o
    sh;L                    @  s$  d dl m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Zd dl	m
Z
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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% ddl&m'Z' ddl(m)Z)m*Z* ddlm+Z+ dZ,e,rddl&m-Z-m.Z. e/e0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!ZCd"ZDd#ZEd$ZFd%ZGd&ZHd'ZId(ZJd)ZKd*ZLd+ZMd,ZNd-ZOd.ZPd/ZQd0ZRd1ZSd2ZTd3ZUd4ZVd5ZWd6ZXd7ZYd8ZZd9Z[d:Z\d;Z]d<Z^d=Z_i dd>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^Z`d_d` e`a D Zbi e5d daddadbfdce6d daddadbfdce5d dad?dadbfdde6d dad?dadbfdde5ddaddadbfdee6ddaddadbfdee5ddad?dadbfdfe6ddad?dadbfdfe5d daddgdbfdhe6d daddgdbfdhe5d dad?dgdbfdie6d dad?dgdbfdie5ddaddgdbfdje6ddaddgdbfdje5ddad?dgdbfdke6ddad?dgdbfdke5d daddldbfdmi e6d daddldbfdme5d dad?dldbfdne6d dad?dldbfdne5ddaddldbfdoe6ddaddldbfdoe5ddad?dldbfdpe6ddad?dldbfdpe5d daddqdbfdre6d daddqdbfdre5d dad?dqdbfdse6d dad?dqdbfdse5ddaddqdbfdte6ddaddqdbfdte5ddgddqdbfdte6ddgddqdbfdte5ddad?dqdbfdue6ddad?dqdbfdui e5ddaddvdbfdwe5d daddxdbfdye5ddaddxdbfdye6ddaddxdbfdze5ddad?dxdbfd{e5ddgddxdbfd|e6ddgddxdbfd}e5d d~dddbfde6d d~dddbfde5ddadddbfde5ddgdddbfde6ddgdddbfde5dd~dddbfde6dd~dddbfde5ddadddgfde6ddadddgfde5d?dadddbfdi e6d?dadddbfde5d?dad?ddbfde6d?dad?ddbfde5d?dadddbfde6d?dadddbfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddafde6d?dadddafde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfdi e5d?dadddgfde6d?dadddgfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddfde6d?dadddfde5d?dadddbfde6d?dadddbfde5d?dadddbfde6d?dadddbfde5d?dadddfde6d?dadddfde5d?dadddafde6d?dadddafde5d?dadddgfdi e6d?dadddgfde5dAdaddadbfde6dAdaddadbfde5dAdad?dadbfde6dAdad?dadbfde5dAdaddgdbfde6dAdaddgdbfde5dAdad?dgdbfde6dAdad?dgdbfde5dAdaddldbfde6dAdaddldbfde5dAdad?dldbfde6dAdad?dldbfde5dAdaddqdbfde6dAdaddqdbfde5dAdadddfde5dAdadddgfdi e6dAdadddgfde5dAdad?dqdbfde6dAdad?dqdbfde5dEdadddbfde6dEdadddbfde5dEdadddfde6dEdadddfde5dEdadddfde6dEdadddfde5dEdadddbfde6dEdadddbfde5dGdaddqdbfdte6dGdaddqdbfdte5dGdadddbfde6dGdadddbfde5dKdadddbfde6dKdadddbfdZceddd ecD Zeg dZfegejhddse%dd dddĄZiddd˄ZjdddτZki Zli ZmdddԄZnG dd̄ deZoedepeqgef ZrdddۄZsdddބZtdddZue,reevef ZwneZwG ddք dewZxelex_lemex_me+a D ]#\ZyZzez{ddZze|exdez eley d  e|exdez emey  q[l[m[y[zG dd dexZ}e}Z~G dd dejZi dde5dddadfdde5dddqdfdde5dddd?fdde5dAddqdfdde5dAddd?fdde5dd?ddfdde5dddxdfdde5dd?dxdfdde5ddAddfdde5d?dddfdde5d?ddd fdde5d?ddd?fdde5dEdddfdde5dGdddfdde5dKdddfdde6dd?ddfdde6dddxdfd e6dd?dxdfde6ddAddfdZdd	d
ZG dd dejZdddZeejeei eeje eeje eejddg eejd dS (      )annotationsN)IteratorMutableMapping)Fraction)NumberRational)IOAnyCallableNoReturncast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecate)StrOrBytesPath)DeferredErroris_pathTYPESF)BufferIntegralLike   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  iI  is  ii  i  i  i  i  raw   
tiff_ccitt   group3   group4   tiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  tiff_raw_16i  packbitsi)  tiff_thunderscani  tiff_deflateit  tiff_sgilogiu  tiff_sgilog24im  lzmaiP  zstdiQ  webpc                 C  s   i | ]\}}||qS  r=   ).0kvr=   r=   g/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    rB   r   r=   )1z1;I)rD   z1;IR)rD   rD   )rD   z1;R)r&   )LzL;2I)rE   zL;2IR)rE   zL;2)rE   zL;2R)r*   )rE   zL;4I)rE   zL;4IR)rE   zL;4)rE   zL;4R)r2   )rE   zL;I)rE   zL;IR)rE   rE   )rE   zL;R)   )I;16zI;12)   )rG   rG   )I;16BrI   )rG   zI;16R)II;16S)rJ   I;16BS)r(   )    )FF;32F)rN   F;32BF)rJ   zI;32N)rJ   I;32S)rJ   I;32BS)r2   r2   )LArS   )r2   r2   r2   )RGBrT   )rT   zRGB;R)r2   r2   r2   r2   )RGBArU   r   )rT   RGBX)r2   r2   r2   r2   r2   r   r   )rT   RGBXX)r2   r2   r2   r2   r2   r2   )r   r   r   )rT   RGBXXX)rU   RGBa)r   r   )rU   RGBaX)r   r   r   )rU   RGBaXX)r&   r   )rU   RGBAX)r&   r   r   )rU   RGBAXX)i  )rH   rH   rH   )rT   zRGB;16L)rT   zRGB;16B)rH   rH   rH   rH   )rU   zRGBA;16L)rU   zRGBA;16B)rT   zRGBX;16L)rT   zRGBX;16B)rU   zRGBa;16L)rU   zRGBa;16B)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`   )r`   PX)PArb   )r`   zP;R)CMYKrc   )rc   CMYKX)rc   CMYKXX)rc   zCMYK;16L)rc   zCMYK;16B)LABrf   c                 c  s    | ]	}t |d  V  qdS )r*   N)len)r>   key_tpr=   r=   rA   	<genexpr>      ri   )s   MM *s   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsTz*Support for LibTIFF earlier than version 4rF   prefixbytesreturnboolc                 C  s   |  ttS N)
startswithtuplePREFIXESrl   r=   r=   rA   _accept#     ru   valfloat | Fraction | IFDRationalmax_valint!tuple[IntegralLike, IntegralLike]c                 C  s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)rw   ry   invn_dr=   r=   rA   _limit_rational'  s   r   r~   min_valc                 C  sp   t | }|j|jf}tdd |D |k rt| t|}tdd |D }t||kr6t|d |d  |}|S )Nc                 s      | ]}t |V  qd S rp   floatr>   ir=   r=   rA   ri   5      z)_limit_signed_rational.<locals>.<genexpr>c                 s  r   rp   r   r   r=   r=   rA   ri   8  r   r   r   )r   	numeratordenominatorminr   r}   rr   max)rw   ry   r   fracr   	n_d_floatr=   r=   rA   _limit_signed_rational/  s   r   opstrr	   c                   s   d	 fdd}|S )
Nselfr~   argstuple[float, ...]rn   bool | float | Fractionc                   s   t | j | S rp   )getattr_valr   r   r   r=   rA   delegateG  s   z_delegate.<locals>.delegate)r   r~   r   r   rn   r   r=   )r   r   r=   r   rA   	_delegateF  s   r   c                   @  sd  e Zd ZdZ	 dZ	dAdBd
dZedCddZedDddZdEddZ	dFddZ
dDddZdGddZdHd d!ZdId#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d2Zed3Zed4Zed5Z ed6Z!ed7Z"ed8Z#ed9Z$ed:Z%ed;Z&ed<Z'ed=Z(ed>Z)e*e+d?red?Z,d@S d@S )Jr~   zImplements 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_denominatorr   r   valuerx   r   rz   rn   Nonec                 C  s   |  t |tr|j| _|j| _|j| _dS t |tr#|j| _|j| _ntr,t	t
|| _n|| _|| _|dkr=td| _dS |dkrHt|| _dS t||krXtt||| _dS 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   )
isinstancer~   r   r   r   r   r   r   TYPE_CHECKINGr   r   r   rz   )r   r   r   r=   r=   rA   __init__]  s(   


zIFDRational.__init__r   c                 C     | j S rp   )r   r   r=   r=   rA   r        zIFDRational.numeratorc                 C  r   rp   )r   r   r=   r=   rA   r     r   zIFDRational.denominatormax_denominatortuple[IntegralLike, int]c                 C  s>   | j dkr| j| j fS t| jtsJ | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )r   r   r   r   r   limit_denominator)r   r   fr=   r=   rA   r     s
   
zIFDRational.limit_rationalr   c                 C  s   t t| jS rp   )r   r   r   r   r=   r=   rA   __repr__  rv   zIFDRational.__repr__c                 C  s
   | j  S rp   )r   __hash__r   r=   r=   rA   r        
zIFDRational.__hash__otherobjectro   c                 C  s0   | j }t|tr|j }t|trt|}||kS rp   )r   r   r~   r   )r   r   rw   r=   r=   rA   __eq__  s   

zIFDRational.__eq__%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS rp   )r   r   r   r   r=   r=   rA   __getstate__     zIFDRational.__getstate__statec                 C  s^   t | d |\}}}t|ttfsJ || _tr tt|| _	n|| _	t|t
s*J || _d S Nr   )r~   r   r   r   r   r   r   r   r   r   rz   r   )r   r   r   r   r   r=   r=   rA   __setstate__  s   

zIFDRational.__setstate____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__NrC   )r   rx   r   rz   rn   r   )rn   r   rn   rz   )r   rz   rn   r   rn   r   )r   r   rn   ro   )rn   r   )r   r   rn   r   )-__name__
__module____qualname____doc__	__slots__r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   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=   rA   r~   O  s\    "






ImageFileDirectory_v2idxsize$Callable[[_LoaderFunc], _LoaderFunc]c                   s   d fdd}|S )Nfunc_LoaderFuncrn   c                   sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r,   _ )r   r   r   rq   replace_load_dispatch)r   r   r   r   r=   rA   	decorator  s
   z#_register_loader.<locals>.decorator)r   r   rn   r   r=   )r   r   r   r=   r   rA   _register_loader  s   r   2Callable[[Callable[..., Any]], Callable[..., Any]]c                   s   d fdd}|S )Nr   Callable[..., Any]rn   c                   s   | t  < | S rp   )_write_dispatch)r   r   r=   rA   r     s   z#_register_writer.<locals>.decorator)r   r   rn   r   r=   )r   r   r=   r   rA   _register_writer  s   r   idx_fmt_nametuple[int, str, str]r   c                   sb   ddl m} | \} }|||< td  	dd fdd}|ft|<  fddt|< d S )Nr   r   =Tr   r   datarm   
legacy_apiro   rn   tuple[Any, ...]c                   s   |  t|    |S rp   )_unpackrg   r   r   r   fmtr   r=   rA   basic_handler  s   z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S rp   )_packr>   r   )r   r   r=   rA   ri     rj   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinr   values)r   r   rA   <lambda>  s   z!_register_basic.<locals>.<lambda>T)r   r   r   rm   r   ro   rn   r   )r   r   structcalcsizer   r   )r   r   r   namer   r=   r   rA   _register_basic  s   
r  c                   @  sR  e Zd ZU dZi Zded< i Zded< 			d}d~ddZedd Z	edd Z
edddZejdddZdddZdddZdd!d"Zdd$d%Zdd(d)Zdd+d,Zdd-d.Zdd0d1Zdd2d3Zdd5d6Zdd:d;Zdd=d>Zeeeejd?d@fejdAdBfejdCdDfej dEdFfej!dGdHfej"dIdJfej#dKdLfej$dAdBfej%dMdNfg	 e&dOdOdddQdRZ'e(dOddTdUZ)e&dVdOdddWdXZ*e(dVddZd[Z+e&d\d]	Pddd_d`Z,e(d\ddbdcZ-e&dddOdddedfZ.e(ddddgdhZ/e&did]	PdddjdkZ0e(diddldmZ1ddqdrZ2ddsdtZ3ddudvZ4dddydzZ5dd{d|Z6dS )r   a  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``.

    z"dict[int, tuple[int, _LoaderFunc]]r   zdict[int, Callable[..., Any]]r      II*     Nifhrm   rl   bytes | Nonegroup
int | Nonern   r   c                 C  s   t |sdt| d}t||dur|n|dd | _| jtkr&d| _n| jtkr/d| _nd}t||d dk| _|| _i | _		 | 
  | jrV| d	|d
