Ë
    T]j¿  ã                   ó–   — d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d„ Zdd„Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)é    N)Útimezone)Ú
LazyObject)Úimport_string)ÚImage)Úsettingsc           
      ó&  — t        | t        j                  «      sy| j                  «       }t        t	        |«      «      }|D �cg c]  }||z  ‘Œ	 }}t	        |D �cg c]!  }|dk7  sŒ	|t        j                  |d«      z  ‘Œ# c}«       S c c}w c c}w )zG
    Calculate the entropy of an image. Used for "smart cropping".
    r   é   )Ú
isinstancer   Ú	histogramÚfloatÚsumÚmathÚlog)ÚimÚhistÚ	hist_sizeÚhÚps        úL/var/www/zogu/zoguvenv/lib/python3.12/site-packages/easy_thumbnails/utils.pyÚimage_entropyr      s{   € ô �bœ%Ÿ+™+Ô&àØ�<‰<‹>€DÜ”c˜$“iÓ €IØ#'Ö(˜aˆA�	‹MÐ(€DÐ(Ü¨TÖ<¨°Q¸!³V�”T—X‘X˜a “^Ó#Ò<Ó=Ð=Ð=ùò )ùÚ<s   ÁB	Á
BÁ&Bc                 ó8  — | €It        t        j                  «      t        t        j                  «      z   D �cg c]  }t	        |«      ‘Œ } }t        g d¢«      }| D ].  }t        j                  |«      d   }|j                  |dd «       Œ0 t        |«      S c c}w )zm
    Return a list of unique valid options for a list of image processors
    (and/or source generators)
    N)ÚsizeÚqualityÚsubsamplingr   é   )
Útupler   ÚTHUMBNAIL_PROCESSORSÚTHUMBNAIL_SOURCE_GENERATORSr   ÚsetÚinspectÚgetfullargspecÚupdateÚlist)Ú
processorsr   Úvalid_optionsÚ	processorÚargss        r   Úvalid_processor_optionsr(      s    € ð
 Ðô ”(×/Ñ/Ó0Ü”(×6Ñ6Ó7ñ8ö9Ø!"ŒM˜!Õð9ˆ
ð 9ô Ò:Ó;€MØò 'ˆ	Ü×%Ñ% iÓ0°Ñ3ˆà×Ñ˜T ! "˜XÕ&ð'ô �ÓÐùò9s   ¸Bc                 óF   — 	 | j                  d«       y# t        $ r Y yw xY w)z2
    Check to see if a file storage is local.
    ÚtestFT)ÚpathÚNotImplementedError)Ústorages    r   Úis_storage_localr.   ,   s,   € ðØ�‰�VÔð øô ò Ùðús   ‚ ”	 Ÿ c                 ó0  — t        | t        «      r(| j                  €| j                  «        | j                  } t        | t        «      s'| j
                  }|j                  ›d|j                  ›�} t        | j                  d«      «      j                  «       S )z‡
    Return a hex string hash for a storage object (or string containing
    'full.path.ClassName' referring to a storage object).
    ú.Úutf8)r
   r   Ú_wrappedÚ_setupÚstrÚ	__class__Ú
__module__Ú__name__Úmd5_not_used_for_securityÚencodeÚ	hexdigest)r-   Ústorage_clss     r   Úget_storage_hashr<   7   sw   € ô �'œ:Ô&Ø×ÑÐ#Ø�N‰NÔØ×"Ñ"ˆÜ�gœsÔ#Ø×'Ñ'ˆØ(×3Ó3°[×5IÒ5IÐJˆÜ$ W§^¡^°FÓ%;Ó<×FÑFÓHÐHó    c                 ó–   — t        | t        j                  «      sy| j                  dv xs | j                  dk(  xr d| j                  v S )z2
    Check to see if an image is transparent.
    F)ÚRGBAÚLAÚPÚtransparency)r
   r   ÚmodeÚinfo©Úimages    r   Úis_transparentrG   G   sI   € ô �eœUŸ[™[Ô)ð Ø�J‰J˜.Ð(ò AØ�Z‰Z˜3ÑÒ? >°U·Z±ZÐ#?ðBr=   c                 ót   — t        | t        j                  «      syd| j                  v xs d| j                  v S )z2
    Check to see if an image is progressive.
    FÚprogressiveÚprogression)r
   r   rD   rE   s    r   Úis_progressiverK   S   s2   € ô �eœUŸ[™[Ô)àØ˜UŸZ™ZÐ'ÒI¨]¸e¿j¹jÐ-HÐIr=   c                 óþ  — 	 t         j                  }	 | j                  «       }|�r/|j                  d«      }|dk(  r| j                  |j                  «      } | S |dk(  r| j                  |j                  «      } | S |dk(  r| j                  |j                  «      } | S |dk(  r6| j                  |j                  «      j                  |j                  «      } | S |dk(  r| j                  |j                  «      } | S |dk(  r6| j                  |j                  «      j                  |j                  «      } | S |d	k(  r| j                  |j                  «      } | S # t        $ r
 t         }Y �ŒWw xY w# t        $ r d}Y �ŒXw xY w)
zS
    Rotate and/or flip an image to respect the image's EXIF orientation data.
    Ni  r	   é   é   é   é   é   é   )r   Ú	TransposeÚAttributeErrorÚ_getexifÚ	ExceptionÚgetÚ	transposeÚFLIP_LEFT_RIGHTÚ
