U
    M»{j¶½  ã                   @  sx  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  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)Z*d e* Z+G d!d"„ d"e	ƒZ,G d#d$„ d$e	ƒZ-d%d&„ Z.d]d'd(„Z/G d)d*„ d*ƒZ0G d+d,„ d,e1ƒZ2G d-d.„ d.ƒZ3G d/d0„ d0e0ƒZ4d1d2d3œd4d5„Z5G d6d7„ d7ejƒZ6d8d9d:d;d<d=d>d>d>d?d@dAdBdCdDdEœZ7dFdG„ Z8G dHdI„ dIƒZ9G dJdK„ dKƒZ:dLdM„ Z;dNdOdPdQdRœdSdT„Z<e8dUfdVdW„Z=dXdY„ Z>e ?e6j@e6e5¡ e Ae6j@e=¡ e Be6j@e<¡ e Ce6j@dZd[g¡ e De6j@d\¡ dS )^é    )ÚannotationsN)ÚIntEnum)ÚIOÚTYPE_CHECKINGÚAnyÚNoReturné   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32be)Ú_imagings   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )úI;16úI;16B)ÚRGBr   )r   zRGB;16B)ÚPúP;1)r   úP;2)r   úP;4)r   r   )ÚLAr   )ÚRGBAzLA;16B)r    r    )r    zRGBA;16B))r   r   )é   r   )é   r   )é   r   )é   r   )r#   r!   )r$   r!   )r   é   )r!   r%   )r"   r%   )r#   r%   )r#   r"   )r$   r"   )r#   é   )r$   r&   s   ^ÿ* ÿ*$é@   c                   @  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© r/   r/   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/PIL/PngImagePlugin.pyr(   g   s   r(   c                   @  s   e Zd ZdZdZdS )ÚBlendr   r   N)r)   r*   r+   Ú	OP_SOURCEÚOP_OVERr/   r/   r/   r0   r1   |   s   r1   c                 C  s*   t  ¡ }| | t¡}|jr&d}t|ƒ‚|S )NzDecompressed Data Too Large)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)ÚsZdobjZ	plaintextÚmsgr/   r/   r0   Ú_safe_zlib_decompressŠ   s    r<   c                 C  s   t  | |¡d@ S )Nl   ÿÿ )r4   Úcrc32)ÚdataÚseedr/   r/   r0   Ú_crc32“   s    r@   c                   @  s¨   e Zd Zdddœdd„Zddœdd	„Zd dœd
d„Zdddœdd„Zddœdd„Zdddddœdd„Zdd„ Z	ddddœdd„Z
ddddœdd„Zd$ddd œd!d"„Zd#S )%ÚChunkStreamú	IO[bytes]ÚNone)ÚfpÚreturnc                 C  s   || _ g | _d S ©N)rD   Úqueue©ÚselfrD   r/   r/   r0   Ú__init__œ   s    zChunkStream.__init__ztuple[bytes, int, int]©rE   c                 C  s�   d}| j dk	st‚| jr6| j ¡ \}}}| j  |¡ n*| j  d¡}|dd… }| j  ¡ }t|ƒ}t|ƒs†t	j
s†dt|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr#   r"   zbroken PNG file (chunk ú))rD   ÚAssertionErrorrG   ÚpopÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rI   ÚcidÚposÚlengthr:   r;   r/   r/   r0   rP       s    
zChunkStream.readc                 C  s   | S rF   r/   ©rI   r/   r/   r0   Ú	__enter__µ   s    zChunkStream.__enter__Úobject)ÚargsrE   c                 G  s   |   ¡  d S rF   )Úclose)rI   r]   r/   r/   r0   Ú__exit__¸   s    zChunkStream.__exit__c                 C  s   d  | _ | _d S rF   )rG   rD   rZ   r/   r/   r0   r^   »   s    zChunkStream.closeÚbytesÚint)rW   rX   rY   rE   c                 C  s$   | j d k	st‚| j  |||f¡ d S rF   )rG   rM   Úappend©rI   rW   rX   rY   r/   r/   r0   Ú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Údecoderc   r/   r/   r0   ÚcallÂ   s    zChunkStream.call)rW   r>   rE   c              
   C  sº   t jr&|d d? d@ r&|  ||¡ dS | jdk	s4t‚zBt|t|ƒƒ}t| j d¡ƒ}||krtdt|ƒ› d�}t	|ƒ‚W n> t
