U
    ­A›dö, ã                æ   @   s"  d dl Z d dlZd dlZd dlZ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mZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ e e¡ZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKd8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIœZLdJdK„ eL M¡ D ƒZNe"d dLddLdMfdNe#d dLddLdMfdNe"d dLdOdLdMfdPe#d dLdOdLdMfdPe"ddLddLdMfdQe#ddLddLdMfdQe"ddLdOdLdMfdRe#ddLdOdLdMfdRe"d dLddSdMfdTe#d dLddSdMfdTe"d dLdOdSdMfdUe#d dLdOdSdMfdUe"ddLddSdMfdVe#ddLddSdMfdVe"ddLdOdSdMfdWe#ddLdOdSdMfdWe"d dLddXdMfdYe#d dLddXdMfdYe"d dLdOdXdMfdZe#d dLdOdXdMfdZe"ddLddXdMfd[e#ddLddXdMfd[e"ddLdOdXdMfd\e#ddLdOdXdMfd\e"d dLdd]dMfd^e#d dLdd]dMfd^e"d dLdOd]dMfd_e#d dLdOd]dMfd_e"ddLdd]dMfd`e#ddLdd]dMfd`e"ddLdOd]dMfdae#ddLdOd]dMfdae"ddLddbdMfdce"d dLddddMfdee"ddLddddMfdee#ddLddddMfdfe"ddLdOdddMfdge"ddSddddMfdhe#ddSddddMfdie"d djddkdMfdle#d djddkdMfdme"ddLddkdMfdne"ddSddkdMfdoe#ddSddkdMfdpe"ddjddkdMfdle#ddjddkdMfdme"ddLddqdSfdre#ddLddqdSfdre"dOdLddsdMfdte#dOdLddsdMfdte"dOdLdOdsdMfdue#dOdLdOdsdMfdue"dOdLddvdMfdwe#dOdLddvdMfdwe"dOdLddvdxfdye#dOdLddvdxfdye"dOdLddzd{fd|e#dOdLddzd{fd|e"dOdLdd}d~fde#dOdLdd}d~fde"dOdLddvdLfd€e#dOdLddvdLfd€e"dOdLddzd�fd‚e#dOdLddzd�fd‚e"dOdLdd}dƒfd„e#dOdLdd}dƒfd„e"dOdLddvdSfdwe#dOdLddvdSfdwe"dOdLddzd…fd†e#dOdLddzd…fd†e"dOdLdd}d‡fdˆe#dOdLdd}d‡fdˆe"dOdLddvd‰fdwe#dOdLddvd‰fdwe"dOdLddŠdMfd‹e#dOdLddŠdMfdŒe"dOdLdd�dMfdŽe#dOdLdd�dMfd�e"dOdLdd�dxfd�e#dOdLdd�dxfd‘e"dOdLdd�dLfd’e#dOdLdd�dLfd“e"dOdLdd�dSfdŽe#dOdLdd�dSfd�e"d”dLddLdMfd•e#d”dLddLdMfd•e"d”dLdOdLdMfd–e#d”dLdOdLdMfd–e"d”dLddSdMfd—e#d”dLddSdMfd—e"d”dLdOdSdMfd˜e#d”dLdOdSdMfd˜e"d”dLddXdMfd™e#d”dLddXdMfd™e"d”dLdOdXdMfdše#d”dLdOdXdMfdše"d”dLdd]dMfd›e#d”dLdd]dMfd›e"d”dLddqdSfdœe#d”dLddqdSfdœe"d”dLdOd]dMfd�e#d”dLdOd]dMfd�e"dždLddvdMfdŸe#dždLddvdMfdŸe"dždLddzdxfd e#dždLddzdxfd e"dždLdd}d{fd¡e#dždLdd}d{fd¡e"dždLdd�dMfd¢e"d£dLddsdMfd¤e#d£dLddsdMfd¤e"d¥dLddsdMfd¦e#d¥dLddsdMfd¦iqZOePd§d¨„ eOD ƒƒZQd©dªd«d¬d­d®gZRd¯d°„ ZSd±d²„ ZTd³d´„ ZUi ZVi ZWG dµd¶„ d¶eƒZXG d·d¸„ d¸eƒZYeVeY_VeWeY_We M¡ D ]B\ZZZ[e[ \d¹dº¡Z[e]eYd»e[ eVeZ d ƒ e]eYd¼e[ eWeZ ƒ �	q2[V[W[Z[[G d½d¾„ d¾eYƒZ^e^Z_G d¿dÀ„ dÀejƒZ`dÁe"dddLdfdÂe"ddd]dfdÃe"dddqdOfdÄe"d”dd]dfdÅe"d”ddqdOfdÆe"ddOdkdfdÇe"dddddfdÈe"ddOdddfdÉe"dd”dkdfdÊe"dOddsdfdËe"dOddvd fdÌe"dOddvdOfdÍe"džddvdfdÎe"d£ddsdfdÏe"d¥ddsdfdÐe#ddOdkdfdÑe#dddddfdÒe#ddOdddfdÓe#dd”dkdfdÔœZadÕdÖ„ ZbG d×dØ„ dØƒZcdÙdÚ„ Zde ee`jfe`eS¡ e ge`jfeb¡ e he`jfed¡ e ie`jfdÛdÜg¡ e je`jfdÝ¡ dS )Þé    N)ÚMutableMapping)ÚFraction)ÚNumberÚRationalé   )ÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags)Úi16be)Úi32be©Úo8©ÚTYPESFTé   s   IIs   MMé   i  i  i  i  i
  i  é  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  éD  iE  iJ  iR  iS  i[  i  i  i˜‚  i»ƒ  éI†  is‡  ii‡  i¼  i  i–Æ  i—Æ  ÚrawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzwÚ	tiff_jpegÚjpegÚtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscanÚtiff_deflateZtiff_sgilogZtiff_sgilog24ÚlzmaZzstdZwebp)r   é   é   é   é   é   é   é   i€  i€  i)€  i²€  it‡  iu‡  imˆ  iPÃ  iQÃ  c                 C   s   i | ]\}}||“qS © r$   )Ú.0ÚkÚvr$   r$   úL/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>Š   s      r)   ©r   r$   )Ú1z1;Ir   )r+   z1;IR)r+   r+   )r+   z1;R)r   )ÚLzL;2I)r,   zL;2IR)r,   zL;2)r,   zL;2R)r   )r,   zL;4I)r,   zL;4IR)r,   zL;4)r,   zL;4R)r#   )r,   zL;I)r,   zL;IR)r,   r,   )r,   zL;R)é   )úI;16zI;12)é   )r.   r.   )úI;16Br0   )r.   zI;16R)ÚIúI;16S)r1   úI;16BS)r   )é    )ÚFúF;32F)r5   úF;32BF)r1   zI;32N)r1   úI;32S)r1   úI;32BS)r#   r#   )ÚLAr:   )r#   r#   r#   )ÚRGBr;   )r;   zRGB;R)r#   r#   r#   r#   )ÚRGBAr<   )r   )ÚRGBXr=   )r#   r#   r#   r#   r#   ©r   r   )r=   ZRGBXX)r#   r#   r#   r#   r#   r#   )r   r   r   )r=   ZRGBXXX)r<   ZRGBa)r   r   )r<   ZRGBaX)r   r   r   )r<   ZRGBaXX)r   r   )r<   ZRGBAX)r   r   r   )r<   ZRGBAXX)iç  )r/   r/   r/   )r;   zRGB;16L)r;   zRGB;16B)r/   r/   r/   r/   )r<   zRGBA;16L)r<   zRGBA;16B)r=   zRGBX;16L)r=   zRGBX;16B)r<   zRGBa;16L)r<   zRGBa;16Br   )ÚPzP;1)r?   zP;1R)r?   zP;2)r?   zP;2R)r?   zP;4)r?   zP;4R)r?   r?   )ÚPAr@   )r?   zP;Rr    )ÚCMYKrA   )rA   ZCMYKX)rA   ZCMYKXX)rA   zCMYK;16Lr!   )r;   r=   r#   )ÚLABrB   c                 c   s   | ]}t |d  ƒV  qdS )r   N)Úlen)r%   Zkey_tpr$   r$   r(   Ú	<genexpr>  s     rD   ó   MM *ó   II* s   MM* s   II *s   MM +s   II+ c                 C   s   | d d… t kS ©Nr   )ÚPREFIXES©Úprefixr$   r$   r(   Ú_accept  s    rK   c                 C   s<   t | ƒdk}t|rd|  n| ƒ |¡}|r8|d d d… S |S )Nr   éÿÿÿÿ)ÚabsÚIFDRationalÚlimit_rational)ÚvalÚmax_valÚinvÚn_dr$   r$   r(   Ú_limit_rational  s    rT   c                 C   sP   t | ƒ}|j|jf}t|ƒ|k r.t| t|ƒƒ}t|ƒ|krLt |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminrT   rM   Úmax)rP   rQ   Zmin_valÚfracrS   r$   r$   r(   Ú_limit_signed_rational  s    
