o
    h1                     @  s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlm Z! ddl"m#Z# dZ$e$rtddlm%Z% e&e'Z(e)dj*Z+dZ,ddddddddddddddd d!Z-e)d"Z.ej/Z0	 d#e0 Z1	 G d$d% d%eZ2G d&d' d'eZ3dxd+d,Z4dydzd0d1Z5G d2d3 d3Z6G d4d5 d5e7Z8G d6d7 d7Z9G d8d9 d9eZ:G d:d; d;e6Z;d{d>d?Z<G d@dA dAejZ=dBdCdDdEdFdGdHdHdHdIdJdKdLdMdNdOZ>d|dTdUZ?G dVdW dWZ@G dXdY dYZAG dZd[ d[eZBd}dgdhZCd~dkdlZDe?dfddndoZEddsdtZFeGe=jHe=e< eIe=jHeE eJe=jHeD eKe=jHdudvg eLe=jHdw dS )    )annotationsN)Callable)IntEnum)IOAny
NamedTupleNoReturncast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)DeferredErrorF)_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                   @  s   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 r2   r2   E/var/www/html/venv/lib/python3.10/site-packages/PIL/PngImagePlugin.pyr+   j   s    r+   c                   @  s   e Zd ZdZ	 dZdS )Blendr   r
   N)r,   r-   r.   	OP_SOURCEOP_OVERr2   r2   r2   r3   r4      s
    r4   sbytesreturnc                 C  s*   t  }|| 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)r7   ZdobjZ	plaintextmsgr2   r2   r3   _safe_zlib_decompress   s   rA   dataseedintc                 C  s   t | |d@ S )Nl    )r:   crc32)rB   rC   r2   r2   r3   _crc32      rF   c                   @  sr   e Zd Zd&ddZd'dd	Zd(d
dZd)ddZd*ddZd+ddZd,ddZ	d-ddZ
d-ddZd.d/d#d$Zd%S )0ChunkStreamfp	IO[bytes]r9   Nonec                 C  s   || _ g | _d S N)rI   queueselfrI   r2   r2   r3   __init__      
zChunkStream.__init__tuple[bytes, int, int]c                 C  s   d}| j dus	J | jr| j \}}}| j | n| j d}|dd }| j  }t|}t|sCtj	sCdt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr&   r%   zbroken PNG file (chunk ))rI   rM   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rO   cidposlengthr7   r@   r2   r2   r3   rV      s   

zChunkStream.readc                 C  s   | S rL   r2   rO   r2   r2   r3   	__enter__   s   zChunkStream.__enter__argsobjectc                 G  s   |    d S rL   )close)rO   rb   r2   r2   r3   __exit__   s   zChunkStream.__exit__c                 C  s   d  | _ | _d S rL   )rM   rI   r`   r2   r2   r3   rd      rG   zChunkStream.closer]   r8   r^   rD   r_   c                 C  s$   | j d usJ | j |||f d S rL   )rM   appendrO   r]   r^   r_   r2   r2   r3   push   s   zChunkStream.pushc                 C  s,   t d||| t| d|d ||S )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ascii)loggerdebuggetattrdecoderg   r2   r2   r3   call   s   zChunkStream.callrB   c              
   C  s   t jr|d d? d@ r| || dS | jdusJ z"t|t|}t| jd}||kr:dt| d}t|W dS  t	j
yV } zdt| d}t||d}~ww )	zRead and verify checksumr      r
   Nr%   z(broken PNG file (bad header checksum in rS   z(broken PNG file (incomplete checksum in )r   rZ   crc_skiprI   rF   rX   rV   r[   r\   structerror)rO   r]   rB   Zcrc1Zcrc2r@   er2   r2   r3   crc   s    
zChunkStream.crcc                 C  s   | j dusJ | j d dS )zRead checksumNr%   )rI   rV   )rO   r]   rB   r2   r2   r3   rp      s   zChunkStream.crc_skip   IENDendchunklist[bytes]c              
   C  s   g }| j d us	J 	 z	|  \}}}W n tjy' } zd}t||d }~ww ||kr/	 |S | |t| j | || q
)NTztruncated PNG file)	rI   rV   rq   rr   OSErrorrt   r   
_safe_readrf   )rO   rv   Zcidsr]   r^   r_   rs   r@   r2   r2   r3   verify   s    

zChunkStream.verifyNrI   rJ   r9   rK   )r9   rR   )r9   rH   )rb   rc   r9   rK   r9   rK   )r]   r8   r^   rD   r_   rD   r9   rK   )r]   r8   r^   rD   r_   rD   r9   r8   )r]   r8   rB   r8   r9   rK   )ru   )rv   r8   r9   rw   )r,   r-   r.   rP   rV   ra   re   rd   rh   rn   rt   rp   rz   r2   r2   r2   r3   rH      s    








rH   c                   @  s4   e Zd ZU dZded< ded< e	d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 | Noner9   c                 C  s   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   rO   r2   r2   r3   r     s   ziTXt.__new__)NN)r   r   r~   r   r   r   r9   r}   )r,   r-   r.   __doc____annotations__staticmethodr   r2   r2   r2   r3   r}      s   
 r}   c                   @  sF   e Zd ZdZdddZddddZ			ddddZ	dd ddZdS )!PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    r9   rK   c                 C  s
   g | _ d S rL   chunksr`   r2   r2   r3   rP        