jk
r´ } zdt|ƒ› d�}t	|ƒ|‚W 5 d}~X Y nX dS )	zRead and verify checksumr   é   r   Nr"   z(broken PNG file (bad header checksum in rL   z(broken PNG file (incomplete checksum in )r   rT   Úcrc_skiprD   rM   r@   rR   rP   rU   rV   ÚstructÚerror)rI   rW   r>   Zcrc1Zcrc2r;   Úer/   r/   r0   ÚcrcÈ   s    zChunkStream.crcc                 C  s   | j dk	st‚| j  d¡ dS )zRead checksumNr"   )rD   rM   rP   )rI   rW   r>   r/   r/   r0   rl   Ý   s    zChunkStream.crc_skipó   IENDzlist[bytes])ÚendchunkrE   c              
   C  sz   g }z|   ¡ \}}}W n2 tjk
rH } zd}t|ƒ|‚W 5 d }~X Y nX ||krTqv|  |t | j|¡¡ | |¡ q|S )Nztruncated PNG file)	rP   rm   rn   ÚOSErrorrp   r   Ú
_safe_readrD   rb   )rI   rr   ZcidsrW   rX   rY   ro   r;   r/   r/   r0   Úverifyã   s    zChunkStream.verifyN)rq   )r)   r*   r+   rJ   rP   r[   r_   r^   rd   rj   rp   rl   ru   r/   r/   r/   r0   rA   ›   s   rA   c                   @  s0   e Zd ZU dZded< ded< eddd„ƒZdS )	ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NoneÚlangÚtkeyNc                 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
        )ÚstrÚ__new__rw   rx   )ÚclsÚtextrw   rx   rI   r/   r/   r0   rz     s    	ziTXt.__new__)NN)r)   r*   r+   Ú__doc__Ú__annotations__Ústaticmethodrz   r/   r/   r/   r0   rv   ø   s
   
rv   c                   @  sd   e Zd ZdZddœdd„Zdddddd	œd
d„Zddddddddœdd„Zddddddœdd„ZdS )ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rC   rK   c                 C  s
   g | _ d S rF   )ÚchunksrZ   r/   r/   r0   rJ     s    zPngInfo.__init__Fr`   Úbool)rW   r>   Ú
after_idatrE   c                 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�   rb   )rI   rW   r>   rƒ   r/   r/   r0   Úadd  s    
zPngInfo.addÚ ústr | bytes)ÚkeyÚvaluerw   rx   ÚziprE   c                 C  s°   t |tƒs| dd¡}t |tƒs,| dd¡}t |tƒsB| dd¡}t |tƒsX| dd¡}|rˆ|  d|d | d | d t |¡ ¡ n$|  d|d | d | d | ¡ dS )	zùAppends 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„   r4   Úcompress)rI   r‡   rˆ   rw   rx   r‰   r/   r/   r0   Úadd_itxt&  s    



 þzPngInfo.add_itxtzstr | bytes | iTXt)r‡   rˆ   r‰   rE   c                 C  sÌ   t |tƒr>| j|||jdk	r"|jnd|jdk	r4|jnd|d�S t |tƒs~z| dd¡}W n$ tk
r|   | j|||d� Y S X t |tƒs”| dd¡}|r´|  d|d t	 
|¡ ¡ n|  d|d	 | ¡ dS )
zæAppends 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�   rv   r’   rw   rx   r`   r�   ÚUnicodeErrorr„   r4   r‘   )rI   r‡   rˆ   r‰   r/   r/   r0   Úadd_textI  s$    
û	

zPngInfo.add_textN)F)r…   r…   F)F)r)   r*   r+   r}   rJ   r„   r’   r˜   r/   r/   r/   r0   r€     s      ú$ ÿr€   c                      sz  e Zd Z‡ fdd„Zdddœdd„Zddœd	d
„Zddœdd„Zddddœdd„Zddddœdd„Zddddœdd„Z	ddddœdd„Z
ddddœdd„Zddddœdd„Zddddœdd„Zddddœdd„Zddddœd d!„Zddddœd"d#„Zddddœd$d%„Zddddœd&d'„Zddddœd(d)„Zddddœd*d+„Zddddœd,d-„Zddddœd.d/„Zddddœd0d1„Z‡  ZS )2Ú	PngStreamc                   sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrJ   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrH   ©Ú	__class__r/   r0   rJ   r  s    zPngStream.__init__ra   rC   )ÚchunklenrE   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_MEMORYr9   )rI   r©   r;   r/   r/   r0   Úcheck_text_memoryƒ  s
    