r[   c                   @   sR  e Zd ZdZdZd4dd„Zedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZed ƒZed!ƒZed"ƒZed#ƒZed$ƒZed%ƒZed&ƒZed'ƒZed(ƒZ ed)ƒZ!ed*ƒZ"ed+ƒZ#ed,ƒZ$ed-ƒZ%ed.ƒZ&ed/ƒZ'ed0ƒZ(ed1ƒZ)e*e+d2ƒ�rNed2ƒZ,d3S )5rN   zÀImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )Ú
_numeratorÚ_denominatorÚ_valr   c                 C   s†   t |tƒr&|j| _|j| _|j| _dS t |tƒrB|j| _|j| _n|| _|| _|dkrbtdƒ| _n |dkrvt|ƒ| _nt||ƒ| _dS )z®
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   Únanr   )	Ú
isinstancerN   rV   r\   rW   r]   r^   r   Úfloat)ÚselfÚvaluerW   r$   r$   r(   Ú__init__=  s    


zIFDRational.__init__c                 C   s   | j S rU   )r\   ©rb   r$   r$   r(   rV   W  s    zIFDRational.numeratorc                 C   s   | j S rU   )r]   re   r$   r$   r(   rW   [  s    zIFDRational.denominatorc                 C   s.   | j dkr| j| j fS | j |¡}|j|j fS )z…

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rW   rV   r^   Úlimit_denominator)rb   Úmax_denominatorÚfr$   r$   r(   rO   _  s    
zIFDRational.limit_rationalc                 C   s   t t| jƒƒS rU   )Ústrra   r^   re   r$   r$   r(   Ú__repr__l  s    zIFDRational.__repr__c                 C   s
   | j  ¡ S rU   )r^   Ú__hash__re   r$   r$   r(   rk   o  s    zIFDRational.__hash__c                 C   s0   | j }t|tƒr|j }t|tƒr(t|ƒ}||kS rU   )r^   r`   rN   ra   )rb   ÚotherrP   r$   r$   r(   Ú__eq__r  s    

zIFDRational.__eq__c                 C   s   | j | j| jgS rU   )r^   r\   r]   re   r$   r$   r(   Ú__getstate__z  s    zIFDRational.__getstate__c                 C   s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rN   rd   r^   r\   r]   )rb   Ústater^   r\   r]   r$   r$   r(   Ú__setstate__}  s
    
zIFDRational.__setstate__c                    s   ‡ fdd„}|S )Nc                    s   t | jˆ ƒ|Ž S rU   )Úgetattrr^   )rb   Úargs©Úopr$   r(   Údelegate…  s    z'IFDRational._delegate.<locals>.delegater$   )rt   ru   r$   rs   r(   Ú	_delegate„  s    zIFDRational._delegateÚ__add__Ú__radd__Ú__sub__Ú__rsub__Ú__mul__Ú__rmul__Ú__truediv__Ú__rtruediv__Ú__floordiv__Ú__rfloordiv__Ú__mod__Ú__rmod__Ú__pow__Ú__rpow__Ú__pos__Ú__neg__Ú__abs__Ú	__trunc__Ú__lt__Ú__gt__Ú__le__Ú__ge__Ú__bool__Ú__ceil__Ú	__floor__Ú	__round__Ú__int__N)r   )-Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rd   ÚpropertyrV   rW   rO   rj   rk   rm   rn   rp   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   Úhasattrr   r‘   r$   r$   r$   r(   rN   /  sT   


rN   c                   @   s  e Zd ZdZd^dd„Zedd„ ƒZedd„ ƒZed	d„ ƒZej	d
d„ ƒZdd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg	ƒƒ ed:d:ƒd_d<d=„ƒZ%ed:ƒd>d?„ ƒZ&ed@d:ƒd`dAdB„ƒZ'ed@ƒdCdD„ ƒZ(edEdFƒdadGdH„ƒZ)edEƒdIdJ„ ƒZ*edKd:ƒdbdLdM„ƒZ+edKƒdNdO„ ƒZ,edPdFƒdcdQdR„ƒZ-edPƒdSdT„ ƒZ.dUdV„ Z/dWdX„ Z0dddZd[„Z1d\d]„ Z2dS )eÚImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    ó   II*     Nc                 C   sÈ   t |ƒs dt|ƒ› d�}t|ƒ‚|dk	r,|n
|dd… | _| jtkrLd| _n| jtkr^d| _nd}t|ƒ‚|d dk| _|| _i | _	|  
¡  | jr¦|  d	|d
d… ¡n|  d|dd… ¡\| _d| _dS )a—  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr   ú>ú<znot a TIFF IFDé+   ÚQr#   r,   r   F)rK   ÚreprÚSyntaxErrorÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ_legacy_api)rb   ÚifhrJ   r¦   Úmsgr$   r$   r(   rd   î  s"    

