
    Q?h$-                     D   S r SrSSKJrJrJr  SSKJrJrJ	r	J
r
JrJr  SSKrSSKJrJrJrJrJrJr  SSKJr  SSKJr  S	 rS
 rS rS rSr\" \5      S-
  rSS jr S S jr!S!S jr"S r#S r$S"S jr%S"S jr& " S S5      r'S r(S r)S#S jr* " S S5      r+ " S S\,5      r-g)$z3.3.0zUtilities used here and there.    )mktimegmtimestrftime)log10pifloorsincoshypotN)transformPointsinverseEllipseGroupStringnumericXShift)flatten)stringWidthc                     S/S-  n[        [        [        U R                  S5      5      5      u  p#nXCU/USS& [	        U5      $ )zNConvert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module.r   	   /N   )listmapintsplittuple)
timeStringLddmmyyyys        Q/var/www/html/env/lib/python3.13/site-packages/reportlab/graphics/charts/utils.pymkTimeTupler#      sG     
aAC!1!1#!678LBDrNAbqE8O    c                 *    [        [        U 5      5      $ )z?Convert a number of seconds since the epoch into a date string.)r   r#   )r   s    r"   str2secondsr&      s     +j)**r$   c                 ,    [        S[        U 5      5      $ )zAConvert a date string into the number of seconds since the epoch.z%Y-%m-%d)r   r   )secondss    r"   seconds2strr)      s     Jw00r$   c                    U S;   a  U $ U S:  a  S[        U * 5      -  $ [        [        U 5      5      nUS:X  a  U S:  a  SnOSnOUS:  a	  SUS-
  -  nOSU-  nX :  a  US-  $ US-  U :  a  US	-  $ US
-  U :  a  US-  $ US-  $ )aG  Return the first 'nice round number' greater than or equal to x