ÿzPngStream.check_text_memoryrK   c                 C  s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)rœ   Úcopyr    r¤   r¥   rZ   r/   r/   r0   Úsave_rewindŒ  s    ýzPngStream.save_rewindc                 C  s,   | j d  ¡ | _| j d | _| j d | _d S )Nr¬   r­   r®   )r¥   r¯   rœ   r    r¤   rZ   r/   r/   r0   Úrewind“  s    zPngStream.rewindr`   )rX   rY   rE   c                 C  sÂ   t  | j|¡}| d¡}t d|d |… ¡ ||d  }t d|¡ |dkr`d|› d�}t|ƒ‚zt||d d … ƒ}W n: tk
rš   t j	r”d }n‚ Y n t
jk
r²   d }Y nX || jd	< |S )
NrŽ   ziCCP profile name %rr   zCompression method %sr   úUnknown compression method z in iCCP chunkr!   Úicc_profile)r   rt   rD   Úfindrf   rg   rV   r<   r9   rT   r4   rn   rœ   )rI   rX   rY   r:   ÚiÚcomp_methodr;   r³   r/   r/   r0   Ú
chunk_iCCP˜  s$    


zPngStream.chunk_iCCPc                 C  s¢   t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|dƒt|dƒf| _z t|d |d f \| _| _	W n t
k
rv   Y nX |d rŠd| jd	< |d
 ržd}t|ƒ‚|S )Né   zTruncated IHDR chunkr   r"   r#   é	   é   r   Ú	interlaceé   zunknown filter category)r   rt   rD   rT   r9   rR   rž   Ú_MODESrŸ   Ú
im_rawmodeÚ	Exceptionrœ   rV   ©rI   rX   rY   r:   r;   r/   r/   r0   Ú
chunk_IHDR³  s"     
zPngStream.chunk_IHDRr   c                 C  sh   d| j kr"d| j d || jfg}n*| jd k	r6d| j d< dd| j || jfg}|| _|| _d}t|ƒ‚d S )NÚbboxr‰   TÚdefault_imagerš   zimage data found)rœ   r¾   r£   rž   r    Zim_idatÚEOFError)rI   rX   rY   r­   r;   r/   r/   r0   Ú
chunk_IDATÇ  s    


zPngStream.chunk_IDATc                 C  s   d}t |ƒ‚d S )Nzend of PNG image)rÄ   )rI   rX   rY   r;   r/   r/   r0   Ú
chunk_IENDÔ  s    zPngStream.chunk_IENDc                 C  s&   t  | j|¡}| jdkr"d|f| _|S )Nr   r   )r   rt   rD   rŸ   r¡   ©rI   rX   rY   r:   r/   r/   r0   Ú
chunk_PLTEØ  s    

zPngStream.chunk_PLTEc                 C  s”   t  | j|¡}| jdkrLt |¡r@| d¡}|dkrJ|| jd< q�|| jd< nD| jdkrft|ƒ| jd< n*| jdkr�t|ƒt|dƒt|dƒf| jd< |S )	Nr   rŽ   r   Útransparency)r   r   r   r   r!   r"   )	r   rt   rD   rŸ   Ú_simple_paletteÚmatchr´   rœ   Úi16)rI   rX   rY   r:   rµ   r/   r/   r0   Ú
chunk_tRNSß  s    




 zPngStream.chunk_tRNSc                 C  s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   rt   rD   rR   rœ   rÇ   r/   r/   r0   Ú
chunk_gAMAó  s    zPngStream.chunk_gAMAc                 C  sB   t  | j|¡}t dt|ƒd  |¡}tdd„ |D ƒƒ| jd< |S )Nz>%dIr"   c                 s  s   | ]}|d  V  qdS )rÎ   Nr/   )Ú.0Úeltr/   r/   r0   Ú	<genexpr>ÿ  s     z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rt   rD   rm   ÚunpackÚlenÚtuplerœ   )rI   rX   rY   r:   Zraw_valsr/   r/   r0   Ú
chunk_cHRMù  s    zPngStream.chunk_cHRMc                 C  s>   t  | j|¡}|dk r,t jr |S d}t|ƒ‚|d | jd< |S )Nr   zTruncated sRGB chunkr   Zsrgb)r   rt   rD   rT   r9   rœ   rÀ   r/   r/   r0   Ú
chunk_sRGB  s    zPngStream.chunk_sRGBc           	      C  sˆ   t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|dƒt|dƒ }}|d }|dkrn|d |d f}|| jd< n|dkr„||f| jd	< |S )
Nr¹   zTruncated pHYs chunkr   r"   r#   r   ç¦
F%uš?ÚdpiZaspect)r   rt   rD   rT   r9   rR   rœ   )	rI   rX   rY   r:   r;   ÚpxÚpyÚunitrÚ   r/   r/   r0   Ú
chunk_pHYs  s    zPngStream.chunk_pHYsc                 C  sŽ   t  | j|¡}z| dd¡\}}W n tk
r>   |}d}Y nX |rŠ| dd¡}| dd¡}|dkrh|n|| j|< || j|< |  t	|ƒ¡ |S )NrŽ   r   r“   rŠ   r‹   ÚreplaceÚexif)
r   rt   rD   Úsplitr9   ri   rœ   r�   r«   rÕ   )rI   rX   rY   r:   ÚkÚvZv_strr/   r/   r0   Ú
chunk_tEXt#  s    

