
     f                       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m	Z	 d dl
mZmZ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 ddlmZ erddlmZ  ej         e!          Z" ej#        d          j$        Z%dZ&ddddddddddddddddZ' ej#        d          Z(ej)        Z*	 d e*z  Z+	  G d! d"e	          Z, G d# d$e	          Z-d% Z.dXd&Z/ G d' d(          Z0 G d) d*e1          Z2 G d+ d,          Z3 G d- d.e0          Z4dYd3Z5 G d4 d5ej                  Z6d6d7d8d9d:d;d<d<d<d=d>d?d@dAdBdCZ7dD Z8 G dE dF          Z9 G dG dH          Z:dI Z;dZdQZ<e8dRfdSZ=dT Z> ej?        e6j@        e6e5            ejA        e6j@        e=            ejB        e6j@        e<            ejC        e6j@        dUdVg            ejD        e6j@        dW           dS )[    )annotationsN)IntEnum)IOTYPE_CHECKINGAnyNoReturn   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)_imagings   \w\w\w\ws   PNG

)1r   )LL;2)r   L;4)r   r   )I;16I;16B)RGBr   )r   zRGB;16B)PP;1)r   P;2)r   P;4)r   r   )LAr    )RGBAzLA;16B)r!   r!   )r!   zRGBA;16B))r	   r   )   r   )   r   )   r   )   r   )r$   r"   )r%   r"   )r	      )r"   r&   )r#   r&   )r$   r&   )r$   r#   )r%   r#   )r$      )r%   r'   s   ^* *$@   c                      e Zd ZdZ	 dZ	 dZdS )Disposalr   r	   r"   N)__name__
__module____qualname__OP_NONEOP_BACKGROUNDOP_PREVIOUS     U/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/PIL/PngImagePlugin.pyr*   r*   g   s1        G M
 K r2   r*   c                      e Zd ZdZ	 dZdS )Blendr   r	   N)r+   r,   r-   	OP_SOURCEOP_OVERr1   r2   r3   r5   r5   |   s%        I
 G r2   r5   c                    t          j                    }|                    | t                    }|j        rd}t          |          |S )NzDecompressed Data Too Large)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)sdobj	plaintextmsgs       r3   _safe_zlib_decompressrC      sE    D>22I +oor2   c                2    t          j        | |          dz  S )Nl    )r9   crc32)dataseeds     r3   _crc32rH      s    :dD!!J..r2   c                  ^    e Zd ZddZddZddZddZd dZd!dZd Z	d"dZ
d"dZd#d$dZdS )%ChunkStreamfp	IO[bytes]returnNonec                "    || _         g | _        d S N)rK   queue)selfrK   s     r3   __init__zChunkStream.__init__   s    $&:<


r2   tuple[bytes, int, int]c                   d}| j         J | j        r8| j                                        \  }}}| j                             |           nL| j                             d          }|dd         }| j                                         }t          |          }t          |          s.t          j	        s"dt          |           d}t          |          |||fS )z.Fetch a new chunk. Returns header information.Nr$   r#   zbroken PNG file (chunk ))rK   rQ   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rR   cidposlengthr?   rB   s         r3   rY   zChunkStream.read   s    w""": 	#z~~//CfGLLQAABB%C',,..CVVFc{{ 	'2 '<S		<<<!#&&&Cr2   c                    | S rP   r1   rR   s    r3   	__enter__zChunkStream.__enter__   s    r2   argsobjectc                .    |                                   d S rP   )close)rR   rf   s     r3   __exit__zChunkStream.__exit__   s    

r2   c                "    d x| _         | _        d S rP   )rQ   rK   rd   s    r3   ri   zChunkStream.close   s    ##
TWWWr2   r`   bytesra   intrb   c                R    | j         J | j                             |||f           d S rP   )rQ   appendrR   r`   ra   rb   s       r3   pushzChunkStream.push   s3    z%%%
3V,-----r2   c                    t                               d|||            t          | d|                    d                     ||          S )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoderp   s       r3   callzChunkStream.call   sN     	&S&999<wt;cjj&9&9;;<<S&IIIr2   rF   c                   t           j        r&|d         dz	  dz  r|                     ||           dS | j        J 	 t	          |t	          |                    }t          | j                            d                    }||k    r"dt          |           d}t          |          dS # t          j
        $ r(}dt          |           d}t          |          |d}~ww xY w)	zRead and verify checksumr      r	   Nr#   z(broken PNG file (bad header checksum in rV   z(broken PNG file (incomplete checksum in )r   r]   crc_skiprK   rH   r[   rY   r^   r_   structerror)rR   r`   rF   crc1crc2rB   es          r3   crczChunkStream.crc   s     * 	A!a 	MM#t$$$Fw"""	*$s,,Dtw||A''Dt||McMMM!#&&& | | 	* 	* 	*IT#YYIIICc"")	*s   A,B+ +C":#CC"c                L    | j         J | j                             d           dS )zRead checksumNr#   )rK   rY   )rR   r`   rF   s      r3   r|   zChunkStream.crc_skip   s'     w"""Qr2      IENDendchunklist[bytes]c                (   g }	 	 |                                  \  }}}n)# t          j        $ r}d}t          |          |d }~ww xY w||k    rnD|                     |t          j        | j        |                     |                    |           |S )NTztruncated PNG file)	rY   r}   r~   OSErrorr   r   
