
    g                       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jF                  d      jH                  Z%dZ&ddddddddddddddddZ' ejF                  d      Z(ejR                  Z*	 d e*z  Z+	  G d! d"e	      Z, G d# d$e	      Z-d% Z.dMd&Z/ G d' d(      Z0 G d) d*e1      Z2 G d+ d,      Z3 G d- d.e0      Z4dNd/Z5 G d0 d1ej$                        Z6d2d3d4d5d6d7d8d8d8d9d:d;d<d=d>d?Z7d@ Z8 G dA dB      Z9 G dC dD      Z:dE Z;dOdFZ<e8dGfdHZ=dI Z> ej~                  e6j                  e6e5        ej                  e6j                  e=        ej                  e6j                  e<        ej                  e6j                  dJdKg        ej                  e6j                  dL       y)P    )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y)Disposalr   r	   r"   N)__name__
__module____qualname__OP_NONEOP_BACKGROUNDOP_PREVIOUS     G/var/www/openai/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.pyr*   r*   g   s$    G M
 Kr2   r*   c                      e Zd ZdZ	 dZy)Blendr   r	   N)r+   r,   r-   	OP_SOURCEOP_OVERr1   r2   r3   r5   r5   |   s    I
 Gr2   r5   c                    t        j                         }|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      s>    D>2I+or2   c                4    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y)ChunkStreamc                     || _         g | _        y N)fpqueue)selfrM   s     r3   __init__zChunkStream.__init__   s    $&:<