d d n| d|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+   Qr2   r   rE   r*   F)ru   reprSyntaxError_prefixMM_endianII_bigtiffr
  tagtyperesetr   next_legacy_api)r   r  rl   r
  msgr=   r=   rA   r   H  s(   


zImageFileDirectory_v2.__init__c                 C  r   rp   )r  r   r=   r=   rA   r  o      zImageFileDirectory_v2.<lambda>c                 C  r   rp   )_offsetr   r=   r=   rA   r  p  r  ro   c                 C  r   rp   )r  r   r=   r=   rA   r   r  r   z ImageFileDirectory_v2.legacy_apir   r   c                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)r   r   r  r=   r=   rA   r   v  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rp   )_tags_v1_tags_v2_tagdatar  _nextr  r   r=   r=   rA   r  {  s   
zImageFileDirectory_v2.resetr   c                 C  s   t t| S rp   )r   dictr   r=   r=   rA   __str__     zImageFileDirectory_v2.__str__dict[str, Any]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
  r  )r>   coder   r   r=   rA   rB     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r=   r   rA   named  s   
zImageFileDirectory_v2.namedrz   c                 C     t t| jt| jB S rp   )rg   setr!  r   r   r=   r=   rA   __len__     zImageFileDirectory_v2.__len__tagr	   c                 C  sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S rp   )r   r!  r  r   r   r   rr   rm   )r   r/  r   typr   handlerrw   r=   r=   rA   __getitem__  s   



