HEX
Server: Apache
System: Linux srv1.prosuiteplus.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: prosuiteplus (1001)
PHP: 8.3.20
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/PIL/__pycache__/TiffImagePlugin.cpython-38.pyc
U

g�
^n��@s�
ddlZddlZddlZddlZddlZddlmZddlmZddl	m
Z
mZddlm
Z
mZmZmZddlmZmZddlmZd	Zd	Zd	Zd
ZdZdZd
ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-d Z.d!Z/d"Z0d#Z1d$Z2d%Z3d&Z4d'Z5d(Z6d)Z7d*Z8d+Z9d,Z:d-Z;d.Z<d/Z=d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dA�Z>dBdC�e>�?�D�Z@eddDddDdEfdFeddDddDdEfdFeddDdGdDdEfdHeddDdGdDdEfdHeddDddDdEfdIeddDddDdEfdIeddDdGdDdEfdJeddDdGdDdEfdJeddDddKdEfdLeddDddKdEfdLeddDdGdKdEfdMeddDdGdKdEfdMeddDddKdEfdNeddDddKdEfdNeddDdGdKdEfdOeddDdGdKdEfdOeddDddPdEfdQeddDddPdEfdQeddDdGdPdEfdReddDdGdPdEfdReddDddPdEfdSeddDddPdEfdSeddDdGdPdEfdTeddDdGdPdEfdTeddDddUdEfdVeddDddUdEfdVeddDdGdUdEfdWeddDdGdUdEfdWeddDddUdEfdXeddDddUdEfdXeddDdGdUdEfdYeddDdGdUdEfdYeddDddZdEfd[eddDdd\dEfd]eddDdd\dEfd^eddKdd\dEfd_eddKdd\dEfd`eddaddbdEfdceddaddbdEfddeddDddbdEfdeeddKddbdEfdfeddKddbdEfdgeddaddbdEfdceddaddbdEfddeddDddhdKfdieddDddhdKfdiedGdDddjdEfdkedGdDddjdEfdkedGdDdGdjdEfdledGdDdGdjdEfdledGdDddmdEfdnedGdDddmdEfdnedGdDddmdofdpedGdDddmdofdpedGdDddqdrfdsedGdDddqdrfdsedGdDddtdufdvedGdDddtdufdvedGdDddmdDfdwedGdDddmdDfdwedGdDddqdxfdyedGdDddqdxfdyedGdDddtdzfd{edGdDddtdzfd{edGdDddmdKfdnedGdDddmdKfdnedGdDddqd|fd}edGdDddqd|fd}edGdDddtd~fdedGdDddtd~fdedGdDddmd�fdnedGdDddmd�fdnedGdDdd�dEfd�edGdDdd�dEfd�edGdDdd�dEfd�edGdDdd�dEfd�edGdDdd�dofd�edGdDdd�dofd�edGdDdd�dDfd�edGdDdd�dDfd�edGdDdd�dKfd�edGdDdd�dKfd�ed�dDddDdEfd�ed�dDddDdEfd�ed�dDdGdDdEfd�ed�dDdGdDdEfd�ed�dDddKdEfd�ed�dDddKdEfd�ed�dDdGdKdEfd�ed�dDdGdKdEfd�ed�dDddPdEfd�ed�dDddPdEfd�ed�dDdGdPdEfd�ed�dDdGdPdEfd�ed�dDddUdEfd�ed�dDddUdEfd�ed�dDddhdKfd�ed�dDddhdKfd�ed�dDdGdUdEfd�ed�dDdGdUdEfd�ed�dDddmdEfd�ed�dDddmdEfd�ed�dDddqdofd�ed�dDddqdofd�ed�dDddtdrfd�ed�dDddtdrfd�ed�dDdd�dEfd�ed�dDddjdEfd�ed�dDddjdEfd�ed�dDddjdEfd�ed�dDddjdEfd�ioZAd�d�d�d�gZBd�d��ZCd�d��ZDd�d��ZEiZFiZGGd�d��d�e�ZHGd�d��d�e�ZIeFeI_FeGeI_Ge�?�D]B\ZJZKeK�Ld�d��ZKeMeId�eKeFeJd�eMeId�eKeGeJ��q�[F[G[J[KGd�d��d�eI�ZNeNZOGd�d��d�ej�ZPd�edddDdfd�edddUdfd�edddhdGfd�ed�ddUdfd�ed�ddhdGfd�eddGdbdfd�eddd\dfd�eddGd\dfd�edd�dbdfd�edGddjdfd�edGddmdfd�edGddmdGfd�ed�ddmdfd�ed�ddjdfd�ed�ddjdfd�eddGdbdfd�eddd\dfd�eddGd\dfd�edd�dbdfdǜZQd�dɄZRGd�d˄d˃ZSd�d̈́ZTe
�UePjVePeC�e
�WePjVeR�e
�XePjVeT�e
�YePjVd�d�g�e
�ZePjVdСdS)��N)�MutableMapping)�Fraction)�Number�Rational�)�Image�	ImageFile�ImagePalette�TiffTags)�i8�o8��TYPESFTsIIsMM�iiiii
i�iiiiiii(i-i1i2i;i=i@�DiRiSi[ii��i��iI�is�ii�i�ii��i���rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw�	tiff_jpeg�jpegZtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscanZtiff_deflateZtiff_sgilogZ
tiff_sgilog24ZlzmaZzstdZwebp)r�������i�i�i)�i��it�iu�im�iP�iQ�cCsi|]\}}||�qS�r)�.0�k�vrr�5/usr/lib/python3/dist-packages/PIL/TiffImagePlugin.py�
<dictcomp>�sr!�rr)�1z1;Ir)r#z1;IR)r#r#)r#z1;R)r)�LzL;2I)r$zL;2IR)r$zL;2)r$zL;2R)r)r$zL;4I)r$zL;4IR)r$zL;4)r$zL;4R)r)r$zL;I)r$zL;IR)r$r$)r$zL;R)�)�I;16zI;12)�)r&r&)�I;16Br()�I�I;16S)r)�I;16BS)r)� )�F�F;32F)r-�F;32BF)r)zI;32N)r)�I;32S)r)�I;32BS)rr)�LAr2)rrr)�RGBr3)r3zRGB;R)rrrr)�RGBAr4)r)�RGBXr5)rrrrr�rr)r5ZRGBXX)rrrrrr)rrr)r5ZRGBXXX)r4ZRGBa)rr)r4ZRGBaX)rrr)r4ZRGBaXX)rr)r4ZRGBAX)rrr)r4ZRGBAXX)i�)r'r'r')r3zRGB;16L)r3zRGB;16B)r'r'r'r')r4zRGBA;16L)r4zRGBA;16B)r5zRGBX;16L)r5zRGBX;16B)r4zRGBa;16L)r4zRGBa;16Br)�PzP;1)r7zP;1R)r7zP;2)r7zP;2R)r7zP;4)r7zP;4R)r7r7)�PAr8)r7zP;Rr)�CMYKr9)r9ZCMYKX)r9ZCMYKXX)r9zCMYK;16Lr)r3r5r)�LABr:�MM*�II*sMM*sII*cCs|dd�tkS�Nr)�PREFIXES��prefixrrr �_acceptsrAcCs<t|�dk}t|rd|n|��|�}|r8|ddd�S|S)Nr���)�abs�IFDRational�limit_rational)�val�max_val�inv�n_drrr �_limit_rationalsrJcCsPt|�}|j|jf}t|�|kr.t|t|��}t|�|krLt|�}t||�}|S�N)r�	numerator�denominator�minrJrC�max)rFrGZmin_val�fracrIrrr �_limit_signed_rational
s
rQc@s.eZdZdZdZd/dd�Zedd��Zedd	��Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
e
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d�Ze
d �Ze
d!�Ze
d"�Ze
d#�Ze
d$�Ze
d%�Ze
d&�Z e
d'�Z!e
d(�Z"e
d)�Z#e
d*�Z$e
d+�Z%e
d,�Z&e
d-�Z'd.S)0rDz� 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�_valrcCs�t|t�r&|j|_|j|_|j|_dSt|t�rB|j|_|j|_n||_||_|dkrbtd�|_n |dkrvt|�|_nt||�|_dS)z�
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr�nanr)	�
isinstancerDrLrRrMrSrTr�float)�self�valuerMrrr �__init__-s