r2   c                   d}| j                   J | j                  r:| j                  j                         \  }}}| j                   j                  |       nE| j                   j	                  d      }|dd }| j                   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 ))rM   rN   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rO   cidposlengthr?   rB   s         r3   rU   zChunkStream.read   s    ww"""::#zz~~/CfGGLLQAAB%C'',,.CVFc{22/S	{!<!#&&Cr2   c                    | S rL   r1   rO   s    r3   	__enter__zChunkStream.__enter__   s    r2   c                $    | j                          y rL   )close)rO   argss     r3   __exit__zChunkStream.__exit__   s    

r2   c                     d x| _         | _        y rL   )rN   rM   r`   s    r3   rc   zChunkStream.close   s    ##
TWr2   c                \    | j                   J | j                   j                  |||f       y rL   )rN   appendrO   r\   r]   r^   s       r3   pushzChunkStream.push   s+    zz%%%

3V,-r2   c                |    t         j                  d|||        t        | d|j                  d             ||      S )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoderi   s       r3   callzChunkStream.call   s>     	&S&9<wtvcjj&9%:;<S&IIr2   c                   t         j                  r|d   dz	  dz  r| j                  ||       y| j                  J 	 t	        |t	        |            }t        | j                  j                  d            }||k7  rdt        |       d}t        |      y# 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 rR   z(broken PNG file (incomplete checksum in )r   rY   crc_skiprM   rH   rW   rU   rZ   r[   structerror)rO   r\   rF   crc1crc2rB   es          r3   crczChunkStream.crc   s     **A!aMM#t$ww"""	*$s,Dtww||A'Dt|@c1M!#&&  || 	*<T#YKqICc")	*s   AB C
*CC
c                V    | j                   J | j                   j                  d       y)zRead checksumNr#   )rM   rU   )rO   r\   rF   s      r3   ru   zChunkStream.crc_skip   s#     ww"""Qr2   c                   g }	 	 | j                         \  }}}||k(  r	 |S | j	                  |t        j                  | j                  |             |j                  |       _# t        j                  $ r}d}t        |      |d }~ww xY w)Nztruncated PNG file)	rU   rv   rw   OSErrorr{   r   
_safe_readrM   rh   )rO   endchunkcidsr\   r]   r^   rz   rB   s           r3   verifyzChunkStream.verify   s     *#'99; S&
 h  HHS)..tww?@KK  << **cl)*s   A# #B	6BB	N)rM   	IO[bytes]returnNone)r   ztuple[bytes, int, int])r   rJ   )rd   objectr   r   r   r   )r\   bytesr]   intr^   r   r   r   )r\   r   rF   r   r   r   )   IEND)r   r   r   zlist[bytes])r+   r,   r-   rP   rU   ra   re   rc   rj   rr   r{   ru   r   r1   r2   r3   rJ   rJ      s5    = *$.J**r2   rJ   c                  8    e Zd ZU dZded<   ded<   edd       Zy)iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NonelangtkeyNc                N    t         j                  | |      }||_        ||_        |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   rO   s        r3   r   ziTXt.__new__  s'     {{3%		r2   )NN)r+   r,   r-   __doc____annotations__staticmethodr   r1   r2   r3   r   r      s'     
 r2   r   c                  b    e Zd ZdZddZdd	dZ	 	 	 d
	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZy)PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                    g | _         y rL   )chunksr`   s    r3   rP   zPngInfo.__init__  s	    79r2   c                @    | j                   j                  |||f       y)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   rh   )rO   r\   rF   
after_idats       r3   addzPngInfo.add  s     	Cz23r2   c                   t        |t              s|j                  dd      }t        |t              s|j                  dd      }t        |t              s|j                  dd      }t        |t              s|j                  dd      }|r8| j                  d|dz   |z   dz   |z   dz   t	        j
                  |      z          y| j                  d|dz   |z   dz   |z   dz   |z          y)	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   r9   compress)rO   keyvaluer   r   zips         r3   add_itxtzPngInfo.add_itxt&  s    $ #u%**Y1C%'LL(3E$&;;w1D$&;;w1DHHk!D(5047%?$--PUBVV
 HHWcIo4u<tCeKeSTr2   c                   t        |t              rL| j                  |||j                  |j                  nd|j                  |j                  |      S d|      S t        |t
              s	 |j                  dd      }t        |t
              s|j                  dd      }|r,| j                  d|dz   t        j                  |      z          y| j                  d|d	z   |z          y# t        $ r | j                  |||      cY S w xY w)
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   r   r   UnicodeErrorr   r9   r   )rO   r   r   r   s       r3   add_textzPngInfo.add_textI  s    eT"==#jj4

##jj4

 !   ;> !   %':Y9 #u%**Y1CHHWcGmdmmE.BBCHHWcEkE12   :}}S%S}99:s   .C) )D	D	Nr   F)r\   r   rF   r   r   boolr   r   ) r   F)r   str | bytesr   r   r   r   r   r   r   r   r   r   )r   r   r   zstr | bytes | iTXtr   r   r   r   )r+   r,   r-   r   rP   r   r   r   r1   r2   r3   r   r     s    
:
4  !U!U !U 	!U
 !U !U 
!UH HM!3!3'9!3@D!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| _        y )Nr   r   r   )superrP   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numrewind_statetext_memory)rO   rM   	__class__s     r3   rP   zPngStream.__init__r  sc     "& r2   c                    | xj                   |z  c_         | j                   t        kD  rd| j                    d}t        |      y )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYr>   )rO   chunklenrB   s      r3   check_text_memoryzPngStream.check_text_memory  sN    H$o-7##$$46  S/! .r2   c                r    | j                   j                         | j                  | j                  d| _        y )N)infotileseq_num)r   copyr   r   r   r`   s    r3   save_rewindzPngStream.save_rewind  s*    LL%%'LL}}
r2   c                    | j                   d   j                         | _        | j                   d   | _        | j                   d   | _        y )Nr   r   r   )r   r   r   r   r   r`   s    r3   rewindzPngStream.rewind  sA    ((0557((0)))4r2   c                   t        j                  | j                  |      }|j                  d      }t        j                  d|d |        ||dz      }t        j                  d|       |dk7  rd| d}t        |      	 t        ||dz   d        }|| j                  d	<   |S # t        $ r t         j                  rd }n Y 0t        j                  $ r d }Y Fw xY w)
Nr   ziCCP profile name %rr	   zCompression method %sr   Unknown compression method z in iCCP chunkr"   icc_profile)r   r   rM   findrn   ro   r[   rC   r>   rY   r9   rw   r   )rO   r]   r^   r?   icomp_methodrB   r   s           r3   
chunk_iCCPzPngStream.chunk_iCCP  s      &1 FF5M+QrU3Ah,k:!/}NKCc""	/!a%'
;K '2]#  	.."  zz 	K	s    B" "CCCc                p   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      t        |d      t        |d      f| _        	 t        |d   |d   f   \  | _        | _	        |d   rd| j                  d	<   |d
   rd}t        |      |S # t        $ r Y 3w xY w)N   zTruncated IHDR chunkr   r#   r$   	      r	   	interlace   zunknown filter category)r   r   rM   rY   r>   rW   r   _MODESr   
im_rawmode	Exceptionr   r[   rO   r]   r^   r?   rB   s        r3   
chunk_IHDRzPngStream.chunk_IHDR  s      &1B;..(CS/!1ay#a)+	,2AaD!A$<,@)DL$/ R5()DLL%R5+Cc""  		s   #B) )	B54B5c                   d| j                   v rd| j                   d   || j                  fg}n9| 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)rO   r]   r^   r   rB   s        r3   
chunk_IDATzPngStream.chunk_IDAT  s    T\\!DLL0#tGHD+04_-FT\\13HID smr2   c                    d}t        |      )Nzend of PNG image)r   )rO   r]   r^   rB   s       r3   
chunk_IENDzPngStream.chunk_IEND  s     smr2   c                v    t        j                  | j                  |      }| j                  dk(  r	d|f| _        |S )Nr   r   )r   r   rM   r   r   rO   r]   r^   r?   s       r3   
chunk_PLTEzPngStream.chunk_PLTE  s4      &1<<3#QhDOr2   c                   t        j                  | j                  |      }| j                  dk(  rMt        j                  |      r'|j                  d      }|dk\  r || j                  d<   |S || j                  d<   |S | j                  dv rt        |      | j                  d<   |S | j                  dk(  r/t        |      t        |d      t        |d      f| j                  d<   |S )	Nr   r   r   transparency)r   r   r   r   r"   r#   )	r   r   rM   r   _simple_palettematchr   r   i16)rO   r]   r^   r?   r   s        r3   
chunk_tRNSzPngStream.chunk_tRNS  s      &1<<3$$Q' FF5M634DLL0  01^,
 	 \\//+.q6DLL(  \\U"+.q63q!9c!Qi+GDLL(r2   c                |    t        j                  | j                  |      }t        |      dz  | j                  d<   |S )N     j@gamma)r   r   rM   rW   r   r   s       r3   
chunk_gAMAzPngStream.chunk_gAMA  s4      &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    yw)r   Nr1   ).0elts     r3   	<genexpr>z'PngStream.chunk_cHRM.<locals>.<genexpr>  s     ,PxS8^xs   chromaticity)r   r   rM   rv   unpacklentupler   )rO   r]   r^   r?   raw_valss        r3   
chunk_cHRMzPngStream.chunk_cHRM  sU       &1==3q6Q;!7;',,Px,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   rM   rY   r>   r   r   s        r3   
chunk_sRGBzPngStream.chunk_sRGB  sU       &1A:..(CS/! tVr2   c                4   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<   |S |dk(  r||f| j                  d	<   |S )
Nr   zTruncated pHYs chunkr   r#   r$   r	   
F%u?dpiaspect)r   r   rM   rY   r>   rW   r   )	rO   r]   r^   r?   rB   pxpyunitr	  s	            r3   
chunk_pHYszPngStream.chunk_pHYs  s      &1A:..(CS/!QC1IBt19v+rF{*C"%DLL  QY%'VDLL"r2   c                b   t        j                  | j                  |      }	 |j                  dd      \  }}|rc|j                  dd      }|j                  dd      }|dk(  r|n|| j                  |<   || j                  |<   | j                  t        |             |S # t        $ r |}d}Y vw xY w)Nr   r	   r2   r   r   replaceexif)
r   r   rM   splitr>   rq   r   r   r   r   )rO   r]   r^   r?   kvv_strs          r3   
chunk_tEXtzPngStream.chunk_tEXt#  s      &1	775!$DAq
 H-AHHY	2E#$;aEDLLO#DLLO""3u:.  	AA	s   B B.-B.c                $   t        j                  | j                  |      }	 |j                  dd      \  }}|r|d   }nd}|dk7  rd| d}t        |      	 t        |dd        }|r\|j                  dd      }|j                  dd	      }|x| j                  |<   | j                  |<   | j                  t        |             |S # t        $ r |}d}Y w xY w# t        $ r t         j                  rd}n Y t        j                  $ r d}Y w xY w)
Nr   r	   r2   r   r   z in zTXt chunkr   r   r  )r   r   rM   r  r>   r[   rC   rY   r9   rw   rq   r   r   r   r   )rO   r]   r^   r?   r  r  r   rB   s           r3   
chunk_zTXtzPngStream.chunk_zTXt6  s$     &1	775!$DAq A$KK!/}NKCc""	%ae,A H-AI.A011DLLOdll1o""3q6*7  	AA	  	..  zz 	A	s)   C C CCD8DDc                *   t        j                  | j                  |      x}}	 |j                  dd      \  }}t        |      dk  r|S |d   |d   |dd  }}}	 |j                  dd      \  }}	}
|dk7  r|dk(  r	 t        |
      }
n|S |dk(  r|
| j                  d<   	 |j                  dd      }|j                  d	d      }|	j                  d	d      }	|
j                  d	d      }
t        |
||	      x| j                  |<   | j                  |<   | j                  t        |
             |S # t        $ r |cY S w xY w# t        $ r |cY S w xY w# t        $ r t         j                  r|cY S  t        j                  $ r |cY S w xY w# t        $ r |cY S w xY w)
Nr   r	   r"   r   s   XML:com.adobe.xmpxmpr   r   r   )r   r   rM   r  r>   r   rC   rY   r9   rw   r   rq   r   r   r   r   )rO   r]   r^   rr?   r  cfcmr   tkr  s              r3   
chunk_iTXtzPngStream.chunk_iTXtX  s   $$TWWf55A	775!$DAq q6A:HaD!A$!"B	''%+KD"a 7Qw-a0A $$"#DLL	H-A;;w1D7H-B(+A -1D",==Q$,,q/s1v&G  	H	  	H	 "  66 zz H  	H	sN   D* D; :E AF *D87D8;E	E	F)F FFFc                j    t        j                  | j                  |      }d|z   | j                  d<   |S )N   Exif  r  )r   r   rM   r   r   s       r3   
chunk_eXIfzPngStream.chunk_eXIf  s0      &1.2Vr2   c                   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      | j
                  d | _        t        j                  d       |S t        |      }|dk(  s|dkD  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   rM   rY   r>   r   warningswarnrW   r   r   )rO   r]   r^   r?   rB   n_framess         r3   
chunk_acTLzPngStream.chunk_acTL  s      &1A:..6CS/!'#DMMPQHq6q=Hz1MMPQH#"1ayV".r2   c                   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      t        |      }| j                  |dk7  s| j                  | j                  |dz
  k7  rd}t        |      || _        t        |d      t        |d      }}t        |d      t        |d	      }	}| j                  \  }
}||z   |
kD  s|	|z   |kD  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   rM   rY   r>   rW   r   r[   r   r   r   float)rO   r]   r^   r?   rB   seqwidthheightr  r  im_wim_h	delay_num	delay_dens                 r3   
chunk_fcTLzPngStream.chunk_fcTL  sn     &1B;..6CS/!!fMM!cQhMM%$--37*B7Cc""Aq	3q!9vQSBZB\\
d:Vd 20Cc"" "BU
BK@V"1bz3q":9	>I#(#3eI6F#F#MZ #$R5Z  !"Wr2   c                \   |dk  r?t         j                  r"t        j                  | j                  |      }|S d}t	        |      t        j                  | j                  d      }t        |      }| j                  |dz
  k7  rd}t        |      || _        | j                  |dz   |dz
        S )Nr#   z"APNG contains truncated fDAT chunkr	   r+  )	r   rY   r   rM   r>   rW   r   r[   r   )rO   r]   r^   r?   rB   r6  s         r3   
chunk_fdATzPngStream.chunk_fdAT  s    A:..((&96CS/!  !,!f==C!G#7Cc""sQw
33r2   )r   r   r   r   r   )r]   r   r^   r   r   r   )r]   r   r^   r   r   r   )r+   r,   r-   rP   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r"  r(  r=  r?  __classcell__r   s   @r3   r   r   q  sn    ""
5
6(( "& D(T(:4r2   r   c                    | d d t         k(  S )Nr$   )_MAGIC)prefixs    r3   _acceptrE    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 graphicsc                F   t        | j                  j                  d            sd}t        |      | j                  | _        d| _        g | _        t        | j                        | _        	 | j                  j                         \  }}}	 | j                  j                  |||      }| j                  j%                  ||       Y# t        $ r Y nvt        $ rk t        j                  d|||       t        j                  | j                  |      }|dd j!                         r| j                  j#                  ||f       Y w xY w| j                  j&                  | _        | j                  j*                  | _        | j                  j.                  | _        d | _        | j                  j4                  | _        | j                  j8                  | _        | j                  j<                  xs d| _        | j0                  jA                  dd      | _!        | j                  jD                  r4| j                  jD                  \  }}tG        jH                  ||      | _%        |d	k(  r|d
z
  | _&        n|| _&        | j                  j<                  d| _'        | j                  jQ                          | jL                  | _)        | j                  jU                         | _+        | jB                  r| xj>                  dz  c_        | jY                  d       | j>                  dkD  | _-        y )Nr$   znot a PNG filer   %r %s %s (unknown)r	   r"   r   F   fdATr#   ).rE  rM   rU   r[   _fp_PngImageFile__frameprivate_chunksr   pngrr   r   AttributeErrorrn   ro   r   r   islowerrh   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_idatrV   _PngImageFile__rewind_seekis_animated)rO   rB   r\   r]   r^   r?   rawmoderF   s           r3   _openzPngImageFile._open  sh   tww||A'"Cc""77
 VX%.tww%7  $xx}}Cf9HHMM#sF3 HHLLa !   ! 913VD((&9q8##%''..Qx8	9 XX%%
XX%%
HH$$	
HH$$	#xx::,,1!YY]]?EB88 HH//MGT'++GT:DL'>"(1*D"(D88+5:D2HH  "!%!4!4D HHMMODM!!"JJqM==1,s   C 	EA0EEc                    | j                   c| j                  r*| j                  }| j                  | j                  dz
         | j                          | j                  r| j                         | j                   S )Nr	   )rT  r^  rM  rT   r'  load)rO   frames     r3   r   zPngImageFile.text  s_     :: 		$--!+,IIK		% zzr2   c                p   | j                   d}t        |      | j                   j                  | j                  d   d   dz
         | j                  J | j                  j                          | j                  j                          | j                  r| j                   j                          d| _         y)zVerify PNG fileNz)verify must be called directly after openr   r"   r$   )rM   RuntimeErrorrT   r   rO  r   rc   _exclusive_fp)rO   rB   s     r3   r   zPngImageFile.verify+  s     77?=Cs## 	TYYq\!_q()xx###GGMMOr2   c                H   | j                  |      sy || j                  k  r| j                  dd       | j                  }t        | j                  dz   |dz         D ]  }	 | j                  |        y # t        $ r$}| j                  |       d}t	        |      |d }~ww xY w)Nr   Tr	   zno more images in APNG file)_seek_checkrM  r]  ranger   rT   )rO   rc  
last_framefrz   rB   s         r3   rT   zPngImageFile.seek=  s    &4<<JJq$\\
t||a'3A+

1 4  +		*%3sm*+s    A44	B!=BB!c                
   | j                   J |  |dk(  rK|r| j                  j                  | j                         | j                   j	                          | j
                  | _        d | _        | j                  rd | _        | j                   j                  | _
        | j                   j                  | _        | j                  | _        d | _        d | _        | j                  j!                  dd      | _        | j                  j!                  d      | _        | j                  j!                  d      | _        | j                  j!                  d      | _        d| _        n_|| j*                  dz   k7  rd| }t-        |      | j/                          | j                  r0| j                  j1                  | j                  | j(                         | j                  j3                         | _        | j                  | _        | j                  r1t5        j6                  | j                  | j                         d| _        d}	 | j                  j9                  d
       	 | j                   j9                         \  }}}|dk(  rd}tA        |      |dk(  r|rd}t?        |      d	}	 | j                   jC                  |||       | j                  2| j$                  tL        jN                  k(  rtL        jP                  | _        d | _        | j$                  tL        jN                  k(  rX| j                  rK| j                  j3                         | _        | jS                  | j                  | j(                        | _        y y | j$                  tL        jP                  k(  retT        jV                  jY                  | jZ                  | j\                        | _        | jS                  | j                  | j(                        | _        y y # t:        j<                  t>        f$ r Y nw xY w# tD        $ r Y nt@        $ r9 |dk(  r|d
z  }|r	|| _        Y njt5        j6                  | j                  |       Y tF        $ r< tH        jK                  d|||       t5        j6                  | j                  |       Y w xY w|| _        | j                   j                  | _        | j                  j!                  d      | _        | j                  j!                  d      | _        | j                  j!                  d      | _        | j                  r~d}tA        |      )Nr   r   Fr2  r4  r   r	   zcannot seek to frame Tr#   r   zNo more images in APNG file   fcTLzAPNG missing frame datarK  rJ  zimage not found in APNG frame)/rO  rL  rT   r\  r   r[  rY  impyaccessr   r   r   r   rM   _prev_imdisposerV  r   
dispose_opblend_opdispose_extentrM  r>   rb  paster   r   r   rU   rv   rw   r[   r   rr   UnicodeDecodeErrorrP  rn   ro   r*   r0   r/   _cropr
   corefillmodesize)rO   rc  r   rB   frame_startr\   r]   r^   s           r3   r]  zPngImageFile._seekL  s   xx###A:dmm,!&*&8&8#==$(DM HH,,	 HH,,	(( DMDL!%!FD"iimmJ7DO IIMM'2DM"&))--"7DDLq((-eW5 o% IIK||dllD,?,?@ GGLLNDMhhDG ""$$TWWd.A.AB&'#KQ'+xx}}$Cf '>7C"3-''>"7)#.."&K:HHMM#sF3' X == T__8L8L%L&44DO??h222}}#}}113#zz$,,8K8KL  __ 6 66 ::??499dii@DL::dllD4G4GHDL 7_ k2  *  :g~!&28D/!((&9% :LL!5sCH((&9: !DL((DI"iimmJ7DO IIMM'2DM"&))--"7D995sm#s7   O> #P >PP	R,(R, R,(A R,+R,c                    | j                   S rL   )rM  r`   s    r3   rV   zPngImageFile.tell  s    ||r2   c                    | j                   j                  d      r| j                  dz   | _        | j                  | _        t
        j
                  j                  |        y)z"internal: prepare to read PNG filer   )r	   N)r   rV  decoderconfigrY  _PngImageFile__idatr   load_preparer`   s    r3   r  zPngImageFile.load_prepare  sH     99==%!%!3!3d!:D))((.r2   c                H   | j                   J | j                  dk(  r| j                  j                  d       | j                   j                         \  }}}|dvr| j                   j	                  |||       y|dk(  r)	 | j                   j                  |||       |dz
  | _        n|| _        | j                  dk(  r|dk  r| j                  }nt        || j                        }| j                  |z
  | _        | j                  j                  |      S # t        $ r Y w xY w)zinternal: read more image datar   r#   )   IDATs   DDATrK  r2   rK  )rO  r  rM   rU   rj   rr   r   min)rO   