z!ImageFileDirectory_v2.__getitem__r   c                 C     || j v p	|| jv S rp   )r   r!  r   r/  r=   r=   rA   __contains__     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S rp   )_setitemr   )r   r/  r   r=   r=   rA   __setitem__  r6  z!ImageFileDirectory_v2.__setitem__r   c              
     s  t ttf}t|| j t||r|gn|}|| jvr jr% j| j|< ntj	| j|< t
dd |D rS|D ]}t|ts?J |dk rKtj| j|<  nq6tj| j|< nt
dd |D rd}d}d}	|D ]/}t|tsmJ |r|d|  krydk s|n d}|rd|  k rd	k sn d}|	r|dk rd}	qd|rtj| j|< nH|rtj| j|< n?|	rtj| j|< n6tj| j|< n/t
d
d |D rtj| j|< nt
dd |D rtj| j|< nt
dd |D rtj| j|< | j| tj	krd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sL| j| tjksL jd u rt|dkr|s|r^| j| tjtjfv r^|f}z|\||< W d S  ty   td| dt| d |d ||< Y d S w |||< d S )Nc                 s      | ]}t |tV  qd S rp   )r   r~   r>   r@   r=   r=   rA   ri         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c                 s  r9  rp   )r   rz   r:  r=   r=   rA   ri     r;  Tr    Fi i   c                 s  r9  rp   )r   r   r:  r=   r=   rA   ri     r;  c                 s  r9  rp   )r   r   r:  r=   r=   rA   ri     r;  c                 s  r9  rp   )r   rm   r:  r=   r=   rA   ri     r;  c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   r   encoder:  r=   r=   rA   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r=   )r   rz   r   r:  r=   r=   rA   r>    s   " c                 3  s(    | ]}t |tr |n|V  qd S rp   )r   r   cvt_enumr   infor=   rA   ri     s
    
r   zMetadata Warning, tag z had too many entries: z, expected 1)r   rm   r   r   r'  r
  r   r  type	UNDEFINEDallr~   SIGNED_RATIONALRATIONALrz   SHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr#  rr   r  r   lengthrg   
ValueErrorwarningswarn)r   r/  r   r   	basetypesr   r@   shortsigned_shortlongis_ifddestr=   r@  rA   r7    s   

 zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S rp   )r   popr  r!  r4  r=   r=   rA   __delitem__  s   z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  r+  rp   )iterr,  r!  r   r   r=   r=   rA   __iter__  r.  zImageFileDirectory_v2.__iter__r   r   r   c                 C  s   t | j| |S rp   )r  unpackr  )r   r   r   r=   r=   rA   r        zImageFileDirectory_v2._unpackr   c                 G  s   t j| j| g|R  S rp   )r  packr  )r   r   r   r=   r=   rA   r     r.  zImageFileDirectory_v2._packHrS  rE   rU  bzsigned bytehzsigned shortlzsigned longr   r   ddoubler  long8r   Tc                 C     |S rp   r=   r   r=   r=   rA   	load_byte"     zImageFileDirectory_v2.load_bytebytes | int | IFDRationalc                 C  s*   t |tr	t|}t |trt|f}|S rp   )r   r~   rz   rm   r   r   r=   r=   rA   
write_byte&  s
   


z ImageFileDirectory_v2.write_byter&   c                 C  s"   | dr|d d }|ddS )N    r|   zlatin-1r   )endswithdecoder   r=   r=   rA   load_string.  s   
z!ImageFileDirectory_v2.load_stringstr | bytes | intc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr<  r   rm  )r   rz   r   rm   r=  r   r   r=   r=   rA   write_string4  s
   