zPngInfo.__init__Fr]   r8   rB   
after_idatboolc                 C  s   | 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   rf   )rO   r]   rB   r   r2   r2   r3   add   s   
zPngInfo.add keystr | bytesvaluer~   r   zipc                 C  s   t |ts|dd}t |ts|dd}t |ts!|dd}t |ts,|dd}|rE| d|d | d | d t|  dS | d|d | d | d |  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)
isinstancer8   encoder   r:   compress)rO   r   r   r~   r   r   r2   r2   r3   add_itxt,  s   



 (zPngInfo.add_itxtstr | bytes | iTXtc                 C  s   t |tr"| j|||jdur|jnd|jdur|j|dS d|dS t |tsAz|dd}W n ty@   | j|||d Y S w t |tsL|dd}|r]| d|d t	
|  dS | d|d	 |  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

        N    )r   r   r      zTXt        tEXtr   )r   r}   r   r~   r   r8   r   UnicodeErrorr   r:   r   )rO   r   r   r   r2   r2   r3   add_textO  s,   

	
zPngInfo.add_textNr|   F)r]   r8   rB   r8   r   r   r9   rK   )r   r   F)r   r   r   r   r~   r   r   r   r   r   r9   rK   )r   r   r   r   r   r   r9   rK   )r,   r-   r.   r   rP   r   r   r   r2   r2   r2   r3   r     s    
$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-   r.   r   r2   r2   r2   r3   r   w     
 r   c                      s   e Zd Zd5 fddZd6d	d
Zd7ddZd7ddZd8ddZd8ddZd9ddZ	d9ddZ
d8ddZd8ddZd8dd Zd8d!d"Zd8d#d$Zd8d%d&Zd8d'd(Zd8d)d*Zd8d+d,Zd8d-d.Zd8d/d0Zd8d1d2Zd8d3d4Z  ZS ):	PngStreamrI   rJ   r9   rK   c                   sZ   t  | i | _i | _d| _d| _g | _d | _d | _d | _	d | _
ti g d | _d| _d S )Nr   r   r   r   )superrP   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memoryrN   	__class__r2   r3   rP   ~  s   
zPngStream.__init__chunklenrD   c                 C  s2   |  j |7  _ | j tkrd| j  d}t|d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYr?   )rO   r   r@   r2   r2   r3   check_text_memory  s   
zPngStream.check_text_memoryc                 C  s   t | j | j| j| _d S rL   )r   r   copyr   r   r   r`   r2   r2   r3   save_rewind  s
   
zPngStream.save_rewindc                 C  s&   | j j | _| j j| _| j j| _d S rL   )r   r   r   r   r   r   r   r   r`   r2   r2   r3   rewind  s   
zPngStream.rewindr^   r_   r8   c                 C  s   | j d usJ t| j |}|d}td|d |  ||d  }td| |dkr7d| d}t|zt||d d  }W n tyS   tj	rPd }n Y n t
jy^   d }Y nw || jd	< |S )
Nr   ziCCP profile name %rr
   zCompression method %sr   Unknown compression method z in iCCP chunkr$   icc_profile)rI   r   ry   findrj   rk   r\   rA   r?   rZ   r:   rr   r   )rO   r^   r_   r7   icomp_methodr@   r   r2   r2   r3   