zPngStream.chunk_tEXtc                 C  s   t  | j|¡}z| dd¡\}}W n tk
r>   |}d}Y nX |rN|d }nd}|dkrnd|› d�}t|ƒ‚zt|dd … ƒ}W n: tk
r¤   t jržd}n‚ Y n tj	k
r¼   d}Y nX |rü| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
NrŽ   r   r“   r   r²   z in zTXt chunkrŠ   r‹   rß   )r   rt   rD   rá   r9   rV   r<   rT   r4   rn   ri   rœ   r�   r«   rÕ   )rI   rX   rY   r:   râ   rã   r¶   r;   r/   r/   r0   Ú
chunk_zTXt6  s4    


zPngStream.chunk_zTXtc                 C  s˜  t  | j|¡ }}z| dd¡\}}W n tk
r>   | Y S X t|ƒdk rP|S |d |d |dd …   }}}z| dd¡\}}	}
W n tk
rž   | Y S X |dk�r|dk�rzt|
ƒ}
W n> tk
rä   t jrÞ| Y S ‚ Y n tj	k
� rþ   | Y S X n|S |dk�r|
| j
d< z4| dd¡}| d	d¡}|	 d	d¡}	|
 d	d¡}
W n tk
�rh   | Y S X t|
||	ƒ | j
|< | j|< |  t|
ƒ¡ |S )
NrŽ   r   r!   r   s   XML:com.adobe.xmpZxmprŠ   r‹   rŒ   )r   rt   rD   rá   r9   rÕ   r<   rT   r4   rn   rœ   ri   r—   rv   r�   r«   )rI   rX   rY   Úrr:   râ   ÚcfÚcmrw   Ztkrã   r/   r/   r0   Ú
chunk_iTXtX  sF    
 





zPngStream.chunk_iTXtc                 C  s    t  | j|¡}d| | jd< |S )Nó   Exif  rà   )r   rt   rD   rœ   rÇ   r/   r/   r0   Ú
chunk_eXIf‚  s    zPngStream.chunk_eXIfc                 C  s�   t  | j|¡}|dk r,t jr |S d}t|ƒ‚| jd k	rJd | _t d¡ |S t|ƒ}|dksb|dkrpt 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   rt   rD   rT   r9   r£   ÚwarningsÚwarnrR   rœ   r¢   )rI   rX   rY   r:   r;   Ún_framesr/   r/   r0   Ú
chunk_acTLˆ  s$    


zPngStream.chunk_acTLc                 C  sB  t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|ƒ}| jd krF|dks^| jd k	rj| j|d krjd}t|ƒ‚|| _t|dƒt|dƒ }}t|dƒt|d	ƒ }}	| j\}
}|| |
ks¾|	| |krÊd
}t|ƒ‚||	|| |	| f| j	d< t
|dƒt
|dƒ }}|dk�rd}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)r   rt   rD   rT   r9   rR   r¤   rV   rž   rœ   rÌ   Úfloat)rI   rX   rY   r:   r;   ÚseqÚwidthÚheightrÛ   rÜ   Zim_wZim_hZ	delay_numZ	delay_denr/   r/   r0   Ú
chunk_fcTLœ  s:    ÿÿ

zPngStream.chunk_fcTLc                 C  sv   |dk r,t jr t  | j|¡}|S d}t|ƒ‚t  | jd¡}t|ƒ}| j|d kr\d}t|ƒ‚|| _|  |d |d ¡S )Nr"   z"APNG contains truncated fDAT chunkr   rò   )	r   rT   rt   rD   r9   rR   r¤   rV   rÅ   )rI   rX   rY   r:   r;   rý   r/   r/   r0   Ú
chunk_fdAT¹  s    zPngStream.chunk_fdAT)r)   r*   r+   rJ   r«   r°   r±   r·   rÁ   rÅ   rÆ   rÈ   rÍ   rÐ   r×   rØ   rÞ   rä   rå   ré   rë   rð   r   r  Ú__classcell__r/   r/   r§   r0   r™   q  s*   		"*r™   r`   r‚   )ÚprefixrE   c                 C  s   | d d… t kS )Nr#   )Ú_MAGIC)r  r/   r/   r0   Ú_acceptÍ  s    r  c                      s¾   e Zd ZdZdZddœdd„Zedd„ ƒZddœd	d
„Zdddœdd„Z	d$ddddœdd„Z
ddœdd„Zddœdd„Zdddœdd„Zddœdd„Zddœdd „Zd!dœ‡ fd"d#„Z‡  ZS )%ÚPngImageFileZPNGzPortable network graphicsrC   rK   c              	   C  sÔ  t | j d¡ƒsd}t|ƒ‚| j| _d| _g | _t| jƒ| _| j ¡ \}}}z| j 	|||¡}W nh t
k
rx   Y qÚY nR tk
rÈ   t d|||¡ t | j|¡}|dd…  ¡ rÄ| j ||f¡ Y nX | j ||¡ q<| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jj�pd| _| j  dd¡| _!| jj"�rV| jj"\}}t# $||¡| _%|d	k�rl|d
 | _&n|| _&| jjd k	�rÄd| _'| j (¡  | j&| _)| j *¡ | _+| j!�rº|  jd7  _|  ,d¡ | jdk| _-d S )Nr#   znot a PNG filer   ú%r %s %s (unknown)r   r!   rÃ   Fó   fdATr"   ).r  rD   rP   rV   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr™   Úpngrj   rÄ   ÚAttributeErrorrf   rg   r   rt   Úislowerrb   rp   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_idatrQ   Ú_PngImageFile__rewindÚ_seekÚis_animated)rI   r;   rW   rX   rY   r:   Úrawmoder>   r/   r/   r0   Ú_openÙ  sR    	