_safe_readrK   ro   )rR   r   cidsr`   ra   rb   r   rB   s           r3   verifyzChunkStream.verify   s     
	*#'99;; S&&< * * **cll)* hHHS).tw??@@@KK
	 s    A?AN)rK   rL   rM   rN   )rM   rT   )rM   rJ   )rf   rg   rM   rN   rM   rN   )r`   rl   ra   rm   rb   rm   rM   rN   )r`   rl   rF   rl   rM   rN   )r   )r   rl   rM   r   )r+   r,   r-   rS   rY   re   rj   ri   rq   ry   r   r|   r   r1   r2   r3   rJ   rJ      s        = = = =       *      $ $ $ $. . . .J J J* * * **         r2   rJ   c                  @    e Zd ZU dZded<   ded<   edd            ZdS )iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NonelangtkeyNc                X    t                               | |          }||_        ||_        |S )z
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )str__new__r   r   )clstextr   r   rR   s        r3   r   ziTXt.__new__  s*     {{3%%		r2   )NN)r+   r,   r-   __doc____annotations__staticmethodr   r1   r2   r3   r   r      sX              \  r2   r   c                  @    e Zd ZdZddZdddZ	 	 	 dddZ	 dddZdS )PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rM   rN   c                    g | _         d S rP   )chunksrd   s    r3   rS   zPngInfo.__init__  s    79r2   Fr`   rl   rF   
after_idatboolc                @    | j                             |||f           dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        N)r   ro   )rR   r`   rF   r   s       r3   addzPngInfo.add  s'     	Cz233333r2    keystr | bytesvaluer   r   zipc                *   t          |t                    s|                    dd          }t          |t                    s|                    dd          }t          |t                    s|                    dd          }t          |t                    s|                    dd          }|r<|                     d|dz   |z   dz   |z   dz   t	          j        |          z              dS |                     d|dz   |z   dz   |z   dz   |z              dS )	zAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        latin-1strictutf-8   iTXts         s      N)
isinstancerl   encoder   r9   compress)rR   r   r   r   r   r   s         r3   add_itxtzPngInfo.add_itxt&  s)   $ #u%% 	2**Y11C%'' 	4LL(33E$&& 	2;;w11D$&& 	2;;w11D 	UHHk!D(5047%?$-PUBVBVV    
 HHWcIo4u<tCeKeSTTTTTr2   str | bytes | iTXtc                8   t          |t                    r6|                     |||j        |j        nd|j        |j        nd|          S t          |t
                    s@	 |                    dd          }n(# t          $ r |                     |||          cY S w xY wt          |t
                    s|                    dd          }|r0|                     d|dz   t          j
        |          z              dS |                     d|d	z   |z              dS )
zAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        Nr2   )r   r   r      zTXt        tEXtr   )r   r   r   r   r   rl   r   UnicodeErrorr   r9   r   )rR   r   r   r   s       r3   add_textzPngInfo.add_textI  s@    eT"" 	==#j4

##j4

# !    %'' 	::Y99 : : :}}S%S}99999: #u%% 	2**Y11C 	3HHWcGmdmE.B.BBCCCCCHHWcEkE122222s   "A9 9"BBNr   F)r`   rl   rF   rl   r   r   rM   rN   )r   r   F)r   r   r   r   r   r   r   r   r   r   rM   rN   )r   r   r   r   r   r   rM   rN   )r+   r,   r-   r   rS   r   r   r   r1   r2   r3   r   r     s         
: : : :
4 
4 
4 
4 
4  !U !U !U !U !UH HM!3 !3 !3 !3 !3 !3 !3r2   r   c                       e Zd Z f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d dZd dZd dZd dZd dZ xZS )"	PngStreamc                    t                                          |           i | _        i | _        d| _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d| _        d S )Nr   r   r   )superrS   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numrewind_statetext_memory)rR   rK   	__class__s     r3   rS   zPngStream.__init__r  st     "& r2   chunklenrm   rM   rN   c                z    | xj         |z  c_         | j         t          k    rd| j          d}t          |          d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYr>   )rR   r   rB   s      r3   check_text_memoryzPngStream.check_text_memory  sY    H$o--6#6 6 6  S//! .-r2   c                ^    | j                                         | j        | j        d| _        d S )N)infotileseq_num)r   copyr   r   r   rd   s    r3   save_rewindzPngStream.save_rewind  s2    L%%''L}
 