chunk_iCCP  s*   

zPngStream.chunk_iCCPc                 C  s   | j d usJ t| j |}|dk rtjr|S d}t|t|dt|df| _zt|d |d f \| _| _	W n	 t
yA   Y nw |d rKd| jd	< |d
 rUd}t||S )N   zTruncated IHDR chunkr   r%   r&   	      r
   	interlace   zunknown filter category)rI   r   ry   rZ   r?   rX   r   _MODESr   
im_rawmode	Exceptionr   r\   rO   r^   r_   r7   r@   r2   r2   r3   
chunk_IHDR  s&    
zPngStream.chunk_IHDRr   c                 C  sl   d| j v rtd| j d || jg}n| jd urd| j d< tdd| j || jg}|| _|| _d}t|)Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler   r   r   r   Zim_idatEOFError)rO   r^   r_   r   r@   r2   r2   r3   
chunk_IDAT  s   


zPngStream.chunk_IDATc                 C  s   d}t |)Nzend of PNG image)r   )rO   r^   r_   r@   r2   r2   r3   
chunk_IEND  s   zPngStream.chunk_IENDc                 C  s4   | j d usJ t| j |}| jdkrd|f| _|S )Nr   r   )rI   r   ry   r   r   rO   r^   r_   r7   r2   r2   r3   
chunk_PLTE  s
   

zPngStream.chunk_PLTEc                 C  s   | j d usJ t| j |}| jdkr/t|r(|d}|dkr&|| jd< |S || jd< |S | jdv r=t|| jd< |S | jdkrRt|t|dt|df| jd< |S )	Nr   r   r   transparency)r   r   r   r   r$   r%   )	rI   r   ry   r   _simple_palettematchr   r   i16)rO   r^   r_   r7   r   r2   r2   r3   
chunk_tRNS  s    



	


 zPngStream.chunk_tRNSc                 C  s2   | j d usJ t| j |}t|d | jd< |S )N     j@gamma)rI   r   ry   rX   r   r   r2   r2   r3   
chunk_gAMA  s   zPngStream.chunk_gAMAc                 C  sT   | j d usJ t| j |}tdt|d  d|}tdd |D | jd< |S )N>r%   Ic                 s  s    | ]}|d  V  qdS )r   Nr2   ).0eltr2   r2   r3   	<genexpr>      z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)rI   r   ry   rq   unpacklentupler   )rO   r^   r_   r7   Zraw_valsr2   r2   r3   
chunk_cHRM
  s
   zPngStream.chunk_cHRMc                 C  sL   | j d usJ t| j |}|dk rtjr|S d}t||d | jd< |S )Nr
   zTruncated sRGB chunkr   Zsrgb)rI   r   ry   rZ   r?   r   r   r2   r2   r3   
chunk_sRGB  s   zPngStream.chunk_sRGBc           	      C  s   | j d usJ t| j |}|dk rtjr|S d}t|t|dt|d}}|d }|dkr?|d |d f}|| jd< |S |dkrJ||f| jd	< |S )
Nr   zTruncated pHYs chunkr   r%   r&   r
   
F%u?dpiZaspect)rI   r   ry   rZ   r?   rX   r   )	rO   r^   r_   r7   r@   pxpyunitr   r2   r2   r3   
chunk_pHYs%  s    
zPngStream.chunk_pHYsc                 C  s   | j d usJ t| j |}z
|dd\}}W n ty%   |}d}Y nw |rK|dd}|dd}|dkr:|n|| j|< || j|< | t	| |S )Nr   r
   r   r   r   replaces   exif)