zPngImageFile._openc                 C  sD   | j d kr>| jr&| j}|  | jd ¡ |  ¡  | jr>|  |¡ | j S )Nr   )r  r  r
  rO   rï   Úload)rI   Úframer/   r/   r0   r|     s    

zPngImageFile.textc                 C  sl   | j dkrd}t|ƒ‚| j  | jd d d ¡ | jdk	s>t‚| j ¡  | j ¡  | jrb| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r!   r#   )	rD   ÚRuntimeErrorrO   r­   r  rM   ru   r^   Z_exclusive_fp)rI   r;   r/   r/   r0   ru   +  s    



zPngImageFile.verifyra   )r  rE   c                 C  s’   |   |¡sd S || jk r$|  dd¡ | j}t| jd |d ƒD ]N}z|  |¡ W q> tk
rŠ } z|  |¡ d}t|ƒ|‚W 5 d }~X Y q>X q>d S )Nr   Tr   zno more images in APNG file)Z_seek_checkr
  r  ÚrangerÄ   rO   )rI   r  Z
last_frameÚfro   r;   r/   r/   r0   rO   =  s    


zPngImageFile.seekFr‚   )r  r±   rE   c              	   C  s>  | j d k	st‚|  |dkr¼|rl| j | j¡ | j  ¡  | j| _d | _| j	rPd | _	| j j
| _| j j| _| j| _d | _d | _| j dd¡| _| j d¡| _| j d¡| _| j d¡| _d| _�nì|| jd krÜd|› �}t|ƒ‚|  ¡  | jrü| j | j| j¡ | j ¡ | _| j| _| j�r.t | j| j¡ d| _d}| j d	¡ z| j  ¡ \}}}W n" tjt fk
�rt   Y �qZY nX |d
k�rŒd}t!|ƒ‚|dk�r¬|�r¨d}t |ƒ‚d}z| j  "|||¡ W n” t#k
�rÜ   Y �qZY nz t!k
�r"   |dk�r|d	8 }|�r|| _Y �qZt | j|¡ Y n4 t$k
�rT   t% &d|||¡ t | j|¡ Y nX �q2|| _| j j| _| j d¡| _| j d¡| _| j d¡| _| j�s¨d}t!|ƒ‚| jd k�rÊ| jt'j(k�rÊt'j)| _d | _| jt'j(k�r| j�r:| j ¡ | _|  *| j| j¡| _n4| jt'j)k�r:t+j, -| j.| j/¡| _|  *| j| j¡| _d S )Nr   rÃ   Frù   rû   rÂ   r   zcannot seek to frame r"   rq   zNo more images in APNG fileó   fcTLzAPNG missing frame dataTr  r  zimage not found in APNG frame)0r  rM   r	  rO   r  r±   r  r  ÚimÚpyaccessrœ   r¬   r    r­   rD   Ú_prev_imÚdisposer  rÃ   Z
dispose_opÚblend_opÚdispose_extentr
  r9   r  Úpaster¯   r   rt   rP   rm   rn   rV   rÄ   rj   ÚUnicodeDecodeErrorr  rf   rg   r(   r.   r-   Ú_cropr	   ÚcoreÚfillÚmodeÚsize)rI   r  r±   r;   Zframe_startrW   rX   rY   r/   r/   r0   r  L  sš    