z"ImageFileDirectory_v2.write_stringr,   r2   )tuple[tuple[int, int] | IFDRational, ...]c                   X   |  t|d  d|}dfdd	 t fd
dt|d d d |dd d D S )Nr*   rE   arz   ra  rn   tuple[int, int] | IFDRationalc                       r| |fS t | |S rp   r~   rv  ra  r   r=   rA   combineC     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S rp   r=   r>   numdenomr|  r=   rA   ri   F      z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r&   r   rv  rz   ra  rz   rn   rw  r   rg   rr   zipr   r   r   valsr=   r|  r   rA   load_rational=     0z#ImageFileDirectory_v2.load_rationalr~   c                      d  fdd|D S )Nr   c                 3  s(    | ]} j d gt|dR  V  qdS )2Ll    N)r   r   r>   r   r   r=   rA   ri   J  s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r=   r   rA   write_rationalH  s   z$ImageFileDirectory_v2.write_rationalr0   c                 C  rg  rp   r=   r   r=   r=   rA   load_undefinedN  ri  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr<  r   )r   r~   rz   r   r=  rr  r=   r=   rA   write_undefinedR  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   ru  )Nr*   rc  rv  rz   ra  rn   rw  c                   rx  rp   ry  rz  r{  r=   rA   r|  `  r}  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  r~  rp   r=   r  r  r=   rA   ri   c  r  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r&   r   r  r  r  r=   r  rA   load_signed_rationalZ  r  z*ImageFileDirectory_v2.load_signed_rationalc                   r  )Nr   c                 3  s*    | ]} j d gt|ddR  V  qdS )2lii   N)r   r   r  r   r=   rA   ri   g  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r=   r   rA   write_signed_rationale  s   z+ImageFileDirectory_v2.write_signed_rationalfp	IO[bytes]r   c                 C  s8   | |}t||krd| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrg   OSError)r   r  r   retr  r=   r=   rA   _ensure_readl  s   
z"ImageFileDirectory_v2._ensure_readc              
   C  st  |    | | _z| jr| d| |dn	| d| |dd }t|D ]}| jr7| d| |dn	| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z	| j| \}}W n ty{   td|
| Y q(w || }|| jrdndkr| }| | jrdnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 q(|st|
 q(|| j|< || j|< |
d7 }
|
|dkrd| dnt|7 }
t|
 q(| jr| d| |dn	| d| |d\| _W d S  ty9 }
 ztt|
 W Y d }
~
d S d }
~
ww )Nr  r2   r`  r&   r   HHQ8s   HHL4srF   unknownztag:  (
) - type: )z%s - unsupported type %sr*   rE   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r  z. Skipping tag z
 - value: rM   <table:  bytes>)r  tellr  r  r   r  ranger   r'  r
  r  r   getr   KeyErrorloggerdebugseekr   
_safe_readrg   rP  rQ  r!  r  r  r  r  r   )r   r  	tag_countr   r/  r0  countr   tagnametypnamer  	unit_sizer1  r   hereoffsetr=   r=   rA   loadv  sx   






 zImageFileDirectory_v2.loadc                 C  s`   | j | d| jr
dnd }| jr|| ddd7 }|| jr'| dd7 }|S | d	d7 }|S )
Nr`  r  *   HHr2   r   r  rH   rE   )r  r   r  r   r  r=   r=   rA   _get_ifh  s   zImageFileDirectory_v2._get_ifhr   r  c              
     s`  |  | jrdndt| j}g }| jrdnd}| jrdnd} t|t| j| jr+dnd  | 7  d }t| j D ]\}}|tkrGt|}| j| }	t	d||	t
| |	tjko_t|t}
|
rt|  |d	}| j| }| D ]\}}|||< qs| }nt|tr|n|f}| j|	 | g|R  }t|| jj}|
rd
nt|	d}d| d| d| d|	 d	}|t|dkrdt| dnt|7 }t	| |
rd}n|	tjtjtjfv rt|}nt|}t||kr|||	|||ddf q;|||	||  | |f  t|d d d 7  q;|d urb|| \}}	}}}|rK| j|	 \}} fdd|| || j D }| j|	 | g|R  }n|  || !||d   }||	|||f||< |D ]'\}}	}}}t	d||	|t
|t
| ||  | jrdnd||	||7 }qd||  |d7 }|D ]\}}	}}}||7 }t|d@ r|d7 }q|S )Nr  r`  rE   r2   r*   r  rF   zTag %s, Type: %s, Value: %s)r
  ifdr  zsave: r  r  z) - value: rH   r  r  r   rm  r   r&   c                   s   g | ]}|  qS r=   r=   )r>   rw   r  r=   rA   r>        z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %sr  r  )"r   r  rg   r   sortedr)  STRIPOFFSETSr  r  r  r  r   rI  r   r#  r   r  tobytesrr   r   r'  r
  r  r   r  r   rM  rL  rC  appendljustr   r   r   )r   r  resultentriesr   fmt_sizestripoffsetsr/  r   r0  rV  r  r   ifd_tag	ifd_valuer   r  r  r  r  r   r1  r=   r  rA   r    sp   "


(



zImageFileDirectory_v2.tobytesc                 C  sB   |  dkr||   |  }| |}|| |t| S r   )r  writer  r  rg   )r   r  r  r  r=   r=   rA   save  s   

zImageFileDirectory_v2.save)r  NN)r  rm   rl   r	  r
  r  rn   r   )rn   ro   )r   ro   rn   r   rn   r   r   )rn   r&  r   r/  rz   rn   r	   r/  r   rn   ro   r/  rz   r   r	   rn   r   )r/  rz   r   r	   r   ro   rn   r   )r/  rz   rn   r   rn   rZ  )r   r   r   rm   rn   r   )r   r   r   r	   rn   rm   r  )r   rm   r   ro   rn   rm   )r   rj  rn   rm   )r   rm   r   ro   rn   r   )r   rq  rn   rm   )r   rm   r   ro   rn   rt  )r   r~   rn   rm   )r   rj  rn   rm   )r  r  r   rz   rn   rm   )r  r  rn   r   )rn   rm   rV   )r  rz   rn   rm   )r  r  rn   rz   )7r   r   r   r   r   __annotations__r   r   r   rl   r  r   setterr  r$  r*  r-  r2  r5  r8  r7  rY  r\  r   r   listmapr  r   rG  rI  SIGNED_BYTErH  rJ  FLOATrK  IFDLONG8r   rh  r   rl  rp  rs  r  r  r  r  r  r  r  r  r  r  r  r=   r=   r=   rA   r     s   
 <'








^

















CPr   r   r   write_c                      s   e Zd ZU dZd$ fddZed	d
 Zedd
 Zded< 	 e	d%ddZ
d&ddZd'ddZd(ddZd)ddZd*d d!Zd+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
    r   r	   kwargsrn   r   c                   s   t  j|i | d| _d S )NT)superr   r  )r   r   r  	__class__r=   rA   r   8  s   
zImageFileDirectory_v1.__init__c                 C  r   rp   )r  r   r=   r=   rA   r  <  r  zImageFileDirectory_v1.<lambda>c                 C  r   rp   )r!  r   r=   r=   rA   r  =  r  zdict[int, int]r  originalr   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`

        rt   )rl   r!  r  r  )clsr  r  r=   r=   rA   from_v2C  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`

        rt   )r   rl   r#  r!  r  r   )r   r  r=   r=   rA   to_v2U  s
   zImageFileDirectory_v1.to_v2r/  r   ro   c                 C  r3  rp   )r  r!  r4  r=   r=   rA   r5  f  r6  z"ImageFileDirectory_v1.__contains__rz   c                 C  r+  rp   )rg   r,  r!  r  r   r=   r=   rA   r-  i  r.  zImageFileDirectory_v1.__len__rZ  c                 C  r+  rp   )r[  r,  r!  r  r   r=   r=   rA   r\  l  r.  zImageFileDirectory_v1.__iter__r   c                 C  s   dD ]	}|  ||| qd S N)FT)r7  )r   r/  r   r   r=   r=   rA   r8  o  s   z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vr&| j| }| j| }| j| \}}dD ]}| ||| ||| q| j | }t|ttfs5|f}|S r  )r  r!  r  r   r7  r   rr   rm   )r   r/  r   r0  r   r1  legacyrw   r=   r=   rA   r2  s  s   



z!ImageFileDirectory_v1.__getitem__)r   r	   r  r	   rn   r   )r  r   rn   r  )rn   r   r  r   r  r  r  )r   r   r   r   r   r   tagstagdatar  classmethodr  r  r5  r-  r\  r8  r2  __classcell__r=   r=   r  rA   r  %  s   
 




r  c                      s   e Zd ZdZdZdZ	d'd( fddZd)ddZed*ddZ	d+ddZ
d+ddZd*ddZd,ddZd- fddZd)dd Zd)d!d"Zd-d#d$Zd)d%d&Z  ZS ).TiffImageFileTIFFz
Adobe TIFFFNr  StrOrBytesPath | IO[bytes]filenamestr | bytes | Nonern   r   c                   s   |  	 |  	 t  || d S rp   )r  r   )r   r  r  r  r=   rA   r     s
   zTiffImageFile.__init__c                 C  s   | j d}|d dkr|| j d7 }t|| _| 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 filer2   r&   r  r|   Nz*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r  r  r   tag_v2r  _TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r  _seekr  r=   r=   rA   _open  s   

zTiffImageFile._openrz   c                 C  sj   | j }|d u r+|  }| t| j | j d u r&| |  d  | j d u s| | | j d us2J | j S )Nr   )r  r  r  rg   r  r  )r   current_n_framescurrentr=   r=   rA   n_frames  s   


zTiffImageFile.n_framesframec                 C  sP   |  |sdS | | | jdur$| jj| jks| jj| jkr&d| _dS dS dS )z%Select a given frame as current imageN)_seek_checkr  _imimr   
_tile_sizemode)r   r  r=   r=   rA   r    s   



zTiffImageFile.seekc                 C  s  t | jtr
| jj| j| _t| j|kr| jsd}t|t	
d|| j| j| j  | jdkr7d}t|| j| j | j| j t	
d| j  | j| j | jj| jv r`d| _n| jj| _| jdkro|d | _t| jdkr|| jdk| _|  jd7  _t| j|ks| j| j|  | j| j t| jv r| jt | jd< n	d| jv r| jd= |   t| j | _| _|| _|   d S )	Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r   xmp)r   r  r   exr  rg   r  r  EOFErrorr  r  r  r  rO  r  r  r  r  r  r  is_animatedXMPrA  _reload_exifr  r  r/  r  _setup)r   r  r  r=   r=   rA   r    sP   