read_bytesr\   r]   r^   s        r3   	load_readzPngImageFile.load_read  s    xx###kkQ GGLLO#xx}}Cf55c3/g~HHMM#sF3 %qj$% kkQ* ?JZ5JkkJ.ww||J''   s   ?D 	D! D!c                :   | j                   J | j                  dk7  r%| j                  j                  | j                         	 | j                  j                  d       	 | j                   j                         \  }}}|dk(  rnU|dk(  r1| j                  r%d| _        | j                   j                  |||       n	 | j                   j                  |||       | j                   j.                  | _        | j                  s"| j                   j3                          d| _         y| j4                  r| j6                  t8        j:                  k(  r| j=                  | j>                  | j@                        }| j>                  jB                  dk(  r.d| jD                  v r |jG                  d| jD                  d         }n|jI                  d      }| j4                  jK                  || j@                  |       | j4                  | _        | jL                  rd| _&        yyyy# t        j
                  t        f$ r Y [w xY w# t        $ r Y kt        $ rZ |dk(  r|dz  }	 t        j                  | j                  |       n*# t        $ r}t        j                   rY d}~Y |d}~ww xY wY t"        $ rm t$        j'                  d|||       t        j                  | j                  |      }|d	d
 j)                         r| j*                  j-                  ||df       Y Aw xY w)z%internal: finished reading image dataNr   Tr#   r   rm  rK  rJ  r	   r"   r   r   r!   )'rO  r  rM   rU   rv   rw   r[   r^  rY  rj   rr   rv  r   r   r   r~   rY   rP  rn   ro   rQ  rN  rh   r   rT  rc   rp  rs  r5   r7   rw  rn  rt  rz  r   convert_transparentconvertru  ro  )rO   r\   r]   r^   rz   r?   updatedmasks           r3   load_endzPngImageFile.load_end  s   xx###;;!GGLL%GGLLO#'88==? S& g~D$4$4&'#c3/?c3/# F XX%%