r2   c                    | j         d                                         | _        | j         d         | _        | j         d         | _        d S )Nr   r   r   )r   r   r   r   r   rd   s    r3   rewindzPngStream.rewind  s?    (05577(0))4r2   ra   rb   rl   c                   t          j        | j        |          }|                    d          }t                              d|d |                    ||dz            }t                              d|           |dk    rd| d}t          |          	 t          ||dz   d                    }n2# t          $ r t           j	        rd }n Y nt          j        $ r d }Y nw xY w|| j        d	<   |S )
Nr   ziCCP profile name %rr	   zCompression method %sr   Unknown compression method z in iCCP chunkr"   icc_profile)r   r   rK   findru   rv   r_   rC   r>   r]   r9   r~   r   )rR   ra   rb   r?   icomp_methodrB   r   s           r3   
chunk_iCCPzPngStream.chunk_iCCP  s    &11 FF5MM+QrrU333Ah,k:::!KKKKCc"""	/!a%''
;;KK 	 	 	. "  z 	 	 	KKK	&1]#s   B0 0CCCc                   t          j        | j        |          }|dk     rt           j        r|S d}t	          |          t          |d          t          |d          f| _        	 t          |d         |d         f         \  | _        | _	        n# t          $ r Y nw xY w|d         r
d| j        d	<   |d
         rd}t          |          |S )N   zTruncated IHDR chunkr   r#   r$   	      r	   	interlace   zunknown filter category)r   r   rK   r]   r>   r[   r   _MODESr   
im_rawmode	Exceptionr   r_   rR   ra   rb   r?   rB   s        r3   
chunk_IHDRzPngStream.chunk_IHDR  s     &11B;;. (CS//!1ayy#a))+	,2AaD!A$<,@)DL$// 	 	 	D	R5 	*()DL%R5 	#+Cc"""s   &(B 
BBr   c                    d| j         v rd| j         d         || j        fg}n%| j        
d| j         d<   dd| j        z   || j        fg}|| _        || _        d}t          |          )Nbboxr   Tdefault_imager   zimage data found)r   r   r   r   r   im_idatEOFError)rR   ra   rb   r   rB   s        r3   
chunk_IDATzPngStream.chunk_IDAT  sy    T\!!DL0#tGHDD+04_-FT\13HID smmr2   c                $    d}t          |          )Nzend of PNG image)r   )rR   ra   rb   rB   s       r3   
chunk_IENDzPngStream.chunk_IEND  s     smmr2   c                b    t          j        | j        |          }| j        dk    r	d|f| _        |S )Nr   r   )r   r   rK   r   r   rR   ra   rb   r?   s       r3   
chunk_PLTEzPngStream.chunk_PLTE  s3     &11<3#QhDOr2   c                   t          j        | j        |          }| j        dk    rKt                              |          r&|                    d          }|dk    r
|| j        d<   nm|| j        d<   nb| j        dv rt          |          | j        d<   nA| j        dk    r6t          |          t          |d          t          |d          f| j        d<   |S )	Nr   r   r   transparency)r   r   r   r   r"   r#   )	r   r   rK   r   _simple_palettematchr   r   i16)rR   ra   rb   r?   r   s        r3   
chunk_tRNSzPngStream.chunk_tRNS  s     &11<3$$Q'' 	1 FF5MM6634DL0 01^,,\///+.q66DL((\U""+.q663q!99c!Qii+GDL(r2   c                n    t          j        | j        |          }t          |          dz  | j        d<   |S )N     j@gamma)r   r   rK   r[   r   r   s       r3   
chunk_gAMAzPngStream.chunk_gAMA  s2     &11 #A 1Wr2   c                    t          j        | j        |          }t          j        dt          |          dz  z  |          }t          d |D                       | j        d<   |S )Nz>%dIr#   c              3      K   | ]	}|d z  V  
dS )r   Nr1   ).0elts     r3   	<genexpr>z'PngStream.chunk_cHRM.<locals>.<genexpr>  s&      ,P,PS8^,P,P,P,P,P,Pr2   chromaticity)r   r   rK   r}   unpacklentupler   )rR   ra   rb   r?   raw_valss        r3   
chunk_cHRMzPngStream.chunk_cHRM  s`      &11=3q66Q;!7;;',,P,Px,P,P,P'P'P^$r2   c                    t          j        | j        |          }|dk     rt           j        r|S d}t	          |          |d         | j        d<   |S )Nr	   zTruncated sRGB chunkr   srgb)r   r   rK   r]   r>   r   r   s        r3   
chunk_sRGBzPngStream.chunk_sRGB  sW      &11A::. (CS//! tVr2   c                .   t          j        | j        |          }|dk     rt           j        r|S d}t	          |          t          |d          t          |d          }}|d         }|dk    r|dz  |dz  f}|| j        d<   n|dk    r||f| j        d	<   |S )
Nr   zTruncated pHYs chunkr   r#   r$   r	   
F%u?dpiaspect)r   r   rK   r]   r>   r[   r   )	rR   ra   rb   r?   rB   pxpyunitr  s	            r3   
chunk_pHYszPngStream.chunk_pHYs  s     &11A::. (CS//!QC1IIBt199v+rF{*C"%DLQYY%'VDL"r2   c                p   t          j        | j        |          }	 |                    dd          \  }}n# t          $ r |}d}Y nw xY w|rj|                    dd          }|                    dd          }|dk    r|n|| j        |<   || j        |<   |                     t          |                     |S )Nr   r	   r2   r   r   replaceexif)
r   r   rK   splitr>   rx   r   r   r   r  )rR   ra   rb   r?   kvv_strs          r3   
chunk_tEXtzPngStream.chunk_tEXt#  s     &11	775!$$DAqq 	 	 	AAAA	  	/H--AHHY	22E#$;;aaEDLO#DLO""3u::...s   6 AAc                F   t          j        | j        |          }	 |                    dd          \  }}n# t          $ r |}d}Y nw xY w|r	|d         }nd}|dk    rd| d}t          |          	 t          |dd                    }n2# t          $ r t           j        rd}n Y nt          j	        $ r d}Y nw xY w|rb|
                    dd          }|
                    dd	          }|x| j        |<   | j        |<   |                     t          |                     |S )
Nr   r	   r2   r   r   z in zTXt chunkr   r   r  )r   r   rK   r  r>   r_   rC   r]   r9   r~   rx   r   r   r   r  )rR   ra   rb   r?   r  r  r   rB   s           r3   
chunk_zTXtzPngStream.chunk_zTXt6  sw    &11	775!$$DAqq 	 	 	AAAA	  	A$KKK!KKKKCc"""	%ae,,AA 	 	 	.   z 	 	 	AAA	  	+H--AI..A011DLOdl1o""3q66***s'   6 AA3B B:'B:9B:c                t   t          j        | j        |          x}}	 |                    dd          \  }}n# t          $ r |cY S w xY wt          |          dk     r|S |d         |d         |dd          }}}	 |                    dd          \  }}	}
n# t          $ r |cY S w xY w|dk    rJ|dk    rB	 t          |
          }
n3# t          $ r t           j        r|cY S  t          j	        $ r |cY S w xY w|S |dk    r
|
| j
        d<   	 |                    dd          }|                    d	d          }|	                    d	d          }	|
                    d	d          }
n# t          $ r |cY S w xY wt          |
||	          x| j
        |<   | j        |<   |                     t          |
                     |S )
Nr   r	   r"   r   s   XML:com.adobe.xmpxmpr   r   r   )r   r   rK   r  r>   r  rC   r]   r9   r~   r   rx   r   r   r   r   )rR   ra   rb   rr?   r  cfcmr   tkr  s              r3   
chunk_iTXtzPngStream.chunk_iTXtX  s    $TWf555A	775!$$DAqq 	 	 	HHH	q66A::HaD!A$!""B	''%++KD"aa 	 	 	HHH	77Qww-a00AA!    6  z   HHH $$$"#DL	H--A;;w11D7H--B(++AA 	 	 	HHH	 -1D",=,==Q$,q/s1vv&&&sL   8 AA:B B$#B$4C C2C21C2AE! !E0/E0c                T    t          j        | j        |          }d|z   | j        d<   |S )N   Exif  r  )r   r   rK   r   r   s       r3   
chunk_eXIfzPngStream.chunk_eXIf  s,     &11.2Vr2   c                z   t          j        | j        |          }|dk     rt           j        r|S d}t	          |          | j        d | _        t          j        d           |S t          |          }|dk    s|dk    rt          j        d           |S || _        t          |d          | j	        d<   d| _
        |S )	Nr$   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r#   loopz
image/apng)r   r   rK   r]   r>   r   warningswarnr[   r   r   )rR   ra   rb   r?   rB   n_framess         r3   
chunk_acTLzPngStream.chunk_acTL  s     &11A::. 6CS//!'#DMPQQQHq66q==Hz11MPQQQH#"1ayyV".r2   c                   t          j        | j        |          }|dk     rt           j        r|S d}t	          |          t          |          }| j        |dk    s| j        | j        |dz
  k    rd}t          |          || _        t          |d          t          |d          }}t          |d          t          |d	          }	}| j        \  }
}||z   |
k    s	|	|z   |k    rd
}t          |          ||	||z   |	|z   f| j	        d<   t          |d          t          |d          }}|dk    rd}t          |          t          |          z  dz  | j	        d<   |d         | j	        d<   |d         | j	        d<   |S )N   z"APNG contains truncated fcTL chunkr   r	   #APNG contains frame sequence errorsr#   r$   r   r%   zAPNG contains invalid framesr         d     duration   disposal   blend)r   r   rK   r]   r>   r[   r   r_   r   r   r   float)rR   ra   rb   r?   rB   seqwidthheightr  r  im_wim_h	delay_num	delay_dens                 r3   
chunk_fcTLzPngStream.chunk_fcTL  s    &11B;;. 6CS//!!ffM!cQhhM%$-37*B*B7Cc"""Aq		3q!99vQSBZZB\
d:Vd 2 20Cc""" "BU
BK@V"1bzz3q"::9	>>I#(#3#3eI6F6F#F#MZ #$R5Z  !"Wr2   c                V   |dk     r9t           j        rt          j        | j        |          }|S d}t	          |          t          j        | j        d          }t          |          }| j        |dz
  k    rd}t          |          || _        |                     |dz   |dz
            S )Nr#   z"APNG contains truncated fDAT chunkr	   r.  )	r   r]   r   rK   r>   r[   r   r_   r   )rR   ra   rb   r?   rB   r9  s         r3   
chunk_fdATzPngStream.chunk_fdAT  s    A::. (&996CS//! !,,!ff=C!G##7Cc"""sQw
333r2   )r   rm   rM   rN   r   )ra   rm   rb   rm   rM   rl   )ra   rm   rb   rm   rM   r   )r+   r,   r-   rS   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r"  r%  r+  r@  rB  __classcell__r   s   @r3   r   r   q  s           "" " " "
 
 
 
5 5 5 5
   6   (            (             "   &       D( ( ( (T      (   :4 4 4 4 4 4 4 4r2   r   prefixrl   rM   r   c                (    | d d         t           k    S )Nr$   )_MAGIC)rE  s    r3   _acceptrH    s    "1":r2   c                       e Zd ZdZdZddZed             ZddZdd
Z	dddZ
ddZddZddZddZddZd  fdZ xZS )!PngImageFilePNGzPortable network graphicsrM   rN   c                |   t          | j                            d                    sd}t          |          | j        | _        d| _        g | _        t          | j                  | _        	 | j                                        \  }}}	 | j        	                    |||          }n# t          $ r Y nt          $ rr t                              d|||           t          j        | j        |          }|dd                                         r| j                            ||f           Y nw xY w| j                            ||           | j        j        | _        | j        j        | _        | j        j        | _        d | _        | j        j        | _        | j        j        | _        | j        j        pd| _        | j                             dd	          | _!        | j        j"        r)| j        j"        \  }}tG          j$        ||          | _%        |d
k    r|dz
  | _&        n|| _&        | j        j        vd	| _'        | j        (                                 | j&        | _)        | j        *                                | _+        | j!        r| xj        dz  c_        | ,                    d           | j        dk    | _-        d S )Nr$   znot a PNG filer   T%r %s %s (unknown)r	   r"   r   F   fdATr#   ).rH  rK   rY   r_   _fp_PngImageFile__frameprivate_chunksr   pngry   r   AttributeErrorru   rv   r   r   islowerro   r   r   _moder   _sizer   r   _textr   r   r   custom_mimetyper   r*  getr   r   r   rawpalette_PngImageFile__prepare_idat!_close_exclusive_fp_after_loadingr   _PngImageFile__rewind_idatrZ   _PngImageFile__rewind_seekis_animated)rR   rB   r`   ra   rb   r?   rawmoderF   s           r3   _openzPngImageFile._open  s   tw||A'' 	#"Cc"""7
 VX%.tw%7%7	!  $x}}Cf9HMM#sF33   ! 9 9 913VDDD(&99qs8##%% 9'..Qx888	9 HLLa   !	!2 X%