zTiffImageFile._seekc                 C  r   )zReturn the current frame number)r  r   r=   r=   rA   r    r   zTiffImageFile.telldict[int, dict[str, bytes]]c                 C  s   i }| j tjj}|rZ|drZt|dd }t|d d d d }t	|d| d|  }|d| d| |  }d|i||< |td| | d d d }|ds|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.
        s   8BIMr*   r.   r   r&   r  r   N)
r  r  r   BaseImageResourcesrq   i16mathceili32)r   blocksrw   idnr   r   r=   r=   rA   get_photoshop_blocks  s   
"
z"TiffImageFile.get_photoshop_blocksImage.core.PixelAccess | Nonec                   s   | j r
| jr
|  S t  S rp   )tileuse_load_libtiff_load_libtiffr  r  r   r  r=   rA   r    s   
zTiffImageFile.loadc                 C  s:   | j d u rt| j tj| j| j| _tj	|  d S rp   )
r  r   _decompression_bomb_checkr  corenewr  r  r   load_preparer   r=   r=   rA   r    s   
zTiffImageFile.load_preparec                 C  sd   | j sd| _|  }tjD ]}||vrq|| qtj| dd tj	j
| jv r0| jtj	j
= d S d S )NT)in_place)r  !_close_exclusive_fp_after_loadinggetexifr   TAGS_V2_GROUPSget_ifdr   exif_transposer   r  Orientationr  )r   exifkeyr=   r=   rA   load_end  s   
zTiffImageFile.load_endc              
   C  s
  t j |  |   t| jdksd}t|| jd d }| jd d }zt| jdo0| j }t| jdr<| j	  W n tyH   d}Y nw |r^t
|tsRJ t|}||d< t|}t | jd	|| j}z	|| j| W n ty } zd
}t||d}~ww | jo| j }t| jdrtd || j \}	}
n<|rtd |s| jd t|dtj}|d\}	}
t||tj ntd | jd || j \}	}
g | _d| _|    |r| j!  d| _|
dk rd|
 }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 readingzdecoder error )"r   r  r  rg   r  r  r   r  r"  r#  r   rr   r  _getdecoderr  decoderconfigsetimager  rO  _exclusive_fpr  r  r  ro  r%  r  oslseekSEEK_CURSEEK_SETr  readonlyr!  close)r   r  extentsr   r  	args_listdecodereclose_self_fpr  errposr=   r=   rA   r  ,  sh   







