
    ,g                        d 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 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Zddl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"m#Z# de_$         G d de%      Z& G d d      Z' G d dejP                        Z) G d dejP                        Z* G d d      Z+	 	 d)dZ,d Z-d  Z.d! Z/d" Z0 G d# d$      Z1 G d% d&e1      Z2 G d' d(e1      Z3y)*z+Fetch and decode images in various formats.    N)md5)BytesIO)cycle)inf)Path)urlparse)url2pathname)ElementTree)Image	ImageFileImageOps)parse_color   )DEFAULT_OPTIONS)
percentage)LOGGER)SVG)URLFetchingErrorfetchTc                        e Zd ZdZed        Zy)ImageLoadingErrorzpAn error occured when loading an image.

    The image data is probably corrupted or in an invalid format.

    c                 l    t        |      j                  }t        |      } | |r| d|       S |      S )Nz: )type__name__str)cls	exceptionnamevalues       i/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/weasyprint/images.pyfrom_exceptionz ImageLoadingError.from_exception$   s:    I''IdV2eW%99D99    N)r   
__module____qualname____doc__classmethodr!    r"   r    r   r      s     : :r"   r   c                   F    e Zd ZdddefdZd Zd Zd	dZd Ze	d        Z
y)
RasterImageNnonec                 0   |}t        ||      }||ur|j                  |_        d x}}|| _        |i n|| _        |d   x| _        }	|d   | _        d|j                  v r|j                  d      }n|j                  dv r|j                  d      }|j                  | _        |j                  | _	        |j                  | _
        | j                  dk7  r| j                  | j                  z  nt        | _        |d   x| _        }
t        |d	i       j                  d
      }| j                  dk(  xr |d u| _        |j                  dv rgd| _        ||
s|	t#        j$                         }d|
d}| j                  | j                  |d<    |j&                  |fi | |j)                         }d }nTd| _        ||
s|j                  dk7  r:t#        j$                         }|j'                  |d|
       |j)                         }d }| j+                  ||      | _        y )Njpeg_qualitydpitransparencyRGBA)1PIRGBr   optimize_imagesappAPP14CMYK)JPEGMPOr8   formatoptimizequalityPNG)rotate_pillow_imager;   id_cache_jpeg_quality_dpiinfoconvertmodewidthheightr   ratior<   getattrgetinvert_colorsior   savegetvaluecache_image_data
image_data)selfpillow_imageimage_idrQ   filenamecacheorientationoptionsoriginal_pillow_imager,   r<   app14
image_files                r    __init__zRasterImage.__init__,   s    !-*<E 4"7">">L$((J!Mbu,3N,CC\EN	\...'//7L/1'//6L %%	!''
"))37;;!3Cdjj4;;.
#*+<#==
 -ub9==gF!YY&0FU$5F/1 DK!X1IZZ\