zIFDRational.__init__cCs|jSrK)rR��arrr rLGszIFDRational.numeratorcCs|jSrK)rSr[rrr rMKszIFDRational.denominatorcCs.|jdkr|j|jfS|j�|�}|j|jfS)z�

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r)rMrLrTZlimit_denominator)rXZmax_denominator�frrr rEOs
zIFDRational.limit_rationalcCstt|j��SrK)�strrWrT�rXrrr �__repr__\szIFDRational.__repr__cCs
|j��SrK)rT�__hash__r_rrr ra_szIFDRational.__hash__cCs
|j|kSrK)rT)rX�otherrrr �__eq__bszIFDRational.__eq__cs�fdd�}|S)Ncst|j��|�SrK)�getattrrT)rX�args��oprr �delegatefsz'IFDRational._delegate.<locals>.delegater)rgrhrrfr �	_delegateeszIFDRational._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__N)r)(�__name__�
__module__�__qualname__�__doc__�	__slots__rZ�propertyrLrMrEr`rarcrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~rr�r�r�r�rrrr rDsL



rDc@s�eZdZdZd\dd�Zedd��Zedd��Zed	d��Zej	d
d��Zdd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fg��ed8d8�d]d:d;��Z#ed8�d<d=��Z$ed>d8�d^d?d@��Z%ed>�dAdB��Z&edCdD�d_dEdF��Z'edC�dGdH��Z(edId8�d`dJdK��Z)edI�dLdM��Z*edNdD�dadOdP��Z+edN�dQdR��Z,dSdT�Z-dUdV�Z.dbdXdY�Z/dZd[�Z0dS)c�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
    `~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
                   ~PIL.TiffTags.TYPES`

    .. versionadded:: 3.0.0
    �II*NcCs�|dd�tkrtd|��|dk	r(|n
|dd�|_|jtkrHd|_n|jtkrZd|_ntd��|��|�d|dd��\|_d	|_	dS)
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.
        Nrz%not a TIFF file (header %r not valid)r�>�<znot a TIFF IFDr$F)
r>�SyntaxError�_prefix�MM�_endian�II�reset�_unpack�next�_legacy_api)rX�ifhr@rrr rZ�s

