
    zvg                       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 d dlmZmZ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          Z0 G d$ d%e          Z1dod)Z2dpdqd-Z3 G d. d/          Z4 G d0 d1e5          Z6 G d2 d3          Z7 G d4 d5e          Z8 G d6 d7e4          Z9drd:Z: G d; d<ej                  Z;d=d>d?d@dAdBdCdCdCdDdEdFdGdHdIdJZ<dsdOZ= G dP dQ          Z> G dR dS          Z? G dT dUe          Z@dtdaZAduddZBe=defdvdgZCdwdkZD ejE        e;jF        e;e:            ejG        e;jF        eC            ejH        e;jF        eB            ejI        e;jF        dldmg            ejJ        e;jF        dn           dS )x    )annotationsN)Callable)IntEnum)IOTYPE_CHECKINGAny
NamedTupleNoReturncast   )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     O/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/PIL/PngImagePlugin.pyr-   r-   h   s1        G M
 K r5   r-   c                      e Zd ZdZ	 dZdS )Blendr   r   N)r.   r/   r0   	OP_SOURCEOP_OVERr4   r5   r6   r8   r8   }   s%        I
 G r5   r8   sbytesreturnc                    t          j                    }|                    | t                    }|j        rd}t          |          |S )Nz=Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)r;   dobj	plaintextmsgs       r6   _safe_zlib_decompressrH      sE    D>22I Moor5   dataseedintc                2    t          j        | |          dz  S )Nl    )r?   crc32)rI   rJ   s     r6   _crc32rN      s    :dD!!J..r5   c                  `    e Z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%dZdS )&ChunkStreamfp	IO[bytes]r=   Nonec                "    || _         g | _        d S N)rQ   queue)selfrQ   s     r6   __init__zChunkStream.__init__   s    $&:<


r5   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 ))rQ   rV   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rW   cidposlengthr;   rG   s         r6   r^   zChunkStream.read   s    w""": 	#z~~//CfGLLQAABB%C',,..CVVFc{{ 	'2 '<S		<<<!#&&&Cr5   c                    | S rU   r4   rW   s    r6   	__enter__zChunkStream.__enter__   s    r5   argsobjectc                .    |                                   d S rU   )close)rW   rk   s     r6   __exit__zChunkStream.__exit__   s    

r5   c                "    d x| _         | _        d S rU   )rV   rQ   ri   s    r6   rn   zChunkStream.close   s    ##
TWWWr5   re   r<   rf   rK   rg   c                R    | j         J | j                             |||f           d S rU   )rV   appendrW   re   rf   rg   s       r6   pushzChunkStream.push   s3    z%%%
3V,-----r5   c                    t                               d|||            t          | d|                    d                     ||          S )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoders   s       r6   callzChunkStream.call   sN     	&S&999<wt;cjj&9&9;;<<S&IIIr5   rI   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 r[   z(broken PNG file (incomplete checksum in )r   rb   crc_skiprQ   rN   r`   r^   rc   rd   structerror)rW   re   rI   crc1crc2rG   es          r6   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&   )rQ   r^   )rW   re   rI   s      r6   r   zChunkStream.crc_skip   s'     w"""Qr5      IENDendchunklist[bytes]c                :   g }| j         J 	 	 |                                 \  }}}n)# t          j        $ r}d}t	          |          |d }~ww xY w||k    rnD|                     |t          j        | j         |                     |                    |           |S )NTztruncated PNG file)	rQ   r^   r   r   OSErrorr   r   
_safe_readrr   )rW   r   cidsre   rf   rg   r   rG   s           r6   verifyzChunkStream.verify   s     w"""
	*#'99;; S&&< * * **cll)* hHHS).tw??@@@KK
	 s   ' AAANrQ   rR   r=   rS   )r=   rY   )r=   rP   )rk   rl   r=   rS   r=   rS   )re   r<   rf   rK   rg   rK   r=   rS   )re   r<   rf   rK   rg   rK   r=   r<   )re   r<   rI   r<   r=   rS   )r   )r   r<   r=   r   )r.   r/   r0   rX   r^   rj   ro   rn   rt   r|   r   r   r   r4   r5   r6   rP   rP      s        = = = =       *      $ $ $ $. . . .J J J J* * * **         r5   rP   c                  D    e Zd ZU dZded<   ded<   e	 d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tkeyNtextstr
str | Noner=   c                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
        )r   __new__r   r   )clsr   r   r   rW   s        r6   r   ziTXt.__new__  s*     {{3%%		r5   )NN)r   r   r   r   r   r   r=   r   )r.   r/   r0   __doc____annotations__staticmethodr   r4   r5   r6   r   r      s`           DH    \  r5   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=))

    r=   rS   c                    g | _         d S rU   )chunksri   s    r6   rX   zPngInfo.__init__  s    79r5   Fre   r<   rI   
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   rr   )rW   re   rI   r   s       r6   addzPngInfo.add  s'     	Cz233333r5    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)
isinstancer<   encoder   r?   compress)rW   r   r   r   r   r   s         r6   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Tr5   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

        Nr5   )r   r   r      zTXt        tEXtr   )r   r   r   r   r   r<   r   UnicodeErrorr   r?   r   )rW   r   r   r   s       r6   add_textzPngInfo.add_textM  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)re   r<   rI   r<   r   r   r=   rS   )r   r   F)r   r   r   r   r   r   r   r   r   r   r=   rS   )r   r   r   r   r   r   r=   rS   )r.   r/   r0   r   rX   r   r   r   r4   r5   r6   r   r     s         
: : : :
4 
4 
4 
4 
4  !U !U !U !U !UH HM!3 !3 !3 !3 !3 !3 !3r5   r   c                  .    e Zd ZU ded<   ded<   ded<   dS )_RewindStatez dict[str | tuple[int, int], Any]infozlist[ImageFile._Tile]tilez
int | Noneseq_numNr.   r/   r0   r   r4   r5   r6   r   r   u  s6         ****r5   r   c                       e Zd Zd  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 )%	PngStreamrQ   rR   r=   rS   c                   t                                          |           i | _        i | _        d| _        d| _        g | _        d | _        d | _        d | _	        d | _
        t          i g d           | _        d| _        d S )Nr   r   r   r   )superrX   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memory)rW   rQ   	__class__s     r6   rX   zPngStream.__init__|  s     :<.0.048.2'+$((R66r5   chunklenrK   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_MEMORYrD   )rW   r   rG   s      r6   check_text_memoryzPngStream.check_text_memory  sY    H$o--6#6 6 6  S//! .-r5   c                t    t          | j                                        | j        | j                  | _        d S rU   )r   r   copyr   r   r   ri   s    r6   save_rewindzPngStream.save_rewind  s5    (LLM
 
r5   c                    | j         j                                        | _        | j         j        | _        | j         j        | _        d S rU   )r   r   r   r   r   r   r   r   ri   s    r6   rewindzPngStream.rewind  s9    (-2244(-)1r5   rf   rg   r<   c                   | j         J 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)rQ   r   r   findrx   ry   rd   rH   rD   rb   r?   r   r   )rW   rf   rg   r;   icomp_methodrG   r   s           r6   
chunk_iCCPzPngStream.chunk_iCCP  s$   w""" &11 FF5MM+QrrU333Ah,k:::!KKKKCc"""	/!a%''
;;KK 	 	 	. "  z 	 	 	KKK	&1]#s   B9 9C(C('C(c                   | j         J 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)rQ   r   r   rb   rD   r`   r   _MODESr   
im_rawmode	Exceptionr   rd   rW   rf   rg   r;   rG   s        r6   
chunk_IHDRzPngStream.chunk_IHDR  s    w""" &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)t          j        d| j         d         || j                  g}n6| j        
d| j         d<   t          j        dd| j        z   || j                  g}|| _        || _        d}t          |          )Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler   r   r   r   im_idatEOFError)rW   rf   rg   r   rG   s        r6   
chunk_IDATzPngStream.chunk_IDAT  s    T\!!OE4<+?doVVWDD+04_-OE6DL+@#tWWXD smmr5   c                $    d}t          |          )Nzend of PNG image)r   )rW   rf   rg   rG   s       r6   
chunk_IENDzPngStream.chunk_IEND  s     smmr5   c                t    | j         J t          j        | j         |          }| j        dk    r	d|f| _        |S )Nr   r   )rQ   r   r   r   r   rW   rf   rg   r;   s       r6   
chunk_PLTEzPngStream.chunk_PLTE  sA    w""" &11<3#QhDOr5   c                   | j         J 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&   )	rQ   r   r   r   _simple_palettematchr   r   i16)rW   rf   rg   r;   r   s        r6   
chunk_tRNSzPngStream.chunk_tRNS  s    w""" &11<3$$Q'' 	1 FF5MM6634DL0 01^,,\///+.q66DL((\U""+.q663q!99c!Qii+GDL(r5   c                    | j         J t          j        | j         |          }t          |          dz  | j        d<   |S )N     j@gamma)rQ   r   r   r`   r   r   s       r6   
chunk_gAMAzPngStream.chunk_gAMA  s@    w""" &11 #A 1Wr5   c                    | j         J t          j        | j         |          }t          j        dt          |          dz   d|          }t          d |D                       | j        d<   |S )N>r&   Ic              3      K   | ]	}|d z  V  
dS )r  Nr4   ).0elts     r6   	<genexpr>z'PngStream.chunk_cHRM.<locals>.<genexpr>  s&      ,P,PS8^,P,P,P,P,P,Pr5   chromaticity)rQ   r   r   r   unpacklentupler   )rW   rf   rg   r;   raw_valss        r6   
chunk_cHRMzPngStream.chunk_cHRM  su     w""" &11=!3SVVq[!3!3!3Q77',,P,Px,P,P,P'P'P^$r5   c                    | j         J t          j        | j         |          }|dk     rt          j        r|S d}t	          |          |d         | j        d<   |S )Nr   zTruncated sRGB chunkr   srgb)rQ   r   r   rb   rD   r   r   s        r6   
chunk_sRGBzPngStream.chunk_sRGB  se     w""" &11A::. (CS//! tVr5   c                @   | j         J 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)rQ   r   r   rb   rD   r`   r   )	rW   rf   rg   r;   rG   pxpyunitr  s	            r6   
chunk_pHYszPngStream.chunk_pHYs#  s    w""" &11A::. (CS//!QC1IIBt199v+rF{*C"%DLQYY%'VDL"r5   c                   | j         J 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   r5   r   r   replaces   exif)
rQ   r   r   splitrD   r{   r   r   r   r  )rW   rf   rg   r;   kvk_strv_strs           r6   
chunk_tEXtzPngStream.chunk_tEXt5  s    w""" &11	775!$$DAqq 	 	 	AAAA	  	/HHY11EHHY	22E'(G||!!DL"'DL""3u::...s   ? AAc                X   | j         J 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   r5   r   r   z in zTXt chunkr   r   r  )rQ   r   r   r  rD   rd   rH   rb   r?   r   r{   r   r   r   r  )
rW   rf   rg   r;   r   r!  r   rG   r"  r#  s
             r6   
chunk_zTXtzPngStream.chunk_zTXtI  s   w""" &11	775!$$DAqq 	 	 	AAAA	  	A$KKK!KKKKCc"""	%ae,,AA 	 	 	.   z 	 	 	AAA	  	/HHY11EHHY	22E8==DL$,u"5""3u::...s'   ? AA<B C0CCc                   | j         J 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   )rQ   r   r   r  rD   r  rH   rb   r?   r   r   r{   r   r   r   r   )rW   rf   rg   rr;   r   cfcmr   tkr!  r"  lang_strtk_strr#  s                  r6   
chunk_iTXtzPngStream.chunk_iTXtl  s0   w"""$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	HHY11E{{7H55HYYw11FHHWh//EE 	 	 	HHH	 59&4Q4QQUdl51s5zz***sN   A AAB B-,B-=C C;'C;:C;AE* *E98E9c                f    | j         J t          j        | j         |          }d|z   | j        d<   |S )N   Exif  exif)rQ   r   r   r   r   s       r6   
chunk_eXIfzPngStream.chunk_eXIf  s:    w""" &11.2Vr5   c                   | j         J 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)rQ   r   r   rb   rD   r   warningswarnr`   r   r   )rW   rf   rg   r;   rG   n_framess         r6   
chunk_acTLzPngStream.chunk_acTL  s    w""" &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".r5   c                   | j         J 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)rQ   r   r   rb   rD   r`   r   rd   r   r   r   float)rW   rf   rg   r;   rG   seqwidthheightr  r  im_wim_h	delay_num	delay_dens                 r6   
chunk_fcTLzPngStream.chunk_fcTL  s   w""" &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r5   c                h   | j         J |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<  )	rQ   r   rb   r   rD   r`   r   rd   r   )rW   rf   rg   r;   rG   rG  s         r6   
chunk_fdATzPngStream.chunk_fdAT  s    w"""A::. (&996CS//! !,,!ff=C!G##7Cc"""sQw
333r5   r   )r   rK   r=   rS   r   )rf   rK   rg   rK   r=   r<   )rf   rK   rg   rK   r=   r
   )r.   r/   r0   rX   r   r   r   r   r   r   r   r   r   r  r  r  r  r$  r&  r/  r3  r9  rN  rP  __classcell__r   s   @r6   r   r   {  s            "" " " "
 
 
 
2 2 2 2
   8   *            *         "   $   (! ! ! !F) ) ) )V      *   <4 4 4 4 4 4 4 4r5   r   prefixr   c                (    | d d         t           k    S )Nr'   )_MAGIC)rS  s    r6   _acceptrV    s    "1":r5   c                       e Zd ZdZdZddZed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 graphicsr=   rS   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&   ).rV  rQ   r^   rd   _fp_PngImageFile__frameprivate_chunksr   pngr|   r   AttributeErrorrx   ry   r   r   islowerrr   r   r   _moder   _sizer   r   _textr   r   r   custom_mimetyper   r8  getr   r   r   rawpalette_PngImageFile__prepare_idat!_close_exclusive_fp_after_loadingr   _PngImageFile__rewind_idatr_   _PngImageFile__rewind_seekis_animated)rW   rG   re   rf   rg   r;   rawmoderI   s           r6   _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$	37
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/dict[str, str | iTXt]c                    | j         [| j        r$| j        }|                     | j        dz
             |                                  | j        r|                     |           | j         J | j         S )Nr   )re  ro  r^  r]   r8  load)rW   frames     r6   r   zPngImageFile.text5  sy     :  -		$-!+,,,IIKKK !		%   z%%%zr5   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'   )rQ   RuntimeErrorr]   r   r`  r   rn   _exclusive_fp)rW   rG   s     r6   r   zPngImageFile.verifyE  s     7?=Cs### 	TYq\!_q()))x### 	GMMOOOr5   ru  rK   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_checkr^  rn  ranger   r]   )rW   ru  