HHNNDH}}%--!?**TWWd.A.AB77<<5(^tyy-H"66		. 9D #??62D##GT-@-@$G--==$(DM ! "@}G LL+.  &  	 '>aKF ((&9   66	  : " ?13VD((&9q8##%''..Q~>	?sa    H ;H8 H54H58	LL I87L8	JJLJJL%A1LLc                    d| j                   vr| j                          d| j                   vrd| j                   vry | j                         j                         S )Nr  zRaw profile type exif)r   rb  getexif_get_merged_dictr`   s    r3   _getexifzPngImageFile._getexif  sG    "IIK"'>dii'O||~..00r2   c                \    d| j                   vr| j                          t        |          S )Nr  )r   rb  r   r  )rO   r   s    r3   r  zPngImageFile.getexif  s%    "IIKw  r2   r   )rc  r   r   r   r   )rc  r   r   r   r   r   )r   r   )r  r   r   r   )r   zdict[str, Any] | None)r   z
Image.Exif)r+   r,   r-   formatformat_descriptionr`  propertyr   r   rT   r]  rV   r  r  r  r  r  r@  rA  s   @r3   rG  rG    s`    F4A-F  $+_IB/ (D8)t1! !r2   rG  )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j                  |      }| j                  t        t        |            |z          | j                  |       t	        |t	        |            }| j                  t        |             y)z'Write a PNG chunk (including CRC field)r2   N)joinwriteo32r   rH   rM   r\   rF   r{   s       r3   putchunkr  :  sU     88D>DHHST^c!"HHTN
vc{
#CHHSXr2   c                      e Zd Zd ZddZy)_idatc                     || _         || _        y rL   )rM   chunk)rO   rM   r  s      r3   rP   z_idat.__init__H  s    
r2   c                >    | j                  | j                  d|       y )Nr  )r  rM   rO   rF   s     r3   r  z_idat.writeL  s    