zImageFileDirectory_v2.__init__cCs|jSrK)r�r_rrr �<lambda>��zImageFileDirectory_v2.<lambda>cCs|jSrK)�_offsetr_rrr r��r�cCs|jSrK)r�r_rrr r��r�cCstd��dS)Nz"Not allowing setting of legacy api)�	Exception�rXrYrrr �
legacy_api�sz ImageFileDirectory_v2.legacy_apicCs(i|_i|_i|_i|_d|_d|_dSrK)�_tags_v1�_tags_v2�_tagdata�tagtypeZ_nextr�r_rrr r��szImageFileDirectory_v2.resetcCstt|��SrK)r^�dictr_rrr �__str__�szImageFileDirectory_v2.__str__cCsdd�|��D�S)z�
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        cSsi|]\}}t�|�j|�qSr)r
�lookup�name)r�coderYrrr r!�s
z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)�itemsr_rrr �named�szImageFileDirectory_v2.namedcCstt|j�t|j�B�SrK)�len�setr�r�r_rrr �__len__�szImageFileDirectory_v2.__len__cCsf||jkr>|j|}|j|}|j|\}}||||j�||<|j|}|jrbt|ttf�sb|f}|SrK)r�r�r��_load_dispatchr�rV�tuple�bytes)rX�tag�data�typ�size�handlerrFrrr �__getitem__�s



z!ImageFileDirectory_v2.__getitem__cCs||jkp||jkSrK)r�r��rXr�rrr �__contains__sz"ImageFileDirectory_v2.__contains__cCs|�|||j�dSrK)�_setitemr�)rXr�rYrrr �__setitem__
sz!ImageFileDirectory_v2.__setitem__c	sjtttf}t�|��t||�r$|gn|}||jk�rJ�jrJ�j|j|<�ntj|j|<t	dd�|D��r�t	dd�|D��r�tj
ntj|j|<n�t	dd�|D���rt	dd�|D��r�tj|j|<nDt	dd�|D��r�tj
|j|<n$t	dd�|D��r�tjntj|j|<nBt	dd�|D���r*tj|j|<n t	d	d�|D���rJtj|j|<|j|tjk�r|t|t��rt|�d
d�n|g}n |j|tj
k�r�dd
�|D�}t�fdd�|D��}|�r�|jn|j}�jdk�s�jdk�r^t|�dk�r^|�s^|�r|j|tj
tjfk�r|f}z|\||<Wn8tk
�rZt�d|t|�f�|d||<YnXn|||<dS)Ncss|]}t|t�VqdSrK)rVrD�rrrrr �	<genexpr>sz1ImageFileDirectory_v2._setitem.<locals>.<genexpr>css|]}|dkVqdS�rNrr�rrr r�scss|]}t|t�VqdSrK)rV�intr�rrr r�scss&|]}d|kodknVqdS)r�Nrr�rrr r�scss&|]}d|kodknVqdS)i���i�Nrr�rrr r�!scss|]}|dkVqdSr�rr�rrr r�&scss|]}t|t�VqdSrK)rVrWr�rrr r�)scss|]}t|t�VqdSrK)rVr^r�rrr r�,s�ascii�replacecSs"g|]}t|t�rt|�n|�qSr)rVr�rWr�rrr �
<listcomp>4sz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c3s|]}��|�VqdSrK)Zcvt_enum�rrY��inforr r�6srz=Metadata Warning, tag %s had too many entries: %s, expected 1r)rr�r^r
r�rVr��type�	UNDEFINED�allZRATIONALZSIGNED_RATIONAL�SHORT�SIGNED_SHORT�LONG�SIGNED_LONG�DOUBLE�ASCII�encoder�r�r�Zlengthr��
ValueError�warnings�warn)rXr�rYr�Z	basetypes�values�destrr�r r�
sl