,ÿzImageFileDirectory_v2.__init__c                 C   s   | j S rU   )r¡   re   r$   r$   r(   Ú<lambda>  ó    zImageFileDirectory_v2.<lambda>c                 C   s   | j S rU   )Ú_offsetre   r$   r$   r(   r®     r¯   c                 C   s   | j S rU   )r«   re   r$   r$   r(   r®     r¯   c                 C   s   d}t |ƒ‚d S )Nz"Not allowing setting of legacy api)Ú	Exception)rb   rc   r­   r$   r$   r(   Ú
legacy_api  s    z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rU   )Ú_tags_v1Ú_tags_v2Ú_tagdatar§   Ú_nextr°   re   r$   r$   r(   r¨     s    zImageFileDirectory_v2.resetc                 C   s   t t| ƒƒS rU   )ri   Údictre   r$   r$   r(   Ú__str__  s    zImageFileDirectory_v2.__str__c                    s   ‡ fdd„ˆ   ¡ D ƒS )z�
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                    s"   i | ]\}}t  |ˆ j¡j|“qS r$   )r   Úlookupr¦   Úname)r%   Úcoderc   re   r$   r(   r)   (  s   ÿ z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsre   r$   re   r(   Únamed"  s    
þzImageFileDirectory_v2.namedc                 C   s   t t| jƒt| jƒB ƒS rU   )rC   Úsetrµ   r´   re   r$   r$   r(   Ú__len__-  s    zImageFileDirectory_v2.__len__c                 C   sf   || j kr>| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jrbt|ttfƒsb|f}|S rU   )r´   rµ   r§   Ú_load_dispatchr²   r`   ÚtupleÚbytes)rb   ÚtagÚdataÚtypÚsizeÚhandlerrP   r$   r$   r(   Ú__getitem__0  s    



z!ImageFileDirectory_v2.__getitem__c                 C   s   || j kp|| jkS rU   )r´   rµ   ©rb   rÃ   r$   r$   r(   Ú__contains__;  s    z"ImageFileDirectory_v2.__contains__c                 C   s   |   ||| j¡ d S rU   )Ú_setitemr²   )rb   rÃ   rc   r$   r$   r(   Ú__setitem__>  s    z!ImageFileDirectory_v2.__setitem__c              
      sÀ  t ttf}t || j¡‰ t||ƒr(|gn|}|| jk�rpˆ jrNˆ j| j|< �n"tj	| j|< t
dd„ |D ƒƒr’t
dd„ |D ƒƒr„tjntj| j|< nÞt
dd„ |D ƒƒ�rt
dd„ |D ƒƒrÆtj| j|< nDt
dd„ |D ƒƒrætj| j|< n$t
dd„ |D ƒƒrþtjntj| j|< ndt
dd„ |D ƒƒ�r.tj| j|< nBt
d	d„ |D ƒƒ�rPtj| j|< n t
d
d„ |D ƒƒ�rptj| j|< | j| tj	k�r’dd„ |D ƒ}n | j| tjk�r²dd„ |D ƒ}| j| tjk�oÌt|tƒ}|�sêt‡ fdd„|D ƒƒ}|�rö| jn| j}|�s´ˆ jdk�s@| j| tjk�s@ˆ jd k�r´t|ƒdk�r´|�s´|�rd| j| tjtjfk�rd|f}z|\||< W n> tk
�r°   t d|› dt|ƒ› d�¡ |d ||< Y nX n|||< d S )Nc                 s   s   | ]}t |tƒV  qd S rU   )r`   rN   ©r%   r'   r$   r$   r(   rD   L  s     z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   s   | ]}|d kV  qdS ©r   Nr$   rÍ   r$   r$   r(   rD   O  s     c                 s   s   | ]}t |tƒV  qd S rU   )r`   ÚintrÍ   r$   r$   r(   rD   R  s     c                 s   s&   | ]}d |  kodk n  V  qdS )r   r   Nr$   rÍ   r$   r$   r(   rD   S  s     c                 s   s&   | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr$   rÍ   r$   r$   r(   rD   U  s     c                 s   s   | ]}|d kV  qdS rÎ   r$   rÍ   r$   r$   r(   rD   Z  s     c                 s   s   | ]}t |tƒV  qd S rU   )r`   ra   rÍ   r$   r$   r(   rD   ]  s     c                 s   s   | ]}t |tƒV  qd S rU   )r`   ri   rÍ   r$   r$   r(   rD   _  s     c                 s   s   | ]}t |tƒV  qd S rU   )r`   rÂ   rÍ   r$   r$   r(   rD   a  s     c                 S   s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciiÚreplace)r`   ri   ÚencoderÍ   r$   r$   r(   Ú
<listcomp>e  s   ÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r$   )r`   rÏ   ra   rÍ   r$   r$   r(   rÓ   j  s     c                 3   s   | ]}ˆ   |¡V  qd S rU   )Zcvt_enum©r%   rc   ©Úinfor$   r(   rD   n  s     r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rÂ   ri   r   r¹   r¦   r`   r§   ÚtypeÚ	UNDEFINEDÚallZRATIONALZSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTEr·   rÁ   r³   r´   ÚlengthrC   Ú
ValueErrorÚwarningsÚwarn)rb   rÃ   rc   r²   Z	basetypesÚvaluesÚis_ifdÚdestr$   rÕ   r(   rË   A  sz    
ÿý
ÿý
þÿþý
ýýþÿzImageFileDirectory_v2._setitemc                 C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rU   )r´   Úpopr³   rµ   rÉ   r$   r$   r(   Ú__delitem__‘  s    z!ImageFileDirectory_v2.__delitem__c                 C   s   t t| jƒt| jƒB ƒS rU   )Úiterr¾   rµ   r´   re   r$   r$   r(   Ú__iter__–  s    zImageFileDirectory_v2.__iter__c                 C   s   t  | j| |¡S rU   )ÚstructÚunpackr£   )rb   ÚfmtrÄ   r$   r$   r(   r©   ™  s    zImageFileDirectory_v2._unpackc                 G   s   t j| j| f|žŽ S rU   )rì   Úpackr£   )rb   rî   rå   r$   r$   r(   Ú_packœ  s    zImageFileDirectory_v2._packc                    s   ‡ ‡fdd„}|S )Nc                    sB   ddl m} | j d¡r2| jdd …  dd¡|ˆ < ˆ| ftˆ < | S )Nr   r   Úload_r    Ú_ú )r   r   r’   Ú
startswithrÑ   rÀ   )Úfuncr   ©ÚidxrÆ   r$   r(   Ú	decorator   s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr$   )r÷   rÆ   rø   r$   rö   r(   Ú_register_loaderŸ  s    z&ImageFileDirectory_v2._register_loaderc                    s   ‡ fdd„}|S )Nc                    s   | t ˆ < | S rU   )Ú_write_dispatch)rõ   ©r÷   r$   r(   rø   «  s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr$   )r÷   rø   r$   rû   r(   Ú_register_writerª  s    z&ImageFileDirectory_v2._register_writerc                    sX   ddl m} | \}‰ }|||< t dˆ  ¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr   r   ú=Tc                    s   |   t|ƒˆ › ˆ › �|¡S rU   )r©   rC   ©rb   rÄ   r²   ©rî   rÆ   r$   r(   r®   ¹  s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                    s   d  ‡‡ fdd„|D ƒ¡S )Nr¯   c                 3   s   | ]}ˆ  ˆ |¡V  qd S rU   )rð   rÔ   )rî   rb   r$   r(   rD   ¾  s     zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©rb   rå   )rî   re   r(   r®   ½  s    )T)r   r   rì   ÚcalcsizerÀ   rú   )Zidx_fmt_namer   r÷   rº   r$   rÿ   r(   Ú_register_basic±  s    
þz%ImageFileDirectory_v2._register_basicÚHÚshortr,   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longrh   ra   ÚdÚdoublerž   Zlong8r   Tc                 C   s   |S rU   r$   rþ   r$   r$   r(   Ú	load_byteÒ  s    zImageFileDirectory_v2.load_bytec                 C   s*   t |tƒrt|ƒ}t |tƒr&t|fƒ}|S rU   )r`   rN   rÏ   rÂ   ©rb   rÄ   r$   r$   r(   Ú
write_byteÖ  s
    


z ImageFileDirectory_v2.write_byter   c                 C   s"   |  d¡r|d d… }| dd¡S )Nó    rL   zlatin-1rÑ   )ÚendswithÚdecoderþ   r$   r$   r(   Úload_stringÞ  s    
z!ImageFileDirectory_v2.load_stringc                 C   s0   t |tƒrt|ƒ}t |tƒs(| dd¡}|d S )NrÐ   rÑ   r  )r`   rÏ   ri   rÂ   rÒ   ©rb   rc   r$   r$   r(   Úwrite_stringä  s
    

z"ImageFileDirectory_v2.write_stringr    r#   c                    sV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr   r,   c                    s   ˆ r| |fS t | |ƒS rU   ©rN   ©Úar  ©r²   r$   r(   Úcombineñ  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   s   | ]\}}ˆ ||ƒV  qd S rU   r$   ©r%   ÚnumÚdenom©r  r$   r(   rD   ô  s     z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   ©r©   rC   rÁ   Úzip©rb   rÄ   r²   Úvalsr$   ©r  r²   r(   Úload_rationalí  s    z#ImageFileDirectory_v2.load_rationalc                    s   d  ‡ fdd„|D ƒ¡S )Nr¯   c                 3   s"   | ]}ˆ j dt|dƒžŽ V  qdS )Ú2Ll   ÿÿ N)r%  )rð   rT   ©r%   rZ   re   r$   r(   rD   ø  s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r  r$   re   r(   Úwrite_rationalö  s    ÿz$ImageFileDirectory_v2.write_rationalr"   c                 C   s   |S rU   r$   rþ   r$   r$   r(   Úload_undefinedü  s    z$ImageFileDirectory_v2.load_undefinedc                 C   s   t |tƒrt|ƒ dd¡}|S )NrÐ   rÑ   )r`   rÏ   ri   rÒ   r  r$   r$   r(   Úwrite_undefined   s    
z%ImageFileDirectory_v2.write_undefinedé
   c                    sV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr   r
  c                    s   ˆ r| |fS t | |ƒS rU   r  r  r  r$   r(   r  
  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   s   | ]\}}ˆ ||ƒV  qd S rU   r$   r  r  r$   r(   rD     s     z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   r  r!  r$   r#  r(   Úload_signed_rational  s    z*ImageFileDirectory_v2.load_signed_rationalc                    s   d  ‡ fdd„|D ƒ¡S )Nr¯   c                 3   s$   | ]}ˆ j dt|ddƒžŽ V  qdS )Ú2liÿÿÿi   €N)r,  )rð   r[   r&  re   r$   r(   rD     s   ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r  r$   re   r(   Úwrite_signed_rational  s    þz+ImageFileDirectory_v2.write_signed_rationalc                 C   s8   |  |¡}t|ƒ|kr4d|› dt|ƒ› d�}t|ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )ÚreadrC   ÚOSError)rb   ÚfprÆ   Úretr­   r$   r$   r(   Ú_ensure_read  s    
ÿz"ImageFileDirectory_v2._ensure_readc              
   C   sŒ  |   ¡  | ¡ | _�z:| jr0|  d|  |d¡¡n|  d|  |d¡¡d }t|ƒD �]Ä}| jrp|  d|  |d¡¡n|  d|  |d	¡¡\}}}}t || j	¡j
}t |d
¡}	d|› d|› d|	› d|› d�	}
z| j| \}}W n. tk
�r   t |
d|› � ¡ Y qPY nX || }|| j�rdndk�r~| ¡ }|  | j�r>dnd|¡\}|
d|› d|› �7 }
| |¡ t ||¡}| |¡ n|d |… }t|ƒ|k�rÄt d|› dt|ƒ› d|› �¡ t |
¡ qP|�sÖt |
¡ qP|| j|< || j|< |
d|dk�r d| nt|ƒ 7 }
t |
¡ qP| j�r4|  d|  |d¡¡n|  d|  |d¡¡\| _W n8 tk
�r† }
 zt t|