477GT*r2   NrF   r   r   r   r+   r,   r-   rP   r  r1   r2   r3   r  r  E  s    +r2   r  c                      e Zd Zd ZddZy)_fdatc                .    || _         || _        || _        y rL   )rM   r  r   )rO   rM   r  r   s       r3   rP   z_fdat.__init__S  s    
r2   c                    | j                  | j                  dt        | j                        |       | xj                  dz  c_        y )NrK  r	   )r  rM   r  r   r  s     r3   r  z_fdat.writeX  s/    

477GS%6=r2   Nr  r  r1   r2   r3   r  r  P  s    
r2   r  c                   | j                   j                  d      }| j                   j                  d| j                  j                  dd            }| j                   j                  d| j                  j                  dt        j                              }	| j                   j                  d| j                  j                  dt
        j                              }
|rt        j                  |      }nt        j                  | g|      }g }d}|D ]  }t        j                  |      D ]~  }|j                  |k(  r|j                         }n|j                  |      }| j                   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   j                  d      }|d   j                  d      }|t        j"                  k(  rt%        |      d	k  rt        j&                  }|t        j&                  k(  ry|d
   j                         }t(        j*                  j-                  d| j.                  d      }|d   }|r|j1                  |      }nd| j.                  z   }|j3                  ||       n!|t        j"                  k(  r	|d   d
   }n|d
   }t5        j6                  |j                  d      |j                  d            }|j9                  d      }|sC||j                  d      k(  r/||j                  d      k(  rd|v r|d   dxx   |d   z  cc<   hd }|j;                  |||d         t%        |      dk(  r
|s|d   d
   S  ||dt=        t%        |            t=        |             |rS| j                  |k7  r| j                  |      } t?        j@                  | tC        ||      dd| j.                  z   d|fg       d}tE        |      D ]  \  }}|d
   }|d   sd|j.                  z   }n|d   }|j1                  |      }|j.                  }|d   }tG        tI        |j                  dd                  }|j                  d|	      }|j                  d|
      } ||dt=        |      t=        |d         t=        |d         t=        |d         t=        |d         tK        |      tK        d      tM        |      tM        |             |dz  }|dk(  r7|s5t?        j@                  |tC        ||      dd|j.                  z   d|fg       @tO        |||      }t?        j@                  ||dd|j.                  z   d|fg       |jP                  } y )Nr0  r$  r   r2  r4  r	   encoderinfor"   rn  r!   )r   r   r   r   r   r   F)