last_framefr   rG   s         r6   r]   zPngImageFile.seekW  s    && 	F4<JJq$\
t|a'33 	+ 	+A+

1 + + +		*%%%3smm*+	+ 	+s   A44
B*>'B%%B*Fr   r   c                H	   | j         J |  d }|dk    r
|ry| j                            | j                   | j                                          | j        | _        d | _        | j         j        | _	        | j         j
        | _        | j        | _        d | _        d | _        | j	                            dd          | _        | j	                            d          | _        | j	                            d          | _        | j	                            d          }d| _        nx|| 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          |          |r|| _        | 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   FrC  rE  r   r   zcannot seek to frame Tr&   r   zNo more images in APNG file   fcTLzAPNG missing frame datar\  r[  zimage not found in APNG frame)/r`  r]  r]   rm  r   rl  rj  _imr   r   r   r   rQ   _prev_imdisposerg  r   
dispose_opblend_opr^  rD   rt  impastedispose_extentr   r   r   r^   r   r   rd   r   r|   UnicodeDecodeErrorra  rx   ry   r-   r3   r2   _cropr   corefillmodesize)	rW   ru  r   r  rG   frame_startre   rf   rg   s	            r6   rn  zPngImageFile._seekf  ss   x###1A:: #dm,,,!!!&*&8# H,	 H,	( DMDL!%!F!FD"immJ77DO IMM'22DM!Y]]622N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!Y]]622N9 $5smm# 	TESD = 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   6H H-,H-#J   
L
L
+L
A L
	L
c                    | j         S rU   )r^  ri   s    r6   r_   zPngImageFile.tell  s
    |r5   c                    | j                             d          r| j        dz   | _        | j        | _        t
          j                            |            dS )z"internal: prepare to read PNG filer   )r   N)r   rg  decoderconfigrj  _PngImageFile__idatr   load_prepareri   s    r6   r  zPngImageFile.load_prepare  sQ     9==%% 	;!%!3d!:D)((.....r5   
read_bytesr<   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   DDATr\  r5   r\  )r`  r  rQ   r^   rt   r|   r   min)rW   r  re   rf   rg   s        r6   	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        r0| j        t8          j        k    r|                     | j        | j                   }| j        j!        dk    r+d| j"        v r"|#                    d| j"        d                   }n| j        j!        dk    rkd| j"        v rb| j"        d         }tI          |tJ                    r|&                    |           n*tI          |tN                    r|(                    |           |)                    d          }| j        *                    || j         |           | j        | _        dS dS dS )z%internal: finished reading image dataNr   Tr&   r   r  r\  r[  r   r%   r   r   r$   r   )+r`  r  rQ   r^   r   r   rd   ro  rj  rt   r|   r  r   r   r   r   rb   ra  rx   ry   rb  r_  rr   r   re  rn   r  r  r8   r:   r  r  r  r  r   convert_transparentr   r<   putpalettealphasrK   putpalettealphaconvertr  )	rW   re   rf   rg   r   r;   updatedmaskts	            r6   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 w|s**~/J/J In5%a// 7#44Q7777'3// 7#33A666"??622D##GT-@$GGG-( (!?!?sa   A. .BBC# #
G/GDG
E)D=5G;D==EGA9GGdict[int, Any] | Nonec                    d| j         vr|                                  d| j         vrd| j         vrd S |                                                                 S )Nr2  zRaw profile type exif)r   rt  getexif_get_merged_dictri   s    r6   _getexifzPngImageFile._getexif4  sU    ""IIKKK""'>di'O'O4||~~..000r5   
Image.Exifc                ~    d| j         vr|                                  t                                                      S )Nr2  )r   rt  r   r  )rW   r   s    r6   r  zPngImageFile.getexif;  s1    ""IIKKKww   r5   r   )r=   rr  )ru  rK   r=   rS   r   )ru  rK   r   r   r=   rS   )r=   rK   )r  rK   r=   r<   )r=   r  )r=   r  )r.   r/   r0   formatformat_descriptionrq  propertyr   r   r]   rn  r_   r  r  r  r  r  rQ  rR  s   @r6   rX  rX    s3       F4A- A- A- A-F    X   $+ + + +`I `I `I `I `ID   / / / / (  (  (  (D<( <( <( <(|1 1 1 1! ! ! ! ! ! ! ! ! !r5   rX  )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#   r  r   r   r    r!   r"   r   r   r$   rQ   rR   re   rS   c                <   d                     |          }|                     t          t          |                    |z              |                     |           t	          |t	          |                    }|                     t          |                     dS )z'Write a PNG chunk (including CRC field)r5   N)joinwriteo32r  rN   )rQ   re   rI   	byte_datar   s        r6   putchunkr  Y  s}     IHHSY  3&'''HHY
F3KK
(
(CHHSXXr5   c                      e Zd ZddZdd
ZdS )_idatrQ   rR   chunkCallable[..., None]r=   rS   c                "    || _         || _        d S rU   )rQ   r  )rW   rQ   r  s      r6   rX   z_idat.__init__g  s    


r5   rI   r<   c                >    |                      | j        d|           d S )Nr  )r  rQ   rW   rI   s     r6   r  z_idat.writek  s     

47GT*****r5   N)rQ   rR   r  r  r=   rS   rI   r<   r=   rS   r.   r/   r0   rX   r  r4   r5   r6   r  r  d  s<           + + + + + +r5   r  c                      e Zd Zdd	ZddZdS )_fdatrQ   rR   r  r  r   rK   r=   rS   c                0    || _         || _        || _        d S rU   )rQ   r  r   )rW   rQ   r  r   s       r6   rX   z_fdat.__init__r  s    
r5   rI   r<   c                    |                      | j        dt          | j                  |           | xj        dz  c_        d S )Nr\  r   )r  rQ   r  r   r  s     r6   r  z_fdat.writew  s:    

47GS%6%6===r5   N)rQ   rR   r  r  r   rK   r=   rS   r  r  r4   r5   r6   r  r  o  s<           
     r5   r  c                  .    e Zd ZU ded<   ded<   ded<   dS )_FrameImage.Imager  z tuple[int, int, int, int] | Noner   zdict[str, Any]encoderinfoNr   r4   r5   r6   r  r  |  s3         OOO****r5   r  r  r  r  r  r  r   rp  r   Image.Image | Noneappend_imageslist[Image.Image]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         }|j                             d          }|j                             d          }|t          j        k    rt%          |          dk     rt          j        }|t          j        k    r|j                                        }t*          j                            d	| j        d
          }|j        }|r|                    |          }n
d| j        z   }|                    ||           n%|t          j        k    r|d         j        }n|j        }t9          j        |                    d	          |                    d	                    }|                    d          }|sS||                    d          k    r:||                    d          k    r!d|v r|j         dxx         |d         z  cc<   nd }|                    tA          |||                     ؐt%          |          dk    r|s|d         j        S  ||dtC          t%          |                    tC          |                     |r| j        |k    r|                     |          } tE          j#        | tI          tJ          tL                   tO          ||                    tE          j(        dd| j        z   d|          g           d}tS          |          D ] \  }}|j        }|j        sd|j        z   }n|j        }|                    |          }|j        }|j         }tU          tW          |                    dd                              }|                    d|	          }|                    d|
          } ||dtC          |          tC          |d                   tC          |d                   tC          |d                   tC          |d                   tY          |          tY          d          t[          |          t[          |                     |dz  }|dk    rd|sbtE          j#        |tI          tJ          tL                   tO          ||                    tE          j(        dd|j        z   d|          g           t]          |||          }tE          j#        |tI          tJ          tL                   |          tE          j(        dd|j        z   d|          g           |j/        }"d S )NrA  r5  r   rC  rE  r   r%   r$   )r   r   r   r   r   F)
alpha_onlys   acTLr   r  r@  )0r  rg  r   r-   r1   r8   r9   	itertoolschainr   Iteratorr  r   r  r   listr  r3   r  r2   r  r   r  r  r  r   cropr  r   subtract_modulogetbboxrr   r  r  r   _saver   r   r<   r  r   	enumeraterK   roundo16r   r  r   ) r  rQ   r  r  rp  r   r  rA  r5  rC  rE  r  	im_framesframe_countim_seqim_framer  previousprev_disposal
prev_blendbase_imr  r   deltar   ru  
frame_datar  frame_durationframe_disposalframe_blendfdat_chunkss                                    r6   _write_multiple_framesr    s    ~!!*--H>fbgkk&!&<&<==D~!!*bgkk*hFV.W.WXXHNwGU_(M(MNNE 5..m44 IK 3B 3B%.v66 2	B 2	B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= ( 4 8 8 D D%155g>>
 H$888S^^a=O=O$,$:M H$:::&k..00G#joofbg|LLG#=D 0"),,t"4"4%/MM'40000"h&:::'m.GG&kG"2$$V,,goof.E.E  }}}66%)D)DDD"koog&>&>>>"k11(444J8OO444VHdK@@AAAAe2	Bh 9~~=| 
E
C	NND			    
7d??D!!BEE"e,,--_UFRW$4aAAB	
 	
 	
 G&y11 ** **z= 	+HM)DD?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RYb% 0 011(>7KKL     E733KORY,,(>7KKL  
 ")GG4r5   filenamer   c                ,    t          | ||d           d S )NT)save_all)r  )r  rQ   r  s      r6   	_save_allr    s    	"b(T******r5   Fr  c                  ( |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          | |||
|||          }'|'r`tW          j,        |'t[          t\          tD                   t_          ||                    tW          j0        d9d:|'j
        z   d|          g           |r]|j        D ]U}|d d         \  }}|dd                                         r*t#          |          d
