o
    j                     @  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 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dl"m#Z# dZ$e$rd dl%m&Z& d dlm'Z'm(Z( ddlm)Z) e*e+Z,e-dj.Z/dZ0dddddddddddd d!d"d#d$Z1e-d%Z2ej3Z4	 d&e4 Z5	 G d'd( d(e	Z6G d)d* d*e	Z7dd.d/Z8ddd3d4Z9G d5d6 d6Z:G d7d8 d8e;Z<G d9d: d:Z=G d;d< d<eZ>G d=d> d>e:Z?ddAdBZ@G dCdD dDejZAdEdFdGdHdIdJdKdKdKdLdMdNdOdPdQdRZBddWdXZCG dYdZ dZZDG d[d\ d\ZEddadbZFG dcdd ddeZGddndoZHddrdsZIeCdfddudvZJddzd{ZKeLeAjMeAe@ eNeAjMeJ eOeAjMeI ePeAjMd|d}g eQeAjMd~ dS )    )annotationsN)IntEnum)Fraction)IO
NamedTuplecast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)	deprecate)DeferredErrorF)Callable)AnyNoReturn)_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 r4   r4   S/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/PIL/PngImagePlugin.pyr-   n   s    r-   c                   @  s   e Zd ZdZ	 dZdS )Blendr   r   N)r.   r/   r0   	OP_SOURCEOP_OVERr4   r4   r4   r5   r6      s
    r6   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)r9   ZdobjZ	plaintextmsgr4   r4   r5   _safe_zlib_decompress   s   rC   dataseedintc                 C  s   t | |d@ S )Nl    )r<   crc32)rD   rE   r4   r4   r5   _crc32      rH   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]r;   Nonec                 C  s   || _ g | _d S N)rK   queueselfrK   r4   r4   r5   __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 ))rK   rO   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rQ   cidposlengthr9   rB   r4   r4   r5   rX      s   