ƒ¡ W Y ¢d S d }
~
X Y nX d S )Nrž   r#   r  r   r   ZHHQ8sé   ÚHHL4sr-   Úunknownztag: ú (ú
) - type: ú)z - unsupported type r   r,   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r.  z. Skipping tag ú
 - value: r4   ú<table: %d bytes>)r¨   Útellr°   r¥   r©   r3  Úranger   r¹   r¦   rº   r   ÚgetrÀ   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readrC   rã   rä   rµ   r§   rŸ   rª   r0  ri   )rb   r1  Z	tag_countÚirÃ   rÅ   ÚcountrÄ   ÚtagnameÚtypnamer­   Z	unit_sizerÇ   rÆ   ÚhereÚoffsetr$   r$   r(   Úload   sh    
ÿüÿý


ÿ



ÿÿý
zImageFileDirectory_v2.loadr   c                 C   s"  |   dt| jƒ¡}g }|t|ƒ t| jƒd  d }d }t| j ¡ ƒD �]â\}}|tkr`t|ƒ}| j |¡}t 	d|› d|› dt
|ƒ› �¡ |tjkožt|tƒ}|rô| jdkr´d}	nd	}	t|	|d
�}
| j| }| ¡ D ]\}}||
|< qÖ|
 |¡}n*t|tƒ�r|n|f}| j| | f|žŽ }t || j¡j}|�r8dn