zTiffImageFile._load_libtiffc                  C  s  d| j v rd}t|t| j td | _| j td| _| j td}| jdkr+d}| j t	d}t
d t
d| j t
d	| t
d
| j t
d| t
d| j t z| j t }| j t }W n tyz } zd}t||d}~ww t|trt|tsd}t|||f| _| j tjj}|dv r||f| _n||f| _t
d| j | j td}t|dkrt|t|  krdkrn nd}| j td}	| j td}
|dv rd}n	|dkrd}nd}|t|
7 }t|	}| j t | jdkr|dv rdnd}|t!krt
"d| d}t#|||k r&|	d| }	n||kr4|dkr4|	| }	t|	|krAd}t#|| j j$||||	|
f}t
d| z	t%| \| _&}W n tys } zt
d d}t#||d}~ww t
d| t
d | j' | j| j(d!< | j t)d}| j t*d}|r|r| j t+}|d"kr||f| j(d#< n,|dkr|d$ |d$ f| j(d#< n|du r||f| j(d#< ||f| j(d%< n||f| j(d%< d } }}g | _,t-p| jd&k| _.| j.rT|d"kr|dd d |dd  }t
d| t%| \| _&}|dkr$| jd'kr$| jdkr$d(}n|d)kr,d*}n|/d+r:|dd, d- }|| jd.| j j0f}| j,1t23d/dd||fd| nt4| j v s`t5| j v rt4| j v ru| j t4 }| j t6|}|}n%| j t5 }| j t7}| j t8}t|trt|tsd0}t||}||kr||kr| jd"kr|d,d }|D ]b}|| |kr|t9|	 d1 }nd}|}| jd"kr|| }|| }|t|df}| j,1t23| j||t|| |t|| |f|| ||7 }||krd|| }}||krd}|d7 }qnt
d2 d}t#|t:| j v r/| j t: | j(d3< | j'd4v rKd5d6 | j t; D }t<=d7d8>|| _?dS dS )9z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r/   r.   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %szMissing dimensionsNzInvalid dimensions)r,   r.   r0   r2   z
- size: %srC   r=   )r&   r.   r2   r(   r,   r*   )r&   r.   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr&   dpigRQ@
resolutionr%   r1   rT   rG   I;16N)z;16Bz;16Lr|   NFr$  zInvalid tile dimensionsr2   z- unsupported data organizationicc_profiler`   rb   c                 S  s   g | ]}t |d  qS r"   r   )r>   ra  r=   r=   rA   r>  z  s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )@r  r  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHr  	TypeErrorr   rz   rO  r  r   r  r  _sizer   SAMPLEFORMATrg   r   r   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr  rl   	OPEN_INFO_moder  rA  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  rn  r  r  r   _Tiler  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r%   r   palette) r   r  photo	fillorderxsizeysizer3  orientationsample_format	bps_tupleextra_tuple	bps_countbps_actual_countsamples_per_pixelr   rawmodexresyresresunitxylayerrv  offsetsrb  w	tilewidthr  stridetile_rawmoder   r`  r=   r=   rA   r    s<  






,









"

 


zTiffImageFile._setuprp   )r  r  r  r  rn   r   r  r   )r  rz   rn   r   )rn   r  )rn   r  )r   r   r   formatformat_descriptionr  r   r  r   r  r  r  r  r  r  r  r!  r  r  r  r=   r=   r  rA   r    s$    



.