%+B%%1)-););GI&!!!*88'002
DK!X1D1D1MZZ\
!!*UX!N'002
//
HEr"   c                 T    | j                   |z  | j                  |z  | j                  fS N)rG   rH   rI   )rR   
resolution	font_sizes      r    get_intrinsic_sizezRasterImage.get_intrinsic_size`   s%    zzJ&j(@$**LLr"   c                    | j                   dk  s| j                  dk  ry |dk(  }d}| j                  rd}t        ||j                  d   d   z  |z        }t        ||j                  d   d   z  |z        }	t        | j                   |z  | j                  |	z        }
|
| j                  kD  r| j                  |
z  }|j                  | ||      }|j                  |dd| d|       |j                  |       y )Nr   autor   gqq?)	rG   rH   rC   absctmmax	add_image	transformdraw_x_object)rR   streamconcrete_widthconcrete_heightimage_renderinginterpolaterI   pt_to_inwidth_inchesheight_inchesr-   
image_names               r    drawzRasterImage.drawc   s    ::?dkkQ.%/99!H~

1a0@@8KLL&**Q-2B BX MNMdjj</}1LMCTYY		C%%dK?
Aq?"2A	HZ(r"   c                     |rt        |      S | j                   d| d| j                  xs d }t        | j                  ||      S )N- )LazyLocalImager@   rC   	LazyImagerA   )rR   datarU   slotkeys        r    rP   zRasterImage.cache_image_datav   sF    !(++WWIQtfAdiio2%67CT[[#t44r"   c                 $   |dk(  r| j                   | j                  }}nt        j                  t	        j
                  | j                  j                              }t        dt        | j                   |z              }t        dt        | j                  |z              }|j                  ||f       t	        j
                         }|j                  ||j                  | j                         |j                   |j                  }}| j                  |j                               | _        | j                   dv rd}nE| j                   dv rd}n4| j                   dk(  rd}n"t#        j$                  d	| j                          d}t'        j(                  d
d|||d|rdndd      }| j                  dk(  rJ| j*                  rt'        j,                  d      |d<   d|d<   t'        j.                  | j                  g|      S d|d<   t'        j(                  d|d      |d<   | j                   dv rd|d   d<   | j                   dv rt        j                  t	        j
                  | j                  j                              }	|	j1                  d      }
|	j3                  | j                   d d       }	| j5                  |	      }| j5                  |
      }| j                  |d      }t'        j.                  |gdd
dt'        j(                  d|d      ||dd|rdndd 	!      |d"<   nK| j5                  t        j                  t	        j
                  | j                  j                                    }t'        j.                  | j                  |d#      g|      S )$Nr   r:   )r3   r/   z
/DeviceRGB)LLAz/DeviceGrayr7   z/DeviceCMYKzUnknown image mode: %sz/XObjectz/Image   truefalse)TypeSubtypeWidthHeight
ColorSpaceBitsPerComponentInterpolater8   )r   r   r   r   r   r   r   r   Decodez
/DCTDecodeFilterz/FlateDecode   )	PredictorColumnsDecodeParms   Colors)r/   r~   Astreamalpha)rz   )	r   r   r   r   r   r   r   r   r   )extraSMaskrj   )rG   rH   r   openrM   r   rQ   ry   rf   round	thumbnailrN   r;   r<   rP   rO   rF   r   warningpydyf
DictionaryrL   ArrayStream
getchannelrE   _get_png_data)rR   rn   	dpi_ratiorG   rH   r   r[   color_spacer   rS   alphapng_data
alpha_datarj   s                 r    get_x_objectzRasterImage.get_x_object}   s   > JJ6E

2::doo.B.B#CDI5i!789EE$++	"9:;F0JNN9#3#3dmm  M%OOY-=-=6E"33J4G4G4IJDO99'&KYY+%'KYY& 'KNN3TYY?&K  % !%06g"
  ;;& !!"'++j"9h*E(O<< 1599(h$// 	1
 	 m 99'-.E- *99& ::bjj1E1E&FGL ++C0E'//		#2?L)),7H++E2J**:M*JF"\\6(("#$//!#$1    +$%)4v'; E'N ))

2::doo&:&:;<>H ||T228(2KLeTTr"   c                    t               }| j                  |d       |j                  d       g }|j                  d      }|rt	        j
                  d|      \  }|j                  d      }|dk(  r!|j                  |j                  |             n |j                  |t        j                         |j                  dt        j                         |j                  d      }|rdj                  |      S )Nr>   )r;   r      z!Is   IDATr"   )
r   rN   seekreadstructunpackappendrM   SEEK_CURjoin)rS   r[   r   raw_chunk_lengthchunk_length
chunk_types         r    r   zRasterImage._get_png_data   s    Y
*U3 	%??1- #MM$0@AML#+JW$
 =>bkk:OOAr{{+)q1  xx!!r"   )Nsource)r   r#   r$   r   r\   ra   rs   rP   r   staticmethodr   r'   r"   r    r)   r)   +   s?    DH2FhM)&5QUf " "r"   r)   c                   .     e Zd Z fdZed        Z xZS )rx   c                 H    t         |           || _        || _        |||<   y r^   )superr\   _keyrA   )rR   rV   r{   ry   	__class__s       r    r\   zLazyImage.__init__   s%    	c
r"   c                 4    | j                   | j                     S r^   )rA   r   rR   s    r    ry   zLazyImage.data   s    {{499%%r"   r   r#   r$   r\   propertyry   __classcell__r   s   @r    rx   rx      s     & &r"   rx   c                   .     e Zd Z fdZed        Z xZS )rw   c                 0    t         |           || _        y r^   )r   r\   	_filename)rR   rU   r   s     r    r\   zLazyLocalImage.__init__   s    !r"   c                 H    t        | j                        j                         S r^   )r   r   
read_bytesr   s    r    ry   zLazyLocalImage.data   s    DNN#..00r"   r   r   s   @r    rw   rw      s    " 1 1r"   rw   c                       e Zd Zd Zd Zd Zy)SVGImagec                 P    t        ||      | _        || _        || _        || _        y r^   )r   _svg	_base_url_url_fetcher_context)rR   treebase_urlurl_fetchercontexts        r    r\   zSVGImage.__init__  s&    h'	!'r"   c                     | j                   j                  |      \  }}d ||fv rD| j                   j                         }|r%|d   r |d   r|d   |d   z  }|r||z  }n|r||z  }nd }n|r|r||z  }nd}|||fS )N   r   r   )r   ra   get_viewbox)rR   image_resolutionr`   rG   rH   viewboxrI   s          r    ra   zSVGImage.get_intrinsic_size
  s    		44Y?vE6?"ii++-G71:'!*