X%
H$	
H$	#x:,1!Y]]?EBB8 	; H/MGT'+GT::DL'>>"(1*D"(D8+5:D2H  """!%!4D HMMOODM! #"JJqMMM=1,s   B( (
D/4A8D/.D/c                    | j         [| j        r$| j        }|                     | j        dz
             |                                  | j        r|                     |           | j         S )Nr	   )rW  ra  rP  rX   r*  load)rR   frames     r3   r   zPngImageFile.text  sk     :  -		$-!+,,,IIKKK !		%   zr2   c                V   | j         d}t          |          | j                             | j        d         d         dz
             | j        J | j                                         | j                                         | j        r| j                                          d| _         dS )zVerify PNG fileNz)verify must be called directly after openr   r"   r$   )rK   RuntimeErrorrX   r   rR  r   ri   _exclusive_fp)rR   rB   s     r3   r   zPngImageFile.verify+  s     7?=Cs### 	TYq\!_q()))x### 	GMMOOOr2   rf  rm   c                ^   |                      |          sd S || j        k     r|                     dd           | j        }t          | j        dz   |dz             D ]Q}	 |                     |           # t          $ r,}|                     |           d}t	          |          |d }~ww xY wd S )Nr   Tr	   zno more images in APNG file)_seek_checkrP  r`  ranger   rX   )rR   rf  