`r  rD   rE   rS   r`   rb   rJ   rQ   rG   rK   rN   rO   rT   rW   rU   rc   YCbCrrf   rR   rI   rL   rP   )rL   rP   r  Image.Imager  r  r  str | bytesc           6      C  st	  zt | j \}}}}}}W n ty% }	 zd| j d}
t|
|	d }	~	ww | j}| j}t|d}|dr9d|_z|d }W n tyU   | j	d}t
|trSd }Y nw |d u r]d}n|dkrdd	}n|d
krjd}tpo|dk}d|t< | jd |t< | jd |t< d|v r|d }nd|v r|d }t
|trt }|| |}ni }tdt| t
|tr| }|D ]/}t
|tjr|tjv r||||< n||||< z
|j| |j|< W q ty   Y qw i }t| dr| j  }i |t!| di }t"t#fD ]}||v r||= qt| drNt$t%t&t't(t)fD ]0}|| j*v rL|t'kr<| j*j| tj+tj,fvr<||= q| j*| ||< | j*j| |j|< q|d| j	d}|r_||t-< t.dft%dft&dft%dft&dft$dft/dft0dft1dft2dff
D ]\}}||v r|| ||< q|d}|rd|t$< |d |t%< |d |t&< |dkr||t3< t4|dkrt4||t5< |d ur||t6< |dkr||t#< t7|vr||t7< nK| jd v r%|t7 dkr%| jd!kr | 8 }| }|d urt9|j:D ]}t9|j;D ]}|||f d"krdnd"|||f< qq|} nt<=| } | jd#v rb| j>?d$d%}g }t4|d& }t9d&D ]} |d'd( |||  || d   D 7 }|dgd)|  7 }q>||t@< |t |t }!}"t4||!|d  d* d+  }#tA|vr|r|d,tB}$|#dkrdntC|$|# |"}%|d	krtC|%d* d+ d+ |"}%n|"}%|%dkrd}%|%|tA< |#dkrdn|#|tA  }&|"|tA  d |tA  }'|&d-krtjD|jtE< |&f|'d  |#|" |&|'d   f |tE< tFt9d|&|' |&|tG< tH|d|tI< | jd.krtJd/tKd0iL D ]\}}(|M||( qtNtOtPtQg})|rd1|v rP|d1 }*t
|*tr;|*dk s;|*d2krAd3}
tR|
|d	krLd4}
tR|
|*|tS< td5 td6tT|L  d}+t|d7r~z|Ud |V }+W n tWjXy}   Y nw i },|)tYtKtEtGtZt[g7 })t3|d i}-t\]|L |L D ]v\}}.|tj^vrt!tj_d8d9sq|tjv rtj`|,|< n'||jv r|j| |,|< nt
|.ttatbtfsԐqtc|jd}/|/r|/|,|< ||-vr||)vrt
|.tbr|.ed:d;d< |-|< qt
|.tfrta|.|-|< q|.|-|< qt#|-v r't4|-t# dkr'|-t# d |-t#< td=tT|-L  | jd>v r9d?}t|-L }0|0g  |||+||0|,f}1th| jd@|1|}2|2i| j>dA| j  	 |2etjjkdd  \}3}4|+ss|l|4 |3rwnq_|3dk rdB|3 dC}
t|
n"|)D ]}||= q|m|}5tjn| |tjoddA| j |5||#dfg dD|v rtp| dD| d S d S )ENzcannot write mode z as TIFFrt   big_tiffTr7  r%   r/   r1   r7   r3   r   r   tiffinfor  zTiffinfo Keys: %sr/  r  r<  descriptionr9  x_resolutiony_resolutionresolution_unitsoftware	date_timeartist	copyrightr8  r&   rC   )rD   rE   rD   r!   r=  rT   r?  r(   c                 S  s   g | ]}|d  qS r>  r=   r:  r=   r=   rA   r>  6  r  z_save.<locals>.<listcomp>r"   r0   r2   
strip_sizer    rz  )r   r   )r   r!      r!   r  r!   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr"  rk   Fr<  r   rm  zConverted items: %s)rI   rG   r:  r$  rX   zencoder error z when writing image file_debug_multipage)q	SAVE_INFOr  r  r  encoderinfoencoderconfigr   r  r  rA  r   rz   WRITE_LIBTIFFrC  r   rH  rI  rm   r   Exifr  r  r  r  r  r  r   r  r  r  r  r   r/  r   EXIFIFDrL  rV  rT  rU  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  rM  rC  r^  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTrM  rg   rO  rN  rE  copyr  heightwidthr   invertr  
getpaletter_  rZ  
STRIP_SIZEr   rI  STRIPBYTECOUNTSrr   r  COMPRESSION_INFO_REVrA  rG  REFERENCEBLACKWHITEr)  
setdefaultr[  r\  rY  TILEBYTECOUNTSrO  JPEGQUALITYr  r  r"  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainLIBTIFF_COREr  r  r   r   r'  rB  r=  r~   sort_getencoderr(  r   MAXBLOCKr  r  _saverX  setattr)6r  r  r  rl  rl   ra  rx  bitsextrar3  r  r  r  r  r7  r$  rA  r  r   
legacy_ifdsupplied_tagsr/  iccr  r8  inverted_impxrq  rp  lutcolormapcolorsr   rt  rb  rv  im_strip_sizerows_per_stripstrip_byte_countsstrips_per_imagedefault_value	blocklistr  r  typesattsr   rB  r  rv  encodererrcoder   r  r=   r=   rA   r    s  



















&
&






 








r  c                   @  sH  e Zd Zg dZh dZdVdWd
dZdXddZdXddZdXddZdYddZ	dZddZ
d[ddZejfd\ddZdXdd Zd]d#d$ZdXd%d&Zd^d)d*Zd_d,d-Zd`d.d/Zd[d0d1Zd[d2d3Zedad7d8Z	9dbdcd<d=Zddd>d?Zddd@dAZdddBdCZdedDdEZdddFdGZdddHdIZdXdJdKZ dXdLdMZ!dfdOdPZ"	dgdhdSdTZ#dUS )iAppendingTiffWriter)r   r   r   r&   r*   r2   r   r   r&   r*   r2   r*   r2   r*   r&   r*   r2   >       	     r#   r$   Ffnr  r  ro   rn   r   c                 C  s~   |  t |r(|| _d| _zt||rdnd| _W n ty'   t|d| _Y nw ttt || _d| _| j	 | _
|   d S )NTzw+bzr+bF)r   r  close_fpopenr   r  r   r   rm   r  	beginningsetup)r   r  r  r=   r=   rA   r     s   zAppendingTiffWriter.__init__c                 C  s   | j | jtj d | _d| _| j d | _}d|v | _	|s$d| _
d S d| _
|tvr1d}t|| |tr:dnd | j	rH| j dtj |   |   d S )	Nr   r*      +TFzInvalid TIFF file headerr  r  )r   r  r  r*  r-  whereToWriteNewIFDOffsetoffsetOfNewPager  IIMMr  isFirstrs   RuntimeError	setEndianrq   r  r,  skipIFDsgoToEnd)r   iimmr  r=   r=   rA   r    s"   
zAppendingTiffWriter.setupc                 C  s   | j rd S | j| j | jd}|sd S || jkr!d}t|| jr,| jdtj	 | 
| jr3dnd}|| j7 }| jd usBJ | j| j | || jrQdnd | j| |   d S )Nr*   z1IIMM of new page doesn't match IIMM of first pager2   )r  r   r  r  r  r  r  r  r*  r,  _readr  _writefixIFD)r   r  r  
ifd_offsetr=   r=   rA   finalize  s$   

zAppendingTiffWriter.finalizec                 C  s   |    |   d S rp   )r  r  r   r=   r=   rA   newFrame5  s   zAppendingTiffWriter.newFramec                 C  s   | S rp   r=   r   r=   r=   rA   	__enter__:  s   zAppendingTiffWriter.__enter__r   r   c                 G  s   | j r	|   d S d S rp   )r  r/  r   r=   r=   rA   __exit__=  s   zAppendingTiffWriter.__exit__rz   c                 C  s   | j  | j S rp   )r   r  r  r   r=   r=   rA   r  A  r   zAppendingTiffWriter.tellr  whencec                 C  s*   |t jkr
|| j7 }| j|| |  S )z
        :param offset: Distance to seek.
        :param whence: Whether the distance is relative to the start,
                       end or current position.
        :returns: The resulting position, relative to the start.
        )r*  r-  r  r   r  r  )r   r  r  r=   r=   rA   r  D  s   

zAppendingTiffWriter.seekc                 C  s^   | j dtj | j  }d|d  }d|  k rdk r'n n| j t| | j  | _d S )Nr   rH   )r   r  r*  SEEK_ENDr  r  rm   r  )r   r6  	pad_bytesr=   r=   rA   r  Q  s   
zAppendingTiffWriter.goToEndendianr   c                 C  sB   || _ | j  d| _| j  d| _| j  d| jrdnd | _d S )NrE   r`  r  r  )r  longFmtshortFmtr  	tagFormat)r   r  r=   r=   rA   r  [  s    zAppendingTiffWriter.setEndianc                 C  s|   	 |  | jrdnd}|dkr| j | jrdnd | _d S | j| |  | jr+dnd}| j|| jr7dnd tj q)NTr2   r*   r   r&   r  rF   )r  r  r   r  r  r  r*  r,  )r   r  num_tagsr=   r=   rA   r  a  s   zAppendingTiffWriter.skipIFDsr   r   c                C  s   | j |S rp   )r   r  rk  r=   r=   rA   r  n  r%  zAppendingTiffWriter.write
field_sizec                 C  s.   z	dddd| W S  t y   d}t|w )Nr`  rE   r  )r&   r*   r2   zoffset is not supported)r  r  )r   r  r  r=   r=   rA   _fmtq  s   zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S rp   )r  r]  r  r  r   r  )r   r  r   r=   r=   rA   r  x  s   zAppendingTiffWriter._readc                 C  
   |  dS Nr&   r  r   r=   r=   rA   	readShort~  r   zAppendingTiffWriter.readShortc                 C  r  Nr*   r  r   r=   r=   rA   readLong  r   zAppendingTiffWriter.readLongbytes_writtenr  expectedc                 C  s0   | d ur| |krd|  d| }t |d S d S )Nzwrote only z bytes but wanted )r  )r  r  r  r=   r=   rA   _verify_bytes_written  s   z)AppendingTiffWriter._verify_bytes_writtenr   r   new_field_sizec                 C  sJ   | j | tj |s|}| j t| j| | |}| 	|| d S rp   )