alpha_only)rn  r   r  s   acTLr   rm  r/  ))r  rV  r   r*   r.   r5   r6   	itertoolschainr   Iteratorrz  r   r  r   listr  r0   r   r/   r
   rx  ry  r{  cropru  r   subtract_modulogetbboxrh   r  r   _saver  	enumerater   roundo16r   r  r   ) rn  rM   r  rz  r_  r   append_imagesr0  r$  r2  r4  r  	im_framesframe_countim_seqim_framer  previousprev_disposal
prev_blendbase_imrq  r   deltar   rc  
frame_datar{  frame_durationframe_disposalframe_blendfdat_chunkss                                    r3   _write_multiple_framesr  ]  s@   ~~!!*-H>>fbggkk&!&<=D~~!!*bggkk*hFVFV.WXHNNwGU__(MNE.m4IK%..v6H}}$#==?#++D1..--/K(T5M2*2;*?J'!jHMM&A*2--
*CJ'(T5M2*2;*?J'%$/',['9G$1K$R= ( 7 ; ;J G%m488A
 H$8$88S^a=O$,$:$:M H$:$::&tn113G#jjoofbgg|LG#F+D"),,t"4%/MM'40"h&:&::'mD1G&tnG"22$$V,goof.E }}}6%)DD"koog&>>"k1]+J7;z;RR7Hd;WXe 7 j 9~=|D!! 

C	ND		 77d?D!BE"e,v7GG/T.UVG&y1zd#&!HMM)Df%D}}T*H}} /U;??:q#ABC$X>!oogu5LQLQLQLQLI~{O	
 	1A:mOOb% (--/G<=  E73KOO(--/G<=
 "))GU 2r2   c                "    t        | ||d       y )NT)save_all)r  )rn  rM   filenames      r3   	_save_allr    s    	"b(T*r2   Fc                  ' |r| j                   j                  d| j                  j                  d            }t               }t               '| j                   j                  dg       }t	        j
                  | g|      D ]R  }t        j                  |      D ]8  }	|j                  |	j                         'j                  |	j                         : T dD ]  }