zChunkStream.readc                 C  s   | S rN   r4   rQ   r4   r4   r5   	__enter__   s   zChunkStream.__enter__argsobjectc                 G  s   |    d S rN   )close)rQ   rd   r4   r4   r5   __exit__   s   zChunkStream.__exit__c                 C  s   d  | _ | _d S rN   )rO   rK   rb   r4   r4   r5   rf      rI   zChunkStream.closer_   r:   r`   rF   ra   c                 C  s$   | j d usJ | j |||f d S rN   )rO   appendrQ   r_   r`   ra   r4   r4   r5   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decoderi   r4   r4   r5   call   s   zChunkStream.callrD   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 rU   z(broken PNG file (incomplete checksum in )r   r\   crc_skiprK   rH   rZ   rX   r]   r^   structerror)rQ   r_   rD   Zcrc1Zcrc2rB   er4   r4   r5   crc   s    
zChunkStream.crcc                 C  s   | j dusJ | j d dS )zRead checksumNr'   )rK   rX   )rQ   r_   rD   r4   r4   r5   rr      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)	rK   rX   rs   rt   OSErrorrv   r   
_safe_readrh   )rQ   rx   Zcidsr_   r`   ra   ru   rB   r4   r4   r5   verify   s    

zChunkStream.verifyNrK   rL   r;   rM   )r;   rT   )r;   rJ   )rd   re   r;   rM   r;   rM   )r_   r:   r`   rF   ra   rF   r;   rM   )r_   r:   r`   rF   ra   rF   r;   r:   )r_   r:   rD   r:   r;   rM   )rw   )rx   r:   r;   ry   )r.   r/   r0   rR   rX   rc   rg   rf   rj   rp   rv   rr   r|   r4   r4   r4   r5   rJ      s    








rJ   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 | Noner;   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   rQ   r4   r4   r5   r   
  s   ziTXt.__new__)NN)r   r   r   r   r   r   r;   r   )r.   r/   r0   __doc____annotations__staticmethodr   r4   r4   r4   r5   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=))

    r;   rM   c                 C  s
   g | _ d S rN   chunksrb   r4   r4   r5   rR   !     
zPngInfo.__init__Fr_   r:   rD   
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   rh   )rQ   r_   rD   r   r4   r4   r5   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)
isinstancer:   encoder   r<   compress)rQ   r   r   r   r   r   r4   r4   r5   add_itxt0  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   r:   r   UnicodeErrorr   r<   r   )rQ   r   r   r   r4   r4   r5   add_textS  s,   

	
zPngInfo.add_textNr~   F)r_   r:   rD   r:   r   r   r;   rM   )r   r   F)r   r   r   r   r   r   r   r   r   r   r;   rM   )r   r   r   r   r   r   r;   rM   )r.   r/   r0   r   rR   r   r   r   r4   r4   r4   r5   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/   r0   r   r4   r4   r4   r5   r   {     
 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 ):	PngStreamrK   rL   r;   rM   c                   sZ   t  | i | _i | _d| _d| _g | _d | _d | _d | _	d | _
ti g d | _d| _d S )Nr   r   r   r   )superrR   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memoryrP   	__class__r4   r5   rR     s   
zPngStream.__init__chunklenrF   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_MEMORYrA   )rQ   r   rB   r4   r4   r5   check_text_memory  s   
zPngStream.check_text_memoryc                 C  s   t | j | j| j| _d S rN   )r   r   copyr   r   r   rb   r4   r4   r5   save_rewind  s
   
zPngStream.save_rewindc                 C  s&   | j j | _| j j| _| j j| _d S rN   )r   r   r   r   r   r   r   r   rb   r4   r4   r5   rewind  s   
zPngStream.rewindr`   ra   r:   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)rK   r   r{   findrl   rm   r^   rC   rA   r\   r<   rt   r   )rQ   r`   ra   r9   icomp_methodrB   r   r4   r4   r5   
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)rK   r   r{   r\   rA   rZ   r   _MODESr   
im_rawmode	Exceptionr   r^   rQ   r`   ra   r9   rB   r4   r4   r5   
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)rQ   r`   ra   r   rB   r4   r4   r5   
chunk_IDAT  s   


zPngStream.chunk_IDATc                 C  s   d}t |)Nzend of PNG image)r   )rQ   r`   ra   rB   r4   r4   r5   
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   )rK   r   r{   r   r   rQ   r`   ra   r9   r4   r4   r5   
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krAt|r:dnd| jd< |S | jdv rOt|| jd< |S | jdkrdt|t|d	t|d
f| jd< |S )Nr    r   r   transparencyr      )r   r   r   r&   r'   )	rK   r   r{   r   _simple_palettematchr   r   i16)rQ   r`   ra   r9   r   r4   r4   r5   
chunk_tRNS  s&   







 zPngStream.chunk_tRNSc                 C  s2   | j d usJ t| j |}t|d | jd< |S )N     j@gamma)rK   r   r{   rZ   r   r   r4   r4   r5   
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   Nr4   ).0eltr4   r4   r5   	<genexpr>      z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)rK   r   r{   rs   unpacklentupler   )rQ   r`   ra   r9   Zraw_valsr4   r4   r5   
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)rK   r   r{   r\   rA   r   r   r4   r4   r5   
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)rK   r   r{   r\   rA   rZ   r   )	rQ   r`   ra   r9   rB   pxpyunitr   r4   r4   r5   
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)
rK   r   r{   splitrA   ro   r   r   r   r   )rQ   r`   ra   r9   kvk_strv_strr4   r4   r5   
chunk_tEXt=  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   )rK   r   r{   r   rA   r^   rC   r\   r<   rt   ro   r   r   r   r   )
rQ   r`   ra   r9   r   r   r   rB   r   r   r4   r4   r5   
chunk_zTXtQ  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   )rK   r   r{   r   rA   r   rC   r\   r<   rt   r   ro   r   r   r   r   )rQ   r`   ra   rr9   r   cfcmr   tkr   r   Zlang_strZtk_strr   r4   r4   r5   
chunk_iTXtt  sP    
zPngStream.chunk_iTXtc                 C  s.   | j d usJ t| j |}d| | jd< |S )N   Exif  exif)rK   r   r{   r   r   r4   r4   r5   
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)rK   r   r{   r\   rA   r   warningswarnrZ   r   r   )rQ   r`   ra   r9   rB   n_framesr4   r4   r5   
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)rK   r   r{   r\   rA   rZ   r   r^   r   r   r   float)rQ   r`   ra   r9   rB   seqwidthheightr   r   Zim_wZim_hZ	delay_numZ	delay_denr4   r4   r5   
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  )	rK   r   r\   r{   rA   rZ   r   r^   r   )rQ   r`   ra   r9   rB   r  r4   r4   r5   
chunk_fdAT  s   zPngStream.chunk_fdATr}   )r   rF   r;   rM   r~   )r`   rF   ra   rF   r;   r:   )r`   rF   ra   rF   r;   r   )r.   r/   r0   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  __classcell__r4   r4   r   r5   r     s,    

	