k    o|d         }|r ||||           V ||d;d           tc          |d<          r|2                                 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 rU   r4   )r	  
frame_sizer   s     r6   r  z"_save.<locals>.<genexpr>.<genexpr>-  s'      ??:A??????r5   N)max)r	  r   sizess    @r6   r  z_save.<locals>.<genexpr>-  sA      RRAS?????????RRRRRRr5   r%   r   bitsr      r)   r(   r&   ;optimizeFcompress_levelr  compress_type
dictionaryr5   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   hISTr2  r'   r1  r*   s   eXIfr   r   r   flush)3r  rg  r   setr  r  r   r  r   r  r  r\   r  r{  r  ri  r  r  getdataencoderconfig	_OUTMODESKeyErrorr   r  rU  r  r?   r   remover   rb  r  
getpaletter   r<   r  getpalettemoderK   r   Exiftobytes
startswithr  r   r  r   r   r  r   hasattrr  ))r  rQ   r  r  r  r   modesr  r  r  r  r  outmodecolorsr  rp  	bit_depth
color_typer   rG   r   iccnamerI   r   chunks_multiple_allowed
info_chunkre   r   palette_byte_numberpalette_bytesr   alpha_bytesalpharedgreenbluer  r2  	single_imr  s)                                           @r6   r  r    sg	     **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   $&I 
*E4-
 
	  
EE"e,,--_UFY^$;QHHI	
 	
 	
  )+ 	) 	)J"2A2IC1Q3x!! ) __1Cjm
 )E"c4(((	E"gsr7 





 s    I 