��
��
��
���
��zImageFileDirectory_v2._setitemcCs.|j�|d�|j�|d�|j�|d�dSrK)r��popr�r�r�rrr �__delitem__Wsz!ImageFileDirectory_v2.__delitem__cCstt|j�t|j�B�SrK)�iterr�r�r�r_rrr �__iter__\szImageFileDirectory_v2.__iter__cCst�|j||�SrK)�struct�unpackr�)rX�fmtr�rrr r�_szImageFileDirectory_v2._unpackcGstj|j|f|��SrK)r��packr�)rXr�r�rrr �_packbszImageFileDirectory_v2._packcs��fdd�}|S)NcsBddlm}|j�d�r2|jdd��dd�|�<�|ft�<|S)Nrr
�load_r�_� )r
rr��
startswithr�r�)�funcr��idxr�rr �	decoratorfs
z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr)r�r�r�rr�r �_register_loaderesz&ImageFileDirectory_v2._register_loadercs�fdd�}|S)Ncs|t�<|SrK)�_write_dispatch)r��r�rr r�qsz9ImageFileDirectory_v2._register_writer.<locals>.decoratorr)r�r�rr�r �_register_writerpsz&ImageFileDirectory_v2._register_writercsXddlm}|\}�}|||<t�d����d��fdd�	ft|<�fdd�t|<dS)	Nrr
�=Tcs|�d�t|����|�S)Nz{}{})r��formatr��rXr�r��r�r�rr r�sz7ImageFileDirectory_v2._register_basic.<locals>.<lambda>csd���fdd�|D��S)Nr�c3s|]}���|�VqdSrK)r�r�)r�rXrr r��szJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>��join�rXr�)r�r_r r��s)T)r
rr�Zcalcsizer�r�)Zidx_fmt_namerr�r�rr�r �_register_basicws
�z%ImageFileDirectory_v2._register_basic�HZshortr$Zlong�bzsigned byte�hzsigned short�lzsigned longr]rW�dZdoublerTcCs|SrKrr�rrr �	load_byte�szImageFileDirectory_v2.load_bytecCs|SrKr�rXr�rrr �
write_byte�sz ImageFileDirectory_v2.write_bytercCs"|�d�r|dd�}|�dd�S)N�rBzlatin-1r�)�endswith�decoder�rrr �load_string�s
z!ImageFileDirectory_v2.load_stringcCsd|�dd�dS)Nr�r�r�r�)r�r�rrr �write_string�sz"ImageFileDirectory_v2.write_stringrrcsV|�d�t|�d�|�}�fdd��t�fdd�t|ddd�|ddd��D��S)	Nz{}Lrcs�r||fSt||�SrK�rD�r\r��r�rr �combine�sz4ImageFileDirectory_v2.load_rational.<locals>.combinec3s|]\}}�||�VqdSrKr�rZnumZdenom�rrr r��sz6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>rr�r�r�r�r��zip�rXr�r�Zvalsr�rr�r �
load_rational�sz#ImageFileDirectory_v2.load_rationalcsd��fdd�|D��S)Nr�c3s"|]}�jdt|d���VqdS)�2Ll��N)r)r�rJ�rrPr_rr r��sz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r�r�rr_r �write_rational�s�z$ImageFileDirectory_v2.write_rationalrcCs|SrKrr�rrr �load_undefined�sz$ImageFileDirectory_v2.load_undefinedcCs|SrKrr�rrr �write_undefined�sz%ImageFileDirectory_v2.write_undefined�
csV|�d�t|�d�|�}�fdd��t�fdd�t|ddd�|ddd��D��S)	Nz{}lrcs�r||fSt||�SrKr�r�r�rr r�sz;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec3s|]\}}�||�VqdSrKrrrrr r��sz=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>rrrrrrr �load_signed_rational�sz*ImageFileDirectory_v2.load_signed_rationalcsd��fdd�|D��S)Nr�c3s$|]}�jdt|dd���VqdS)�2li���i�N)r)r�rQr	r_rr r��s�z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r�r�rr_r �write_signed_rational�s�z+ImageFileDirectory_v2.write_signed_rationalcCs2|�|�}t|�|kr.tdd|t|�f��|S)NzCorrupt EXIF data.  z,Expecting to read %d bytes but only got %d. )�readr��OSError)rX�fpr�Zretrrr �_ensure_read�s
��z"ImageFileDirectory_v2._ensure_readc
Cs�|��|��|_�z�t|�d|�|d��d�D�]l}|�d|�|d��\}}}}tr�t�|�j	}t
�|d�}td||||fdd	�z|j
|\}	}
Wn&tk
r�tr�td
|�Yq2YnX||	}|dk�r&|��}|�d|�\}
t�rtd
�||
�dd	�|�|
�t�||�}|�|�n|d|�}t|�|k�rZt�d|t|�|f�q2|�sbq2||j|<||j|<tr2|dk�r�td|�q2td||�q2|�d|�|d��\|_Wn8tk
�r�}zt�t|��WY�dSd}~XYnXdS)Nr�rr�HHL4sr%�unknownztag: %s (%d) - type: %s (%d)r���endz- unsupported typerr$z$Tag Location: {} - Data Location: {}zXPossibly corrupt EXIF data.  Expecting to read %d bytes but only got %d. Skipping tag %sr,�- value: <table: %d bytes>�- value:)r��tellr��ranger�r�DEBUGr
r�r�r�get�printr��KeyErrorr��seekrZ
_safe_readr�r�r�r�r�r�rr^)rXr�ir�r��countr��tagname�typnameZ	unit_sizer�r��here�offset�msgrrr �load�sd
"�



�
��


zImageFileDirectory_v2.loadrc