zPngImageFile._seekc                 C  s   | j S rF   )r
  rZ   r/   r/   r0   rQ   ­  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_preparerZ   r/   r/   r0   r0  °  s    zPngImageFile.load_preparer`   )Ú
read_bytesrE   c                 C  sÊ   | j dk	st‚| jdkr–| j d¡ | j  ¡ \}}}|dkrP| j  |||¡ dS |dkrŽz| j  |||¡ W n tk
r€   Y nX |d | _q|| _q|dkr¦| j}nt|| jƒ}| j| | _| j |¡S )zinternal: read more image dataNr   r"   )ó   IDATs   DDATr  r“   r  )	r  rM   r/  rD   rP   rd   rj   rÄ   Úmin)rI   r1  rW   rX   rY   r/   r/   r0   Ú	load_read¹  s&    
zPngImageFile.load_readc                 C  sJ  | j dk	st‚| jdkr&| j | j¡ | j d¡ z| j  ¡ \}}}W n  tjtfk
rf   Y �qœY nX |dkrv�qœn(|dkrž| jržd| _	| j  
|||¡ �qœz| j  |||¡ W q& tk
rÌ   Y �qœY q& tk
�rB   |dkrì|d8 }zt | j|¡ W n> tk
�r< } ztj�r(W Y ¢Y �qœn|‚W 5 d}~X Y nX Y q& tk
�r˜   t d|||¡ t | j|¡}|dd	…  ¡ �r”| j ||d
f¡ Y q&X q&| j j| _| j�sÀ| j  ¡  d| _ n†| j�rF| jtjk�rF|  | j | j!¡}| j j"dk�rd| j#k�r| $d| j#d ¡}n
| %d¡}| j &|| j!|¡ | j| _ | j'�rFd| _'dS )z%internal: finished reading image dataNr   r"   rq   r!  r  r  r   r!   Tr   rÉ   r    )(r  rM   r/  rD   rP   rm   rn   rV   r  r  rd   rj   r)  rÄ   r   rt   rs   rT   r  rf   rg   r  r  rb   r�   r  r^   r$  r&  r1   r3   r*  r"  r'  r-  r¬   Zconvert_transparentÚconvertr(  r#  )rI   rW   rX   rY   ro   r:   ÚupdatedÚmaskr/   r/   r0   Úload_endÛ  s`    



 ÿ
zPngImageFile.load_endzdict[str, Any] | Nonec                 C  s6   d| j kr|  ¡  d| j kr*d| j kr*d S |  ¡  ¡ S )Nrà   zRaw profile type exif)r¬   r  ÚgetexifZ_get_merged_dictrZ   r/   r/   r0   Ú_getexif  s
    
zPngImageFile._getexifz
Image.Exifc                   s   d| j kr|  ¡  tƒ  ¡ S )Nrà   )r¬   r  r›   r9  rZ   r§   r/   r0   r9    s    
zPngImageFile.getexif)F)r)   r*   r+   ÚformatÚformat_descriptionr  Úpropertyr|   ru   rO   r  rQ   r0  r4  r8  r:  r9  r  r/   r/   r§   r0   r  Õ  s   C
a	":r  )r   ó   rŽ   )úL;1r>  rŽ   )r   ó   rŽ   )r   ó   rŽ   )r   ó   rŽ   )r   rB  rA  )r   ó   rŽ   )r   r>  ó   )r   r@  rD  )r   rA  rD  )r   rB  rD  )r   rB  r@  )r    rB  ó   )r   r?  r   r   r   r   ÚIr   r   r   r   r   r   r   r    c                 G  sJ   d  |¡}|  tt|ƒƒ| ¡ |  |¡ t|t|ƒƒ}|  t|ƒ¡ dS )z'Write a PNG chunk (including CRC field)r“   N)ÚjoinÚwriteÚo32rÕ   r@   ©rD   rW   r>   rp   r/   r/   r0   Úputchunk:  s
    

rK  c                   @  s$   e Zd Zdd„ Zdddœdd„ZdS )	Ú_idatc                 C  s   || _ || _d S rF   )rD   Úchunk)rI   rD   rM  r/   r/   r0   rJ   H  s    z_idat.__init__r`   rC   ©r>   rE   c                 C  s   |   | jd|¡ d S )Nr2  )rM  rD   ©rI   r>   r/   r/   r0   rH  L  s    z_idat.writeN©r)   r*   r+   rJ   rH  r/   r/   r/   r0   rL  E  s   rL  c                   @  s$   e Zd Zdd„ Zdddœdd„ZdS )	Ú_fdatc                 C  s   || _ || _|| _d S rF   )rD   rM  r®   )rI   rD   rM  r®   r/   r/   r0   rJ   S  s    z_fdat.__init__r`   rC   rN  c                 C  s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr  r   )rM  rD   rI  r®   rO  r/   r/   r0   rH  X  s    z_fdat.writeNrP  r/   r/   r/   r0   rQ  P  s   rQ  c                  C  sN  | j  d¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}	| j  d| j dtj¡¡}
|rht |¡}nt | g|¡}g }d}|D �]}t	 
|¡D �]ö}|j|kr¬| ¡ }n
| |¡}| j  ¡ }t|ttfƒrÜ|| |d< n |d krüd|jkrü|jd |d< t|	ttfƒ�r|	| |d< t|
ttfƒ�r4|
| |d< |d7 }|�rt|d }|d  d¡}|d  d¡}|tjk�r†t|ƒd	k �r†tj}|tjk�râ|d
  ¡ }tj d| jd¡}|d }|�rÊ| |¡}n