rI   r   ry   splitr?   rm   r   r   r   r   )rO   r^   r_   r7   kvk_strv_strr2   r2   r3   
chunk_tEXt7  s   
zPngStream.chunk_tEXtc           
      C  s  | j d usJ t| j |}z
|dd\}}W n ty%   |}d}Y nw |r-|d }nd}|dkr=d| d}t|z
t|dd  }W n tyW   tjrTd}n Y n tj	yb   d}Y nw |r|
dd}|
dd	}	|	 | j|< | j|< | t|	 |S )
Nr   r
   r   r   r   z in zTXt chunkr   r   r   )rI   r   ry   r   r?   r\   rA   rZ   r:   rr   rm   r   r   r   r   )
rO   r^   r_   r7   r   r   r   r@   r   r   r2   r2   r3   
chunk_zTXtK  s<   
zPngStream.chunk_zTXtc                 C  s  | j d usJ t| j | }}z
|dd\}}W n ty%   | Y S w t|dk r.|S |d |d |dd  }}}z|dd\}}	}
W n tyT   | Y S w |dkr|dkr~zt|
}
W n tyr   tjrq| Y S   tj	y}   | Y S w |S |dkr|
| j
d< z|dd}|d	d}|	d	d}|
d	d}W n ty   | Y S w t||| | j
|< | j|< | t| |S )
Nr   r
   r$   r   s   XML:com.adobe.xmpZxmpr   r   r   )rI   r   ry   r   r?   r   rA   rZ   r:   rr   r   rm   r   r}   r   r   )rO   r^   r_   rr7   r   cfcmr~   tkr   r   Zlang_strZtk_strr   r2   r2   r3   
chunk_iTXtn  sP    
zPngStream.chunk_iTXtc                 C  s.   | j d usJ t| j |}d| | jd< |S )N   Exif  exif)rI   r   ry   r   r   r2   r2   r3   
chunk_eXIf  s   zPngStream.chunk_eXIfc                 C  s   | j d usJ t| j |}|dk rtjr|S d}t|| jd ur,d | _td |S t|}|dks8|dkr?t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)rI   r   ry   rZ   r?   r   warningswarnrX   r   r   )rO   r^   r_   r7   r@   n_framesr2   r2   r3   
chunk_acTL  s&   


zPngStream.chunk_acTLc                 C  sN  | j d usJ t| j |}|dk rtjr|S d}t|t|}| jd u r*|dks6| jd ur<| j|d kr<d}t||| _t|dt|d}}t|dt|d	}}	| j\}
}|| |
ksf|	| |krld
}t|||	|| |	| f| j	d< t
|dt
|d}}|dkrd}t|t| d | 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)rI   r   ry   rZ   r?   rX   r   r\   r   r   r   float)rO   r^   r_   r7   r@   seqwidthheightr   r   Zim_wZim_hZ	delay_numZ	delay_denr2   r2   r3   
chunk_fcTL  s6   
zPngStream.chunk_fcTLc                 C  s   | j d usJ |dk rtjrt| j |}|S d}t|t| j d}t|}| j|d kr5d}t||| _| |d |d S )Nr%   z"APNG contains truncated fDAT chunkr
   r	  )	rI   r   rZ   ry   r?   rX   r   r\   r   )rO   r^   r_   r7   r@   r  r2   r2   r3   
chunk_fdAT  s   zPngStream.chunk_fdATr{   )r   rD   r9   rK   r|   )r^   rD   r_   rD   r9   r8   )r^   rD   r_   rD   r9   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__r2   r2   r   r3   r   }  s,    

	














#
+

r   prefixr   c                 C  s
   |  tS rL   )