#
+

r   prefixr   c                 C  s
   |  tS rN   )
startswith_MAGIC)r  r4   r4   r5   _accept  r   r   c                      s   e Zd ZdZdZd%ddZed&dd	Zd% f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 graphicsr;   rM   c              	   C  s  | j d usJ t| j dsd}t|| j | _d| _g | _t| j | _	 | j \}}}z
| j	|||}W n0 t
yA   Y n0 tyh   td||| t| j |}|dd  rf| 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'   ).rK   r   rX   r^   _fp_PngImageFile__frameprivate_chunksr   pngrp   r   AttributeErrorrl   rm   r   r{   islowerrh   rv   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_idatrY   _PngImageFile__rewind_seekis_animated)rQ   rB   r_   r`   ra   r9   rawmoderD   r4   r4   r5   _open  s\   






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,  r4  r%  rW   r	  load)rQ   framer4   r4   r5   r   >  s   

zPngImageFile.textc                   s`   | j du rd}t|| j | jd d d  | jdusJ | j  | j  t   dS )zVerify PNG fileNz)verify must be called directly after openr   r&   r(   )rK   RuntimeErrorrW   r   r'  r|   rf   r   )rQ   rB   r   r4   r5   r|   N  s   


zPngImageFile.verifyr9  rF   c              
   C  s   |  |sd S || jk r| dd | j}zt| jd |d D ]}| | q W d S  tyB } z| | d}t||d }~ww )Nr   Tr   zno more images in APNG file)Z_seek_checkr%  r3  ranger   rW   )rQ   r9  Z
last_framefru   rB   r4   r4   r5   rW   ^  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'   rw   zNo more images in APNG file   fcTLzAPNG missing frame datar#  r"  zimage not found in APNG frame)2r'  r   r$  r   exrW   r2  r   r1  r0  Z_imr   r   r   r   rK   _prev_imdisposer-  r   Z
dispose_opblend_opr%  rA   r8  impastedispose_extentr   r   r{   rX   rs   rt   r^   r   rp   UnicodeDecodeErrorr(  rl   rm   r-   r3   r2   _cropr	   corefillmodesize)	rQ   r9  r   rD  rB   Zframe_startr_   r`   ra   r4   r4   r5   r3  m  s   



!
zPngImageFile._seekc                 C  s   | j S rN   )r%  rb   r4   r4   r5   rY     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decoderconfigr0  _PngImageFile__idatr   load_preparerb   r4   r4   r5   rL    s   zPngImageFile.load_prepare
read_bytesr:   c                 C  s   | j dusJ | jdusJ | jdkrU| jd | j  \}}}|dvr/| j ||| dS |dkrMz
| j ||| W n	 tyF   Y nw |d | _n|| _| jdks|dkr]| j}nt|| j}| j| | _| j|S )zinternal: read more image dataNr   r'   )   IDATs   DDATr#  r   r#  )r'  rK   rK  rX   rj   rp   r   min)rQ   rM  r_   r`   ra   r4   r4   r5   	load_read  s,   

zPngImageFile.load_readc           	      C  st  | j dusJ | jdusJ | jdkr| j| j 	 | jd z
| j  \}}}W n tjtfy7   Y nw |dkr=n|dkrP| jrPd| _| j 	||| noz
| j 
||| W nc tyc   Y n\ ty   |dkrq|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r6| jtjkr8| | 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'   rw   r=  r#  r"  r   r&   r   r   r%   r    )+r'  rK   rK  rX   rs   rt   r^   r4  r0  rj   rp   rE  r   r   r{   rz   r\   r(  rl   rm   r)  r&  rh   r   r,  rf   r?  rA  r6   r8   rF  rB  rD  rI  r   Zconvert_transparentr   r:   ZputpalettealphasrF   ZputpalettealphaconvertrC  )	rQ   r_   r`   ra   ru   r9   updatedmasktr4   r4   r5   load_end   sz   

#





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   r8  getexifZ_get_merged_dictrb   r4   r4   r5   _getexif?  s
   
zPngImageFile._getexif
Image.Exifc                   s   d| j vr	|   t  S )Nr  )r   r8  r   rW  rb   r   r4   r5   rW  F  s   