last_framefr   rB   s         r3   rX   zPngImageFile.seek=  s    && 	F4<JJq$\
t|a'33 	+ 	+A+

1 + + +		*%%%3smm*+	+ 	+s   A44
B*>'B%%B*Fr   r   c                b	   | j         J |  |dk    r|r| j                            | j                   | j                                          | j        | _        d | _        | j        rd | _        | j         j	        | _
        | j         j        | _        | j        | _        d | _        d | _        | j
                            dd          | _        | j
                            d          | _        | j
                            d          | _        | j
                            d          | _        d| _        n}|| j        dz   k    rd| }t-          |          |                                  | j        r%| j                            | j        | j                   | j                                        | _        | j        | _        | j        r&t5          j        | j        | j                   d| _        d}	 | j                            d
           	 | j                                         \  }}}n# t:          j        t>          f$ r Y nw xY w|dk    rd}tA          |          |dk    r|rd}t?          |          d	}	 | j         !                    |||           n# tD          $ r Y nt@          $ r3 |dk    r|d
z  }|r	|| _        Y ndt5          j        | j        |           Y nFtF          $ r: tH          %                    d|||           t5          j        | j        |           Y nw xY w4|| _        | j         j        | _        | j
                            d          | _        | j
                            d          | _        | j
                            d          | _        | j        sd}tA          |          | j        &| j        tL          j'        k    rtL          j(        | _        d | _        | j        tL          j'        k    rN| j        rE| j                                        | _        | )                    | j        | j                  | _        d S d S | j        tL          j(        k    rVtT          j+        ,                    | j-        | j.                  | _        | )                    | j        | j                  | _        d S d S )Nr   r   Fr5  r7  r   r	   zcannot seek to frame Tr#   r   zNo more images in APNG file   fcTLzAPNG missing frame datarN  rM  zimage not found in APNG frame)/rR  rO  rX   r_  r   r^  r\  impyaccessr   r   r   r   rK   _prev_imdisposerY  r   
dispose_opblend_opdispose_extentrP  r>   re  paster   r   r   rY   r}   r~   r_   r   ry   UnicodeDecodeErrorrS  ru   rv   r*   r0   r/   _cropr
   corefillmodesize)rR   rf  r   rB   frame_startr`   ra   rb   s           r3   r`  zPngImageFile._seekL  st   x###1A:: 	#dm,,,!!!&*&8#= )$(DM H,	 H,	( DMDL!%!F!FD"immJ77DO IMM'22DM"&)--"7"7DDLLq(((5e55 oo% IIKKK| AdlD,?@@@ GLLNNDMhDG " ($TWd.ABBB&'#K:Q'+x}}$Cffk2   E '>>7C"3--''>>" /7)#..."&K:HMM#sF3333)   E : : :g~~!& "28D/!E(&99999% : : :LL!5sCHHH(&99999:;:B !DL(DI"immJ77DO IMM'22DM"&)--"7"7D9 $5smm# = T_8L%L%L&4DO?h222} M#}1133#zz$,8KLLM M _ 666 :??49di@@DL::dlD4GHHDLLL 76s7   H% %H>=H>4J 
LL<LA LLc                    | j         S rP   )rP  rd   s    r3   rZ   zPngImageFile.tell  s
    |r2   c                    | j                             d          r| j        dz   | _        | j        | _        t
          j                            |            dS )z"internal: prepare to read PNG filer   )r	   N)r   rY  decoderconfigr\  _PngImageFile__idatr   load_preparerd   s    r3   r  zPngImageFile.load_prepare  sQ     9==%% 	;!%!3d!:D)((.....r2   
read_bytesrl   c                   | j         J | j        dk    r| j                            d           | j                                         \  }}}|dvr| j                             |||           dS |dk    r9	 | j                             |||           n# t          $ r Y nw xY w|dz
  | _        n|| _        | j        dk    |dk    r| j        }nt          || j                  }| j        |z
  | _        | j                            |          S )zinternal: read more image dataNr   r#   )   IDATs   DDATrN  r2   rN  )rR  r  rK   rY   rq   ry   r   min)rR   r  r`   ra   rb   s        r3   	load_readzPngImageFile.load_read  s$    x###kQ GLLOOO#x}}Cf555c3///sg~~HMM#sF3333   D$qj$% kQ* ??JJZ55JkJ.w||J'''s   5B 
