
    h                    (   S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	  S SK
JrJrJrJrJr  SSKJrJrJrJrJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  Sr \ (       a  SSKJ!r!  SSK"J#r#   " S S\5      r$\$RJ                  r&S.S jr' " S S\R&                  5      r(SSSS.r)S/S jr*\\+\,\-\.   \R,                  4   r/        S0S jr0        S1S jr1      S2S jr2 " S S\5      r3        S3S jr4S4S jr5 S5         S6S jjr6S7S  jr7          S8S! jr8S4S" jr9Sr:S9S# jr;S:S$ jr<S;S% jr=S<S& jr>      S=S' jr?S>S( jr@          S?S) jrA S@       SAS* jjrB SB       SCS+ jjrC\R                  " \(R                  \(\'5        \R                  " \(R                  \65        \R                  " \(R                  \55        \R                  " \(R                  S,5        \R                  " \(R                  S-5        g)D    )annotationsN)IntEnum)cached_property)IOAnyLiteral
NamedTupleUnion   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)DeferredErrorF)_imaging)Bufferc                  $    \ rS rSrSrSrSrSrSrg)LoadingStrategy8   z.. versionadded:: 9.1.0r   r       N)	__name__
__module____qualname____firstlineno____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS__static_attributes__r       D/var/www/html/env/lib/python3.13/site-packages/PIL/GifImagePlugin.pyr   r   8   s    !O'($Jr'   r   c                $    U R                  S5      $ )N)s   GIF87as   GIF89a)
startswith)prefixs    r(   _acceptr,   G   s    344r'   c                     ^  \ rS rSrSrSrSrSrSS jrSS jr	SS jr
\SS	 j5       r\SS
 j5       rSS jrSSS jjrSU 4S jjrSS jrSS jrSrU =r$ )GifImageFileP   GIFzCompuserve GIFFNc                    U R                   R                  S5      nU(       a(  US   (       a  U R                   R                  US   5      $ g )Nr   r   )fpread)selfss     r(   dataGifImageFile.dataW   s6    GGLLO177<<!%%r'   c                    [        S[        U5      S5       H,  nUS-  X   s=:X  a  XS-      s=:X  a  XS-      :X  a  M(     g    g   g)Nr      r   r   TF)rangelen)r4   pis      r(   _is_palette_neededGifImageFile._is_palette_needed]   sM    q#a&!$AFad:aAh:!E(: ; % r'   c                f   U R                   R                  S5      n[        U5      (       d  Sn[        U5      eUS S U R                  S'   [        US5      [        US5      4U l        US   nUS-  S-   nUS	-  (       ak  US
   U R                  S'   U R                   R                  SU-  5      nU R                  U5      (       a%  [        R                  " SU5      nU=U l
        U l        U R                   U l        U R                   R                  5       U l        S U l        U R!                  S5        g )N   znot a GIF file   version   
      r         
backgroundr9   RGBr   )r2   r3   r,   SyntaxErrorinfoi16_sizer>   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r4   r5   msgflagsbitsr<   s         r(   _openGifImageFile._openc   s    GGLLqzz"Cc"" !u		)AYAq	)
"	Q3;&'eDIIl#Q$Y'A&&q)) $$UA.566#dl77%)

1r'   c                   U R                   c7  U R                  5       n  U R                  U R                  5       S-   S5        M%  U R                   $ ! [         a    U R                  5       S-   U l          Of = fU R	                  U5        NF)Nr   FrU   rS   rV   EOFErrorseek)r4   currents     r(   n_framesGifImageFile.n_frames}   sv    >>!iikG1JJtyy{Q6 
 ~~  1!%q1IIgs   &A "A65A6c                    U R                   b  U R                   S:g  $ U R                  5       nU(       a  g U R                  SS5        SnU R	                  U5        U$ ! [         a    Sn N!f = f)Nr   TFr]   )r4   r`   is_animateds      r(   rd   GifImageFile.is_animated   sn    >>%>>Q&&))+	 JJq% K 			'	  	 K	 s   A A,+A,c                d   U R                  U5      (       d  g XR                  :  a  S U l        U R                  S5        U R                  n[	        U R                  S-   US-   5       H  n U R                  U5        M     g ! [
         a$  nU R                  U5        Sn[        U5      UeS nAff = f)Nr   r   no more images in GIF file)_seek_check_GifImageFile__frame_imrV   r:   r^   r_   )r4   frame
last_frameferW   s         r(   r_   GifImageFile.seek   s    &&<<DHJJqM\\
t||a'3A+

1 4  +		*%2sm*+s   +B
B/B**B/c                h  ^  [        T R                  [        5      (       a  T R                  R                  eUS:X  a_  ST l        S T l        ST l        T R                  R                  T R                  5        ST l	        ST R                  ;   a  T R                  S	 O(T R                  (       a  U(       a  T R                  5         UT R                  S-   :w  a  SU 3n[        U5      eT R                  T l        T R                  (       aY  T R                  R                  T R                  5        T R                  5       (       a   T R                  5       (       a  M  ST l        T R                  R!                  S5      nU(       a  US:X  a  Sn[#        U5      eS n0 nS nS nS n	 U(       d  T R                  R!                  S5      nU(       a  US:X  a  GOUS:X  Ga  T R                  R!                  S5      nT R                  5       n
US   S	:X  aB  U
b?  U
S   nUS-  (       a  U
S
   n[%        U
S5      S-  US'   SU-  nUS-	  nU(       a  UT l	        OUS   S:X  aE  SnU
(       a  X-  nT R                  5       n
U
(       a  M  SU;   a  US==   SU-   -  ss'   OXS'   S nM  US   S:X  a  US:X  a  U
b}  U
T R                  R'                  5       4US'   U
R)                  S5      (       aH  T R                  5       n
U
(       a1  [+        U
5      S
:  a"  U
S   S:X  a  [%        U
S5      T R                  S'   T R                  5       (       a   T R                  5       (       a  M  GOUS:X  Ga  T R                  R!                  S5      n[%        US5      [%        US5      pU[%        US5      -   U[%        US5      -   nnUT R,                  S   :  d  UT R,                  S   :  a^  U(       aW  [/        UT R,                  S   5      [/        UT R,                  S   5      4T l        [2        R4                  " T R0                  5        XUU4n	US   nUS-  S:g  nUS-  (       aV  US-  S-   nT R                  R!                  S
U-  5      nT R7                  U5      (       a  [8        R:                  " SU5      nOSnT R                  R!                  S5      S   nT R                  R'                  5       T l        OS nGMJ  Uc  S n[#        U5      eUT l        U(       d  g / T l        T R
                  (       a0  T R<                  R?                  T R
                  T R@                  5        Ub  UOT RB                  T l"        UT l#        US:X  a  T RD                  (       a-  [H        [J        RL                  :X  a  Ub  S!OST l'        OS"T l'        OS#T l'        U(       a	  UT l(        GO-T RB                  (       a  SS$K)J)n  U" T RB                  5      T l(        OS T l(        OT RT                  S":X  a  [H        [J        RV                  :w  d  U(       a  S%T R                  ;   aw  T R<                  RY                  T R                  S%   S5        T R<                  R[                  S![2        R\                  R^                  5      T l        S!T l'        T R                  S%	 O@ST l'        T R<                  R[                  S[2        R\                  R^                  5      T l        S,U 4S& jjnS T l        U	T l         T R@                  (       Ga  T R                  S:  Ga   T R                  S:X  a  T R@                  u  pnnUU-
  UU-
  4n[2        R4                  " U5        S"nT R                  Ra                  S%U5      nUb  T RT                  S';   a  S!nU" U5      S(-   nO6T R                  Ra                  S)S5      nT RT                  S';   a
  SnU" U5      n[2        Rb                  Re                  UUU5      T l        OT Rf                  b,  T Ri                  T R<                  T R@                  5      T l        OzUbw  T R@                  u  pnnUU-
  UU-
  4n[2        R4                  " U5        S"nUnT RT                  S';   a  S!nU" U5      S(-   n[2        Rb                  Re                  UUU5      T l        Ubu  SnUb@  US:X  a(  [H        [J        RL                  :w  a  UT R                  S%'   OT RT                  S';  a  Un[l        Rn                  " S*WWWW4T R                  WUU45      /T l        URa                  S5      (       a  US   T R                  S'   S+ H<  nUU;   a  UU   T R                  U'   M  UT R                  ;   d  M/  T R                  U	 M>     g ! [j         a     Nf = f)-Nr   commentr   zcannot seek to frame    ;rg      !   r9   rE   duration   r      r'      
   	extension   NETSCAPE2.0loop   ,	      rB   rD   @   rG   rF   rJ   Fzimage not found in GIF frameRGBAPL)copytransparencyc                   > TR                   (       aV  U S-  S-   [        TR                   R                  5      :  a  Sn [        TR                   R                  U S-  U S-  S-    5      $ X U 4$ )Nr9   r   )_frame_paletter;   rQ   tuple)colorr4   s    r(   _rgb GifImageFile._seek.<locals>._rgb]  sh    ""19q=3t':':'B'B#CCET0088UQYQR]STTe,,r'   rJ   r   )r   rI   gif)rv   r{   )r   intreturnztuple[int, int, int])8
isinstancerR   r   ex_GifImageFile__offsetdisposeri   r_   rT   disposal_methodrL   tileload
ValueErrorr2   r6   r3   r^   rM   rS   r*   r;   sizemaxrN   r   _decompression_bomb_checkr>   r   rO   impastedispose_extentrP   r   _frame_transparencyLOADING_STRATEGYr   r%   _moderQ   r   moder$   putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillrj   _cropAttributeErrorr   _Tile)r4   rk   update_imagerW   r5   rQ   rL   frame_transparency	interlaceframe_dispose_extentblockrX   dispose_bitsrr   x0y0x1y1rY   r<   r   r   dispose_sizedispose_moder   r   ks   `                          r(   rV   GifImageFile._seek   s1   dhh..((++A:DM8<DLDLHHMM$--(#$D DII%IIi( yy\		DLL1$$)%1CS/!((==GGLL'))++ ))++DMGGLLOAI.C3-EI!!	#GGLLOT	d GGLLO		Q43;5#4 "!HEqy-21X*'*5!}r'9D$ $.#5L#/1#4L#
 0<,qTS[ "G  ( $		  % !D(Y57?:*1YAqTS[UaZE4E ).tww||~(=D%''77 $		 SZ1_qQ03E1DIIf-iikk iikk d GGLLO QC1IBc!Qic!QiB1%diil):!$R1!6B		!8M!MDJ33DJJ?')r2~$!"RZA-	3;!AI?DQ$Y/A..q11"."2"25!"<"' ww||Aq) $As v 0C3-	<<GGMM$,,(;(;<)0)<g$BUBU#5 A:""#'A'AA+=+IuDJ!$DJ 
&$$%#D$7$78#yyC$(X(XX%2//		.0I1M"&''//&%,,:U:U"V%+
 IIn5%*
"&''//%9T9T"U	- 24#7#71#<*''1, &*%8%8NBB$&GR"W#5L33LA $'L IIMM.:LME(997+1L$(K$$6E $		lA >997+0L$(KE#(::??<u#UDL xx+'+zz$''4;N;N'O+7)-)<)<B(*Rb'977E'* 2997+1L$();$<t$CE',zz(,(  L!-A:'?+E+EE4F		.1YYo5#5LR$MM9l3	DI 88I#'	?DIIi *ADy#Aw		!diiIIaL	 +- " s    2Cf$ 8f$ A:f$ $
f10f1c                p  > U R                   (       a  SOSnS U l        U R                  S:X  aG  U R                  b9  [        R
                  R                  XR                  U R                  5      U l        OU R                  S;   a  U R                  U l        U R                   (       ay  [        R
                  R                  SU R                  U R                  =(       d    S5      U l        U R                  R                  " S/U R                   R                  5       Q76   OS U l        U R                  (       d  U R                  b  U R                  U R                  R                  :w  a  [        R
                  R                  U R                  R                  U R                  5      nU R                   (       a+  UR                  " S/U R                   R                  5       Q76   UR                  U R                  SU R                  R                  -   5        X l        Xl        S U l         [        TU ]A  5         g )Nr   r   r   r   rJ   r   r   )r   _prev_imri   r   r   r   r   r   r   r   
putpalettegetdatarj   r   r   superload_prepare)r4   	temp_modeexpanded_im	__class__s      r(   r   GifImageFile.load_prepare  sx   ..CC	<<1''3**//yy$*B*B YY/) GGDM""**//#tyy$:R:R:WVWX""5I4+>+>+F+F+HI}}!5$))tww||:S**//$'',,		BK""&&uMt/B/B/J/J/LMdggv'<=!G
"r'   c                   U R                   S:X  a  U R                  S:X  a  [        [        R                  :X  a  U R
                  b.  U R                  R                  U R
                  S5        SU l        OSU l        U R                  R                  U R                  [        R                  R                  5      U l        g U R                  (       d  g U R                  U R                  R                  :w  a  U R
                  b+  [        R                  R!                  SU R                  5      nOf[        R                  R!                  SU R                  5      nUR#                  SSU R                  R%                  5       5        UR                  S5      nUR'                  U R                  SU R                  R                  -   5        Xl        U R                  c   eU R
                  bB  U R                  R                  U R
                  S5        U R                  R                  S5      nOU R                  R                  S5      nU R(                  c   eU R+                  X R(                  5      nU R                  U l        U R                  R                  U l        UR                  S:X  a'  U R                  R'                  X R(                  U5        g U R                  R'                  X R(                  5        g )Nr   r   r   rJ   r   )ri   r   r   r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   
getpaletter   r   r   )r4   r   frame_ims      r(   load_endGifImageFile.load_end  s
   <<1yyC$48R8R$R++7GG++D,D,DaH!'DJ!&DJ''//$))U\\5P5PQ}}99***''3#jjoofdii@#jjooc499=&&ueTWW5G5G5IJ)11%8dmmVdmm6H6H-HI'M==,,,##/GG##D$<$<a@wwv.Hwwu-H""...::h(;(;<--WW\\
==F"GGMM($7$7BGGMM($7$78r'   c                    U R                   $ N)ri   )r4   s    r(   rS   GifImageFile.tell  s    ||r'   )__frame__offset__rewindrR   r   r   rj   r   rU   r   rN   r   r   r   r2   rP   r   rQ   r   )r   zbytes | None)r<   bytesr   bool)r   None)r   r   )r   r   )rk   r   r   r   )T)rk   r   r   r   r   r   )r   r   r    r!   formatformat_description!_close_exclusive_fp_after_loadingrP   r6   r>   rZ   propertyra   r   rd   r_   rV   r   r   rS   r&   __classcell__)r   s   @r(   r.   r.   P   sq    F)(-%N4 	 	  "+ @!D6%9N r'   r.   r   r   )1r   r   c                   U R                   [        ;   a  U R                  5         U $ [        R                  " U R                   5      S:X  a  U R                  S[        R                  R                  S9n U R                  c   eU R                  R                   S:X  aO  U R                  R                   H5  nUS   S:X  d  M  U R                  R                  U   U R                  S'     U $    U $ U R                  S5      $ )	z
Takes an image (or frame), returns an image in a mode that is appropriate
for saving in a Gif.

It may return the original image, or it may return an image converted to
palette or 'L' mode.

:param im: Image object
:returns: Image object
rJ   r   rQ   r   r9   r   r   r   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErQ   colorsrL   )r   rgbas     r(   _normalize_moder     s     
ww'
		!U*ZZU]]%;%;Z<zz%%%::??f$

))7a<.0jj.?.?.EBGGN+		 * 	::c?r'   c                   SnU(       ab  [        U[        [        [        45      (       a  [        USS 5      n[        U[        R                  5      (       a  [        UR
                  5      nU R                  S:X  a)  U(       d!  U R                  S5      nUc   e[        U5      nO<U(       d  [        S [        S5       5       5      n[        R                  " SUS9U l        Uc   eU(       a  / nU R
                  c   e[        S[        U5      S5       HP  n[        X6US-    5      nU R
                  R                  R                  U5      nX;   a  SnUR                  U5        MR     [        U5       H1  u  phUb  M
  [        [        U5      5       H  n	X;  d  M
  XU'     M/     M3     / n
U H  nUc   eU
R                  U5        M     U R                  U
5      n OA[!        X5      nUb3  U R                  X5      n S	U;   a   UR#                  US	   5      US	'   U $ U $ U R
                  c   eX0R
                  l        U $ ! [$         a    US		  U $ f = f)
aP  
Normalizes the palette for image.
  - Sets the palette to the incoming palette, if provided.
  - Ensures that there's a palette for L mode images
  - Optimizes the palette if necessary/desired.

:param im: Image object
:param palette: bytes object containing the source palette, or ....
:param info: encoderinfo
:returns: Image object
Ni   r   c              3  *   #    U  H	  oS -  v   M     g7f)r9   Nr   ).0r=   s     r(   	<genexpr>%_normalize_palette.<locals>.<genexpr>4  s     &Bz!Avzs   rJ   r   r   r9   r   )r   r   	bytearraylistr   rQ   r   r   r:   r;   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )r   rQ   rL   source_palette
im_paletteused_palette_colorsr=   source_colorr   jdest_mapoptimized_palette_colorss               r(   _normalize_paletter     s@    Ngy$788&wt}5Ng|8899&w7N	ww#~t,J)))&z2N&&BuSz&BBN!..unM
%%%02zz%%%q#n-q1A AE!:;LJJ%%)),7E+&&u- 2 ""56HA}s#678A312A. 9 7 !(E$$$OOE" ) h'#0#: #/!!":KB%-+C+I+I^,,D(
 I2I::!!!'JJI " -^,I-s   H= =IIc                r   [        U 5      nUR                  R                  5        H7  u  pE[        U[        5      (       d  M  U R
                  R                  XE5        M9     [        X2U R
                  5      n[        X0R
                  5       H  nUR                  U5        M     Sn[        U 5      (       a  US-  n[        XSU5        S[        U 5      4Ul        [        R                  " X1[        R                  " SSU R                   -   S["        UR$                     5      /5        UR                  S5        g )Nr   r   r   rD   r       )r   rL   itemsr   strencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   r   )r   r2   rQ   im_outr   vr5   rX   s           r(   _write_single_framer  ^  s    
 R F!!#aNN%%a+ $  @F7
 8 ER
.}R01FOOY__UFRWW,<aAUVW HHUOr'   c                8   X4 Vs/ s H4  o"R                   (       a  [        UR                   R                   5      OSPM6     nnUS   US   :w  a"  UR                  S5      nU R                  S5      n [        R                  " X5      nXDR                  SS94$ s  snf )Nr'   r   r   r   F)
alpha_only)rQ   r   r   r   subtract_modulogetbbox)base_imim_framer   palette_bytesdeltas        r(   _getbboxr  z  s     ELCVCVRZZbjj  !S8CV   Q=++##F+//&)&&x9E--5-111s   ;Bc                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
_Framei  Image.Imager   z tuple[int, int, int, int] | Nonebboxdict[str, Any]r   r   N)r   r   r    r!   __annotations__r&   r   r'   r(   r  r    s    O
**r'   r  c           
        U R                   R                  S5      nU R                   R                  SU R                  R                  S5      5      n/ nS nSnS n[        R                  " U /U R                   R                  S/ 5      5       GH3  n	[
        R                  " U	5       GH  n
[        U
R                  5       5      n
US:X  a]  U
R                  R                  5        H?  u  pUS:X  a  M  [        U[        5      (       d  M$  U R                   R                  X5        MA     U R                   R                  5       nSU
R                  ;   a  UR                  SU
R                  S   5        [        XU5      n
[        U[        [        45      (       a  X7   US'   O%Uc"  SU
R                  ;   a  U
R                  S   US'   [        U[        [        45      (       a  XG   US'   US-  nS nU(       Ga  U(       Ga  [!        Xj5      u  nnU(       d6  UR                  S5      (       a  US   R                   S==   US   -  ss'   GM  US   R                   R                  S5      S:X  a  U R                   R                  SU R                  R                  S5      5      nUb{  Uch  [#        U
U5      n[$        R&                  " S	U
R(                  U5      nUS   R*                  R,                  nUc   eUR/                  UUR0                  5        [!        X5      S   nGOwS
U
R(                  -   nGOfUR                  S5      (       GaL  U
R0                  S:w  Ga;  SU;  a.  U
R,                  c   e U
R,                  R3                  U
5      US'   SU;   Ga   U
R                  5       n[$        R&                  " S	UR(                  US   5      nUR0                  S:X  a/  UR7                  5       u  nnnn[8        R:                  " S UUUUS9nOhUR0                  S	:X  aB  [$        R&                  " SUR(                  5      nUR=                  UR?                  5       5        Un[8        R:                  " S US9nURA                  U[B        RD                  " U5      S9  OS nU
nURG                  [I        U=(       d    U
UU5      5        GM     GM6     [K        U5      S:X  a0  SU R                   ;   a  US   R                   S   U R                   S'   gU H  nUR*                  n
URL                  (       d1  [O        U
UR                   5       H  nURQ                  U5        M     S
nO]U(       d  SUR                   S'   URL                  S
U
R(                  -   :w  a  U
RS                  URL                  5      n
URL                  S S n[U        XUUR                   5        M     g! [4         a     GNSf = f)Nrv   disposalr   append_imagesr   r   rq   r   r   r   optimizer   r   c                t    U S   " U S   " U S   " U S   " U S   U S   5      U S   5      U S   5      S-  S5      $ )	Nr   r   rgbarz   r   r   argss    r(   <lambda>(_write_multiple_frames.<locals>.<lambda>  sZ    T)_$(K(,U,0KS	49,MtTWy)* )-S		%& '*%* %(	."r'   )r  r  r  r  r   c                &    U S   " U S   S-  S5      $ )Nr   r   rz   r   r   r  s    r(   r   r!    s    T)_T$Z#=Ms-Sr'   )r   )maskFTinclude_color_table)+r   r   rL   	itertoolschainr   Iteratorr   r   r   r   r   r   r   r   r   r  _get_backgroundr   newr   r   rQ   r   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r  r;   r  r   r   crop_write_frame_data)r   r2   rQ   rv   r  	im_framesprevious_imframe_countbackground_im
imSequencer  r   r  r   
diff_framer  r  r   rI   first_paletter   r  r  r  r  r#  delta_l
frame_datar5   offsets                                 r(   _write_multiple_framesr;    s    ~~!!*-H~~!!*bggkk*.EFH I&*KKMoordBNN,>,>PR,ST
%..z:H&x}}7Ha$MM//1DAN* !!S))11!7	 2 ..--/K.&&~x}}^7TU)([IH(T5M22*2*?J'!jHMM&A*2--
*CJ'(T5M22*2*?J'1KJ[&{=t"z22!"11*=ZAXX=R=,,00<A NN..&N(CE ((0)85)IJ,1IIc8==*,UM,5aLOO,C,CM#0#<<#<)44]MDVDVW'@C%5 __Z00X]]c5I%[8'//;;;! ( 0 0 A A( K (7
 &4%-]]_
$yyejj+n:UV ::/).JAq!Q#,#8#8	!" #$"#"#"#$D"  %zzS0*/))C*D ' @(/#,#8#8 S#($D #((HOOD4I(J"KVJ$:(D+NOy ; U~ 9~')21)A)A*)MBNN:&
=='*2H2HI JF @D
&&'<=&8=="88#==9__Ra(F"
0F0FG    }  * ! !s   *W
WWc                    [        XUSS9  g )NT)save_all)r  )r   r2   filenames      r(   	_save_allr?    s    	"(T*r'   c                   SU R                   ;   d  SU R                  ;   a6  U R                   R                  SU R                  R                  S5      5      nOS nU R                   R                  SS5        U(       a  [	        XU5      (       d  [        XU5        UR                  S5        [        US5      (       a  UR                  5         g g )NrQ   r  Trs   flush)	r   rL   r   r   r;  r  r   hasattrrA  )r   r2   r>  r=  rQ   s        r(   r  r    s     BNN"i277&:..$$YI0FG
!!*d31"'BBBG,HHTNr7

 r'   c                t    U R                   R                  SS5      n[        U R                  5      S:  a  SnU$ )Nr   r      r   )r   r   minr   )r   r   s     r(   r   r   &  s5    "";2I 277|b	r'   c                    UR                   S   nSUR                   ;   a  [        UR                   S   S-  5      nOSn[        UR                   R                  SS5      5      nUc  US:w  d  U(       ap  Ub  SOSnXvS-  -  nU R	                  S[        S	5      -   [        S
5      -   [        U5      -   [        U5      -   [        U=(       d    S5      -   [        S5      -   5        UR                   R                  S5      nU(       a&  [        U5      n	[        U	5      n
U
(       a	  US-  nX:-  nU R	                  S[        US   5      -   [        US   5      -   [        UR                  S   5      -   [        UR                  S   5      -   [        U5      -   5        U(       a!  W
(       a  U R	                  [        W	5      5        U R	                  [        S5      5        g ! [         a    S n GNf = f)Nr   rv   rE   r   r  r   r   rt   ru   r   r$  rG   r~   rD   )r   KeyErrorr   r   r   r   o16_get_palette_bytes_get_color_table_sizer   _get_header_palette)r2   r   r:  rX   r   rv   r  packed_flagr$  r  color_table_sizes              r(   r   r   0  s   ~~n5 R^^#r~~j1B672>>%%j!45H8q=H'3a1}$
ge o (m	
 "#$ e	
 ..,,-BC*2.0?CKE,EHH
fQi.	
fQi.	 bggaj/	 bggaj/		
 U)	 /
$]34HHRUOU  s   G G,+G,c                ^   U R                  5       n [        US5       nU R                  S:w  a'  [        R                  " SU/U[        R
                  S9  OSSU/nS/n[        R                  " U[        R                  [        R
                  S9n[        R                  " UUR                  U[        R
                  S9nUR                  c   eUR                  R                  5         UR                  5       n	U	(       a  [        R                  " X5      eUR                  5       n	U	(       a  [        R                  " X5      eS S S 5         [        R                  " U5        g ! , (       d  f       N&= f! [         a     g f = f!  [        R                  " U5        f ! [         a     f f = f= f)NwbrJ   ppmtogif)stdoutstderrppmquant256)stdinrQ  rR  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPErQ  closewaitCalledProcessErrorosunlinkOSError)
r   r2   r>  tempfilerm   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r(   _save_netpbmri  b  sj    xxzH$(D!Qww%%%*1Z=O=O (9	'L	'--jooj>P>P
 (--$++%--	
 "((444!!'')$//+$77KK$//+$77KK= "@	IIhC "!D  			IIh 		sY   F D$E"F E3 "
E0,F 3
F ?F F,FF,
F)&F,(F))F,c                   U R                   S;   GaG  U(       Ga?  UR                  S5      (       Ga(  [        =(       d    U R                   S:H  nU(       d  U R                  U R                  -  S:  a  / n[        U R                  5       5       H  u  pEU(       d  M  UR                  U5        M!     U(       d  [        U5      [        U5      :  a  U$ U R                  c   e[        U R                  R                  5      [        R                  " U R                  R                   5      -  nSUS-
  R                  5       -  n[        U5      US-  ::  a  US:  a  U$ g)a0  
Palette optimization is a potentially expensive operation.

This function determines if the palette should be optimized using
some heuristics, then returns the list of palette entries in use.

:param im: Image object
:param info: encoderinfo
:returns: list of indexes of palette entries in use, or None
)r   r   r  r   i   Nr   r   )r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r;   rQ   r   getmodebands
bit_length)r   rL   optimiser   r=   countnum_palette_colorscurrent_palette_sizes           r(   r   r     s    
ww*$((:*>*> #4bggnrxx"))+i7"$%blln55'..q1 6 323s;N7OO**::)))!$RZZ%7%7!8E<N<N

= " $%);a)?(K(K(M#M  '(,@A,EE(1,**r'   c                    U (       d  g[        U 5      S:  a  g[        R                  " [        R                  " [        U 5      S-  S5      5      S-
  $ )Nr   r   r   r9   r   )r;   mathceillog)r  s    r(   rJ  rJ    sA    	]	a	yy#m"4"91=>BBr'   c                x    [        U 5      nSU-  [        U 5      S-  -
  nUS:  a  U [        S5      S-  U-  -  n U $ )z
Returns the palette, null padded to the next power of 2 (*3) bytes
suitable for direct inclusion in the GIF header

:param palette_bytes: Unpadded palette bytes, in RGBRGB form
:returns: Null padded palette
r   r9   r   )rJ  r;   r   )r  rM  actual_target_size_diffs      r(   rK  rK    sR     -];  !$44M8Ja8OO"A%<<<r'   c                   ^ U R                   (       d  g[        U R                   R                   5      mU R                   R                  S:X  a0  SR                  U4S j[	        [        T5      S-  5       5       5      mT$ )z
Gets the palette for inclusion in the gif header

:param im: Image object
:returns: Bytes, len<=768 suitable for inclusion in gif header
r'   r   c              3  @   >#    U  H  nTUS -  US -  S-    v   M     g7f)r   r9   Nr   )r   r=   rQ   s     r(   r   %_get_palette_bytes.<locals>.<genexpr>  s&     X?W!71q51q5195?Ws   r9   )rQ   r   r   joinr:   r;   )r   rQ   s    @r(   rI  rI    s[     ::BJJ&&'G	zz& ((XuS\UVEV?WXXNr'   c                    SnU(       aD  [        U[        5      (       a-  U R                  c   e U R                  R                  X5      nU$ UnU$ ! [         a  n[        U5      S;  a  e  S nAU$ S nAff = f)Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   r   rQ   getcolorr   r   )r   info_backgroundrI   rn   s       r(   r(  r(    s     Jou-- ::)))
ZZ00E
  )J  q6 "   s   A 
A5A00A5c                D   SnU R                   R                  S5      S:X  dK  U(       aF  SU;   d>  UR                  S5      c,  UR                  S5      (       d  UR                  S5      (       a  Sn[        XR                  S5      5      n[        U 5      n[	        U5      nS	U-   [        U R                  S
   5      -   [        U R                  S   5      -   [        US-   5      [        U5      [        S
5      -   [        U5      /nUR                  S5      b_  UR                  S[        S5      -   [        S5      -   S-   [        S5      -   [        S5      -   [        US   5      -   [        S
5      -   5        UR                  S5      (       a  S[        S5      -   nUS   n[        U[        5      (       a  UR                  5       n[        S
[        U5      S5       H$  n	XU	S-    n
U[        [        U
5      5      U
-   -  nM&     U[        S
5      -  nUR                  U5        U$ )z2Return a list of strings representing a GIF headers   87arC   s   89ar   r}   rv   rr   rI   s   GIFr   r   rG   rt   rz   rH   r|   r9   rx   )rL   r   r(  rI  rJ  rH  r   r   rK  r   r   r   encoder:   r;   )r   rL   rC   rI   r  rM  headercomment_blockrr   r=   subblocks              r(   r   r     s    G	ww{{9'd"xx+xx
##xx	""  XXl%;<J&r*M,]; 	
	
bggaj/	 bggaj/	 	c!"
:AM*F xx#gf  e	
 e $v,  e		
 xx	r#wy/gs##nn&Gq#g,,A1s7+HRH.99M - 	Am$Mr'   c                     X1l         [        XUS5        [        R                  " UU [        R                  " SSUR
                  -   S[        UR                     5      /5        U R                  S5        U? g ! U? f = f)Nr   r   r   r   )	r   r   r   r  r   r   r   r   r   )r2   r  r:  paramss       r(   r0  r0  L  sn    !% 	B&!4__UFX]]$:Awx}}?UVW	
 	 H s   A2A7 7A;c                    Uc  0 n[        X5      nSU;  a"  SU R                  ;   a  U R                  S   US'   [        XU5      nUR                  U l        UR                  U l        [        X5      nXS4$ )a   
Legacy Method to get Gif data from image.

Warning:: May modify image data.

:param im: Image object
:param palette: bytes object containing the source palette, or ....
:param info: encoderinfo
:returns: tuple of(list of header items, optimized palette)

rI   )r   rL   r   rQ   r   r   )r   rQ   rL   r   im_modr  s         r(   	getheaderr  g  st     |'14LBGG$;WW\2\T2FBJIIBE)F&&r'   c                    SSK Jn   " S SU5      nU R                  5         U" 5       n[        XPX5        UR                  $ )a  
Legacy Method

Return a list of strings representing this image.
The first string is a local image header, the rest contains
encoded image data.

To specify duration, add the time in milliseconds,
e.g. ``getdata(im_frame, duration=1000)``

:param im: Image object
:param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
:param \**params: e.g. duration or other encoder info parameters
:returns: List of bytes containing GIF encoded frame data

r   )BytesIOc                  "    \ rS rSr/ rSS jrSrg)getdata.<locals>.Collectori  c                N    U R                   R                  U5        [        U5      $ r   )r6   r   r;   )r4   r6   s     r(   r    getdata.<locals>.Collector.write  s    IIT"t9r'   r   N)r6   r   r   r   )r   r   r    r!   r6   r   r&   r   r'   r(   	Collectorr    s    	r'   r  )ior  r   r0  r6   )r   r:  r  r  r  r2   s         r(   r   r     s8    & G  GGI	Bbf-77Nr'   z.gifz	image/gif)r+   r   r   r   )r   r  r   r  )r   r  rQ   _Palette | NonerL   r  r   r  )r   r  r2   	IO[bytes]rQ   r  r   r   )r
  r  r  r  r   z4tuple[Image.Image, tuple[int, int, int, int] | None])r   r  r2   r  rQ   r  r   r   )r   r  r2   r  r>  str | bytesr   r   )F)
r   r  r2   r  r>  r  r=  r   r   r   )r   r  r   r   )
r2   r  r   r  r:  tuple[int, int]rX   r   r   r   )r   r  rL   r  r   zlist[int] | None)r  r   r   r   )r  r   r   r   )r   r  r   r   )r   r  r  z=int | tuple[int, int, int] | tuple[int, int, int, int] | Noner   r   )r   r  rL   r  r   list[bytes])
r2   r  r  r  r:  r  r  r  r   r   )NN)r   r  rQ   r  rL   zdict[str, Any] | Noner   z$tuple[list[bytes], list[int] | None])r   )r   r  r:  r  r  r   r   r  )J
__future__r   r%  rv  r`  rX  enumr   	functoolsr   typingr   r   r   r	   r
    r   r   r   r   r   r   r   _binaryr   rM   r   r   rH  _utilr   TYPE_CHECKINGr   _typingr   r   r#   r   r,   r.   r   r   r   r   r   r   _Paletter   r  r  r  r;  r?  r  r   r   ri  rk  r   rJ  rK  rI  r(  r   r0  r  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer   r'   r(   <module>r     s  4 #   	   % 6 6   "  !  g  #22 5`9&& `N #C
(4 	49l.G.GGHDD-D5CDDN  
	8
2
2$/
29
2 Z  "-<	D+
 MR".9EI	&//"/,;/DG/	/d-d -`C$ R 	6;|!!! ! 	!
 
!8 UY''-'<Q')'> 06"","AD""P   L''w ?   L'' /   ++Y 7   ,,f 5   L'' 5r'   