|
|v s n |j                         }
t        'fdt        d      D              }n| j                  }| j                  }
|
}|
dk(  rd| j                   v rt        d| j                   d   z  d	      }nL| j                  r>t!        t        t#        | j                  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                   j                  dd      | j                   j                  dd      | j                   j                  dd      | j                   j                  dd      f| _        	 t(        |   \  }}}|j/                  t0                ||dt3        |d         t3        |d         ||ddd	       g d}| j                   j                  d| j                  j                  d            }|r8d}|dz   t5        j6                  |      z   } ||d|       |j9                  d       | j                   j                  d       }|rg d!}|j:                  D ]o  }|d d \  }}||v r|j9                  |        ||||       +||v r ||||       :|dd j=                         sNt#        |      d
k(  xr |d   }|rf ||||       q | j                  dk(  rOd
z  }| j>                  jA                  d"      d | }t#        |      |k  r|dz  }t#        |      |k  r ||d#|       | j                   j                  d$| j                  j                  d$d             }|s|dk(  r| j                  dk(  rM} tC        |tD              r ||d%|d |         nt!        dt        d&|            }d'|z  dz   }! ||d%|!d |         n| j                  d(v r*t!        dt        d)|            } ||d%tG        |             n| j                  d"k(  r2|\  }"}#}$ ||d%tG        |"      tG        |#      z   tG        |$      z          nrd$| j                   v rdd*}t-        |      | j                  dk(  rH| j>                  jI                         d+k(  r+| j>                  jA                  d+d,      }!}  ||d%|!d |         | j                   j                  d-      }%|%rB ||d.t3        tK        |%d   d/z  d0z               t3        tK        |%d   d/z  d0z               d1       |r=d2d3g}|j:                  D ]*  }|d d \  }}||v s|j9                  |        ||||       , | j                   j                  d4      }&|&rKtC        |&tL        jN                        r|&jQ                  d5      }&|&jS                  d6      r|&d7d  }& ||d8|&       |rtU        | |||
|      } | r3tW        jX                  | t[        ||      d9d:| j                  z   d|fg       |rO|j:                  D ]@  }|d d \  }}|dd j=                         st#        |      d
k(  xr |d   }|s7 ||||       B  ||d;d       t]        |d<      r|j_                          y y # t*        $ r}d|
 d}t-        |      |d }~ww xY w)=Nr   r  )r!   r   r   c              3  H   K   | ]  t        fd D                yw)c              3  (   K   | ]	  }|     y wrL   r1   )r   