d| j }| ||¡ n"|tjk�rü|d d
 }n|d
 }t | d¡| d¡¡}|jdd�}|�sx|| d¡k�rx|| d¡k�rxd|k�rx|d d  |d 7  < q’nd }| |||dœ¡ q’q‚t|ƒdk�r®|�s®|d d
 S ||dtt|ƒƒt|ƒƒ |�r| j|k�rä|  |¡} t  | t!||ƒdd| j d|fg¡ d}t"|ƒD �]2\}}|d
 }|d �s<d|j }n|d }| |¡}|j}|d }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!||ƒdd|j d|fg¡ n0t'|||ƒ}t  ||dd|j d|fg¡ |j(}�qd S )Nr÷   rì   r   rù   rû   r   éÿÿÿÿÚencoderinfor!   r"  r    )r   r   r   r   rÂ   rš   éþÿÿÿF)Z
alpha_only)r"  rÂ   rS  s   acTLr‰   r!  rö   ))rS  r  r¬   r(   r,   r1   r2   Ú	itertoolsÚchainr   ÚIteratorr-  r¯   r5  r�   ÚlistrÖ   r.   rÕ   r-   r	   r+  r,  r.  Úcropr(  r
   Zsubtract_moduloZgetbboxrb   rI  r   Ú_saverL  Ú	enumeratera   ÚroundÚo16r   rQ  r®   ) r"  rD   rM  r-  r  rÃ   Úappend_imagesr÷   rì   rù   rû   rV  Z	im_framesZframe_countÚim_seqÚim_framerS  ÚpreviousZprev_disposalZ
prev_blendZbase_imr%  rÂ   Údeltar®   r  Z
frame_datar.  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr/   r/   r0   Ú_write_multiple_frames]  sÚ    





 ÿÿþýü
ü
$





õýýrc  zImage.ImagerB   r†   rC   )r"  rD   ÚfilenamerE   c                 C  s   t | ||dd� d S )NT)Úsave_all)rZ  )r"  rD   rd  r/   r/   r0   Ú	_save_allÞ  s    rf  Fc           '   
     sR  |rª| j  d| j d¡¡}tƒ }tƒ ‰ | j  dg ¡}t | g|¡D ],}t |¡D ]}	| |	j	¡ ˆ  |	j
¡ qPqBdD ]}
|
|krt qŽqt| ¡ }
t‡ fdd„tdƒD ƒƒ}n| j
}| j	}
|
}|
dk�rPd| j krätd	| j d > d
ƒ}n0| j�rttt| j ¡ d	 ƒd d
ƒd	ƒ}nd
}|dk�rP|dk�r.d	}n|dk�r>d}nd}|d|› �7 }| j  dd¡| j  dd¡| j  dd¡| j  dd¡f| _zt| \}}}W n: tk
�rÒ } zd|
› d�}t|ƒ|‚W 5 d }~X Y nX | t¡ ||dt|d ƒt|d	 ƒ||dddƒ	 dddddg}| j  d | j d ¡¡}|�r\d!}|d" t |¡ }||d#|ƒ | d¡ | j  d$¡}|�rd%d&d'd(g}|jD ]Š}|d d… \}}||k�r¶| |¡ ||||ƒ nR||k�rÎ||||ƒ n:|d	d…  ¡ �r€t|ƒdk�oô|d }|�s€||||ƒ �q€| j	dk�rZ|d }| j  d)¡d |… }t|ƒ|k �rN|d7 }�q4||d*|ƒ | j  d+| j d+d ¡¡}|�s‚|dk�rf| j	dk�ræ|} t!|t"ƒ�r´||d,|d | … ƒ n0tdtd-|ƒƒ}d.| d }!||d,|!d | … ƒ n~| j	d/k�rtdtd0|ƒƒ}||d,t#|ƒƒ nP| j	d)k�rL|\}"}#}$||d,t#|"ƒt#|#ƒ t#|$ƒ ƒ nd+| j k�r¨d1}t|ƒ‚nB| j	dk�r¨| j $¡ d2k�r¨| j  d2d3¡}!|} ||d,|!d | … ƒ | j  d4¡}%|%�rò||d5tt%|%d d6 d7 ƒƒtt%|%d	 d6 d7 ƒƒd8ƒ |�r>d9d:g}|jD ]6}|d d… \}}||k�r| |¡ ||||ƒ �q| j  d;¡}&|&�rŒt!|&t&j'ƒ�rh|& (d<¡}&|& )d=¡�r€|&d>d … }&||d?|&ƒ |�r¦t*| |||
|||ƒ} | �rÐt+ ,| t-||ƒd@dA| j
 d|fg¡ |�r.|jD ]P}|d d… \}}|d	d…  ¡ �rÜt|ƒdk�o|d }|�rÜ||||ƒ �qÜ||dBdƒ t.|dCƒ�rN| /¡  d S )DNrÃ   r^  )r    r   r   c                 3  s$   | ]‰ t ‡ fd d„ˆD ƒƒV  qdS )c                 3  s   | ]}|ˆ  V  qd S rF   r/   )rÑ   Ú