WQZ/"U]F"UNEvFNEEfe##r"   c                    	 | j                   j                  |||| j                  | j                  | j                         y # t
        $ rA}t        j                  d| j                         t        j                  d|       Y d }~y d }~ww xY w)NzFailed to render SVG image %sz Error while rendering SVG image:exc_info)	r   rs   r   r   r   BaseExceptionr   errordebug)rR   rj   rk   rl   rm   r   s         r    rs   zSVGImage.draw  sm    	QIINN!!4==2  	QLL8$..ILL;iPP	Qs   >A 	B
7BBN)r   r#   r$   r\   ra   rs   r'   r"   r    r   r     s     $$Qr"   r   c           	         || v r| |   S 	 t        ||      5 }t        |j                  d            }|j                  dk(  rt	        |j
                        }	nd}	d|v r|d   }
n|d   j                         }
|xs |d   }ddd       d}g }dk(  r$	 t        j                  
      }t        ||||      }|Y	 t        j                  t        
            }t        |j!                         d	      j#                         }t%        |||
	| ||      }|| |<   |S # 1 sw Y   xY w# t        $ r}|j                  |       Y d}~d}~ww xY w# t        $ rn}|dk(  rt&        j)                  |d
         	 t        j                  
      }t        ||||      }n"# t        $ r t&        j)                  |      w xY wY d}~d}~ww xY w# t*        t&        f$ r:}t-        j.                  d||       t-        j0                  d|       d}Y d}~d}~ww xY w)z(Get an Image instance from an image URI.redirected_urlfileNstringfile_obj	mime_typezimage/svg+xmlF)usedforsecurityr   zFailed to load image at %r: %szError while loading image:r   )r   r   rK   schemer	   pathr   r
   
fromstringr   	Exceptionr   r   r   r   r   encode	hexdigestr)   r   r!   r   r   r   r   )rV   r   rX   urlforced_mime_typer   rW   result
parsed_urlrU   r   r   imagesvg_exceptionsr   svg_exceptionrS   rT   raster_exceptionr   s                       r    get_image_from_urir   &  s$    e|Sz/;$ 
	@!&**-=">?J  F*'