BBc                   | j         J | j        dk    r| j                            | j                   	 | j                            d           	 | j                                         \  }}}n# t          j        t          f$ r Y nAw xY w|dk    rn5|dk    r,| j        r%d| _        | j         	                    |||           n	 | j         
                    |||           n# t          $ r Y nt          $ rP |dk    r|dz  }	 t          j        | j        |           n&# t          $ r}t          j        rY d}~Y n|d}~ww xY wY nt"          $ rs t$                              d|||           t          j        | j        |          }|d	d
                                         r| j                            ||df           Y nw xY w| j         j        | _        | j        s"| j                                          d| _         dS | j        r| j        t8          j        k    r|                     | j        | j                   }| j        j!        dk    r+d| j"        v r"|#                    d| j"        d                   }n|$                    d          }| j        %                    || j         |           | j        | _        | j&        rd| _&        dS dS dS dS )z%internal: finished reading image dataNr   Tr#   r   rp  rN  rM  r	   r"   r   r   r!   )'rR  r  rK   rY   r}   r~   r_   ra  r\  rq   ry   ry  r   r   r   r   r]   rS  ru   rv   rT  rQ  ro   r   rW  ri   rs  rv  r5   r7   rz  rq  rw  r}  r   convert_transparentconvertrx  rr  )rR   r`   ra   rb   r   r?   updatedmasks           r3   load_endzPngImageFile.load_end  s!   x###;!GLL%%%"	?GLLOOO#'8==?? S&&L+.    g~~D$4&'#c3///?c3////%    	  	  	 '>>aKF (&9999       6  	  :9 " ? ? ?13VDDD(&99qs8##%% ?'..Q~>>>	?="	?F X%
 	)HNNDHHH} )%-!?!?**TWd.ABB7<5((^ty-H-H"66	. 9 DD #??622D##GT-@$GGG-= )$(DMMM) )!?!?) )sa   A. .BBC# #
G/GDG
E)D=5G;D==EGA9GGdict[str, Any] | Nonec                    d| j         vr|                                  d| j         vrd| j         vrd S |                                                                 S )Nr  zRaw profile type exif)r   re  getexif_get_merged_dictrd   s    r3   _getexifzPngImageFile._getexif  sU    ""IIKKK""'>di'O'O4||~~..000r2   
Image.Exifc                ~    d| j         vr|                                  t                                                      S )Nr  )r   re  r   r  )rR   r   s    r3   r  zPngImageFile.getexif  s1    ""IIKKKww   r2   r   )rf  rm   rM   rN   r   )rf  rm   r   r   rM   rN   )rM   rm   )r  rm   rM   rl   )rM   r  )rM   r  )r+   r,   r-   formatformat_descriptionrc  propertyr   r   rX   r`  rZ   r  r  r  r  r  rC  rD  s   @r3   rJ  rJ    s.       F4A- A- A- A-F   X   $+ + + +_I _I _I _I _IB   / / / / (  (  (  (D8) 8) 8) 8)t1 1 1 1! ! ! ! ! ! ! ! ! !r2   rJ  )r      r   )L;1r  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    Ir   r   r   r   r   r   r   r!   c                <   d                     |          }|                     t          t          |                    |z              |                     |           t	          |t	          |                    }|                     t          |                     dS )z'Write a PNG chunk (including CRC field)r2   N)joinwriteo32r  rH   rK   r`   rF   r   s       r3   putchunkr  :  sx     88D>>DHHST^^c!"""HHTNNN
vc{{
#
#CHHSXXr2   c                      e Zd Zd ZddZdS )	_idatc                "    || _         || _        d S rP   )rK   chunk)rR   rK   r  s      r3   rS   z_idat.__init__H  s    


r2   rF   rl   rM   rN   c                >    |                      | j        d|           d S )Nr  )r  rK   rR   rF   s     r3   r  z_idat.writeL  s     

47GT*****r2   NrF   rl   rM   rN   r+   r,   r-   rS   r  r1   r2   r3   r  r  E  s7          + + + + + +r2   r  c                      e Zd Zd ZddZdS )	_fdatc                0    || _         || _        || _        d S rP   )rK   r  r   )rR   rK   r  r   s       r3   rS   z_fdat.__init__S  s    
r2   rF   rl   rM   rN   c                    |                      | j        dt          | j                  |           | xj        dz  c_        d S )NrN  r	   )r  rK   r  r   r  s     r3   r  z_fdat.writeX  s:    

47GS%6%6===r2   Nr  r  r1   r2   r3   r  r  P  s7          
     r2   r  c                   | j                             d          }| j                             d| j                            dd                    }| j                             d| j                            dt          j                            }	| j                             d| j                            dt
          j                            }
|rt          j        |          }nt          j        | g|          }g }d}|D ]}t          j
        |          D ]}|j        |k    r|                                }n|                    |          }| j                                         }t          |t          t           f          r||         |d<   n|d|j        v r|j        d         |d<   t          |	t          t           f          r|	|         |d<   t          |
t          t           f          r|
|         |d<   |dz  }|r|d         }|d                             d          }|d                             d          }|t          j        k    rt%          |          d	k     rt          j        }|t          j        k    r|d
                                         }t(          j                            d| j        d          }|d         }|r|                    |          }n
d| j        z   }|                    ||           n'|t          j        k    r|d         d
         }n|d
         }t5          j        |                    d          |                    d                    }|                    d          }|sT||                    d          k    r;||                    d          k    r"d|v r|d         dxx         |d         z  cc<   nd }|                    |||d           Ԑt%          |          dk    r|s|d         d
         S  ||dt=          t%          |                    t=          |                     |rQ| j        |k    r|                     |          } t?          j         | tC          ||          dd| j        z   d|fg           d}tE          |          D ]\  }}|d
         }|d         sd|j        z   }n|d         }|                    |          }|j        }|d         }tG          tI          |                    dd                              }|                    d|	          }|                    d|
          } ||dt=          |          t=          |d                   t=          |d                   t=          |d                   t=          |d                   tK          |          tK          d          tM          |          tM          |                     |dz  }|dk    r5|s3t?          j         |tC          ||          dd|j        z   d|fg           tO          |||          }t?          j         ||dd|j        z   d|fg           |j(        }d S )Nr3  r'  r   r5  r7  r	   encoderinfor"   rq  r!   )r   r   r   r   r   r   F)
alpha_only)rq  r   r  s   acTLr   rp  r2  ))r  rY  r   r*   r.   r5   r6   	itertoolschainr   Iteratorr}  r   r  r   listr  r0   r  r/   r
   r{  r|  r~  croprx  r   subtract_modulogetbboxro   r  r   _saver  	enumeraterm   roundo16r   r  r   ) rq  rK   r  r}  rb  r   append_imagesr3  r'  r5  r7  r  	im_framesframe_countim_seqim_framer  previousprev_disposal
prev_blendbase_imrt  r   deltar   rf  
frame_datar~  frame_durationframe_disposalframe_blendfdat_chunkss                                    r3   _write_multiple_framesr  ]  sh   ~!!*--H>fbgkk&!&<&<==D~!!*bgkk*hFV.W.WXXHNwGU_(M(MNNE 5..m44IK 3Y 3Y%.v66 2	Y 2	YH}$$#==??#++D11.--//K(T5M22 D*2;*?J''!jHM&A&A*2-
*CJ'(T5M22 @*2;*?J'%$// :',['9G$1K !$R= ( 7 ; ;J G G%m488AA
 H$888S^^a=O=O$,$:M H$:::&tn1133G#joofbg|LLG#F+D 0"),,t"4"4%/MM'40000"h&:::'mD1GG&tnG"2$$V,,goof.E.E  }}}66%)D)DDD"koog&>&>>>"k11]+J777;z;RR777Hd;WWXXXXe2	Yh 9~~=|D!! 
E
C	NND			    W7d??D!!BE"e,,v7GG/T.UVVVG&y11 ** **zd#&! 	+HM)DDf%D}}T**H} /U;??:q#A#ABBCC$X>>!oogu55LLQLLQLLQLLQLLII~{OO	
 	
 	
 	1A::m:Ob%  (-/G<=     E733KO(-/G<=  
 ")GGU** **r2   rq  Image.ImagerK   rL   filenamer   rN   c                ,    t          | ||d           d S )NT)save_all)r  )rq  rK   r  s      r3   	_save_allr    s    	"b(T******r2   Fc                R  ' |r| j                             d| j                            d                    }t                      }t                      '| j                             dg           }t	          j        | g|          D ]M}t          j        |          D ]6}	|                    |	j	                   '                    |	j
                   7NdD ]}
|
|v r n	|                                }
t          'fdt          d          D                       }n| j
        }| j	        }
|
}|
dk    rd| j         v rt          d| j         d         z  d	          }nU| j        rLt!          t          t#          | j                                        d                   d
z  d	          d          }nd	}|dk    r|dk    rd}n|dk    rd}nd}|d| z  }| j                             dd          | j                             dd          | j                             dd          | j                             dd          f| _        	 t(          |         \  }}}n(# t*          $ r}d|
 d}t-          |          |d }~ww xY w|                    t0                      ||dt3          |d                   t3          |d                   ||ddd	  	         g d}| j                             d| j                            d                    }|r>d}|dz   t5          j        |          z   } ||d|           |                    d           | j                             d           }|rg d!}|j        D ]}|d d         \  }}||v r#|                    |            ||||           6||v r ||||           H|dd                                         r*t#          |          d
k    o|d         }|s ||||           | j	        dk    r_|d
z  }| j                             d"          d |         }t#          |          |k     r|dz  }t#          |          |k      ||d#|           | j                             d$| j                            d$d                     }|s|dk    r| j	        dk    rk|} tC          |tD                    r ||d%|d |                     n@t!          dt          d&|                    }d'|z  dz   }! ||d%|!d |                     n| j	        d(v r9t!          dt          d)|                    } ||d%tG          |                     n| j	        d"k    rA|\  }"}#}$ ||d%tG          |"          tG          |#          z   tG          |$          z              nud$| j         v rd*}t-          |          nZ| j	        dk    rO| j        $                                d+k    r2| j                             d+d,          }!|}  ||d%|!d |                     | j                             d-          }%|%r[ ||d.t3          tK          |%d         d/z  d0z                       t3          tK          |%d         d/z  d0z                       d1           |rAd2d3g}|j        D ]5}|d d         \  }}||v r"|                    |            ||||           6| j                             d4          }&|&r[tC          |&tL          j'                  r|&(                    d5          }&|&)                    d6          r
|&d7d          }& ||d8|&           |rtU          | |||
|||          } | r1tW          j,        | t[          ||          d9d:| j
        z   d|fg           |r]|j        D ]U}|d d         \  }}|dd                                         r*t#          |          d
k    o|d         }|r ||||           V ||d;d           t]          |d<          r|/                                 d S d S )=Nr   r  )r!   r   r   c              3  P   K   | ]t          fd D                       V   dS )c              3  (   K   | ]}|         V  d S rP   r1   )r   
frame_sizer   s     r3   r   z"_save.<locals>.<genexpr>.<genexpr>  s'      ??:A??????r2   N)max)r   r   sizess    @r3   r   z_save.<locals>.<genexpr>  sA      RRAS?????????RRRRRRr2   r"   r   bitsr	      r&   r%   r#   ;optimizeFcompress_levelr  compress_type
dictionaryr2   zcannot write mode z as PNGs   IHDRr   r   )s   cHRMs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  pnginfo)s   sPLTr   r   r   r   s   PLTEr   s   tRNS      )r   r   r  r   i  z%cannot use transparency for this moder!   Ar  s   pHYsr  g      ?r  s   bKGDs   hISTr  r$   r$  r'   s   eXIfr   r   r   flush)0r  rY  r   setr  r  r   r  r   r}  r~  rW   r  rl  r  r[  r  r  getdataencoderconfig	_OUTMODESKeyErrorr   r  rG  r  r9   r   remover   rT  rq  
getpaletter   rl   r  getpalettemoderm   r
   Exiftobytes
startswithr  r   r  r  hasattrr  )(rq  rK   r  r  r  r   modesr  r  r  r}  r~  outmodecolorsr  rb  	bit_depth
color_typer   rB   r   iccnamerF   r   chunks_multiple_allowed
info_chunkr`   r   palette_byte_numberpalette_bytesr   alpha_bytesalpharedgreenbluer  r  r  s(                                          @r3   r  r    sC	     **RW[[99
 
 **?B??ordM:: 	) 	)F)26:: ) )		(-(((		(-(((() ) 	 	Du}}  99;;DRRRRqRRRRRwwGs{{ R^##bnV44c::FF z SRZ%7%7%9%9!%<!=!=!BCHH!LLR<<{{1z4zz!G 	:u--
+R00
?B//
<--	B")27);&JJ " " "04000cll!" HHV	E
DGDG
 
 
 ;::F
.

]BGKK,F,F
G
GC
  g~c 2 22b'4    	g>i((D )"F"F"F+ 	) 	)J"2A2ICf}}c"""b#t$$$$///b#t$$$$QqS!!## ) __1Cjm