Cst|�dt|j��}g}|t|�t|j�dd}d}t|j���D�]H\}}|tkr`t|�}|j�|�}tr�t	d�
|||��t|t�r�|n|f}|j
||f|��}	t�rt�|�j}
t�|d�}t	d|
|||fdd�t|	�d	kr�t	d
t|	��n
t	d|�|tjtjtjfk�r(t|	�}nt|�}t|	�dk�r\|�||||	�dd�d
f�qF|�||||�d|�|	f�|t|	�ddd7}qF|dk	�r�||\}}}}}	|	�r�td��|�d|�d|�d|�}|||||	f||<|D]D\}}}}}	t�rt	|||t|�t|	��||�d||||�7}�q�|d7}|D].\}}}}}	||	7}t|	�d@�r@|d7}�q@|S)Nr�r%rzTag {}, Type: {}, Value: {}rzsave: %s (%d) - type: %s (%d)r�rr'rrr�r�r$rrz&multistrip support not yet implementedrrs)r�r�r��sortedr��STRIPOFFSETSr�rrrr�rVr�r�r
r�r�rZBYTEr�r��append�ljust�NotImplementedErrorr��repr)
rXr'�result�entriesZstripoffsetsr�rYr�r�r�r$r%r#rrr �tobytessZ�


zImageFileDirectory_v2.tobytescCsN|��dkr&|�|j|�ddd��|��}|�|�}|�|�|t|�S)NrZHL�*r)r�writer�r�r2r�)rXrr'r0rrr �saveZs

zImageFileDirectory_v2.save)r�N)T)T)T)T)T)r)1r�r�r�r�rZr�r@r'r��setterr�r�r�r�r�r�r�r�r�r�r�r�r�r�r��list�mapr
r�r�ZSIGNED_BYTEr�r�ZFLOATr�r�r�r�r�rr
rrrrrr)r2r5rrrr r��sv6

J






���




	>
Cr�r�r�r�Zwrite_csteZdZdZ�fdd�Zedd��Zedd��Zedd��Z	d	d
�Z
dd�Zd
d�Zdd�Z
dd�Zdd�Z�ZS)�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,
    `~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    cst�j||�d|_dS)NT)�superrZr�)rXre�kwargs��	__class__rr rZ�szImageFileDirectory_v1.__init__cCs|jSrK)r�r_rrr r��r�zImageFileDirectory_v1.<lambda>cCs|jSrK)r�r_rrr r��r�cCs(||jd�}|j|_|j|_|j|_|S)a3 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`

        r?)r@r�r�r�)�clsZoriginal�ifdrrr �from_v2�s
zImageFileDirectory_v1.from_v2cCs4t|jd�}t|j�|_t|j�|_t|j�|_|S)a3 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`

        r?)r�r@r�r�r�r�)rXr?rrr �to_v2�s
zImageFileDirectory_v1.to_v2cCs||jkp||jkSrK)r�r�r�rrr r��sz"ImageFileDirectory_v1.__contains__cCstt|j�t|j�B�SrK)r�r�r�r�r_rrr r��szImageFileDirectory_v1.__len__cCstt|j�t|j�B�SrK)r�r�r�r�r_rrr r��szImageFileDirectory_v1.__iter__cCsdD]}|�|||�qdS�N)FT)r�)rXr�rYr�rrr r��sz!ImageFileDirectory_v1.__setitem__cCsn||jkrL|j|}|j|}|j|\}}dD]}|�|||||�|�q0|j|}t|ttf�sj|f}|SrB)r�r�r�r�r�rVr�r�)rXr�r�r�r�r�ZlegacyrFrrr r��s



z!ImageFileDirectory_v1.__getitem__)r�r�r�r�rZr��tagsZtagdata�classmethodr@rAr�r�r�r�r��
__classcell__rrr<r r9ps
r9cs�eZdZdZdZdZdd�Zedd��Zedd	��Z	d
d�Z
dd
�Zdd�Z�fdd�Z
dd�Zdd�Zdd�Zdd�Z�ZS)�
TiffImageFileZTIFFz
Adobe TIFFFcCs||j�d�}t|�|_d|_|_|jj|_|_d|_	|j|_
g|_d|_t
rntd�td|j�td|�|�d�dS)z#Open the first image in a TIFF filerNrBz*** TiffImageFile._open ***z
- __first:z- ifh: r)rrr��tag_v2r�r?r�Z_TiffImageFile__first�_TiffImageFile__next�_TiffImageFile__frame�_TiffImageFile__fp�
_frame_pos�	_n_framesrr�_seek)rXr�rrr �_open�s

zTiffImageFile._opencCsP|jdkrJ|��}|�t|j��|jdkr@|�|��d�q"|�|�|jS)Nr)rLrrMr�rKr!)rXZcurrentrrr �n_frames�s


zTiffImageFile.n_framescCs|jSrK)�_is_animatedr_rrr �is_animated�szTiffImageFile.is_animatedcCs<|�|�sdS|�|�t�|j�tj�|j|j�|_dS)z%Select a given frame as current imageN)	Z_seek_checkrMrZ_decompression_bomb_checkr��core�new�mode�im�rX�framerrr r!�s


zTiffImageFile.seekcCs|j|_t|j�|kr�|js$td��trFtd||j|j|j�	�f�|j�	�|j�
|j�|j�|j�tr�td|j�	��|j�
|j�|jj|_|jdkr�|d|_t|j�dkr�|jdk|_|jd7_q|j�
|j|�|j�
|j�t�|j�|_|_||_|��dS)Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %szLoading tags, location: %srr)rJrr�rKrH�EOFErrorrrrIrr!r,rGr)r�rLrPr9r@r�r?�_setuprVrrr rM	s6��



zTiffImageFile._seekcCs|jS)zReturn the current frame number)rIr_rrr r(szTiffImageFile.tellcs|jr|��St���SrK)�use_load_libtiff�
_load_libtiffr:r)r_r<rr r),szTiffImageFile.loadcCs`|jrPtjtjtjtjtjtjtjd��	|j�}|dk	rP|j
�|�|_
|j
j|_
|js\d|_dS)N)rrrrrrrT)�_tile_orientationrZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90rrUZ	transposer��_sizerP�!_close_exclusive_fp_after_loading)rX�methodrrr �load_end1s ��	
zTiffImageFile.load_endc	Cs�tj�|�}|jdkrtd��|js(|S|��t|j�dksFtd��|jdd}t|jdd�}z6t|jd�o�t	�
|j���}t|jd�r�|j��Wntk
r�d	}YnX|r�||d
<t�
|jdt|�|j�}z|�|j|�Wntk
�r
td��YnX|j�o|j}t|jd
��rNt�r8td�|�|j���\}}nd|�r�t�rbtd�|�st|j�d�|�d�\}}n.t�r�td�|j�d�|�|j���\}}g|_d|_|��|�r�|j��d|_|dk�r�t|��tj�|�S)z] Overload method triggered when we detect a compressed tiff
            Calls out to libtiff Nzcannot load this imagerzNot exactly one tilerr�fileno�flushFr�libtiffzCouldn't set the image�getvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.sfpfpz+don't have fileno or getvalue. just reading)rr)�tilerZload_preparer�r7�hasattrr�os�duprarbZ_getdecoderrTr�Z
decoderconfig�setimagerUr�Z
_exclusive_fprPrrr�rdr!r�readonlyr`�close)	rXZpixelZextentsrer�decoderZ
close_self_fp�n�errrrr r[Esh

�


zTiffImageFile._load_libtiffc
Cs�d|jkrtd��t|j�td�|_|j�td�|_|j�td�}|jdkrRd}|j�t	d�}t
r�td�td|j�td	|�td
|j�td|�td|j�d
��t
|j�t��}t
|j�t��}||f|_t
r�td|j�|j�td�}t|�dk�r(t|�t|�k�r dk�r(nnd}|j�td�}|j�td�}|dk�rTd}n|dk�rdd}nd}|t|�7}|t|�k�r�t|�dk�r�||}|jj|||||f}	t
�r�td|	�zt|	\|_}
Wn,tk
�r�t
�r�td�td��YnXt
�rtd|
�td|j�|j|jd<|j�td�}|j�td�}|�r�|�r�|j�t �}
|
dk�r�t
|d�t
|d�f|jd<nx|
dk�r�t
|dd�t
|dd�f|jd<nF|
dk�r�t
|d�t
|d�f|jd<||f|jd <n||f|jd <d}}}g|_!t"�p|jd!k|_#|j#�r�|dk�rj|	dd�d|	dd�}	t
�r\td|	�t|	\|_}
|
d"k�rxd#}
d$|
k�r�|
�$d$d%�}
d&|
k�r�|
�$d&d%�}
|
|jd'|jj%f}|j!�&d(dd||fd|f��nXt'|jk�s�t(|jk�rt'|jk�r|jt'}|j�t)|�}|jd}n"|jt(}|j�d)�}|j�d*�}|D]�}|||k�rh|t*|�d+}nd}|
}|jdk�r�|
|}||}|t
|�df}|j!�&|j||t|||�t|||�f||f�||}||jdk�rDd||}}||jdk�rDd}}|d7}�qDnt
�r&td,�td-��t+|jk�rJ|jt+|jd.<|jd/k�r~d0d1�|jt,D�}t-�.d2d3�/|��|_0|j�d4�|_1dS)5z-Setup this image object based on current tagsi�z+Windows Media Photo files not yet supportedrrrrz*** Summary ***z- compression:z- photometric_interpretation:z- planar_configuration:z
- fill_order:z- YCbCr subsampling:iz- size:r"r)rrrrrrzformat key:z- unsupported formatzunknown pixel modez- raw mode:z- pil mode:�compressionr��?�dpigR���Q@N�
resolutionrr&�I;16Nz;16Bz;16Nz;16LFrciBiCrz- unsupported data organizationzunknown data organization�icc_profile�r7r8cSsg|]}t|d��qS)r)r)rr�rrr r�dsz(TiffImageFile._setup.<locals>.<listcomp>�RGB;Lr�i)2rGr�COMPRESSION_INFOr�COMPRESSIONZ_compression�PLANAR_CONFIGURATION�_planar_configuration�PHOTOMETRIC_INTERPRETATION�	FILLORDERrrr�r��
IMAGEWIDTH�IMAGELENGTHr]r��SAMPLEFORMATr�rOrN�
BITSPERSAMPLE�EXTRASAMPLESr@�	OPEN_INFOrTr r�r��X_RESOLUTION�Y_RESOLUTION�RESOLUTION_UNITre�READ_LIBTIFFrZr�r'r,r+�TILEOFFSETS�ROWSPERSTRIP�sum�
ICCPROFILE�COLORMAPr	rr��paletter\)rX�photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_count�key�rawmodeZxresZyresZresunit�x�yZlayerr\Zoffsetsr��wr'�strideZtile_rawmoder�rrr rY�s�




2