86!)
+002(?F;,?I
	@ '5"--f5 sKA =*$zz'&/: szz|UCMMO# (FHe* E#JLc
	@ 
	@&  5%%m445  
M/+::>!;LMMM&11&9D$T3WEE  M+::;KLLM 
M$ /0 5sIF1IFs   G A(D?G #D" 4G 7E	 :G DG "	E+E<G EG 		G F;0#FF;F33F;6G ;G  G H0HHc                 N   | j                   }|dk(  r$d| j                  v r~t        j                  |       } nh|dk7  rc|\  }}|dkD  r.t	        t
        j                  d|       }| j                  |      } |r)| j                  t
        j                  j                        } || _         | S )z{Return a copy of a Pillow image with modified orientation.

    If orientation is not changed, return the same image.

    
from-imageexifr*   r   ROTATE_)	r;   rD   r   exif_transposerJ   r   	Transpose	transposeFLIP_LEFT_RIGHT)rS   rW   image_formatanglefliprotations         r    r?   r?   a  s      &&Ll"\&&&#22<@L		!t19u'%0ABH'11(;L'11//1L 'Lr"   c                 L   |D cg c]  }t        ||        }}|d   d|d<   |d   | |d<   |d   }t        |      D ]  \  }}|	||k  r|||<   |} d}t        |      D ]9  \  }}|	||   }||z
  ||z
  z  }t        |dz   |      D ]  }|||z  z   ||<    |}; |S c c}w )a  Give color stops positions on the gradient vector.

    ``vector_length`` is the distance between the starting point and ending
    point of the vector gradient.

    ``positions`` is a list of ``None``, or ``Dimension`` in px or %. 0 is the
    starting point, 1 the ending point.

    See https://drafts.csswg.org/css-images-3/#color-stop-syntax.

    Return processed color stops, as a list of floats in px.

    r   r   r   )r   	enumeraterange)	vector_length	positionspositionprevious_posi
previous_ibase	incrementjs	            r    process_color_stopsr  y  s    FOOHm4OIO |	!}%	" Q<L + (8,&+	!'( J + 8Z(D!DQ^<I:>1- 4#a)m3	!4J 7 Ps   B!c                     | d   | d   }}||z
  }|dk(  rdgt        |       z  } n| D cg c]
  }||z
  |z   } }||| fS c c}w )zNormalize stop positions between 0 and 1.

    Return ``(first, last, positions)``.

    first: original position of the first position.
    last: original position of the last position.
    positions: list of positions between 0 and 1.

    r   r   )len)r   firstlasttotal_lengthposs        r    normalize_stop_positionsr    se     A,	"4E%<LqC#i.(	=FGccEk\1G	G$	!! Hs   ?c                    t        |      }|dkD  sJ |t        |       k(  sJ |d   |d   z
  }|dk(  rt        t        |            }|dz
  }| D cg c]  \  }}}}||z   }}}}}| D cg c]  \  }}}}||z   }	}}}}| D cg c]  \  }}}}||z   }
}}}}| D cg c]	  \  }}}}| }}}}}dx}x}x}}d|z  }t        |dd d      D ]K  \  }}|||dz
     z
  |z  }|dz
  |fD ].  }|||   |z  z  }||	|   |z  z  }||