frame_size©rµ   r/   r0   rÓ   õ  s     z"_save.<locals>.<genexpr>.<genexpr>N)Úmax)rÑ   ©Úsizesrh  r0   rÓ   õ  s     z_save.<locals>.<genexpr>r!   r   Úbitsr   é   r%   r$   r"   ú;ÚoptimizeFZcompress_levelrR  Úcompress_typeÚ
dictionaryr“   zcannot write mode z as PNGs   IHDRr   rŽ   s   cHRMs   gAMAs   sBITs   sRGBs   tIMEr³   s   ICC Profiler•   s   iCCPZpnginfos   sPLTr�   r–   r”   r   s   PLTErÉ   s   tRNSéÿ   ó   ÿ)r   r   rF  r   iÿÿ  z%cannot use transparency for this moder    ÚArÚ   s   pHYsrÙ   g      à?r>  s   bKGDs   hISTrà   r#   rê   r&   s   eXIfr‰   rš   rq   Úflush)0rS  r  r¬   ÚsetrU  rV  r   rW  r„   r-  r.  rN   rÖ   r  r3  r  ri  rÕ   ZgetdataZencoderconfigÚ	_OUTMODESÚKeyErrorrs   rH  r  rI  r4   r‘   Úremover�   r  r"  Z
getpaletter�   r`   r]  Zgetpalettemodera   r	   ZExifÚtobytesÚ
startswithrc  r   rZ  rL  Úhasattrru  )'r"  rD   rd  rM  re  rÃ   Úmodesr^  r_  r`  r-  r.  ZoutmodeÚcolorsrl  r  Z	bit_depthÚ
color_typero   r;   r�   ZiccÚnamer>   r¬   Zchunks_multiple_allowedZ
info_chunkrW   rƒ   Zpalette_byte_numberZpalette_bytesrÉ   Zalpha_bytesÚalphaÚredÚgreenÚbluerÚ   rà   r/   rj  r0   rZ  â  s*    
ÿ

$


ü


÷





"
û



      ÿ$
rZ  c                 K  sB   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W 5 | ` X |jS )z4Return a list of PNG chunks representing this image.c                   @  s0   e Zd Zg Zdddœdd„Zdddœdd„Zd	S )
zgetchunks.<locals>.collectorr`   rC   rN  c                 S  s   d S rF   r/   rO  r/   r/   r0   rH  ²  s    z"getchunks.<locals>.collector.write)rM  rE   c                 S  s   | j  |¡ d S rF   )r>   rb   )rI   rM  r/   r/   r0   rb   µ  s    z#getchunks.<locals>.collector.appendN)r)   r*   r+   r>   rH  rb   r/   r/   r/   r0   Ú	collector¯  s   r…  c                 W  s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )Nr“   )rG  rI  r@   rb   rJ  r/   r/   r0   rb   ¸  s    
zgetchunks.<locals>.appendN)rS  rZ  r>   )r"  Úparamsr…  rb   rD   r/   r/   r0   Ú	getchunks¬  s    	r‡  z.pngz.apngz	image/png)r   )EÚ
__future__r   rU  ÚloggingÚrerm   rí   r4   Úenumr   Útypingr   r   r   r   r…   r	   r
   r   r   r   Ú_binaryr   rÌ   r   rR   r   r   r]  r   rI  r   Ú	getLoggerr)   rf   ÚcompilerË   rS   r  r½   rÊ   Z	SAFEBLOCKr7   rª   r(   r1   r<   r@   rA   ry   rv   r€   r™   r  r  rw  rK  rL  rQ  rc  rf  rZ  r‡  Zregister_openr;  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer/   r/   r/   r0   Ú<module>!   s¤   
ë
	
]`  ^  Uð  K