r   r  r*  r,  r  r  r_  r  r  r  )r   r   r  r  r  r=   r=   rA   _rewriteLast  s   z AppendingTiffWriter._rewriteLastc                 C  s   |  |dd d S )Nr&   r*   r  rr  r=   r=   rA   rewriteLastShortToLong  r^  z*AppendingTiffWriter.rewriteLastShortToLongc                 C     |  |dS r  r  rr  r=   r=   rA   rewriteLastShort  r%  z$AppendingTiffWriter.rewriteLastShortc                 C  r  r  r  rr  r=   r=   rA   rewriteLastLong  r%  z#AppendingTiffWriter.rewriteLastLongc                 C  s0   | j t| j| | |}| || d S rp   )r   r  r  r_  r  r  r  )r   r   r  r  r=   r=   rA   r    s   zAppendingTiffWriter._writec                 C     |  |d d S r  r  rr  r=   r=   rA   
writeShort  r   zAppendingTiffWriter.writeShortc                 C  r  r  r  rr  r=   r=   rA   	writeLong  r   zAppendingTiffWriter.writeLongc                 C  s    |    | jr| j  d S d S rp   )r  r  r   r/  r   r=   r=   rA   r/    s   zAppendingTiffWriter.closec              
   C  s*  |  | jrdnd}t|D ]}t| j| j| jrdnd\}}}| j| }|| }| jr1dnd}||k}	|	sG|  || j	 }
| 
|
| || jv r| j }tdt|j|t|d||| |	ru| || | j||  q| j|
 | || | j| q|	r| j|tj qd S )Nr2   r&   rF   r*   z;fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %dr  )r  r  r  r  r]  r  r   r  
fieldSizesr  r  Tagsr  r  r  r   r'  r  r   r  _fixOffsetsr  r*  r,  )r   r  r   r/  
field_typer  r  
total_sizer  is_localr  cur_posr=   r=   rA   r    sB   






zAppendingTiffWriter.fixIFDr  c                 C  s   t |D ]^}| |}|| j7 }d}| jr |dv r |dkr d}n
|dkr*|dkr*d}|r\|dkr6d	}t|| ||| | d d }| j|tj	 | 
| | jd| tj	 q| || qd S )
Nr   )r&   r*   l        r2   r&   r    r*   r   znot implemented)r  r  r  r  r  r  r   r  r*  r,  r  )r   r  r  r   r  r  r  rewindr=   r=   rA   r    s&   


zAppendingTiffWriter._fixOffsetsisShortisLongc                 C  s$   |rd}n|r
d}nd}|  ||S )Nr&   r*   r   )r  )r   r  r  r	  r  r=   r=   rA   
fixOffsets  s   zAppendingTiffWriter.fixOffsetsN)F)r  r  r  ro   rn   r   r  )rn   r  )r   r   rn   r   r   )r  rz   r  rz   rn   rz   )r  r   rn   r   )r   r   rn   rz   )r  rz   rn   r   )r  rz   rn   rz   )r  r  r  rz   rn   r   rV   )r   rz   r  rz   r  rz   rn   r   )r   rz   rn   r   )r   rz   r  rz   rn   r   )r  rz   r  rz   rn   r   )FF)r  rz   r  ro   r	  ro   rn   r   )$r   r   r   r   r  r   r  r  r  r  r  r  r  r-  r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r  r  r  r/  r  r  r
  r=   r=   r=   rA   r    sD    	























)r  c           	   	   C  s   t | jdg }t| ds|st| ||S |  }z\t|@}| g| D ]2}t|ds/i |_t|ds7d|_t|dd}t	|D ]}|
| |  t||| |  qAq%W d    n1 sbw   Y  W | 
| d S W | 
| d S | 
| w )Nappend_imagesr  r  r  r=   r   )r  r  r  r   r  r  r  r  r   r  r  r  r  )	r  r  r  r  cur_idxtfimsnfrr   r=   r=   rA   	_save_all 	  s.   




r  z.tifz.tiffz
image/tiff)rl   rm   rn   ro   )rw   rx   ry   rz   rn   r{   )rw   r~   ry   rz   r   rz   rn   r{   )r   r   rn   r	   )r   rz   r   rz   rn   r   )r   rz   rn   r   )r   r   rn   r   )r  r{  r  r  r  r|  rn   r   )
__future__r   r  r  loggingr	  r*  r  rP  collections.abcr   r   	fractionsr   numbersr   r   typingr   r	   r
   r   r    r   r   r   r   r   r   _binaryr   r  r   r  r   
_deprecater   _typingr   _utilr   r   r   r   r   r   	getLoggerr   r  rW  r  r  r  r  r  rH  rI  rM  rA  rE  rF  r  r  rO  rZ  r  rT  rU  rC  rV  r  r  r  r  	PREDICTORr_  r[  r\  rY  r  r  rN  rL  
JPEGTABLESrG  r  r  r  r  r^  r  r  r  IMAGEJ_META_DATA_BYTE_COUNTSIMAGEJ_META_DATAr@  r)  r  rR  r   rP  rs   r   r  ru   r   r   r   r   r   r~   rm   ro   r   r   r   r  rz   
_IFDv2Baser   r   r  r   r  r  ImageFileDirectoryr  r  r  BytesIOr  r  register_openrx  register_saveregister_save_allregister_extensionsregister_mimer=   r=   r=   rA   <module>   sb  ( 
	
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuxyz{~	
	     \    	

  8  .