t |d¡}d|› d|› d|› d|› d�	}|dt|ƒdk�r€dt|ƒ nt|ƒ 7 }t 	|¡ |�r¢d}n(|tjtjtjfk�rÂt|ƒ}nt|ƒ}t|ƒdk�rö| |||| dd¡df¡ qF| ||||   d|¡|f¡ |t|ƒd d d 7 }qF|d k	�rˆ|| \}}}}}|�rZd}t|ƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]T\}}}}}t 	|› d|› d|› dt
|ƒ› dt
|ƒ› �	¡ ||   d||||¡7 }�qŒ|d7 }|D ].\}}}}}||7 }t|ƒd@ �rî|d7 }�qî|S )Nr  r-   r   zTag z, Type: z	, Value: rœ   s   II*    s   MM *   )r¦   Úifdr6  zsave: r7  r8  r9  r:  r/   r;  r   r  r¯   r,   r   z&multistrip support not yet implementedr   ró   r5  s       ) rð   rC   r´   Úsortedr¼   ÚSTRIPOFFSETSr§   r>  r@  rA  rŸ   r   rÜ   r`   r·   r£   r™   ÚtobytesrÁ   rú   r¹   r¦   rº   r   ri   rà   rß   rØ   ÚappendÚljustÚNotImplementedErrorr©   )rb   rI  ÚresultÚentriesZstripoffsetsrÃ   rc   rÅ   ræ   r¬   rK  rå   Zifd_tagZ	ifd_valuerÄ   rF  rG  r­   rE  r$   r$   r(   rN  c  sj     


 ÿ


.zImageFileDirectory_v2.tobytesc                 C   sN   |  ¡ dkr&| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ZHLé*   r#   )r<  Úwriter¡   rð   rN  rC   )rb   r1  rI  rR  r$   r$   r(   Úsave°  s    

zImageFileDirectory_v2.save)rš   NN)T)T)T)T)T)r   )3r’   r“   r”   r•   rd   r—   rJ   rI  r²   Úsetterr¨   r¸   r½   r¿   rÈ   rÊ   rÌ   rË   ré   rë   r©   rð   rù   rü   r  ÚlistÚmapr   rÚ   rÜ   ZSIGNED_BYTErÛ   rÝ   ÚFLOATrÞ   ZIFDZLONG8r  r  r  r  r$  r'  r(  r)  r+  r-  r3  rJ  rN  rV  r$   r$   r$   r(   r™   ±  sz   <
 
P








÷þÿ





C
Mr™   ró   rò   rñ   Zwrite_c                       s~   e Zd ZU dZ‡ fdd„Zedd„ ƒZedd„ ƒZee	d< e
dd	„ ƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚImageFileDirectory_v1aþ  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                    s   t ƒ j||Ž d| _d S )NT)Úsuperrd   r«   )rb   rr   Úkwargs©Ú	__class__r$   r(   rd   Ø  s    zImageFileDirectory_v1.__init__c                 C   s   | j S rU   )r³   re   r$   r$   r(   r®   Ü  r¯   zImageFileDirectory_v1.<lambda>c                 C   s   | j S rU   )rµ   re   r$   r$   r(   r®   Ý  r¯   r§   c                 C   s(   | |j d�}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        rI   )rJ   rµ   r§   rª   )ÚclsÚoriginalrK  r$   r$   r(   Úfrom_v2ã  s
    zImageFileDirectory_v1.from_v2c                 C   s4   t | jd�}t| jƒ|_t| jƒ|_t| jƒ|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        rI   )r™   rJ   r·   rµ   r§   r´   )rb   rK  r$   r$   r(   Úto_v2õ  s
    zImageFileDirectory_v1.to_v2c                 C   s   || j kp|| jkS rU   )r³   rµ   rÉ   r$   r$   r(   rÊ     s    z"ImageFileDirectory_v1.__contains__c                 C   s   t t| jƒt| jƒB ƒS rU   )rC   r¾   rµ   r³   re   r$   r$   r(   r¿   	  s    zImageFileDirectory_v1.__len__c                 C   s   t t| jƒt| jƒB ƒS rU   )rê   r¾   rµ   r³   re   r$   r$   r(   rë     s    zImageFileDirectory_v1.__iter__c                 C   s   dD ]}|   |||¡ qd S ©N)FT)rË   )rb   rÃ   rc   r²   r$   r$   r(   rÌ     s    z!ImageFileDirectory_v1.__setitem__c                 C   sn   || j krL| j| }| j| }| j| \}}dD ]}|  ||| ||ƒ|¡ q0| j | }t|ttfƒsj|f}|S rd  )r³   rµ   r§   rÀ   rË   r`   rÁ   rÂ   )rb   rÃ   rÄ   rÅ   rÆ   rÇ   ÚlegacyrP   r$   r$   r(   rÈ     s    



z!ImageFileDirectory_v1.__getitem__)r’   r“   r”   r•   rd   r—   ÚtagsZtagdatar·   Ú__annotations__Úclassmethodrb  rc  rÊ   r¿   rë   rÌ   rÈ   Ú__classcell__r$   r$   r^  r(   r[  Å  s   

r[  c                       sŠ   e Zd ZdZdZdZd‡ fdd„	Zdd„ Zed	d
„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚTiffImageFileZTIFFz
Adobe TIFFFNc                    s   d | _ d | _tƒ  ||¡ d S rU   )Útag_v2rÃ   r\  rd   )rb   r1  Úfilenamer^  r$   r(   rd   -  s    zTiffImageFile.__init__c                 C   s    | j  d¡}|d dkr(|| j  d¡7 }t|ƒ| _d| _| jj | _| _d| _| j | _	g | _
d| _t d¡ t d| j› �¡ t dt|ƒ› �¡ |  d	¡ dS )
z#Open the first image in a TIFF filer#   r   r�   NrL   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r1  r/  r™   rk  rK  rª   Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ	_n_framesr@  rA  rŸ   Ú_seek)rb   r¬   r$   r$   r(   Ú_open6  s    

zTiffImageFile._openc                 C   sP   | j d krJ|  ¡ }|  t| jƒ¡ | j d kr@|  |  ¡ d ¡ q"|  |¡ | j S )Nr   )rq  r<  rr  rC   rp  rB  )rb   Úcurrentr$   r$   r(   Ún_framesQ  s    


zTiffImageFile.n_framesc                 C   s<   |   |¡sdS |  |¡ t | j¡ tj | j| j¡| _dS )z%Select a given frame as current imageN)	Z_seek_checkrr  r   Z_decompression_bomb_checkrÆ   ÚcoreÚnewÚmodeÚim)rb   Úframer$   r$   r(   rB  [  s
    

zTiffImageFile.seekc                 C   sH  | j | _| j ¡  t| jƒ|krú| js2d}t|ƒ‚t d|› d| j	› d| j› d| j ¡ › �¡ | j 
| j¡ | j | j¡ t d| j ¡  ¡ | j | j¡ | jj| jkr²d| _n
| jj| _| jdkrÐ|d | _t| jƒdkrê| jdk| _|  j	d7  _	q| j 
| j| ¡ | j | j¡ |  ¡  t | j¡ | _| _|| _	|  ¡  d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )ro  r1  r<  rC   rp  rm  ÚEOFErrorr@  rA  rn  rB  rO  rk  rJ  rª   rq  Úis_animatedZ_reload_exifr[  rb  rÃ   rK  Ú_setup)rb   rz  r­   r$   r$   r(   rr  f  s6    
$ÿ


zTiffImageFile._seekc                 C   s   | j S )zReturn the current frame number)rn  re   r$   r$   r(   r<  Œ  s    zTiffImageFile.tellc                 C   s   t | jkr|  | jt  ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )ÚXMPrk  Z_getxmpre   r$   r$   r(   Úgetxmp�  s    zTiffImageFile.getxmpc                 C   s²   i }| j  d¡}|r®|dd… dkr®t|dd… ƒ}t |d d d ¡d }t|d| d| … ƒ}|d| d| | … }d	|i||< |t d| | d ¡d d… }q|S )
a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        r   Nr   s   8BIMr!   r   r   r*  rÄ   )rk  r>  Úi16ÚmathÚceilÚi32)rb   ÚblocksrP   ÚidÚnrÆ   rÄ   r$   r$   r(   Úget_photoshop_blocks™  s    $z"TiffImageFile.get_photoshop_blocksc                    s   | j r| jr|  ¡ S tƒ  ¡ S rU   )ÚtileÚuse_load_libtiffÚ_load_libtiffr\  rJ  re   r^  r$   r(   rJ  ®  s    zTiffImageFile.loadc                 C   s    | j r^tjjtjjtjjtjjtjjtjjtjj	dœ 
| j ¡}|d k	r^| j |¡| _| jj| _| jsœd| _| j ¡  |  ¡ }tjD ]}||kr�q‚| |¡ q‚d S )N)r   r   r   r    r!   r"   r#   T)Ú_tile_orientationr   Z	TransposeZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r>  ry  Z	transposerÆ   Ú_sizer|  Ú!_close_exclusive_fp_after_loadingr1  r<  Zgetexifr   ÚTAGS_V2_GROUPSÚget_ifd)rb   ÚmethodÚexifÚkeyr$   r$   r(   Úload_end³  s,    ùø	


zTiffImageFile.load_endc           
   
   C   s  t j  | ¡ |  ¡  t| jƒdks.d}t|ƒ‚| jd d }t| jd d ƒ}z6t| jdƒojt	 