frame_sizer   s     r3   r   z"_save.<locals>.<genexpr>.<genexpr>  s     ?:As   N)max)r   r   sizess    @r3   r   z_save.<locals>.<genexpr>  s     RAS???s   "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  rV  r   setr  r  r   r  r   rz  r{  rS   r  ri  r  rX  r  r   getdataencoderconfig	_OUTMODESKeyErrorr~   r  rC  r  r9   r   remover   rQ  rn  
getpaletter   r   r  getpalettemoder   r
   Exiftobytes
startswithr  r   r  r  hasattrr  )(rn  rM   r  r  r  r   modesr  r  r  rz  r{  outmodecolorsr  r_  	bit_depth
color_typerz   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    s    **RWW[[9
 **?B?oordM:F)226:		(--(		(--( ; ; )Du} ) 99;DRqRRwwwwGs{ R^^#bnnV44c:F zzSRZZ%7%7%9!%<!=!BCH!LR<{14&z!G 	:u-
+R0
?B/
<-	B")27);&J HHV	
DGDG
 ;F
..

]BGGKK,F
GC
 g~c 22b'4  	g>>i(D"F++J"2AICf}c"b#t$//b#t$Qq!!# _1Cjm
!"c4( & 
ww#~$qj((/0D1DE- #66U"M - #66b'=)>>%%nbggkk.RV6WXL|q(77c> K,.b'<#=>"1c#|&<=,.6b'5+#67WW//q#e\":;L"gs<01WW+C"gs3x#e*4s4y@A/ >cl"77c>bee224>EE$$VS1E K"gu\k23
..

U
#C
CFVOc)*+CFVOc)*+	
 7#++J"2AICf}c"b#t$	 & >>f%DdEJJ'<<?D???+8Db'4 #E4-
 
E"e,v7GG/T.UV++J"2AIC1Qx! _1Cjm
"c4( & 
"gsr7

 Q  ""4&0cl!"s   :\? ?	]]]c                     G d d      }d } |       }	 || _         t        | |d|       | ` |j                  S # | ` w xY w)z4Return a list of PNG chunks representing this image.c                       e Zd Zg ZddZddZy)getchunks.<locals>.collectorc                     y rL   r1   r  s     r3   r  z"getchunks.<locals>.collector.write  s    r2   c                :    | j                   j                  |       y rL   )rF   rh   )rO   r  s     r3   rh   z#getchunks.<locals>.collector.append  s    IIU#r2   Nr  )r  r   r   r   )r+   r,   r-   rF   r  rh   r1   r2   r3   	collectorr    s    		$r2   r  c                    dj                  |      }t        t        |t        |                  }| j                  |||f       y )Nr2   )r  r  rH   rh   r  s       r3   rh   zgetchunks.<locals>.append  s7    xx~&vc{+,
		3c"#r2   N)r  r  rF   )rn  paramsr  rh   rM   s        r3   	getchunksr    sK    $ $$
 
Bb"dF#N77N Ns   9 =z.pngz.apngz	image/png)r   )rD  r   r   r   )rn  zImage.ImagerM   r   r  r   r   r   )E
__future__r   r  loggingrerv   r%  r9   enumr   typingr   r   r   r   r   r
   r   r   r   r   _binaryr   r   r   rW   r   r   r  r   r  r   	getLoggerr+   rn   compiler   rX   rC  r   r   	SAFEBLOCKr<   r   r*   r5   rC   rH   rJ   r   r   r   r   rE  rG  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 G G ! !  ! !			8	$	L	!	'	' 
 !+
2 "**01$$
 ~%w *G /Z Zz3 2Y3 Y3@U4 U4x
 K!9&& K!f
 
!$$$	 
"	$'($$$	 $&!	(+ +
 
~*B+ #+U CT>   L''w ?   L'' /   ++Y 7   ,--/@ A   L'' 5r2   