|   |z  z  }|||   |z  z  }0 M |dk(  rt	        d      S t	        d||z  dz   d	||z  dz   d	||z  dz   d
| d	      S c c}}}}w c c}}}}w c c}}}}w c c}}}}w )zG
    https://drafts.csswg.org/css-images-3/#gradient-average-color
    r   r   r   r   Ntransparentzrgb(    /))r
  listr   r   r   )colorsr   nb_stopsr  rgbapremul_rpremul_gpremul_br   result_rresult_gresult_bresult_atotal_weightr  r  weightr  s                        r    gradient_average_colorr&    s
   
 9~Ha<<s6{"""R=9Q</Lqx)	!|(.//*!Q1A/H/(.//*!Q1A/H/(.//*!Q1A/H/!'((:1aAQ(E(011H1x1(X|#L 122 *8Yq1u--=a% 	*Af,,Hf,,Hf,,Ha6))H		** 1}=))8h&,-Qx(/BS/H.I("S()H,a9: 	:# 0//(s   E!
0E)
E1
*E9
c                   $    e Zd Zd Zd Zd Zd Zy)Gradientc                 v    |sJ t        d |D              | _        t        d |D              | _        || _        y )Nc              3   &   K   | ]	  \  }}|  y wr^   r'   ).0color_s      r    	<genexpr>z$Gradient.__init__.<locals>.<genexpr>  s     >heQE>   c              3   &   K   | ]	  \  }}|  y wr^   r'   )r+  r-  r  s      r    r.  z$Gradient.__init__.<locals>.<genexpr>  s     #LHH#Lr/  )tupler  stop_positions	repeating)rR   color_stopsr3  s      r    r\   zGradient.__init__  s6    {>+>>##L#LL"r"   c                      y)N)NNNr'   )rR   r   r`   s      r    ra   zGradient.get_intrinsic_size  s    r"   c                 F   | j                  ||      \  }}}}}	|dk(  r9j                  dd||       j                  |	d          j                          y |	D 
cg c]  }
|
d   	 }}
t	        t        |      dz
        D cg c]  }||   ||dz      f }}t	        t        |	      dz
        D cg c]4  }|	|   j                  d      d d |	|dz      j                  d      d d dg6 }}t        |      D ]D  \  }}|dk(  s|dkD  r||dz
     d   ||dz
     d<   |t        |	      dz
  k  s7||   d   ||   d<   F t        |      D ]"  \  }\  }}d||fvs||fdk7  s||z  ||   d<   $ |dk(  rdnd}|d   |d	   f}| j                   }t        |	      dz
  d
z  }|dd	 }fd|D        }j                  ||||      }j                  |d||||      }j                  |       t        d |D              rzj                  dd||      }|dk(  rdnd}fd|D        }j                  ||||      }|j                  |d||||      }|j                  |       d|j                   dg|_        j!                  |j                         y c c}
w c c}w c c}w )Nsolidr   r   r   srgb)r   r   r   linearr   r   r   c              3   N   K   | ]  \  }}}j                  d |||        yw)r:  Ncreate_interpolation_function)r+  c0c1nrj   s       r    r.  z Gradient.draw.<locals>.<genexpr>  s0      ,B 00RC,s   "%r3   )dc              3   &   K   | ]	  }|d k7    yw)r   Nr'   )r+  r   s     r    r.  z Gradient.draw.<locals>.<genexpr>  s     .euz.r/  c              3   P   K   | ]  \  }}j                  d |f|fd        yw)r:  r   Nr<  )r+  r>  r?  rj   s      r    r.  z Gradient.draw.<locals>.<genexpr>  s2      -B 44VbURE1M-s   #&Grayr  z sh)layout	rectangle	set_colorfillr   r
  tor   r3  create_stitching_functionadd_shadingrh   anyset_alpha_stater@   rj   paint_shading)rR   rj   rk   rl   _image_renderingscale_ytype_pointsr   r  r,  alphasr  alpha_couplescolor_couplesr   a0a1shading_typedomainextendr   boundssub_functionsfunctionshadingalpha_streamalpha_shadings    `                          r    rs   zGradient.draw  s?   48KKO5-1	6 GQ>?CVAY'KKM(./u%(// 3v;?+- AYq1u&- - 3v;?+- AY\\&!"1%va!e}'7'7'?'CQG- -
 "&) 	>HAuzq5.;AE.B1.EM!a%(+s6{Q&*7*:1*=M!$Q'	> %]3 	.KAxBR b"X%7&(2ga #	. "X-q1A,	".^^#f+/V+1R,*, 33FFM3 $$%C7#.v..!111no7L !& 11qL-+-M 777H(44ffffhHM""W"-%&}'7'7&8#<"=LWZZ(e 0--s   JJ29Jc                     t         )a]  Get layout information about the gradient.

        width, height: Gradient box. Top-left is at coordinates (0, 0).

        Returns (scale_y, type_, points, positions, colors).

        scale_y: vertical scale of the gradient. float, used for ellipses
                 radial gradients. 1 otherwise.
        type_: gradient type.
        points: coordinates of useful points, depending on type_:
            'solid': None.
            'linear': (x0, y0, x1, y1)
                      coordinates of the starting and ending points.
            'radial': (cx0, cy0, radius0, cx1, cy1, radius1)
                      coordinates of the starting end ending circles
        positions: positions of the color stops. list of floats in between 0
                   and 1 (0 at the starting point, 1 at the ending point).
        colors: list of (r, g, b, a).

        )NotImplementedError)rR   rG   rH   s      r    rE  zGradient.layout&  s
    * "!r"   N)r   r#   r$   r\   ra   rs   rE  r'   r"   r    r(  r(    s    # <)|"r"   r(  c                       e Zd Zd Zd Zy)LinearGradientc                 P    t         j                  | ||       |\  | _        | _        y r^   )r(  r\   direction_type	direction)rR   r4  rg  r3  s       r    r\   zLinearGradient.__init__?  s#    $Y7.7+T^r"   c                    t        | j                        dk(  rddd g | j                  d   gfS | j                  dk(  rW| j                  j	                  d      \  }}|dk(  rdnd}|dk(  rdnd}t        j                  ||      }||z  |z  }||z  |z  }	nH| j                  d	k(  sJ | j                  }
t        j                  |
      }t        j                  |
       }	t        |d
      t        |	d
      }	}t        | j                        }t        ||z        t        ||	z        z   }t        || j                        }| j                  sn|d   |d   k(  r-|j                  d|d   dz
         |j                  d|d          |d   |d   k(  r+|j!                  |d   dz          |j!                  |d          t#        |      \  }}}| j                  r5||k(  rt%        ||      }ddd g |gfS ||z
  }|dkD  sJ t'        t        |      dz
        D cg c]  }||dz      ||   z
   }}t)        dg|      }t)        |      }t)        dg|d d d         }t)        |d d d         }||k  rJt+        |      }|j!                  t+        |             |j!                  |d   |z          |||z  z  }||k  rJ|dkD  rLt+        |      }|j                  dt+        |             |j                  d|d   |z
         |||z  z  }|dkD  rL|||z  z
  dz  }||	|z  z
  dz  }|||z  z   ||	|z  z   |||z  z   ||	|z  z   f}dd|||fS c c}w )Nr   r7  r   cornerr-  leftr   topr   	   r   r9  )r
  r  rf  rg  splitmathhypotsincosr   r  rd   r  r2  r3  insertr   r  r&  r   r   next)rR   rG   rH   yxfactor_xfactor_ydiagonaldxdyr   r  r   r   r  r  r,  stop_lengthr  position_steps
next_stepsnext_colorsprevious_stepsprevious_colorsstepstart_xstart_yrR  s                               r    rE  zLinearGradient.layoutD  s   t{{q gtR$++a.)999 (*>>'',DAq&[raH%ZrQHzz%0H F"X-BE!H,B&&'111NNE%B((5/!B r1uR|B dkk"EBJ#frk*::'t7J7JK	~~ |y|+  IaL1$45a+}	"-  2!23fRj)!9)!DtY>> }.vyA'4eW44 ,K?"? s9~124 !a% 9Q</4N 4
 3N34J-K"A#=tt(<#=>N#F4R4L1O &J'd;/0  2!56{**	 & !)N+ao!67  IaL4$78++	 !) 2--2B..!3b5j 'BJ"6b4i29!46 (FIv55?4s   MN)r   r#   r$   r\   rE  r'   r"   r    rd  rd  >  s    8
R6r"   rd  c                   *    e Zd Zd Zd Zd Zd Zd Zy)RadialGradientc                 l    t         j                  | ||       || _        || _        |\  | _        | _        y r^   )r(  r\   centershape	size_typesize)rR   r4  r  r  r  r3  s         r    r\   zRadialGradient.__init__  s2    $Y7
 %)!	r"   c                    t        | j                        dk(  rddd g | j                  d   gfS | j                  \  }}}}t        ||      }t        ||      }|dk(  r||z
  }|dk(  r||z
  } | j                  | j                  ||||       \  }}||z  }	t        | j                        }
t        || j                        }| j                  sp|d   dkD  r2|d   |d   k(  r'|j                  dd       |
j                  d|
d          |d   |d   k(  r+|j                  |d   dz          |
j                  |
d          |d   dk  r| j                  r-|d   |d   z
  }|d|d    |z  z   z  }|D cg c]  }||z   	 }}n|d   dk  rddd g | j                  d   gfS t        |      D ]_  \  }}|dk(  r|
|d  ||d  }}
 nK|dkD  s|
|   }|
|dz
     }||dz
     }|dk  sJ t        ||||g|dd|g      }|g|
|d  z   }
dg||d  z   } n t        |      \  }}}||k(  r | j                  rt        |
|      }ddd g |gfS |||	z  ||||	z  |f}| j                  r| j                  |||	|||
      \  }}}
|	d|||
fS c c}w )	Nr   r7  r   rightbottomrm  r   radial)r
  r  r  r   _handle_degenerate_resolve_sizer  r  r2  r3  rs  r   r   r&  r  _repeat)rR   rG   rH   origin_xcenter_xorigin_ycenter_ysize_xsize_yrP  r  r   r   offsetr  r  r,  previous_colorprevious_positionintermediate_colorr  r  rR  s                          r    rE  zRadialGradient.layout  s<   t{{q gtR$++a.)999 26.(Hhh.h/wx'Hx(H 100vxBD6/ dkk"'0C0CD	~~ |aIaLIaL$@  A&a+}	"-  2!23fRj)Q<!~~ )"	! <&!	!}/M*NO?HI8X.I	I R=A%gtR$++b/1BBB#,Y#7 KAx1},212J	!"	!| &q	)/A,5a!e,<)01444-C+^UEJ.1h?.A* #5!5qr
!B%&C)AB-$7	!" ":)!DtY D=T^^*69=EgtR%00 h(%h($0 >>(,vw	6)C%FIv &)V;;Q Js   -I5c           
      (   |j                         }|j                         }|d   |d   z
  }	t        t        j                  ||d   z
  ||z  |d   z
        t        j                  ||d   z
  |d    |z        t        j                  |d    ||z  |d   z
        t        j                  |d    |d    |z              }
t        j                  |
|d   z
  |	z        }|dkD  r@d|z   }||z  }t        |      D cg c]  }|D ]  }||z   	  }}}|d d |d   |	|z  z   fz   }|d   dk(  r|||fS |d   |	z  }|d d dz   |dd  z   }t        |      }|r3|||z  z  }t        |      D cg c]  }|D ]
  }||z
  |z     c}}|z   }||z
  }|dk(  r|||fS |d   |d   fdk(  sJ d|cxk  rdk  sJ  J |d d d   }d|z
  }t        |d	      D ]  \  }}||k(  r.|| d  |z   }|| d  D cg c]
  }||z
  dz
   }}||z   }|||fc S ||k  s?||    }||dz
      }||dz
      }||||g}||||g}t        ||      }|g||dz
   d  z   |z   }||dz
   d  D cg c]
  }|dz
  |z
   }}|dz
  |z
  g||}|||fc S  y c c}}w c c}}w c c}w c c}w )
N   r   r   r   )r   r   r   r:  )start)	copyrf   ro  rp  ceilr   intr   r&  )rR   rG   rH   rP  rR  r   r  original_colorsoriginal_positionsgradient_lengthmax_distancerepeat_afterrepeatr  r  repeat_beforefull_repeatpartial_repeatreverserI   new_positionsr,  
next_colornext_positionaverage_colorsaverage_positions
zero_colors                              r    r  zRadialGradient._repeat  s    ++-&^^- )fQi/ JJuvay(&7*:VAY*FGJJuvay(6!9*w*>?JJq	z6G#3fQi#?@JJq	zF1I:#78	:
 yy,":o!MN!%FfF&+FmO!"IO8@HOOI OBQZ6!9/M#M"OOF!9>9f,, q	O3 d"VABZ/ -(o33F49+4F4/0 24 K(*4*46?@I
 '4Q9f,,
 #1%'9"'=>&HHH>%A%%%%%$TrT*N"$WA6 	1KAx5  )!-6 %7rs$;!=  {*Q.!= != *I5	y&00% (+,q1uX6
 2QU8 <"'
J!G%-ue]$K!3"$57
$!a%	(BBVK *AE()4!63;HqL;.!6 !6 #QY4Q}QyQ	y&005	1IO&4,!="!6s   9I>'J(J
Jc           	      ,   | j                   dk(  r+| j                  \  }}t        ||      }t        ||      }||fS t        |      }t        ||z
        }t        |      }	t        ||z
        }
| j                  j	                  d      rt
        nt        }| j                  j                  d      r0| j                  dk(  r ||||	|
      }||fS  |||       ||	|
      fS | j                  dk(  r_ |t        j                  ||	      t        j                  ||
      t        j                  ||	      t        j                  ||
            }||fS  |||	f||
f||	f||
fd       \  }}|t        j                  d      z  |t        j                  d      z  fS )z+Resolve circle size of the radial gradient.explicitclosestsidecirclec                 &    t        j                  |  S r^   )ro  rp  )r  s    r    <lambda>z.RadialGradient._resolve_size.<locals>.<lambda>b  s    $**a. r"   )r{   r   )r  r  r   rd   
startswithminrf   endswithr  ro  rp  sqrt)rR   rG   rH   r  r  r  r  rj  r  rk  r  picksize_xycorner_xcorner_ys                  r    r  zRadialGradient._resolve_sizeH  s   >>Z'!YYNFF.F/F6>!8}EH$%(mVh&'ii**95s399f%zzX%tUC8''e$d3&777::!4::dC0$**T62J::eS14::eV3LNGG##!3K$%v(*( $))A,&499Q<(???r"   c                 b    ||cxk(  rdk(  rn ndx}}||fS |dk(  rd}d}||fS |dk(  rd}d}||fS )ztHandle degenerate radial gradients.

        See https://drafts.csswg.org/css-images-3/#degenerate-radials

        r   gHz>g    cAr'   )rR   r  r  s      r    r  z!RadialGradient._handle_degeneratee  sc     V q ""FV v~ q[FF v~ q[FFv~r"   N)r   r#   r$   r\   rE  r  r  r  r'   r"   r    r  r    s     )M<^P1d@:r"   r  )NNr   )4r%   rM   ro  r   hashlibr   r   	itertoolsr   r   pathlibr   urllib.parser   urllib.requestr	   	xml.etreer
   r   PILr   r   r   tinycss2.color4r   rv   r   layout.percentr   loggerr   svgr   urlsr   r   LOAD_TRUNCATED_IMAGES
ValueErrorr   r)   Objectrx   rw   r   r   r?   r  r  r&  r(  rd  r  r'   r"   r    <module>r     s    1 	        ! ' !  * * '  &   ) #'	 :
 :" "D	& 	&1U\\ 1 Q  QF KO1=8v0*Z"&:D`" `"FX6X X6vZX Zr"   