! )E"c4(((	w#~~$qj((//0D1D0DE-  #666U"M -  #666b'=)))>%%nbgkk.RV6W6WXXL 4|q((7c>> K,.. 8b'<#=>>>>"1c#|&<&<==,.6b'5+#67777W///q#e\":":;;LE"gs<001111W+CE"gs3xx#e**4s4yy@AAAA// >cll"	 0 7c>>be2244>>E$$VS11E KE"gu\k\2333
.

U
#
#C
 
CFVOc)**++CFVOc)**++	
 	
 	
  %7#+ 	% 	%J"2A2ICf}}c"""b#t$$$>f%%D !dEJ'' 	#<<??D???++ 	8Db'4    
#E4-
 
 
 WE"e,,v7GG/T.UVVV )+ 	) 	)J"2A2IC1Q3x!! ) __1Cjm
 )E"c4(((	E"gsr7 





 s    I 
I7I22I7c                     G d d          }d } |            }	 || _         t          | |d|           | ` n# | ` w xY w|j        S )z4Return a list of PNG chunks representing this image.c                  "    e Zd Zg Zd	dZd
dZdS )getchunks.<locals>.collectorrF   rl   rM   rN   c                    d S rP   r1   r  s     r3   r  z"getchunks.<locals>.collector.write  s    Dr2   r  c                :    | j                             |           d S rP   )rF   ro   )rR   r  s     r3   ro   z#getchunks.<locals>.collector.append  s    IU#####r2   Nr  )r  rl   rM   rN   )r+   r,   r-   rF   r  ro   r1   r2   r3   	collectorr    sA        	 	 	 		$ 	$ 	$ 	$ 	$ 	$r2   r  c                    d                     |          }t          t          |t          |                              }|                     |||f           d S )Nr2   )r  r  rH   ro   r  s       r3   ro   zgetchunks.<locals>.append  sM    xx~~&vc{{++,,
		3c"#####r2   N)r  r  rF   )rq  paramsr  ro   rK   s        r3   	getchunksr    s    $ $ $ $ $ $ $ $$ $ $
 