zPngImageFile.getexifr~   )r;   r7  )r9  rF   r;   rM   r   )r9  rF   r   r   r;   rM   )r;   rF   )rM  rF   r;   r:   )r;   rV  )r;   rY  )r.   r/   r0   formatformat_descriptionr6  propertyr   r|   rW   r3  rY   rL  rP  rU  rX  rW  r  r4   r4   r   r5   r!    s    
D

d

	
#
?r!  )r      r   )L;1r]  r   )r      r   )r      r   )r      r   )r$   ra  r`  )r      r   )r!   r]     )r"   r_  rc  )r#   r`  rc  )r    ra  rc  )r   ra  r_  )r%   ra     )r   r^  r   r   r   r$   r   r   r   r!   r"   r#   r    r   r%   rK   rL   r_   rM   c                 G  sJ   d |}| tt||  | | t|t|}| t| dS )z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r   rH   rK   r_   rD   Z	byte_datarv   r4   r4   r5   putchunkd  s
   

ri  c                   @  s    e Zd ZdddZdddZdS )_idatrK   rL   chunkCallable[..., None]r;   rM   c                 C  s   || _ || _d S rN   )rK   rk  )rQ   rK   rk  r4   r4   r5   rR   r  rS   z_idat.__init__rD   r:   c                 C  s   |  | jd| d S )NrN  )rk  rK   rQ   rD   r4   r4   r5   rf  v     z_idat.writeN)rK   rL   rk  rl  r;   rM   rD   r:   r;   rM   r.   r/   r0   rR   rf  r4   r4   r4   r5   rj  o  s    
rj  c                   @  s    e Zd Zdd	d
ZdddZdS )_fdatrK   rL   rk  rl  r   rF   r;   rM   c                 C  s   || _ || _|| _d S rN   )rK   rk  r   )rQ   rK   rk  r   r4   r4   r5   rR   }  s   
z_fdat.__init__rD   r:   c                 C  s*   |  | jdt| j| |  jd7  _d S )Nr#  r   )rk  rK   rg  r   rm  r4   r4   r5   rf    s   z_fdat.writeN)rK   rL   rk  rl  r   rF   r;   rM   ro  rp  r4   r4   r4   r5   rq  z  s    
rq  rB  Image.Imageencoderinfodict[str, Any]c                 C  s2   | dd| dd| dd| ddf| _d S )NoptimizeFZcompress_levelcompress_type
dictionaryr   )r-  Zencoderconfig)rB  rs  r4   r4   r5   _apply_encoderinfo  s
   




ry  c                   @  r   )_Framerr  rB  z tuple[int, int, int, int] | Noner   rt  rs  Nr   r4   r4   r4   r5   rz    r   rz  rk  rl  rI  r   r5  r   Image.Image | Noneappend_imageslist[Image.Image]c           #      C  s  | 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!| |r| j|kr^| n| |}t"|| j  t#$|t%t&t' t(||t#)dd| j d|g d}t*|D ]\}}|j}|jsd|j }n|j}||}|j}|j }|dd}t+|d ,d}|j-dkrd}t.||d|	} |d|
}!||dt!|t!|d t!|d t!|d t!|d t/|j-t/|j0t1| t1|! |d7 }t"|| j  |dkr%|s%t#$|t%t&t' t(||t#)dd|j d|g qt2|||}"t#$|t%t&t' |"t#)dd|j d|g |"j3}qd S )Nr  r  r   r  r  r   rv  r&   r%   )r   r   r   r   r   F)Z
alpha_onlys   acTLr   r    zcannot write durationr=  )4rs  r-  r   r-   r1   r6   r7   	itertoolschainr   IteratorrI  r   rQ  r   listr   r3   r   r2   rB  r	   rG  rH  rJ  r   croprC  r
   Zsubtract_moduloZgetbboxrh   rz  rg  ry  r   _saver   r   r:   rj  r   	enumerater   limit_denominator	numeratorrA   o16denominatorr   rq  r   )#rB  rK   rk  rI  r5  r   r|  r  r  r  r  r  Z	im_framesZframe_countim_seqim_framers  previousZprev_disposalZ
prev_blendZbase_imr@  r   deltaZ
default_imr   r9  Z
frame_datarJ  Zframe_durationdelayrB   Zframe_disposalZframe_blendZfdat_chunksr4   r4   r5   _write_multiple_frames  s   	








4







r  filenamer   c                 C  s   t | ||dd d S )NT)save_all)r  )rB  rK   r  r4   r4   r5   	_save_all)  rn  r  r  c           )   
     sJ  |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	}