startswith_MAGIC)r  r2   r2   r3   _accept  r   r  c                      s   e Zd ZdZdZd%ddZed&dd	Zd%d
dZd'ddZ	d(d)ddZ
d*ddZd%ddZd+ddZd%ddZd,d d!Zd- fd#d$Z  ZS ).PngImageFileZPNGzPortable network graphicsr9   rK   c              	   C  s  t | jdsd}t|| j| _d| _g | _t| j| _	 | j \}}}z
| j	|||}W n0 t
y:   Y n0 tya   td||| t| j|}|dd  r_| j||f Y nw | j|| q| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjpd| _| j dd	| _!| jj"r| jj"\}}t#$||| _%|d
kr|d | _&n|| _&| jjd urd	| _'| j(  | j&| _)| j* | _+| j!r|  jd7  _| ,d | jdk| _-d S )Nr&   znot a PNG filer   T%r %s %s (unknown)r
   r$   r   F   fdATr%   ).r  rI   rV   r\   _fp_PngImageFile__frameprivate_chunksr   pngrn   r   AttributeErrorrj   rk   r   ry   islowerrf   rt   r   _moder   _sizer   r   _textr   r   r   Zcustom_mimetyper   r  getr   r   r   rawpalette_PngImageFile__prepare_idatZ!_close_exclusive_fp_after_loadingr   _PngImageFile__rewind_idatrW   _PngImageFile__rewind_seekis_animated)rO   r@   r]   r^   r_   r7   rawmoderB   r2   r2   r3   _open  sZ   






zPngImageFile._opendict[str, str | iTXt]c                 C  sR   | j d u r| jr| j}| | jd  |   | jr| | | j d us&J | j S )Nr
   )r)  r1  r"  rU   r  load)rO   framer2   r2   r3   r   7  s   

zPngImageFile.textc                 C  sl   | j du rd}t|| j | jd d d  | jdusJ | j  | j  | jr1| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r$   r&   )rI   RuntimeErrorrU   r   r$  rz   rd   Z_exclusive_fp)rO   r@   r2   r2   r3   rz   G  s   




zPngImageFile.verifyr6  rD   c                 C  s   |  |sd S || jk r| dd | j}t| jd |d D ]!}z| | W q ty@ } z| | d}t||d }~ww d S )Nr   Tr
   zno more images in APNG file)Z_seek_checkr"  r0  ranger   rU   )rO   r6  Z
last_framefrs   r@   r2   r2   r3   rU   Y  s   



zPngImageFile.seekFr   r   c           	   	   C  s4  | j d usJ t| jtr| jj|  d }|dkrb|r<| j| j | j   | j| _	d | _
| j j| _| j j| _| j| _d | _d | _| jdd| _| jd| _| jd| _| jd}d| _n|| jd krrd| }t||   | jr| j| j| j | j | _| j| _| j	rt| j| j	 d| _	d}	 | jd
 z
| j  \}}}W n t j!t"fy   Y new |dkrd}t#||dkr|rd}t"|d	}z
| j $||| W n@ t%y   Y n9 t#y   |dkr|d
8 }|r|| _	Y n#t| j| Y n t&y   t'(d||| t| j| Y nw q|| _| j j| _| jd| _| jd| _| jd}| jsDd}t#||rJ|| _| jd u r[| jt)j*kr[t)j+| _d | _| jt)j*kr|| jrz| j | _| ,| j| j| _d S d S | jt)j+krt-j./| j0| j1| _| ,| j| j| _d S d S )Nr   r   Fr  r  r   r
   zcannot seek to frame Tr%   ru   zNo more images in APNG file   fcTLzAPNG missing frame datar   r  zimage not found in APNG frame)2r$  r   r!  r   exrU   r/  r   r.  r-  Z_imr   r   r   r   rI   _prev_imdisposer*  r   Z
dispose_opblend_opr"  r?   r5  impastedispose_extentr   r   ry   rV   rq   rr   r\   r   rn   UnicodeDecodeErrorr%  rj   rk   r+   r1   r0   _cropr   corefillmodesize)	rO   r6  r   rA  r@   Zframe_startr]   r^   r_   r2   r2   r3   r0  h  s   