Bb"dF###NNBN7Ns   8 <z.pngz.apngz	image/png)r   )rE  rl   rM   r   )rq  r  rK   rL   r  r   rM   rN   )E
__future__r   r  loggingrer}   r(  r9   enumr   typingr   r   r   r   r   r
   r   r   r   r   _binaryr   r   r   r[   r   r   r  r   r  r   	getLoggerr+   ru   compiler   r\   rG  r   r   	SAFEBLOCKr<   r   r*   r5   rC   rH   rJ   r   r   r   r   rH  rJ  r  r  r  r  r  r  r  r  register_openr  register_saveregister_save_allregister_extensionsregister_mimer1   r2   r3   <module>r      s  B # " " " " "      				          3 3 3 3 3 3 3 3 3 3 3 3 G G G G G G G G G G G G G G ! ! ! ! ! ! ! ! ! ! ! !       ! ! ! ! ! ! ! ! ! ! ! ! 		8	$	$	L	!	!	' 
 !+
 
2 "*011$
 ~%    w   *    G     / / / /Z Z Z Z Z Z Z Zz    3   2Y3 Y3 Y3 Y3 Y3 Y3 Y3 Y3@U4 U4 U4 U4 U4 U4 U4 U4x
       K! K! K! K! K!9& K! K! K!f
 
!$$$	 
"	$'($$$	 $&! 	(  + + + + + + + +
 
 
 
 
 
 
 
~* ~* ~*B+ + + + #+U C C C CT  >  L'w ? ? ?  L' / / /  +Y 7 7 7  ,-/@ A A A  L' 5 5 5 5 5r2   