�


 
(





 

��zTiffImageFile._setupcCsBz4z|j|jkr|j��Wntk
r0YnXW5d|_XdSrK)rJrrk�AttributeErrorr_rrr �
_close__fpis
zTiffImageFile._close__fp)r�r�r�r�Zformat_descriptionr^rNr�rOrQr!rMrr)r`r[rYr�rErrr<r rF�s"
	
]HrFr#r$r2r7r8r0r&r*r.r3r5r4r9�YCbCrr:r1r(r+r/)r#r$r2r7r8r)r&r*r-r3r5r4r9r�r:r1r(r+r/c!Cs�zt|j\}}}}}}Wn"tk
r<td|j��YnXt|d�}	|j�d|j�d��}
|
dkrjd}
tpt|
dk}t	|dd�|	t
<|jd|	t<|jd|	t
<|j�di�}tr�td	t|��t|t�r�|��}|D]>}
|�|
�|	|
<z|j|
|	j|
<Wq�tk
�rYq�Xq�t|d
��rjttttttfD]2}
|
|jk�r6|j|
|	|
<|jj|
|	j|
<�q6d|jk�r�|jd|	t<tdftd
ftd
ftdftdftdft dft!dft"dft#dff
D]$\}
}||jk�r�|j||	|
<�q�|j�d�}|�r,d|	t<t$|dd�|	t<t$|dd�|	t<|dk�rX||	t%<t&|�dk�rXt&|�|	t'<|dk	�rj||	t(<|dk�r|||	t)<||	t*<|jdk�r�|j+�,dd�}t-dd�|D��|	t.<t&|�|jd|ddd}|jd|	t/<||jd|	t0<d|	t1<t2�|
d�|	t3<|�r�d |jk�rl|jd }t|t$��rJ|dk�sJ|d!k�rRt4d"��|
d#k�rdt4d$��||	t5<t�r�td%�td&t6|	�7���d}t|d'��r�z|�8d�t9�:|�;��}Wnt<j=k
�r�YnXi}t.t>t)t0t1t?g}i}|d|t%<i}t|d(��r|j@��}tA�B|	�7�t	|d
i��7�|�7��D]�\}}|tCjDk�r�tC�E|�jFtCjGk�s4tHjIjJ�sj�q4||	jk�r�|	j|||<nt|t$tKtLtMf��s��q4||k�r4||k�r4t|tL��r�|�Nd)d*�d+||<n"t|tO��r�tK|�||<n|||<�q4t�rtd,t6|�7���|jd-k�r$d.}t|�7��}|�P�||
||||f}tH�Q|jd/||jR�}|�S|j+d0|j�|�Nd1�\}}}|�s�|�T|�|�rp�q��qp|dk�r�td2|��n.|	�U|�} tV�W||dd0|j| ||dffg�d3|jk�r�|	|_XdS)4Nzcannot write mode %s as TIFFr?rorrzrrZtiffinfozTiffinfo Keys: %srGrtZdescriptionrrZx_resolutionZy_resolutionZresolution_unitZsoftwareZ	date_timeZartist�	copyrightrqrrpr"rur3rvcss|]}t|�dVqdS)rN)rr�rrr r��sz_save.<locals>.<genexpr>rr�quality�dzInvalid quality settingrz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %srar�r�r�r�zConverted items: %s)r(r&rsrcr6i@z(encoder error %d when writing image file�_debug_multipage)Y�	SAVE_INFOrTr rr��encoderinforr��
WRITE_LIBTIFFrdryr�r}r~rrr7rVr9rAr�r�rfr�r�r��IPTC_NAA_CHUNK�PHOTOSHOP_CHUNK�XMPrGr��IMAGEDESCRIPTION�SOFTWARE�	DATE_TIME�ARTIST�	COPYRIGHTr�r�r��SAMPLESPERPIXELr�rr{rUZ
getpaletter�r�r��STRIPBYTECOUNTSr+�COMPRESSION_INFO_REVrxr��JPEGQUALITYr*r�r!rgrhra�io�UnsupportedOperation�REFERENCEBLACKWHITE�TRANSFERFUNCTIONr��	itertools�chainr
ZLIBTIFF_COREr�r�r�rrRZlibtiff_support_custom_tagsrWr^r�r�rD�sortZ_getencoder�
encoderconfigrir4r5r�_saver�)!rUr�filenamer�r@r�r��bitsZextrar?rorcr�r�r�rqZlutr�r�Z_fp�typesZ	blocklistZattsZ
legacy_ifdr�rYrCr\�er��sr�r'rrr r��s*

��


"
 
�
	�	
���


�r�c
@s�eZdZdddddddddddddg
Zdddd	d
dhZd:d
d�Zdd�Zdd�Zdd�Zdd�Z	dd�Z
dd�Zej
fdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd;d7d8�Zd9S)<�AppendingTiffWriterrrrrrri riii	FcCsvt|d�r||_d|_nF||_d|_zt||r2dnd�|_Wn tk
r\t|d�|_YnX|j��|_|��dS)NrFTzw+bzr+b)	rfr]�close_fpr��openrr�	beginning�setup)rX�fnrSrrr rZ�s
zAppendingTiffWriter.__init__cCs�|j�|jtj�d|_d|_|j�d�|_}|s>d|_	dSd|_	|dkrX|�
d�n|dkrl|�
d�ntd	��|��|�
�dS)
NrrTFr<r�r;r�zInvalid TIFF file header)r]r!r�rg�SEEK_SET�whereToWriteNewIFDOffset�offsetOfNewPager�IIMM�isFirst�	setEndian�RuntimeError�skipIFDs�goToEnd)rXr�rrr r��szAppendingTiffWriter.setupcCs�|jr
dS|j�|j�|j�d�}|s,dS||jkr>td��|��}||j7}|j�|j�|�	|�|j�|�|�
�dS)Nrz1IIMM of new page doesn't match IIMM of first page)r�r]r!r�rr�r��readLongr��	writeLong�fixIFD)rXr��	IFDoffsetrrr �finalize�s


zAppendingTiffWriter.finalizecCs|��|��dSrK)r�r�r_rrr �newFrame�szAppendingTiffWriter.newFramecCs|SrKrr_rrr �	__enter__�szAppendingTiffWriter.__enter__cCs|jr|��dS)NF)r�rk)rX�exc_type�	exc_value�	tracebackrrr �__exit__�szAppendingTiffWriter.__exit__cCs|j��|jSrK)r]rr�r_rrr r�szAppendingTiffWriter.tellcCs*|tjkr||j7}|j�||�|��SrK)rgr�r�r]r!r)rXr'�whencerrr r!�s

zAppendingTiffWriter.seekcCs^|j�dtj�|j��}d|d}d|kr:dkrNnn|j�t|��|j��|_dS)Nrr')r]r!rg�SEEK_ENDrr4r�r�)rX�posZpadBytesrrr r��s
zAppendingTiffWriter.goToEndcCs.||_|jd|_|jd|_|jd|_dS)Nr$r�ZHHL)�endian�longFmt�shortFmt�	tagFormat)rXr�rrr r��szAppendingTiffWriter.setEndiancCsP|��}|dkr"|j��d|_qL|j�|�|��}|j�|dtj�qdS)Nrrr%)r�r]rr�r!�	readShortrg�SEEK_CUR)rXr��numTagsrrr r��szAppendingTiffWriter.skipIFDscCs|j�|�SrK)r]r4r�rrr r4�szAppendingTiffWriter.writecCst�|j|j�d��\}|S)Nr)r�r�r�r]rr�rrr r��szAppendingTiffWriter.readShortcCst�|j|j�d��\}|Sr=)r�r�r�r]rr�rrr r��szAppendingTiffWriter.readLongcCsF|j�dtj�|j�t�|j|��}|dk	rB|dkrBtd|��dS)N���r� wrote only %u bytes but wanted 4�	r]r!rgr�r4r�r�r�r��rXrYZbytesWrittenrrr �rewriteLastShortToLong�sz*AppendingTiffWriter.rewriteLastShortToLongcCsF|j�dtj�|j�t�|j|��}|dk	rB|dkrBtd|��dS)Nr�r� wrote only %u bytes but wanted 2)	r]r!rgr�r4r�r�r�r�r�rrr �rewriteLastShortsz$AppendingTiffWriter.rewriteLastShortcCsF|j�dtj�|j�t�|j|��}|dk	rB|dkrBtd|��dS)N���rr�r�r�rrr �rewriteLastLongsz#AppendingTiffWriter.rewriteLastLongcCs6|j�t�|j|��}|dk	r2|dkr2td|��dS)Nrr�)r]r4r�r�r�r�r�rrr �
writeShortszAppendingTiffWriter.writeShortcCs6|j�t�|j|��}|dk	r2|dkr2td|��dS)Nrr�)r]r4r�r�r�r�r�rrr r�szAppendingTiffWriter.writeLongcCs|��|j��dSrK)r�r]rkr_rrr rkszAppendingTiffWriter.closecCs|��}t|�D]�}t�|j|j�d��\}}}|j|}||}|dk}|sj|��}	|	|j	7}	|�
|	�||jkr�|j��}
|r�|j
||dk|dkd�|j�|
d�n0|j�|	�|j
||dk|dkd�|j�|
�d}	}
q|r|j�dtj�qdS)Nrrr)�isShort�isLong)r�rr�r�r�r]r�
fieldSizesr�r�r��Tagsr�
fixOffsetsr!rgr�)rXr�r"r�Z	fieldTyper#Z	fieldSizeZ	totalSizeZisLocalr'ZcurPosrrr r�s:




��
zAppendingTiffWriter.fixIFDcCs�|s|std��t|�D]�}|r(|��n|��}||j7}|r�|dkr�|dkrVtd��|�|�|j�dtj	�|�
tj�|j�dtj	�q|r�|�
|�q|�|�qdS)Nz offset is neither short nor longr�rznot implementedi����r)r�rr�r�r�r�r]r!rgr�r�r
r�r�r�)rXr#r�r�r"r'rrr r�?s

zAppendingTiffWriter.fixOffsetsN)F)FF)r�r�r�r�r�rZr�r�r�r�r�rr�r�r!r�r�r�r4r�r�r�r�r�r�r�rkr�r�rrrr r�isJ�

#r�c	Cs�|j��}|j}t|�dg��}t|d�s:|s:t|||�S|��}z~t	|��l}|g|D]Z}||_||_t|d�sxd}	n|j
}	t|	�D]*}
|�|
�|��t|||�|�
�q�qXW5QRXW5|�|�XdS)N�
append_imagesrOr)r��copyr�r7rrfr�rr!r�rOrr)r�)rUrr�r�r�r�Zcur_idxZtfZimsZnfrr�rrr �	_save_allWs(



r�z.tifz.tiffz
image/tiff)[r�r�rgr�r�Zcollections.abcrZ	fractionsrZnumbersrr�rrr	r
Z_binaryrrrrr�r�ZIFD_LEGACY_APIr�r�r}r~r�rxr{r|r�r+r�r�r�r�r�ryr�r�r�r�r�Z	PREDICTORr�r�r�rZ
JPEGTABLESr�r�r�r�r�ZEXIFIFDr�r�ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATArwr�r�r�r>rArJrQr�r�rDr�r�r�r��setattrr9ZImageFileDirectoryrFr�r�r�r�Z
register_openr�Z
register_saveZregister_save_allZregister_extensionsZ
register_mimerrrr �<module>)s���w�pZX1�Wo