ROTATE_180ÚFLIP_TOP_BOTTOMÚ
ROTATE_270Ú	ROTATE_90)r   ÚImage__TransposeÚexifÚorientations       r   Úexif_orientationra   ]   s�  € ð
!ä Ÿ?™?Ðð
Ø�{‰{‹}ˆò
 Ø—h‘h˜vÓ&ˆØ˜!ÒØ—‘Ð.×>Ñ>Ó?ˆBð €Ið ˜AÒØ—‘Ð.×9Ñ9Ó:ˆBð €Ið ˜AÒØ—‘Ð.×>Ñ>Ó?ˆBð €Ið ˜AÒØ—‘Ð.×9Ñ9Ó:ß‘IÐ.×>Ñ>Ó?ð ð €Ið ˜AÒØ—‘Ð.×9Ñ9Ó:ˆBð €Ið ˜AÒØ—‘Ð.×8Ñ8Ó9ß‘IÐ.×>Ñ>Ó?ð ð €Ið ˜AÒØ—‘Ð.×8Ñ8Ó9ˆBØ€Iøô9 ò !ä Óð!ûô ò ð ‹ðús"   ‚E “E- ÅE*Å)E*Å-E<Å;E<c                 ó   — 	 | j                  |«      }|rPt        j                  |«      r;t        t        dd«      r*t        j                  «       }t        j                  ||«      S |S # t        $ r Y yt        $ r Y yw xY w)z_
    Get modified time from storage, ensuring the result is a timezone-aware
    datetime.
    r   NÚUSE_TZF)	Úget_modified_timeÚOSErrorr,   r   Úis_naiveÚgetattrr   Úget_default_timezoneÚ
make_aware)r-   ÚnameÚmodified_timeÚdefault_timezones       r   rd   rd   „   s}   € ð
Ø×1Ñ1°$Ó7ˆñ
 œ×*Ñ*¨=Ô9Ü”8˜X uÔ-Ü'×<Ñ<Ó>ÐÜ×&Ñ& }Ð6FÓGÐGØÐøô ò ÙÜò Ùðús   ‚A' Á'	A=Á2A=Á<A=c                 ó2   — t        j                  d| d¬«      S )zÅ
    Calculate a md5 hash of the given data, but explicitly mark it as not
    being used for security purposes. Without this flag FIPS compliant
    systems will raise an exception when used.
    Úmd5F©Úusedforsecurity©ÚhashlibÚnew©Údatas    r   r8   r8   •   s   € ô �;‰;�u˜d°EÔ:Ð:r=   c                 ó2   — t        j                  d| d¬«      S )zÅ
    Calculate a sha1 hash of the given data, but explicitly mark it as not
    being used for security purposes. Without the flag FIPS compliant
    systems will raise an exception when used.
    Úsha1Fro   rq   rt   s    r   Úsha1_not_used_for_securityrx   �   s   € ô �;‰;�v˜t°UÔ;Ð;r=   )N)rr   r    r   Údjango.utilsr   Údjango.utils.functionalr   Údjango.utils.module_loadingr   ÚPILr   Úeasy_thumbnails.confr   r   r(   r.   r<   rG   rK   ra   rd   r8   rx   © r=   r   ú<module>r      sS   ðÛ Û Û å !Ý .Ý 5å Ý )ò
>óò$òIò 	BòJò$òNò";ó<r=   