|
}g }| jrh|  pgg }|
dkrd| j v r|td	| j d > d
}n| jrttt|d d
d	}nd
}|dkr|dkrd	}n	|dkrd}nd}|d| 7 }z	t| \}}}W n ty } zd|
 d}t||d }~ww |dkrtdddd |t ||dt|d t|d	 ||ddd	 g d}| j d| jd }rd}|d t| }||d| |d | j d }rng d}|jD ]G}|d d \}}||v rB|| |||| q&||v rO|||| q&|d	d  rlt|dkob|d }|sl|||| q&| j	dkr|d }t|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 rt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r?| j"# d)kr?| j"d)d*}"|}!||d"|"d |!  | j d+ }&rd||d,tt$|&d d- d. tt$|&d	 d- d. d/ |rd0d1g}|jD ]}|d d \}}||v r|| |||| qn| j d2 }'rt |'t%j&r|''d3}'|'(d4r|'d5d  }'||d6|' | }(|rt)| |||
|||}(|(rt*|(| j  t+,|(t-t.t t/||t+0d7d8|(j
 d|g |r|jD ](}|d d \}}|d	d  rt|dko|d }|r|||| q||d9d: t1|d;r#|2  d S d S )<Nr   r|  )r%   r   r    c                 3  s&    | ] t  fd dD V  qdS )c                 3  s    | ]}|  V  qd S rN   r4   )r   
frame_sizer   r4   r5   r   F  r   z"_save.<locals>.<genexpr>.<genexpr>N)max)r   sizesr  r5   r   F  s   $ z_save.<locals>.<genexpr>r&   r    bitsr      r*   r)   r'   ;zcannot write mode z as PNGr   zSaving I mode images as PNGr   )
stacklevels   IHDRr   r   )s   cHRMs   cICPs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  Zpnginfo)s   sPLTr   r   r   s   PLTEr   s   tRNSr      )r   r   r   r   r  r   z%cannot use transparency for this moder%   Ar   s   pHYsr   g      ?r]  s   bKGDs   hISTr  r(   r  r+   s   eXIfr   r   rw   r   flush)3rs  r-  r   setr  r  r   r  r   rI  rJ  rV   r   r;  r/  Z
getpaletterO  r  r   	_OUTMODESKeyErrorrz   r   rf  r  rg  r<   r   remover   r)  r:   r   r  rB  ZgetpalettemoderF   r	   ZExiftobytesr  r  ry  r   r  r   r   rj  r   hasattrr  ))rB  rK   r  rk  r  r   modesr|  r  r  rI  rJ  Zoutmoder/  colorsr  r5  Z	bit_depth
color_typeru   rB   r   ZiccnamerD   r   Zchunks_multiple_allowedZ
info_chunkr_   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalpharedgreenbluer   r  Z	single_imr4   r  r5   r  -  s4  	










"




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   )BytesIOrK   rL   r_   r:   rD   r;   rM   c                   s0   d |}tt|t|} |||f d S )Nr   )re  rg  rH   rh   rh  r   r4   r5   rh     s   
zgetchunks.<locals>.appendr   NrK   rL   r_   r:   rD   r:   r;   rM   )ior  rs  r  )rB  r  r  rh   rK   r4   r   r5   	getchunks  s   r  z.pngz.apngz	image/png)r9   r:   r;   r:   )r   )rD   r:   rE   rF   r;   rF   )r  r:   r;   r   r  )rB  rr  rs  rt  r;   rM   )rB  rr  rK   rL   rk  rl  rI  r   r5  r   r   r{  r|  r}  r;   r{  )rB  rr  rK   rL   r  r   r;   rM   )rB  rr  rK   rL   r  r   rk  rl  r  r   r;   rM   )rB  rr  r  r   r;   r  )R
__future__r   r  loggingrers   r  r<   enumr   	fractionsr   typingr   r   r   r   r	   r
   r   r   r   _binaryr   r   r   rZ   r   r   r  r   rg  Z
_deprecater   Z_utilr   TYPE_CHECKINGcollections.abcr   r   r   r   	getLoggerr.   rl   compiler   r[   r  r   r   Z	SAFEBLOCKr?   r   r-   r6   rC   rH   rJ   r   r   r   r   r   r   r!  r  ri  rj  rq  ry  rz  r  r  r  r  Zregister_openrZ  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer4   r4   r4   r5   <module>   s    


	^`  
o  ^

	
 
 
P