!
zPngImageFile._seekc                 C  s   | j S rL   )r"  r`   r2   r2   r3   rW     s   zPngImageFile.tellc                 C  s0   | j dr| jd | _| j| _tj|  dS )z"internal: prepare to read PNG filer   )r
   N)r   r*  Zdecoderconfigr-  _PngImageFile__idatr   load_preparer`   r2   r2   r3   rI    s   zPngImageFile.load_prepare
read_bytesr8   c                 C  s   | j dusJ | jdkrN| jd | j  \}}}|dvr(| j ||| dS |dkrFz
| j ||| W n	 ty?   Y nw |d | _n|| _| jdks|dkrV| j}nt|| j}| j| | _| j|S )zinternal: read more image dataNr   r%   )   IDATs   DDATr   r   r   )r$  rH  rI   rV   rh   rn   r   min)rO   rJ  r]   r^   r_   r2   r2   r3   	load_read  s*   

zPngImageFile.load_readc           	      C  sf  | j dusJ | jdkr| j| j 	 | jd z
| j  \}}}W n tjtfy0   Y nw |dkr6n|dkrI| jrId| _| j 	||| noz
| j 
||| W nc ty\   Y n\ ty   |dkrj|d8 }z	t| j| W n ty } ztjrW Y d}~Y n3|d}~ww Y n) ty   td||| t| j|}|d	d
  r| j||df Y nw q| j j| _| js| j   d| _ dS | jr/| jtjkr1| | j| j }| jj!dkrd| j"v r|#d| j"d }n.| jj!dkrd| j"v r| j"d }t$|t%r|&| nt$|t'r|(| |)d}| j*|| j | | j| _dS dS dS )z%internal: finished reading image dataNr   Tr%   ru   r:  r   r  r
   r$   r   r   r#   r   )+r$  rH  rI   rV   rq   rr   r\   r1  r-  rh   rn   rB  r   r   ry   rx   rZ   r%  rj   rk   r&  r#  rf   r   r)  rd   r<  r>  r4   r6   rC  r?  rA  rF  r   Zconvert_transparentr   r8   ZputpalettealphasrD   Zputpalettealphaconvertr@  )	rO   r]   r^   r_   rs   r7   updatedmasktr2   r2   r3   load_end  sx   

#





zPngImageFile.load_enddict[int, Any] | Nonec                 C  s6   d| j vr	|   d| j vrd| j vrd S |   S )Nr  zRaw profile type exif)r   r5  getexifZ_get_merged_dictr`   r2   r2   r3   _getexif8  s
   