| j ¡ ¡}t| jdƒr‚| j ¡  W n tk
rœ   d}Y nX |rª||d< t  | jd	t|ƒ| j¡}z| | j|¡ W n2 tk
�r } zd
}t|ƒ|‚W 5 d}~X Y nX | j�o| j }t| jdƒ�rFt d¡ | | j ¡ ¡\}}	n\|�rxt d¡ |�sh| j d¡ | d¡\}}	n*t d¡ | j d¡ | | j ¡ ¡\}}	|�rÎzt	 |¡ W n tk
�rÌ   Y nX g | _d| _|  ¡  |�rø| j ¡  d| _|	dk �r
t|	ƒ‚t j  | ¡S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   ÚfilenoÚflushFr   ÚlibtiffzCouldn't set the imageNÚgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   rJ  Zload_preparerC   rˆ  r0  rX  r˜   r1  ÚosÚdupr”  r•  Z_getdecoderrx  rÁ   ZdecoderconfigÚsetimagery  râ   Z_exclusive_fpr|  r@  rA  r  r—  rB  r/  ÚcloseÚreadonlyr“  )
rb   r­   Zextentsrr   r1  ÚdecoderÚeZclose_self_fpr†  Úerrr$   r$   r(   rŠ  Ò  sh    
   ÿ





zTiffImageFile._load_libtiffc              
   C   s:  d| j krd}t|ƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| jdkrVd}| j  t	d¡}t
 d¡ t
 d| j› �¡ t
 d	|› �¡ t
 d
| j› �¡ t
 d|› �¡ t
 d| j t¡› �¡ t| j  t¡ƒ}t| j  t¡ƒ}||f| _t
 d| j› �¡ | j  td¡}t|ƒdk�rJt|ƒt|ƒ  k�rBdk�rJn nd}| j  td¡}| j  td¡}|dk�rvd}	n|dk�r†d}	nd}	|	t|ƒ7 }	t|ƒ}
| j  t| jdk�rÀ|dk�rÀdnd¡}|tk�rèt
 d|¡ d}t|ƒ‚||
k �r |d|… }n||
k�r|
dk�r|| }t|ƒ|k�r6d}t|ƒ‚| j j|||||f}t
 d|› �¡ zt| \| _}W n< t k
�r¨ } zt
 d¡ d}t|ƒ|‚W 5 d}~X Y nX t
 d|› �¡ t
 d| j› �¡ | j| j!d< | j  t"d¡}| j  t#d¡}|�r~|�r~| j  t$¡}|dk�r&||f| j!d < nX|dk�rH|d! |d! f| j!d < n6|dk�rp||f| j!d < ||f| j!d"< n||f| j!d"< d } }}g | _%t&�pž| jd#k| _'| j'�r€|dk�rî|dd… d |dd…  }t
 d|› �¡ t| \| _}|d$k�rüd%}d&|k�r| (d&d'¡}d(|k�r(| (d(d'¡}|dk�rN| jd)k�rN| jdk�rNd*}|| jd+| j j)f}| j% *d,dd||fd|f¡ �nXt+| j k�s˜t,| j k�rÂt+| j k�rÈ| j t+ }| j  t-|¡}| jd }n"| j t, }| j  t.¡}| j  t/¡}|D ]Ð}|| |k�r|t0|ƒ d- }nd}|}| jdk�r6|| }||	 }|t|ƒdf}| j% *| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�rîd||  }}|| jd k�rîd }}|d7 }�qînt
 d.¡ d}t|ƒ‚t1| j k�rô| j t1 | j!d/< | jd0k�r(d1d2„ | j t2 D ƒ}t3 4d3d4 5|¡¡| _6| j  d5¡| _7dS )6z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   r   r   r!   z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: z- size: r*   r$   )r   r!   r#   r   r    r   )r   r!   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: Úcompressionr   ÚdpigR¸…ëQ@Ú
resolutionr   r.   úI;16Nz;16Bz;16Nz;16Lr   r;   Fr–  r#   z- unsupported data organizationÚicc_profile©r?   r@   c                 S   s   g | ]}t |d  ƒ‘qS ©r   r   )r%   r  r$   r$   r(   rÓ     s     z(TiffImageFile._setup.<locals>.<listcomp>úRGB;Lr¯   i  )8rk  r0  ÚCOMPRESSION_INFOr>  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONZ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERr@  rA  rÃ   ÚYCBCRSUBSAMPLINGrÏ   Ú
IMAGEWIDTHÚIMAGELENGTHrŒ  rÆ   ÚSAMPLEFORMATrC   rY   rX   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELÚMAX_SAMPLESPERPIXELÚerrorr    rJ   Ú	OPEN_INFOrx  r?  rÖ   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITrˆ  ÚREAD_LIBTIFFr‰  rÑ   rI  rO  rM  ÚTILEOFFSETSÚROWSPERSTRIPÚ	TILEWIDTHÚ
TILELENGTHÚsumÚ
ICCPROFILEÚCOLORMAPr
   r   r  Úpaletter‹  )rb   r­   ÚphotoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr’  Úrawmoderž  ZxresZyresZresunitÚxÚyÚlayerr  Úoffsetsr	  ÚwrI  ÚstrideZtile_rawmoderÃ  r$   r$   r(   r}  /  s   



2

þ
 ÿ
ú







ÿþý 

üÿ
zTiffImageFile._setup)NN)r’   r“   r”   ÚformatÚformat_descriptionr�  rd   rs  r—   ru  rB  rr  r<  r  r‡  rJ  r“  rŠ  r}  ri  r$   r$   r^  r(   rj  (  s    	
	&	]rj  r+   r,   r:   r?   r@   r8   r.   r2   r6   r;   r=   r<   rA   ÚYCbCrrB   r9   r0   r3   r7   )r+   r,   r:   r?   r@   r1   r.   r2   r5   r;   r=   r<   rA   rÎ  rB   r9   r0   r3   r7   c           2      C   sD	  zt | j \}}}}}}W n: tk
rT }	 zd| j› d�}
t|
ƒ|	‚W 5 d }	~	X Y nX t|d�}| j}| j}z|d }W n. tk
r¦   | j d¡}t	|t
ƒr¢d }Y nX |d kr¶d}n|dkrÄd}n|dkrÐd	}tpÚ|dk}d
|t< | jd |t< | jd
 |t< d|k�r|d }n:d|k�rJ|d }t	|tƒ�rNt ¡ }| |¡ |}ni }t dt|ƒ ¡ t	|tƒ�rt| ¡ }|D ]j}t	|tjƒ�r¦|tjk�r¦| |¡||< n| |¡||< z|j| |j|< W n tk
�rÞ   Y nX �qxt| dƒ�r4tt t!t"t#t$fD ]2}|| j%k�r | j%| ||< | j%j| |j|< �q | d| j d¡¡}|�rV||t&< t'dft dft!dft dft!dftdft(dft)dft*dft+dff
D ] \}}||k�r–|| ||< �q–| d¡}|�rèd|t< |d |t < |d
 |t!< |dk�r||t,< t-|ƒd