I7I22I7paramsr    list[tuple[bytes, bytes, bytes]]c                    ddl m} g dfd
} |            }	 || _        t          | |d|           | `n# | `w xY wS )z4Return a list of PNG chunks representing this image.r   )BytesIOrQ   rR   re   r<   rI   r=   rS   c                    d                     |          }t          t          |t          |                              }                    |||f           d S )Nr5   )r  r  rN   rr   )rQ   re   rI   r  r   r   s        r6   rr   zgetchunks.<locals>.append  sN    HHTNN	&F3KK0011sIs+,,,,,r5   r   rQ   rR   re   r<   rI   r<   r=   rS   )ior#  r  r  )r  r   r#  rr   rQ   r   s        @r6   	getchunksr'    s    F- - - - - -
 
Bb"b&!!!NNBNMs   7 ;z.pngz.apngz	image/png)r;   r<   r=   r<   )r   )rI   r<   rJ   rK   r=   rK   )rS  r<   r=   r   r%  )r  r  rQ   rR   r  r  r  r   rp  r   r   r  r  r  r=   r  )r  r  rQ   rR   r  r   r=   rS   )r  r  rQ   rR   r  r   r  r  r  r   r=   rS   )r  r  r   r   r=   r!  )K
__future__r   r  loggingrer   r6  r?   collections.abcr   enumr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   _binaryr   r   r   r`   r   r   r  r   r  r   	getLoggerr.   rx   compiler   ra   rU  r   r   	SAFEBLOCKrB   r   r-   r8   rH   rN   rP   r   r   r   r   r   rV  rX  r  r  r  r  r  r  r  r  r'  register_openr  register_saveregister_save_allregister_extensionsregister_mimer4   r5   r6   <module>r7     sK  B # " " " " "      				    $ $ $ $ $ $       E E E E E E E E E E E E E E E E G G G G G G G G G G G G G G ! ! ! ! ! ! ! ! ! ! ! !       ! ! ! ! ! ! ! ! ! ! ! ! 		8	$	$	L	!	!	' 
 !+
 
2 "*011$
 ~%    w   *    G      / / / / /[ [ [ [ [ [ [ [|    3   6Y3 Y3 Y3 Y3 Y3 Y3 Y3 Y3@    :   d4 d4 d4 d4 d4 d4 d4 d4V       Q! Q! Q! Q! Q!9& Q! Q! Q!r
 
!$$$	 
"	$'($$$	 $&! 	(   + + + + + + + +
 
 
 
 
 
 
 
         Z      K K K K\+ + + + "*N N N N Nj   2  L'w ? ? ?  L' / / /  +Y 7 7 7  ,-/@ A A A  L' 5 5 5 5 5r5   