zPngImageFile._getexif
Image.Exifc                   s   d| j vr	|   t  S )Nr  )r   r5  r   rT  r`   r   r2   r3   rT  ?  s   

zPngImageFile.getexifr|   )r9   r4  )r6  rD   r9   rK   r   )r6  rD   r   r   r9   rK   )r9   rD   )rJ  rD   r9   r8   )r9   rS  )r9   rV  )r,   r-   r.   formatformat_descriptionr3  propertyr   rz   rU   r0  rW   rI  rM  rR  rU  rT  r  r2   r2   r   r3   r    s    
C


d

	
"
>r  )r      r   )L;1rZ  r   )r      r   )r      r   )r      r   )r"   r^  r]  )r      r   )r   rZ     )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#   rI   rJ   r]   rK   c                 G  sJ   d |}| tt||  | | t|t|}| t| dS )z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r   rF   rI   r]   rB   Z	byte_datart   r2   r2   r3   putchunk]  s
   

rf  c                   @  s    e Zd ZdddZdddZdS )_idatrI   rJ   chunkCallable[..., None]r9   rK   c                 C  s   || _ || _d S rL   )rI   rh  )rO   rI   rh  r2   r2   r3   rP   k  rQ   z_idat.__init__rB   r8   c                 C  s   |  | jd| d S )NrK  )rh  rI   rO   rB   r2   r2   r3   rc  o     z_idat.writeN)rI   rJ   rh  ri  r9   rK   rB   r8   r9   rK   r,   r-   r.   rP   rc  r2   r2   r2   r3   rg  h  s    
rg  c                   @  s    e Zd Zdd	d
ZdddZdS )_fdatrI   rJ   rh  ri  r   rD   r9   rK   c                 C  s   || _ || _|| _d S rL   )rI   rh  r   )rO   rI   rh  r   r2   r2   r3   rP   v  s   
z_fdat.__init__rB   r8   c                 C  s*   |  | jdt| j| |  jd7  _d S )Nr   r
   )rh  rI   rd  r   rj  r2   r2   r3   rc  {  s   z_fdat.writeN)rI   rJ   rh  ri  r   rD   r9   rK   rl  rm  r2   r2   r2   r3   rn  s  s    
rn  c                   @  r   )_FrameImage.Imager?  z tuple[int, int, int, int] | Noner   zdict[str, Any]encoderinfoNr   r2   r2   r2   r3   ro    r   ro  r?  rp  rh  ri  rF  r   r2  r   Image.Image | Noneappend_imageslist[Image.Image]c                  C  sN  | j d}| j d| jdd}| j d| jdtj}	| j d| jdtj}
|r4t|}nt| g|}g }d}|D ]}t	
|D ]}|j|krT| }n||}| j  }t|ttfrl|| |d< n|d u r|d|jv r||jd |d< t|	ttfr|	| |d< t|
ttfr|
| |d< |d7 }|r*|d }|j d}|j d}|tjkrt|dk rtj}|tjkr|j }tjd	| jd
}|j}|r||}nd| j }||| n|tjkr|d j}n|j}t|d	|d	}|jdd}|s)||dkr)||dkr)d|v r)|j d  |d 7  < qHnd }|t ||| qHqAt|dkrF|sF|d jS ||dt!t|t!| |rz| j|kra| |} t"#| t$t%t& t'||t"(dd| j d|g d}t)|D ]\}}|j}|jsd|j }n|j}||}|j}|j }t*t+|dd}|d|	}|d|
}||dt!|t!|d t!|d t!|d t!|d t,|t,dt-|t-| |d7 }|dkr|st"#|t$t%t& t'||t"(dd|j d|g qt.|||}t"#|t$t%t& |t"(dd|j d|g |j/}qd S )Nr  r  r   r  r  r
   r$   r#   )r   r   r   r   r   F)Z
alpha_onlys   acTLr   r:  r  )0rq  r*  r   r+   r/   r4   r5   	itertoolschainr   IteratorrF  r   rN  r   listr   r1   r   r0   r?  r   rD  rE  rG  r   cropr@  r   Zsubtract_moduloZgetbboxrf   ro  rd  r   _saver	   r   r8   rg  r   	enumeraterD   roundo16r   rn  r   ) r?  rI   rh  rF  r2  r   rs  r  r  r  r  rx  Z	im_framesZframe_countim_seqim_framerq  previousZprev_disposalZ
prev_blendZbase_imr=  r   deltar   r6  Z
frame_datarG  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr2   r2   r3   _write_multiple_frames  s   	








4








r  filenamer   c                 C  s   t | ||dd d S )NT)save_all)r|  )r?  rI   r  r2   r2   r3   	_save_all  rk  r  r  c           (   
     sV  |rU| j d| jd}t }t  | j dg }t| g|D ]}t|D ]}	||	j	  |	j
 q(q!dD ]}
|
|v rB nq:| }
t fddtdD }n| j
}| j	}
|
}|
dkrd| j v rqtd	| j d > d
}n| jrttt| j d	 d d
d	}nd
}|dkr|dkrd	}n	|dkrd}nd}|d| 7 }| j dd| j dd| j dd| j ddf| _z	t| \}}}W n ty } zd|
 d}t||d }~ww |t ||dt|d t|d	 ||ddd	 g d}| j d| jd}|r d}|d t| }||d| |d  | j d!}|rxg d"}|jD ]G}|d d \}}||v rL|| |||| q0||v rY|||| q0|d	d  rvt|dkol|d }|sv|||| q0| j	dkr|d }| j d#d | }t||k r|d7 }t||k s||d$| | j d%| jd%d }|s|dkr*| j	dkr|} t!|t"r||d&|d |   nztdtd'|}d(| d }!||d&|!d |   na| j	d)v rtdtd*|}||d&t#| nJ| j	d#kr|\}"}#}$||d&t#|"t#|# t#|$  n.d%| j v r)d+}t|n!| j	dkrK| j$ d,krK| j d,d-}!|} ||d&|!d |   | j d.}%|%rp||d/tt%|%d d0 d1 tt%|%d	 d0 d1 d2 |rd3d4g}|jD ]}|d d \}}||v r|| |||| qz| j d5}&|&rt!|&t&j'r|&(d6}&|&)d7r|&d8d  }&||d9|& | }'|rt*| |||
|||}'|'rt+,|'t-t.t" t/||t+0d:d;|'j
 d|g |r|jD ](}|d d \}}|d	d  rt|dko|d }|r|||| q||d<d t1|d=r)|2  d S d S )>Nr   rs  )r#   r   r   c                 3  s&    | ] t  fd dD V  qdS )c                 3  s    | ]}|  V  qd S rL   r2   )r   
frame_sizer   r2   r3   r   1  r   z"_save.<locals>.<genexpr>.<genexpr>N)max)r   sizesr  r3   r   1  s   $ z_save.<locals>.<genexpr>r$   r   bitsr
      r(   r'   r%   ;optimizeFZcompress_levelru  compress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   r   )s   cHRMs   cICPs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  Z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      ?rZ  s   bKGDs   hISTr  r&   r   r)   s   eXIfr   r   ru   flush)3rq  r*  r   setrw  rx  r   ry  r   rF  rG  rT   r   r8  rL  r,  r  r   ZgetdataZencoderconfig	_OUTMODESKeyErrorrx   rc  r  rd  r:   r   remover   r&  r?  Z
getpaletter   r8   r  ZgetpalettemoderD   r   ZExiftobytesr  r  r   r|  r	   r   rg  r   hasattrr  )(r?  rI   r  rh  r  r   modesrs  r  r  rF  rG  Zoutmodecolorsr  r2  Z	bit_depth
color_typers   r@   r   ZiccnamerB   r   Zchunks_multiple_allowedZ
info_chunkr]   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalpharedgreenbluer   r  Z	single_imr2   r  r3   r|    s:  	
$









"




r|  paramsr    list[tuple[bytes, bytes, bytes]]c                   sJ   ddl m} g  d fd
d}| }z|| _t| |d| W | ` S | `w )z4Return a list of PNG chunks representing this image.r   )BytesIOrI   rJ   r]   r8   rB   r9   rK   c                   s0   d |}tt|t|} |||f d S )Nr   )rb  rd  rF   rf   re  r   r2   r3   rf     s   
zgetchunks.<locals>.appendr   NrI   rJ   r]   r8   rB   r8   r9   rK   )ior  rq  r|  )r?  r  r  rf   rI   r2   r   r3   	getchunks  s   r  z.pngz.apngz	image/png)r7   r8   r9   r8   )r   )rB   r8   rC   rD   r9   rD   )r  r8   r9   r   r  )r?  rp  rI   rJ   rh  ri  rF  r   r2  r   r   rr  rs  rt  r9   rr  )r?  rp  rI   rJ   r  r   r9   rK   )r?  rp  rI   rJ   r  r   rh  ri  r  r   r9   rK   )r?  rp  r  r   r9   r  )M
__future__r   rw  loggingrerq   r  r:   collections.abcr   enumr   typingr   r   r   r   r	   r   r   r   r   r   r   _binaryr   r   r   rX   r   r   r  r   rd  Z_utilr   TYPE_CHECKINGr   	getLoggerr,   rj   compiler   rY   r  r   r   Z	SAFEBLOCKr=   r   r+   r4   rA   rF   rH   r   r}   r   r   r   r  r  r  rf  rg  rn  ro  r  r  r|  r  Zregister_openrW  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer2   r2   r2   r3   <module>   s    


	^`  
m  ]

 
 
V