k�rt-|ƒ|t.< |d k	�r&||t/< |d
k�r8||t0< t1|k�rL||t1< nŒ| jdk�rØ|t1 dk�rØ| jdk�rÎ|  2¡ }| ¡ }t3|j4ƒD ]:}t3|j5ƒD ](}|||f dk�r´dnd|||f< �qš�qŒ|} n
t6 7| ¡} | jd k�rR| j8 9d!d"¡}g }t-|ƒd# }t3d#ƒD ]>}|d$d%„ ||| ||d
  … D ƒ7 }|dgd&|  7 }�q
||t:< t-|ƒ| jd |d  d' d(  }|�rÐ| d)t;¡}|dk�r”d
nt<|| | jd
 ƒ} |dk�rÚt<| d' d( d( | jd
 ƒ} n
| jd
 } | dk�rèd
} |dk�röd
n||  }!| jd
 |  d
 |  }"| |t=< |!d*k�r2tj>|jt?< |!f|"d
  || jd
  |!|"d
   f |t?< t@t3d|!|" |!ƒƒ|tA< tB |d
¡|tC< | jd+k�r¼tDd,tEd-i F¡ D ]\}#}$| G|#|$¡ �q¤tHtItJtKg}%|�rðd.|k�r*|d. }&t	|&t
ƒ�r |&dk �s |&d/k�rd0}
tL|
ƒ‚|dk�r"d1}
tL|
ƒ‚|&|tM< t d2¡ t d3tN| F¡ ƒ ¡ d}'t|d4ƒ�r�z| Od¡ tP Q| R¡ ¡}'W n tSjTk
�rŽ   Y nX i }(|%tEt?tAtUtVg7 }%t,|d i})i }*t| d5ƒ�rÌ| jW ¡ }*tX| di ƒ|*–}+t0|+k�rì|+t0= tY Z| F¡ |+ F¡ ¡D ]Ò\}#}$|#tj[k�rxtXtj\d6d7ƒ�s(�q |#|jk�rD|j|# |(|#< n4t	|$t
t]t^tfƒ�s^�q nt _|#¡j`},|,�rx|,|(|#< |#|)k�r |#|%k�r t	|$t^ƒ�r®|$ ad8d9¡d: |)|#< n"t	|$tbƒ�rÈt]|$ƒ|)|#< n|$|)|#< �q t0|)k�r t-|)t0 ƒd
k�r |)t0 d |)t0< t d;tN|) F¡ ƒ ¡ | jd<k�r&d=}t|) F¡ ƒ}-|- c¡  |||'||-|(f}.t d| jd>|.|¡}	|	 e| j8d?| j ¡ |	 ad@¡d
d … \}/}0|'�s–| f|0¡ |/�rp�q¤�qp|'�rÐztP g|'¡ W n tk
�rÎ   Y nX |/dk �	r0dA|/› dB�}
t|
ƒ‚n@|%D ]}#||#= �qô| h|¡}1ti j| |dd?| j |1||d
ffg¡ dC|k�	r@|| _kd S )DNzcannot write mode z as TIFFrI   r   r   r   r   r   r   r   r   Ztiffinfor‘  zTiffinfo Keys: %srk  r¤  Údescriptionr¢  Zx_resolutionZy_resolutionZresolution_unitZsoftwareÚ	date_timeZartistÚ	copyrightr¡  r   r*   )r+   r,   r+   éÿ   r¥  r;   r§  r   c                 S   s   g | ]}|d  ‘qS r¦  r$   rÍ   r$   r$   r(   rÓ   ²  s     z_save.<locals>.<listcomp>r   r"   r#   Z
strip_sizer   rÎ  )r   r   )r   rÒ  é€   rÒ  rÓ  rÒ  Úqualityéd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr”  rÃ   Zlibtiff_support_custom_tagsFrÐ   rÑ   r  zConverted items: %s)r0   r.   r£  r–  r>   i @  zencoder error z when writing image fileÚ_debug_multipage)lÚ	SAVE_INFOrx  r?  r0  r™   ÚencoderinfoÚencoderconfigrÖ   r>  r`   rÏ   ÚWRITE_LIBTIFFr«  rÆ   r¯  r°  rÂ   r   ZExifrJ  r@  rA  rX  r[  rc  r   rŽ  r�  r§   r±   r˜   rº  r¸  r¹  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKr~  rk  rÁ  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr²  rC   r´  r³  r±  r¬  Úcopyr=  ÚheightÚwidthr	   Úinvertry  Z
getpaletterÂ  Ú
STRIP_SIZErX   r½  rÜ   ÚSTRIPBYTECOUNTSrÁ   rM  ÚCOMPRESSION_INFO_REVr©  r®  ÚREFERENCEBLACKWHITEr¼   Ú
setdefaultr¾  r¿  r¼  ÚTILEBYTECOUNTSrâ   ÚJPEGQUALITYrL  rB  r˜  r™  r”  ÚioÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDrÃ   rq   Ú	itertoolsÚchainZLIBTIFF_CORErv  ra   ri   r¹   r×   rÒ   rN   ÚsortZ_getencoderrš  rU  r›  rV  r   Ú_saverÖ  )2ry  r1  rl  rÅ  rJ   rÄ  rÌ  ÚbitsÚextrarž  r­   rK  rØ  rÙ  r   r–  rÖ   r‘  r’  Ziccrº   r¡  Zinverted_imZpxrÇ  rÆ  ZlutZcolormapÚcolorsrD  rË  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagerÃ   rc   Z	blocklistrÔ  ro  ÚtypesZattsZ
legacy_ifdZsupplied_tagsr×   rf  r  ÚerrcoderÄ   rI  r$   r$   r(   rô  2  s°   







úö






*
&""



ÿ
ÿ  þ
 


û	






  ÿ
rô  c                   @   sô   e Zd ZdddddddddddddgZdddd	d
dhZd:dd„Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zejfdd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd;d7d8„Zd9S )<ÚAppendingTiffWriterr   r   r   r   r#   r   i   r   i  i  i	  Fc                 C   sv   t |dƒr|| _d| _nF|| _d| _zt||r2dndƒ| _W n  tk
r\   t|dƒ| _Y nX | j ¡ | _|  ¡  d S )Nr/  FTzw+bzr+b)	r˜   rh   Úclose_fprº   Úopenr0  r<  Ú	beginningÚsetup)rb   Úfnrw  r$   r$   r(   rd   q  s    
zAppendingTiffWriter.__init__c                 C   sŒ   | j  | jtj¡ d | _d| _| j  d¡ | _}|s>d| _	d S d| _	|dkrX|  
d¡ n |dkrl|  
d¡ nd	}t|ƒ‚|  ¡  |  ¡  d S )
Nr   r   TFrF   rœ   rE   r›   zInvalid TIFF file header)rh   rB  rý  r˜  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPager/  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rb   Úiimmr­   r$   r$   r(   rþ    s     zAppendingTiffWriter.setupc                 C   s„   | j r
d S | j | j¡ | j d¡}|s,d S || jkrBd}t|ƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r  rh   rB  r  r/  r  r  ÚreadLongr  Ú	writeLongÚfixIFD)rb   r	  r­   Ú
ifd_offsetr$   r$   r(   Úfinalize˜  s    


zAppendingTiffWriter.finalizec                 C   s   |   ¡  |  ¡  d S rU   )r  rþ  re   r$   r$   r(   ÚnewFrame±  s    zAppendingTiffWriter.newFramec                 C   s   | S rU   r$   re   r$   r$   r(   Ú	__enter__¶  s    zAppendingTiffWriter.__enter__c                 C   s   | j r|  ¡  dS )NF)rû  r›  )rb   Úexc_typeÚ	exc_valueÚ	tracebackr$   r$   r(   Ú__exit__¹  s    zAppendingTiffWriter.__exit__c                 C   s   | j  ¡ | j S rU   )rh   r<  r  re   r$   r$   r(   r<  ¾  s    zAppendingTiffWriter.tellc                 C   s*   |t jkr|| j7 }| j ||¡ |  ¡ S rU   )r˜  r   r  rh   rB  r<  )rb   rI  Úwhencer$   r$   r(   rB  Á  s    

zAppendingTiffWriter.seekc                 C   s^   | j  dtj¡ | j  ¡ }d|d  }d|  k r:dk rNn n| j  t|ƒ¡ | j  ¡ | _d S )Nr   r/   )rh   rB  r˜  ÚSEEK_ENDr<  rU  rÂ   r  )rb   ÚposZ	pad_bytesr$   r$   r(   r  È  s    
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr,   r  ZHHL)ÚendianÚlongFmtÚshortFmtÚ	tagFormat)rb   r  r$   r$   r(   r  Ò  s    zAppendingTiffWriter.setEndianc                 C   sP   |   ¡ }|dkr"| j ¡ d | _qL| j |¡ |  ¡ }| j |d tj¡ q d S )Nr   r   r-   )r
  rh   r<  r  rB  Ú	readShortr˜  ÚSEEK_CUR)rb   r  Únum_tagsr$   r$   r(   r  Ø  s    zAppendingTiffWriter.skipIFDsc                 C   s   | j  |¡S rU   )rh   rU  r  r$   r$   r(   rU  ã  s    zAppendingTiffWriter.writec                 C   s   t  | j| j d¡¡\}|S )Nr   )rì   rí   r  rh   r/  r  r$   r$   r(   r  æ  s    zAppendingTiffWriter.readShortc                 C   s   t  | j| j d¡¡\}|S rG   )rì   rí   r  rh   r/  r  r$   r$   r(   r
  ê  s    zAppendingTiffWriter.readLongc                 C   sN   | j  dtj¡ | j  t | j|¡¡}|d k	rJ|dkrJd|› d�}t|ƒ‚d S )Néþÿÿÿr   úwrote only ú bytes but wanted 4©	rh   rB  r˜  r  rU  rì   rï   r  r  ©rb   rc   Zbytes_writtenr­   r$   r$   r(   ÚrewriteLastShortToLongî  s
    z*AppendingTiffWriter.rewriteLastShortToLongc                 C   sN   | j  dtj¡ | j  t | j|¡¡}|d k	rJ|dkrJd|› d�}t|ƒ‚d S )Nr  r   r   ú bytes but wanted 2)	rh   rB  r˜  r  rU  rì   rï   r  r  r#  r$   r$   r(   ÚrewriteLastShortõ  s
    z$AppendingTiffWriter.rewriteLastShortc                 C   sN   | j  dtj¡ | j  t | j|¡¡}|d k	rJ|dkrJd|› d�}t|ƒ‚d S )Néüÿÿÿr   r   r!  r"  r#  r$   r$   r(   ÚrewriteLastLongü  s
    z#AppendingTiffWriter.rewriteLastLongc                 C   s>   | j  t | j|¡¡}|d k	r:|dkr:d|› d�}t|ƒ‚d S )Nr   r   r%  )rh   rU  rì   rï   r  r  r#  r$   r$   r(   Ú
writeShort  s    zAppendingTiffWriter.writeShortc                 C   s>   | j  t | j|¡¡}|d k	r:|dkr:d|› d�}t|ƒ‚d S )Nr   r   r!  )rh   rU  rì   rï   r  r  r#  r$   r$   r(   r  	  s    zAppendingTiffWriter.writeLongc                 C   s   |   ¡  | j ¡  d S rU   )r  rh   r›  re   r$   r$   r(   r›    s    zAppendingTiffWriter.closec                 C   s   |   ¡ }t|ƒD ]ê}t | j| j d¡¡\}}}| j| }|| }|dk}|sj|  ¡ }	|	| j	7 }	|  
|	¡ || jkræ| j ¡ }
|r¬| j||dk|dkd� | j |
d ¡ n0| j |	¡ | j||dk|dkd� | j |
¡ d  }	}
q|r| j dtj¡ qd S )Nr#   r   r   )ÚisShortÚisLong)r  r=  rì   rí   r  rh   r/  Ú
fieldSizesr
  r  r(  ÚTagsr<  Ú
fixOffsetsrB  r˜  r  )rb   r  rD  rÃ   Z
field_typerE  Z
field_sizeÚ
total_sizeÚis_localrI  Zcur_posr$   r$   r(   r    s:    




  ÿ  ÿ
zAppendingTiffWriter.fixIFDc                 C   s¶   |s|sd}t |ƒ‚t|ƒD ]”}|r,|  ¡ n|  ¡ }|| j7 }|r–|dkr–|dkr^d}t |ƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|r¦|  |¡ q|  |¡ qd S )Nz offset is neither short nor longr   r   znot implementediöÿÿÿr#   )r  r=  r  r
  r  r$  rh   rB  r˜  r  r)  r   rÜ   r&  r(  )rb   rE  r*  r+  r­   rD  rI  r$   r$   r(   r.  6  s"    

zAppendingTiffWriter.fixOffsetsN)F)FF)r’   r“   r”   r,  r-  rd   rþ  r  r  r  r  r<  rí  r   rB  r  r  r  rU  r  r
  r$  r&  r(  r)  r  r›  r  r.  r$   r$   r$   r(   rú  X  sJ   ó

#rú  c              	   C   sÒ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs:|s:t| ||ƒS |  ¡ }z~t	|ƒ�l}| g| D ]Z}||_ ||_t|dƒsxd}	n|j
}	t|	ƒD ]*}
| |
¡ | ¡  t|||ƒ | ¡  q†qXW 5 Q R X W 5 |  |¡ X d S )NÚappend_imagesru  r   )rØ  râ  rÙ  rX  r>  r˜   rô  r<  rB  rú  ru  r=  rJ  r  )ry  r1  rl  rØ  rÙ  r1  Zcur_idxÚtfZimsZnfrr÷   r$   r$   r(   Ú	_save_allP  s(    



r3  z.tifz.tiffz
image/tiff)krí  rñ  Úloggingr�  r˜  rì   rã   Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Ú r   r   r	   r
   r   Ú_binaryr   r€  r   rƒ  r   r   Ú	getLoggerr’   r@  r»  rÚ  ZIFD_LEGACY_APIræ  r¤   r¢   r¯  r°  r²  r©  r¬  r­  rÝ  rM  r´  r½  rç  r¸  r¹  r«  rº  rï  rÞ  rß  rà  Z	PREDICTORrÂ  r¾  r¿  r¼  rë  rð  r³  r±  Z
JPEGTABLESr®  ré  rá  rÛ  rÜ  rÁ  ZEXIFIFDr~  rì  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr¨  r¼   rè  r·  rY   rµ  rH   rK   rT   r[   rÀ   rú   rN   r™   r÷   rº   rÑ   Úsetattrr[  ZImageFileDirectoryrj  r×  rô  rú  r3  Zregister_openrÌ  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer$   r$   r$   r(   Ú<module>)   sæ  
î                                                                                                                 ‹xú
     \   wë  ( y