Used in selecting apropriate tick mark intervals; we say we want
an interval which places ticks at least 10 points apart, work out
what that is in chart space, and ask for the nextRoundNumber().
Tries the series 1,2,5,10,20,50,100.., going up or down as needed.
)r      r   g      r+   皙?g      ?      $@   g       @   g      @)nextRoundNumberr   r   )xlgbases      r"   r0   r0   #   s     	F{1uoqb)))q]71u!VBF#D2:D 9#:Qh1_#:Qh1_#:$;r$   )r,   g?g      ?      ?r+   c                    X:  a&  X:X  a  U S:X  a  Sn SnOSU -  n SU-  nO[        S5      eX-
  [        U5      -  nUS:  =(       a    US:  =(       d    US:  =(       a    S[        [        U5      5      -  =(       d    SnUn X4-  nU[        S	   ::  a  OUS-  nM  SnU[        U   :  a  US-   oe[        U   :  a  M   [        U   U-  nX-  n[        U5      US:  -
  n	Xy-  nXyU-   -  nX'-  nUS:  a
  XQ:  a  S
nUnOUS:  a  U* nX:  a  UnSnX::  a  X::  a  OUS-   nU[        :  a  SnUS-  nMu  XXpU-
  U-   U-
  4$ )z>determine tick parameters for range [lo, hi] using I intervalsr   gr,   g?g?zlo>hir+   
   g        )
ValueErrorfloatr   r   
_intervalsr   _j_max)
lohiIr1   bajssnls
             r"   find_intervalrE   K   s    
x61uVVW%%	waA	!1"62uU1X#6;!A	A
CjnebD 
 	
A
JqM/q1u1JqM/
]1_EFAaCLD!HDQ3uTAt5QUEEV8A"A) * !VaZ"_$$r$   c                 L   U(       a.  [        X5      S   U-  n[        X5      u  pVUS:  a  US-   nXS-  nO5 US     SnU H'  n[	        XU5      nUS   U:  d  M  US S u  pEnUS   nM)     WWU4$ ! [         a)    [        [        SUS-
  5      [        US-   S5      5      n Nff = f)Nr   :0yE>r+   r.   r   g)divmod	TypeErrorrangemaxrE   )	lowerupperrC   gridtr=   zwis	            r"   find_good_gridrS   z   s    5q!D(u"T612W	-aD AE*AtAvetA$	 
 b$;  	-c!AaCjQqS,A	-s   A0 00B#"B#c                    [        XX%5      u  pxn[        [        U5      5      n	U	S:X  a  Sn	USU	-  -  n
[        U
5      U
:g  n
U	S:  d  U	S:  a  S[	        U
S-   5      -   S-   nOWU	S:  a   [        U	5      U
-   nS	[	        U5      -   S
-   nO1U
[        U	5      -
  nS	[	        US-   5      -   S-   [	        U5      -   S-   nU(       a  US-   n/ n[        [        X-
  5      U-  S-   5      S-   nU(       aF  / n[        U5       H2  nXuU-  -   nUR                  U5        UR                  UUU-   -  5        M4     X4$ [        U5       H#  nXuU-  -   nUR                  UUUU-   -  45        M%     U$ )z
return tick positions and labels for range lower<=x<=upper
n=number of intervals to try (can be a list or sequence)
split=1 return ticks then labels else (tick,label) pairs
r   r+   r-   r   z%+   z.0e%z.0fr.   .fz%%r,   )rS   r   r   r   reprr9   rJ   append)rL   rM   rC   r   percentrN   labelVOffsetrO   r=   powerrQ   formatdigitsTlabelsrR   vs                    r"   ticksrd      sw    !q7KA4%+EaxS%ZAA	AqyEBJd1Q3i%A:Z\F4<'-Fs5z\FfQh'+DL8<Fvd{
AE"$KS !!#AqAq&AHHQKMM&AlN34  yqAq&AHHa1\>234  r$   c                 p   [        U 5      nS U ;   a  SnX!:  a  X   c  US-  nX!:  a  X   c  M  X!:X  a  U $ US-
  nX   c  US-  nX   c  M  US-  nU(       d  U(       a  XU n [        [        U 5      5       Vs/ s H  o@U   b  M
  UPM     nnU H  nSXS-
     XS-      -   -  X'   M     X#U 4$ SX4$ s  snf )Nr   r+   r4   )lenrJ   )datamr?   rD   rR   r>   s         r"   	findNonesri      s    D	At|cdgoFA cdgo4aCgoFA go	1$)4c$i(<(1GQ(<A4!9TA#Y./DG TzQ8O	 =s   9	B3B3c                     U  Vs/ s H  oS   PM	     nn[        U5      u  p4n[        U5      nU(       d
  XF:  d  XR:w  a4  U(       d  XF:  a  XU n [        X5       VVs/ s H  u  pUS   U4PM     n nnU $ s  snf s  snnf Nr+   r   )ri   rf   zip)pairsr1   Yr?   rD   nYrh   ys           r"   pairFixNonesrq      sy    u!1uAq\FAAAAC25UQZU%(]3]ca!A$q]3L 	
 4s   A5A:c           
          US-
  U S   /-  U -   n [        U[        U 5      S-   5       Vs/ s H  n[        [        XU-
  U 5      5      U-  PM!     n nU $ s  snf rk   )rJ   rf   r9   sum)rg   rC   rR   s      r"   maveragert      sa    aC$q'?4D/4Qs4y{/CD/C!E#dQ3qk"#A%/CDDK Es   &Ac           
          [        U [        U  Vs/ s H  o"S   PM	     snU5      5       VVs/ s H  u  p#US   U4PM     snn$ s  snf s  snnf rk   )rl   rt   )rg   rC   r1   ss       r"   pairMaveragerw      sH     #D($3G$QaD$3G*J KL KQqT!H KLL3GLs
   AA	c                   t    \ rS rSrSrS/4S jrS rS rS r\	S 5       r
\	S	 5       r\S
 5       rS rS rSrg)DrawTimeCollector   za
generic mechanism for collecting information about nodes at the time they are about to be drawn
gifc                     [         R                  " 5       U l        U R                  5         S U l        Xl        SU l        g )NF)weakrefWeakKeyDictionary_nodesclear_pmcanvformatsdisabled)selfr   s     r"   __init__DrawTimeCollector.__init__   s.    //1

r$   c                 H    / U l         U R                   R                  U l        g N)_infor[   _info_appendr   s    r"   r   DrawTimeCollector.clear   s    
 JJ--r$   c                 B    XU4U R                   U'   XR                  S'   g )N_drawTimeCallback)r   __dict__)r   funcnodeargskwdss        r"   recordDrawTimeCollector.record   s"    !t,D-1)*r$   c                     U R                   R                  US 5      nU(       a(  Uu  pEnU" XU/UQ70 UD6nUb  U R                  U5        g g g r   )r   getr   )r   r   canvasrendererr   r   r   rR   s           r"   __call__DrawTimeCollector.__call__   sR    {{tD)#DT9D9D9A}d//2} r$   c                     [        USS 5      nU(       d  g U R                  nU R                  nXPR                  -   nX`R                  -   nUR                  5       n	[        R                  XEU4Xx445      U	S'   U	$ )Nctmrect)getattrr1   rp   widthheightcopyry   transformAndFlatten)
r   r   r   r   Ax1y1x2y2Ds
             r"   rectDrawTimeCallback&DrawTimeCollector.rectDrawTimeCallback   sm    F5&&VVVV**_++IIK#77r7B7:KL&	r$   c                 t    [        U 5      S:w  a  [        U 5      n[        X!5      n[        [        U5      5      $ )zftransform an flatten a list of points
A   transformation matrix
p   points [(x0,y0),....(xk,yk).....]
)r+   r   r   r+   r   r   )r   r   r   r   )r   piAs      r"   r   %DrawTimeCollector.transformAndFlatten   s2     8]"B%AWQZ  r$   c                 r    U R                   (       d  SS KnUR                  SS5      U l         U R                   $ )Nr   r+   )r   renderPMPMCanvas)r   r   s     r"   pmcanvDrawTimeCollector.pmcanv	  s*    ||#,,Qq1DL||r$   c                 $   [        USS 5      nU(       d  g [        U[        5      (       an  U R                  nUR	                  UR
                  UR                  UR                  UR                  5        UR                  nU Vs/ s H  oS   US   4PM     nnOIUR                  5       R                  n[        S[        U5      S5       V	s/ s H  oU	   XyS-      4PM     nn	UR                  5       n
U R                  XW5      U
S'   U
$ s  snf s  sn	f )Nr   r+   r.   r   poly)r   
isinstancer   r   ellipsecxcyrxryvpath	asPolygonpointsrJ   rf   r   r   )r   r   r   r   r   r   cr   r1   rR   r   s              r"   wedgeDrawTimeCallback'DrawTimeCollector.wedgeDrawTimeCallback  s    F5&&d7##AIIdggtww8A&'(aA$qtaA(A ''A(-aAq(9:(91A$q1v(9A:IIK,,Q1&	 ) ;s   DDc                     SSK n[        US-   S5      n UR                  U R                  U5        UR                  5         g! UR                  5         f = f)z
save the current information known to this collector
fnroot is the root name of a resource to name the saved info
override this to get the right semantics for your collector
r   Nz.default-collector.outrQ   )pprintopenr   close)r   fnrootr   rY   s       r"   saveDrawTimeCollector.save   sC     	
v..s
3	MM$**Q'GGIAGGIs   A A)r   r   r   r   r   r   N)__name__
__module____qualname____firstlineno____doc__r   r   r   r   staticmethodr   r   propertyr   r   r   __static_attributes__ r$   r"   ry   ry      sh      %g .23 
 
 ! !   r$   ry   c                 2    U u  p#Uu  pE[        XB-
  XS-
  5      $ )z"return distance between two points)r   )xxx_todo_changemexxx_todo_changeme1x0y0r   r   s         r"   xyDistr   -  s!    GR GR"%"%!!r$   c                    U u  pEUu  pgUu  pUu  pXE4nXd-
  Xu-
  4nX4nX-
  X-
  4n[        US   US   -  US   US   -  -
  5      nUS   US   -
  US   US   -
  4nUS   US   -  US   US   -  -
  nUS   US   -  US   US   -  -
  n[        U5      S:  a  [        U5      S:  a  gg UU-  nUU-  nSUs=::  a  S::  a0  O  g SUs=::  a  S::  a  O  g US   UUS   -  -   US   UUS   -  -   4$ g g )Nr   r+   rG   	collinear)r9   abs)xxx_todo_changeme2xxx_todo_changeme3xxx_todo_changeme4xxx_todo_changeme5x00y00x01y01x10y10x11y11r   rqrv   rsqpqprqpsrO   us                         r"   lineSegmentIntersectr   3  sI   "IS"IS"IS"ISAA 	AA	qtAaDy1ad"	#B	
1ad1Q4!9	B
Q%!*RU1Q4Z
C
Q%!*RU1Q4Z
C
2wt|s8D=BABA!wQw1a77tAadF{AaD1Q4K'' wr$   c
                    U(       d
  [        5       nUS-  n[        S-  n
X:-  n[        XEU5      nU=(       a    S=(       d    SnUS-  nUS-  nU	S:w  aS  U	S:X  a  XSU-  -  U-  -  nO?U	S	:X  a  X[        U5      -  U-  -  nO%U	S
:X  a  X[        [	        XXUS5      5      -  U-  -  nU H  n[        UXV5      n[        U5      U-  n[        5       nUR                  [        SSUXVSS95        UR                  U [        U5      U-  -   U[        U5      U-  -   5        UR                  XU-  -
  U
-  U-
  5        UR                  U5        XU-  -  nM     U$ )z%make a group with circular text in itih     r7   r+   r4   Z   startmiddleendnumericNr   )fontNamefontSize
textAnchor)r   r   r   r9   r   addr   	translater
   r	   rotate)r1   rp   radiusangletextr   r   insideGr   pi180phir   sighsigsig90letterbetahs                      r"   makeCircularStringr
  P  se   %'a	SLEsFE
+C1E
-R
1Cs7DFE7xE	?6))CuU|#F**C"u]:5(SWXYYZ```CFH7U|F"G	fQ6HRYZ[	Ac#hvo%aC&78	#4i-&u,-	a4x  Hr$   c                   *    \ rS rSrSrS rS rS rSrg)CustomDrawChangerip  z1
a class to simplify making changes at draw time
c                     S U l         g r   storer   s    r"   r   CustomDrawChanger.__init__t  s	    
r$   c                 B   U(       aT  U R                  U5      U l        [        U R                  [        5      (       d   SU R                  R
                  -  5       eg U R                  b7  U R                  R                  5        H  u  p4[        X#U5        M     S U l        g g )Nz5%s.changer should return a dict of changed attributes)_changerr  r   dict	__class__r   itemssetattr)r   changeobjr@   rc   s        r"   r   CustomDrawChanger.__call__w  s    s+DJdjj..  B0gjnjxjx  kB  kB  1B  B.ZZ#zz'')a  *DJ $r$   c                     [        S5      e)z
When implemented this method should return a dictionary of
original attribute values so that a future self(False,obj)
can restore them.
zAbstract method _changer called)RuntimeError)r   r  s     r"   r  CustomDrawChanger._changer  s     <==r$   r  N)	r   r   r   r   r   r   r   r  r   r   r$   r"   r  r  p  s    >r$   r  c                       \ rS rSrSS jrSrg)FillPairedDatai  c                 :    [         R                  X5        X l        g r   )r   r   other)r   rc   r   s      r"   r   FillPairedData.__init__  s    d
r$   )r   N)r   )r   r   r   r   r   r   r   r$   r"   r  r    s    r$   r  )r/   )   r/      rV      r   N)r"  r+   r   Nr   )r$  )r   Nr   ).__version__r   timer   r   r   mathr   r   r   r	   r
   r   r}   reportlab.graphics.shapesr   r   r   r   r   r   reportlab.lib.utilsr   reportlab.pdfbase.pdfmetricsr   r#   r&   r)   r0   r:   rf   r;   rE   rS   rd   ri   rq   rt   rw   ry   r   r   r
  r  r   r  r   r$   r"   <module>r,     s   
 ( ) ) 2 2  e e ' 4+
1$L 

:q-%^($L$
MT Tl"(:@> >0T r$   