
     h                        d Z dZddlmZ ddlT ddlT ddlmZmZ ddl	m
Z
mZmZmZmZmZ ddlmZmZmZ ddlmZ dd	lmZmZmZmZ ddlT dd
lmZmZ ddlm Z m!Z!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z)  G d de          Z* G d de+          Z, G d de          Z- G d d          Z. G d d          Z/ G d de/e"          Z0 G d de/e          Z1ddl2m3Z3  G d d e3          Z4 G d! d"e4          Z5g d#g d$gZ6 G d% d&e4          Z7 G d' d(e7          Z8 G d) d*e4          Z9 G d+ d,e9          Z:d- Z; G d. d/e4          Z<d0 Z=d1 Z>d2 Z?d3 Z@d4 ZAd5 ZBd6S )7z3.3.0z9This module defines a very preliminary Line Plot example.    colors)*)flattenisStr)DrawingGroupRectPolyLinePolygon_SetKeyWordArgs)TypedPropertyCollection
PropHolder
tpcGetItem)Label)
XValueAxis
YValueAxisAdjYValueAxisNormalDateXValueAxis)uSymbol2Symbol
makeMarker)Grid
DoubleGridShadedPolygon)stringWidthgetFont)PlotArea   )FillPairedDatac                      e Zd Z e eed           eed           eed           eed           eddd	           edd
d	           eddd	           eed           ee	dd	          	  	        Z
dS )LinePlotPropertieszWidth of a line.desczColor of a line.zDash array of a line.z,Color of infill defaults to the strokeColor.NzWidget placed at data points.r   r#   advancedUsagezShader Class.zFiller Class.zName of the line.zIf true flood fill to x axis)	strokeWidthstrokeColorstrokeDashArray	fillColorsymbolshaderfillernameinFill)__name__
__module____qualname__AttrMapAttrMapValueisNumberisColorOrNoneisListOfNumbersOrNoneisStringOrNone	isBoolean_attrMap     _/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/reportlab/graphics/charts/lineplots.pyr!   r!      s        w"l82DEEE"l=7IJJJ&,'<CZ[[[ L5cdddd)HWXYYYdqIIIdqIII|N1DEEEi.L[\]]]

 

 

HHHr;   r!   c                       e Zd ZddZdS )InFillValueNc                 J    t                               | |          }||_        |S N)int__new__yValue)clsvrC   selfs       r<   rB   zInFillValue.__new__&   s!    {{3q!!r;   r@   )r/   r0   r1   rB   r:   r;   r<   r>   r>   %   s(             r;   r>   c                   t    e Zd Z ee eed           e eedd          d                    Z	d Z
dS )	ShaderzIf true shade to x axisr"      )lohiz(AxisColor, LineColor))BASEverticalr   c                     d d g}t          | d|          p|}|d         st          |dt          j                  |d<   |d         s||d<   d S d S )Nr   r   r)   r   )getattrr   white)rF   lpgrowNorowColorrowcs          r<   shadezShader.shade1   s]    $KD!$$)t@GB{6<@@QqTt$HQqTTT$$r;   N)r/   r0   r1   r2   r   r3   r8   
SequenceOfr5   r9   rW   r:   r;   r<   rH   rH   +   sr        wH<	0IJJJjj!qAAAH`aaa
 
 
H
% % % % %r;   rH   c                       e Zd Zd ZdS )NoFillerc                     d S r@   r:   rF   rQ   rR   rS   rT   pointss         r<   fillzNoFiller.fill8   s    r;   N)r/   r0   r1   r^   r:   r;   r<   rZ   rZ   7   s#            r;   rZ   c                   |    e Zd ZdZ e eed           eed           eed                    Zd Z	d Z
d	S )
Fillerz#mixin providing simple polygon fillzfiller interior colorr"   zfiller edge colorzfiller edge widthr)   r'   r&   c                     || _         d S r@   )__dict__)rF   kws     r<   __init__zFiller.__init__B   s    r;   c                     |                     t          |t          | d|          t          | d|          t          | dd                               d S )Nr)   r'   r&   皙?ra   )addr   rO   r\   s         r<   r^   zFiller.fillE   sb    	gfd;x88]8<<]3779 9 9 	: 	: 	: 	: 	:r;   N)r/   r0   r1   __doc__r2   r3   r5   isNumberOrNoner9   re   r^   r:   r;   r<   r`   r`   ;   s        --w L5LMMM"l=7JKKK"l>8KLLL
 
 
H
  : : : : :r;   r`   c                       e Zd ZdS )ShadedPolyFillerNr/   r0   r1   r:   r;   r<   rl   rl   K           Dr;   rl   c                       e Zd ZdS )
PolyFillerNrm   r:   r;   r<   rp   rp   N   rn   r;   rp   )AbstractLineChartc            
          e Zd ZdZ ed.i ded eedd          d eedd          d	 ed
d          d ed
d          d ed
d          d eed          d ee	d          d ee	d          d ed
d          d ed
d          d ed
d          d ed
d          d ed
d d          d! eed"d          d# eed$d          Z
d% Zd& Zd' Zd( Zd) Zd* Zd+ Zej        dd,fd-Zd
S )/LinePlotzLine plot with multiple lines.

    Both x- and y-axis are value axis (so there are no seperate
    X and Y versions of this class).
    rL   reversePlotOrderzIf true reverse plot order.r   r$   lineLabelNudgez,Distance between a data point and its label.
lineLabelsNz(Handle to the list of data point labels.r"   lineLabelFormatz9Formatting string or function used for data point labels.lineLabelArrayzHexplicit array of line label values, must match size of data if present.joinedLinesz.Display data points joined with lines if true.r'   z.Color used for background border of plot area.r)   0Color used for background interior of plot area.lineszHandle of the lines.
xValueAxiszHandle of the x axis.
yValueAxiszHandle of the y axis.dataz2Data to be plotted, list of (lists of) x/y tuples.annotationsz<list of callables, will be called with self, xscale, yscale.
behindAxesz If true use separate line group.	gridFirstz#If true use draw grids before axes.c                    t          j        |            d| _        t                      | _        t                      | _        ddg| _        t          t                    | _
        d| j
        _        t          j        | j
        d         _        t          j        | j
        d         _        t          t                     | _        d | _        d | _        d| _        d| _        d | _        g | _        d| _        d| _        d S )Nr   )r   r   )rI   rI   )      @r   )   r   )      )r   rI   rI   r   r   rI   )r   r   r      r   
   )r   re   rt   r   r|   r   r}   r~   r   r!   r{   r&   r   redr'   bluer   rv   rw   rx   ru   ry   _inFillr   r   r   rF   s    r<   re   zLinePlot.__init__j   s    $ !$,,$,, 21	
 --?@@
!"
$*J
1!$*K
1!1%88#" !
  r;   c                 t   t          dd          }ddg}t                      }d|_        d|_        d|_        d|_        ||_        d|_        d	|_        t          j
        |_        t          j        |j        d
         _        t          d          |j        d
         _        t          j        |j        d         _        t          d          |j        d         _        d
|j        _        d|j        _        d|j        _        d
|j        _        d|j        _        d|j        _        |                    |           |S )z Shows basic use of a line chart.     r   r   r   r   )g      @r   r   2   }   ,  r   %2.0fr   FilledCircleFilledDiamondr      )r   rs   xyheightwidthr~   ry   rw   r   blackr'   r   r{   r   r*   r   r|   valueMinvalueMax	valueStepr}   rh   )rF   drawingr~   rQ   s       r<   demozLinePlot.demo   s    #s## 23
 ZZ	$"(*'77"(+'88!"!""#!"!""#Br;   c                    t          | j                  | _        t          t	          t          t           | j                                      | _        t                      }g j        }| j	        j
        }| j        j
        }| j        }t          |          }t          |          D ]\  }}t          |t                    r\|j        }	d|	cxk    r|k     r3n n0|	|k    rt!          d|z            |                    ||	f           nt!          d|d|	          g j        }
t          |          D ]f\  }}|d         } |
t%          |          r% |t'          t)          |                              n
 ||           ||d                   f           g ||
j                   |j        }|D ]\  }}	t          ||         |	          ||<   t          |          | _        || _        dS )zWorks out where they go.

        Sets an attribute _positions which is a list of
        lists of (x, y) matching the data.
        r   z)data row %r may not be paired with itselfz	data row z! is paired with invalid data row r   N)lenr~   _seriesCountmaxlistmap
_rowLengthsetappendr|   scaler}   	enumerate
isinstancer   other
ValueErrorrh   r   mktimemkTimeTuple__self___pairInFills
_positions)rF   pairsPxscaleyscaler~   nrS   rU   r   linecolNodatumxvs                 r<   calcPositionszLinePlot.calcPositions   s      	NNd3s49#5#56677I&&yII#D// 	 	JE3#~.. h	e::::A:::::e||()TW\)\]]]IIuUm,,,,$*Y^Y^Y^`e`e%fggg9D )#  u1X7<RyyPFF6+b//22333ffRjjF58$$    AdmJ " 	6 	6LE5%ahu55AeHHJJr;   c                 @   | j         }| j        |         |         d         }|d}nt          |t                    r |dk    r| j        |         |         }nT||z  }nNt          |d          r,t          |d          s ||          }n" || ||||          }nt          d|z            |rq| j        ||f         }|j        sdS |dk    r|	                    ||| j
        z              n|	                    ||| j
        z
             |                    |           nd}|S )z*Draw a label for a given item in the list.r   Nvalues__call____labelFmtEX__z6Unknown formatter type %s, expected string or functionr   )rw   r~   r   strrx   hasattrr   rv   visible	setOriginru   setText)	rF   rS   r   r   r   labelFmt
labelValue	labelTextlabels	            r<   _innerDrawLabelzLinePlot._innerDrawLabel   sY    'Yu%e,Q/
II%% 	a8## /6u=		$z1		Xj)) 	a8$455 ;$HZ00		$HT%a::		UW__``` 
	OUEN3E=(&&1uu1t':#:;;;;1t':#:;;;MM)$$$$Er;   c                 \    |                     |                     ||||                     dS )zLDraw a label for a given item in the list.
        G must have an add methodN)rh   r   )rF   GrS   r   r   r   s         r<   	drawLabelzLinePlot.drawLabel  s0     	
d""5q3344444r;   c                 
  )* t                      }| j        }| j        }t          | dd           }|r!t	          |j        |j                  }|j        }| j        }| j        }t          | dd           }	| j	        )t          )          *|	s0| j        s))*fdt          t          |                    D             rRt          |	dd           }
|
|j        }
n|                    |
          }
|j        }||j        z   }t          | d|          }t          | d|          }t          t          |                    }| j        rt%          |          }|D ]}||         }|*z  })|         }t          |dd           }t          |d|          }t          |d	|	          }t          |d
d           }t'          |d          r|j        }nt'          )d          r)j        }nd }| j        rt-          |          }|st/          |t0                    rt          |dd           }t/          |t0                    r+|t-          t%          ||j                                     z   }n||
g|z   ||
gz   }|r|                    | ||||           n0|                    t9          ||||k    r|nd |pd                     |r|dk    s||k    r:t;          ||dd          }|r||_        |r||_        |                    |           t'          |d          r|j        }nt'          )d          r)j        }nd }|r|r| j         |         }tC          |          D ]\  }} ||f)v rt          )||f         d|          }!n|}!|!|u r|}"|}#n|!}"t          |"d|          }#tE          tG          |"|          | d         | d         |#          }"|"r3|r|||         d         |z  dz  z  |"_$        |                    |"           n|r| j         |         }tC          |          D ]\  }} t          )||f         dd           }!|!s!t          |!dt          |!d|                    }#tE          |!| d         | d         |#          }"|"r3|r|||         d         |z  dz  z  |"_$        |                    |"           tC          |          D ]#\  }$}%|%\  }&}'| %                    |||$|&|'           $t          |dd           }(|(r|(&                    | ||||           |S )N_bubblePlotr   c                 H    g | ]}t          |z           d d          |S )r.   FrO   ).0rS   r{   
styleCounts     r<   
<listcomp>z&LinePlot.makeLines.<locals>.<listcomp>  sJ     L L L5"5z)9#:8EJJL L L Lr;   rC   _inFillG_lineGr'   r)   r.   r(   r&   r,   rg   ra   rI   r   r   )r'   strokeLineCapstrokeLineJoinr*         ?r+   )'r	   r}   r|   rO   min_bubbleRadius
_bubbleMaxrw   r   r{   r   r   range_yr   _x_lengthrt   reversedr   r&   ry   r   r   r   r   r^   rh   r   r   r(   r*   r~   r   r   r   sizer   rW   )+rF   rR   yAxA
bubblePlotbubbleR	bubbleMaxr   r   r   inFillYinFillX0inFillX1inFillGlGRrS   rU   
styleRowNorowStyler'   r)   r.   dashr   r]   r,   fpointsr   uSymboldrowjxyjuSymbolr*   symColorr   r   x1y1r+   r{   r   s+                                            @@r<   	makeLineszLinePlot.makeLines  s   GG__T-55
 	&"*2+;<<GI'O$y..
ZZ
 	1t( 	1L L L L LE#a&&MM L L L	1 ght44G%((7++uH"*,Hd:a00GT(1%%#a&&MM 1hqkk! P	B P	BEE(C+JZ(H!(=>>K+{CCIXhw77F8%6==Dx//  ,.. )  !  	_ZN;; 	_$Xx>>F!#n55 S"(78AciL3I3I+J+J"J#+G"4v"='@R"R _DyIIIIGGicnpycycyT_T_  @D  QV  Q]  Z]  %^  %^  %^  _  _  _ !k9.D.D#F{QRbcdddD 1+0( 4/3,FF4LLLx** "/)) , &6di&6t%cNN & &DAb"1~..#*5A+>x#P#P#*7**!(#.!)#*6+k#J#J+Jva,@,@Ar!uXVVF &% N*1471:i3G#2M*MFKf&" 6di&6t%cNN & &DAb&uZ\':8DIIH#-X&xGH][f<g<ghhH+HRU2a5JJF &% N*1471:i3G#2M*MFKf  )~~ 8 8eBq%B7777Xx66FAv||D5SAAAr;   c                 	   | j         }| j        }t          | dd           rdx|_        |_        |                    | j        | j        | j                   |r||_        |r||_        |	                    | j
                   |                    d          }|| j        | j        z   k    s|| j        k     r| j        }n|}|                    | j        || j                   |	                    | j
                   |                                  t                      }|                    |                                            | j        s| j        r||                                 | j        r-t                      | _        |                    | j                   | j        r-t                      | _        |                    | j                   |                                 |                                 |j        r|j        gpg }|j        r|j        gpg }t          |dd          }|d k    rD|dv r"|                    |j        |j        z              |dv r|                    |j                   t          |dd          }|d k    rD|dv r"|                    |j        |j        z              |dv r|                    |j                   | j        r<|                    || |j        |           |                    || |j        |           |                    |                                           |                    |                                           | j        sbt          |d	d
          }	t          |d	d
          }
|	s|                    || |j        |           |
s|                    || |j        |           t          | dg           }|D ]=}t          |dd           r*|                     || |j        |j                             >|                    |                                            | j        s@|	r|                    || |j        |           |
r|                    || |j        |           |D ]=}t          |dd           s*|                     || |j        |j                             >|S )Nr   r   r   skipGridnone)bothtop)r  bottom)parentdimexcludedrawGridLastFr   beforeLines) r}   r|   rO   r   setPositionr   r   r   joinAxis	configurer~   r   r   r   r	   rh   makeBackgroundr   r   _joinToAxisr   r   visibleAxisr   r   r   r   r   makeGridgetGridDimsdrawr  )rF   r   r   xAxisCrossesAtr   rR   xAexyAexr  xAdglyAdglr   as                r<   r  zLinePlot.draw  s   __4d++ 	0.//BNR^
tvtvt{333Rr{Rr{
TY !dft{2228O8OAAA
tvq$*---
TYGG	d!!##$$$< 	#4? 	#NN| % %dm$$$ ##ggdk"""

~)25'/R~)25'/R2j00T>>>))BE"*,---,,,BE"""2j00T>>>))BE"*,---,,,BE"""> 	GKK".KFFFKK".KFFF	bggii	bggii~ 	UB~e44EB~e44ET"++att+TTTT"++att+TTTd=44 	1 	1Aqt,, 1aaRXbh//000	dnn~ 	QPbkk!4BN4kPPPPbkk!4BN4kPPP 	1 	1A1]400 1aaRXbh//000r;   Tc                    	
 ddl m	m
 fdt          | dg           D             }	
fd}||_        |                    |           || _        d S )Nr   )r	   Linec                 >    g | ]}t          |d d          k    |S )r-   Nr   )r   r  r-   s     r<   r   z)LinePlot.addCrossHair.<locals>.<listcomp>  s1    aaaQGAfUYDZDZ\`D`D`qD`D`D`r;   r   c           
      <    |          } |          }             }|j         }|                     	|j        ||j        |j        z   |
                     |j         }|                     	||j        ||j        |j        z   
                     |S )N)r'   r&   )r   rh   r   r   r   )rF   xScaleyScaler   r   rR   r   r   r	   r  r'   r&   r   yvs           r<   
annotationz)LinePlot.addCrossHair.<locals>.annotation  s    r

Ar

AABEE$$ruQruRZ/kVabbbcccBEE$$qqrz!1kVabbbcccHr;   )reportlab.graphics.shapesr	   r  rO   r  r   r   )rF   r-   r   r"  r'   r&   r  r   r#  r	   r  s    `````   @@r<   addCrossHairzLinePlot.addCrossHair  s    99999999aaaa'$}R"@"@aaa	 	 	 	 	 	 	 	 	 	 "-
:&&&&r;   r:   )r/   r0   r1   ri   r2   r   r3   r8   r4   r5   r9   re   r   r   r   r   r  r  r   r   r%  r:   r;   r<   rs   rs   R   s        
 w 
 
 
HH 
'<	8Udeffff
%h5crstttt
 "\$-WXXXX
 ',t2mnnnn	

 &d1{||||
 #l82bcccc
 #l=7ghhhh
 !L5ghhhh
 T(>????
 "\$-DEEEE
 "\$-DEEEE
 |D'[\\\\
 #l4.l{|}}}}
 "\)2Tcdeeee
 !L1Vefgggg
H$' ' 'R$ $ $N) ) )V     D5 5 5
q q qfC C CJ 28!X\ ' ' ' ' ' 'r;   rs   c            
           e Zd Z ee eed           eed           eed           eed                    ZdZdZ	dZ
d	Zd
 Zd Zd Zd ZdS )
LinePlot3Dzdx/dzr"   zdy/dzzdepth of an individual serieszz gap around series)rL   theta_xtheta_yzDepthzSpacer   r   r   c                     t                               |            | j        }| j        }| j        }| j        j        dk    r||z  |dz   |z  z   }n|d|z  z   }| j        |z  | _        | j	        |z  | _
        d S )Nparallel_3dr   rI   )rs   r   r   r+  r*  r|   styler(  _3d_dxr)  _3d_dy)rF   nSeriesr+  r*  	_3d_depths        r<   r   zLinePlot3D.calcPositions  s    t$$$#? -//	6'99II6)Il9,l9,r;   c                 Z    | j         }| j        j        dk    r|| j        |z   z  |z   }n|}|S )Nr-  )r+  r|   r.  r*  )rF   rS   r+  z0s       r<   _calc_z0zLinePlot3D._calc_z0  s;    ? -//F*+F2BBB	r;   c                 6    ||| j         z  z   ||| j        z  z   fS r@   )r(  r)  )rF   r   r   zs       r<   _zadjustzLinePlot3D._zadjust  s#    4<1T\>!111r;   c                    t          | dd           }|r
J d            | j        }| j        }t          t	          t          |                              }| j        r|                                 t          | dd           }|r
J d            | j        }| j	        }| j
        }| j        }	ddlm}
  |
            }ddlm}m} | j        j        dk    rt          | d	d
          }t          | dd           rpddlm} t          t)          ||                    } |||          }d }|D ]8\  }}}}||k    r|}d}n|d
z  }||                             ||z   ||f           9d }n|}nd }|}t          | j                  }|D ]}||         }t          |          }| j        ||z           }|j        }t          |dd           }|                     |          }||z   } t3          |d          r|j        }!n$t3          | j        d          r| j        j        }!nd }!| j        r_|r]||         }"|"d         \  }#}$t	          d
t          |"                    D ],}%|"|%         \  }&}' |||#|&|$|'|| ||	|d |d d d d           |&|'}$}#-t3          |d          r|j        }(n$t3          | j        d          r| j        j        }(nd }(|(r[|D ]X})||%         \  }&}' ||&|'|          \  }&}'t;          |(|)d         |)d
         |          }*|*r|                    d
|||&|'|*f           Yt	          |          D ]R}%||%         \  }&}' ||&|'|          \  }&}'|                     ||%|&|'          }+|+r|                    d|||&|'|+f           S|                                  tC                      },|"                                D ]}-|,                    |-d                    |,S )Nr   z$_bubblePlot not supported for 3d yetr   zinFill not supported for 3d yetr   )
_FakeGroup)_make_3d_line_infofind_intersectionsr-  _3d_tilewidthr   _find_intersections)copy)smallr(   r&   rg   )fillColorShaded	tileWidthr'   r&   r(   shadingr*   rI   )#rO   rw   r   r   r   r   rt   reverser*  r8  r(  r)  $reportlab.graphics.charts.linechartsr:  !reportlab.graphics.charts.utils3dr;  r<  r|   r.  r?  r   insertr{   r'   r5  r   r&   ry   r*   r   rh   r   sortr	   value).rF   r   r   	positionsr   r.   r*  r8  r(  r)  r:  Fr;  r<  rB  r?  
fpositionsIicir   r   r   jcr   rS   rU   r   r   rT   r   r4  z1r   frowx0y0r   r   r   r   r   r*   LrR   rE   s.                                                 r<   r  zLinePlot3D.makeLines  s   T-55
EEEEE~ 'O	s9~~&&'' -!))+++i--<<<<<z =,,CCCCCCJLL\\\\\\\\? -//_Q77It1$77 '%%%%%%!#d9"5"566
&&z	BBB  5 5GAa!1uuAqM((2qe4444 		&

I"J __
 1	/ 1	/EE"CCAz%*"45H+H8%6==Du%%BfBx//  ,]33 
.  ( 
(%e,D!!WFB!&qT!3!3 ( (!%eB**Ar2r2r2 ' ($),0dTX(+	- - - -
 "$RBx** "/X.. *+ = = =B ZFB%XbB//FB+GBqE"Q%IIF<quua2bF%;<<< q / /UB!"R++B((r2>>.aeeQr"R1-...	/ 	
GG((AAEE!B%LLLLr;   N)r/   r0   r1   r2   rs   r3   r4   r9   r(  r)  r*  r+  r   r5  r8  r  r:   r;   r<   r'  r'    s        wH,xg666,xg666h-LMMMh-BCCC	
 
 
H GGFF
- 
- 
-  2 2 2j j j j jr;   r'  ) i0      Y@)韼0gq"Uo
Y@)c0gt	dY@)0gY@)+0g=hY@)0gkRY@)0g#޺Y@)V0g޴ϙY@)0grwY@)0g_i]^Z@)0g#T[@)0g/+^v[@)J0bȺ[@)0re  )s1gY?[@)1gr[@);1ga:{[@)1g'Q=c[@)1gCU[@)f1gL[@)1gі⠍[@)/	1g`[@)	1g R\@)	1g%^O.\@)Z
1gc3v\@)
1g+m\@)-1g^;[@)-1gP[@)K.1g&}kS\@).1g[@)/1gUP[@)v/1g|\pSe\@) rW  )rY  rX  )rZ  g333333Y@)r[  g     Y@)r\  gyY@)r]       Y@)r^  ry  )r_  fffffY@)r`  rz  )ra  g33333Y@)rb  gffffffZ@)rc  g33333[@)rd  gfffff[@)rf  g[@)rg  gfffffF\@)rh  ǧ[@)ri  g33333[@)rj  g33333\@)rk  gfffff[@)rl  g33333S[@)rm  g[@)rn  g[@)ro  fffff&\@)rp  gL\@)rq  皙y\@)rr  g\@)rs  g,\@)rt  r|  )ru  g33333\@)rv  g\@)rw  r{  )rx  gfffff\@c                       e Zd ZdZd ZdS )SimpleTimeSeriesPlotzsA customized version of LinePlot.
    It uses NormalDateXValueAxis() and AdjYValueAxis() for the X and Y axes.
    c                     t                               |            t                      | _        t	                      | _        t          | _        d S r@   )rs   re   r   r|   r   r}   _monthlyIndexDatar~   r   s    r<   re   zSimpleTimeSeriesPlot.__init__  s9    $.00$,,%			r;   N)r/   r0   r1   ri   re   r:   r;   r<   r~  r~    s-         & & & & &r;   r~  c                   n    e Zd ZdZ ee edd           eed                    Zd Z	d
dZ
d	 ZdS )GridLinePlota  A customized version of SimpleTimeSeriesSPlot.
    It uses NormalDateXValueAxis() and AdjYValueAxis() for the X and Y axes.
    The chart has a default grid background with thin horizontal lines
    aligned with the tickmarks (and labels). You can change the back-
    ground to be any Grid or ShadedRect, or scale the whole chart.
    If you do provide a background, you can specify the colours of the
    stripes with 'background.stripeColors'.
    Nz3Background for chart area (now Grid or ShadedRect).r"   z&Scalefactor to apply to whole drawing.)rL   
backgroundscaleFactorc                     ddl m} t                              |            d | _        t                      | _        d| j        _        d| j        _        d| j        _	        d| j        _
        |j        | j        _        d S )Nr   r   
horizontalr   r   )reportlab.libr   r~  re   r  r   r  orientationuseRectsuseLinesr&   r   r'   )rF   r   s     r<   re   zGridLinePlot.__init__  su    ((((((%%d+++&&&2##$ #$ &)#&,l###r;   c                    ddl m} |st          dd          }t                      }d|_        d|_        d|_        d|_        t          |_	        d|_
        |j        |_         |j        d	d
dddd	          }||j        d         _        d|j        d         _        d |j        d         _         |j        dddddd	          }||j        d         _        d|j        d         _        ddg|j        d         _        d|j        j        _        d|j        j        _        d|j        j        _        d|j        j        _        d|j        j        _        d|j        j        _        d|j        _        d|j        _        d|j        _        d|j        j        _        t;                      |_        |j        |j         g|j        _!        d|j        _"        |#                    |d           |S )Nr   r   r   r   r   r   r   r   d   A      zPANTONE 288 CV)spotNamedensityrI   O   [   zPANTONE Wm Red CVr   r   startwiiz	{mm}/{yy}z%5d%% r   rM   plot)$r  r   r   r  r   r   r   r   r  r~   ry   r   r'   
PCMYKColorr{   r&   r(   r|   labelsfontSize
textAnchor	boxAnchorangledxdyxLabelFormatr}   labelTextFormattickLeftr   r  pink	lightbluestripeColorsr  rh   )rF   r   r   rQ   c0c1s         r<   r   zGridLinePlot.demo  s   (((((( 	(c3''G^^	#Vs2a5EsSSS"$"#&*#VqBq3FPSTTT"$"#'(e#(*%*1'),&%(""#"$%0"(0%!"(*%&,k63C%D"$.!Bvr;   c                    | j         | j        }}|r||_        |r||_        |                    | j        | j        | j                   |                    | j                   |	                    d          }|| j        | j        z   k    s|| j        k     r| j        }n|}|                    | j        || j
                   |                    | j                   | j        }t          |t                    r,|j        dk    r|j        rt!          t#          |j	        |j        g|j        z                       }g }t'          t)          |          dz
            D ])}|                    ||dz            ||         z
             *||_        n|j        dk    r|j        rt!          t#          |j	        |j        g|j        z                       }	g }t'          t)          |	          dz
            D ])}|                    |	|dz            |	|         z
             *||_        nt          |t.                    r| j        |j        _        | j        |j        _        | j
        |j        _
        | j        |j        _        | j        |j        _        | j        |j        _        | j
        |j        _
        | j        |j        _        |j        j        dk    r|j        rt!          t#          |j	        |j        g|j        z                       }g }t'          t)          |          dz
            D ])}|                    ||dz            ||         z
             *||j        _        n|j        j        dk    r|j        rt!          t#          |j	        |j        g|j        z                       }	g }t'          t)          |	          dz
            D ])}|                    |	|dz            |	|         z
             *||j        _        |j        j        dk    r|j        rt!          t#          |j	        |j        g|j        z                       }g }t'          t)          |          dz
            D ])}|                    ||dz            ||         z
             *||j        _        n|j        j        dk    r|j        rt!          t#          |j	        |j        g|j        z                       }	g }t'          t)          |	          dz
            D ])}|                    |	|dz            |	|         z
             *||j        _        |                                  | j
        | j        | j        }}}
|r|dk    r|dd|ddf|_        nt;                      }|                    |                                            |                    | j                    |                    | j                   |                    |                                             |S )Nr   rM   r   r  )!r|   r}   r  r  r   r   r   r  r~   r   r   r  r   r   r  _tickValuesr   r   	_valueMinr   r   r   
deltaStepsr   grid0grid1r   r  	transformr	   rh   r  r  )rF   xvayvar  r   backxposstepsrP  yposr   r   r  rR   s                 r<   r  zGridLinePlot.draw  sn   ?DOS"s"s444di    1dft{2228O8OAAA4:...di   dD!! 0	.:--#/-C	CM?S_+LMMNNs4yy{++ 6 6ALLacT!W!45555"'!\11co1C	CM?S_+LMMNNs4yy{++ 6 6ALLacT!W!45555"'j)) #	.6DJL6DJL#zDJ $DJ6DJL6DJL#zDJ $DJ z%333C	CM?S_+LMMNNs4yy{++ 6 6ALLacT!W!45555(-
%%'<77CO7C	CM?S_+LMMNNs4yy{++ 6 6ALLacT!W!45555(-
%z%333C	CM?S_+LMMNNs4yy{++ 6 6ALLacT!W!45555(-
%%'<77CO7C	CM?S_+LMMNNs4yy{++ 6 6ALLacT!W!45555(-
%%)Zd>N{v 	;>>&1k!A>AKKA	d!!##$$$	do	do	dnnr;   r@   )r/   r0   r1   ri   r2   rs   r3   rj   r9   re   r   r  r:   r;   r<   r  r    s          wH!\$-bccc"l>8`aaa
 
 
H
	3 	3 	3" " " "HT T T T Tr;   r  c                       e Zd ZdZd Zd ZdS )AreaLinePlotz@we're given data in the form [(X1,Y11,..Y1M)....(Xn,Yn1,...YnM)]c                 h    t                               |            d| _        d| _        g d| _        d S )Nr   ))r      r  r  )rI      r      )r   r  F   (   )rs   re   r   rt   r~   r   s    r<   re   zAreaLinePlot.__init__D  s6    $ !===			r;   c                    	 | j         }t          |          }t          |d                   }|dgz  }g | _         t          d|          D ]s}g }t          |          D ]E}||         ||         |         z   ||<   |                    ||         d         ||         f           F| j                             |           tt                              |           || _         S # || _         w xY w)Nr   r   )r~   r   r   r   rs   r  )rF   odatar   mSrP  Dr   s           r<   r  zAreaLinePlot.drawJ  s    	IEE

AE!HA1#ADI1QZZ $ $q 1 1AQ4%(1+-AaDHHeAhqk!A$/0000	  ####==&&DIIDIs   CC 	C(N)r/   r0   r1   ri   re   r  r:   r;   r<   r  r  B  s8        JJ> > >    r;   r  c                       e Zd Zd ZdS )SplitLinePlotc                    t                               |            t                      | _        t	                      | _        g d| _        d | j        _        d| j        _        d| j        _	        d| j        _
        t          j        d          | j        d         _        t          j        d          | j        d         _        t          j        d          | j        d         _        d S )N))i1ffffff?皙?        )i1r  r  r  )iQ1r  r  r  )i1r  r  r  )i1r  r  r  )i}1r  r  r  )i1r  r  r  )i1r  r  r  )i	1r  r  r  )im1r  r  r  )i1r  r  r  )i51r  r  r  )i1r  r  r  )i1r  r  r  )ia1r  r  r  )i1r  r  r  )i)1r  r  r  )i1r  r  r  )i1r  r  r  )i1r  r  r  )i1r  r  r  )i}1r  r  r  )i1r  r  r  )iE1r  r  r  )i1r  r  r  )i1r  r  r  )iq1r  r  r  )i1r  r  r  )i91r  r  r  )i1r  r  r  )i1r  r  r  )i2r  r  r  )i)2r  r  r  )i2r  r  r  )i2r  r  r  )iU2r  r  r  )i2r  r  r  )i2r  r  r  )i2r  r  r  )i2r  r  r  )iI2r  r  r  )i2r  r  r  )i2r  r  r  )i>2r  r  r  )i9?2r  r  r  )i?2r  r  r  )i@2r  r  r  )ie@2r  r  r  )i@2r  r  r  )i-A2r  r  r  )iA2r  r  r  )iA2r  r  r  )iYB2r  r  r  )iB2r  r  r  )i!C2r  r  r  )ie2r  r  r  )iIf2r  r  r  )if2r  r  r  )ig2r  r  r  )iug2r  r  r  )ig2r  r  r  )i=h2r  r  r  )ih2r  r  r  )ii2r  r  r  )iii2r  r  r  )ii2r  r  r  )i1j2r  r  r  )i2r  r  r  )iY2Q?
ףp=
?r  )i2r  r  r  )i!2r  r  r  )i2r  r  r  )i2r  r  r  )iM2r  r  r  )i2r  r  r  )i2r  r  r  )iy2r  r  r  )iݐ2r  r  r  )iA2r  r  r  )i2r  r  r  )ii2Q?RQ?r  )iʹ2r  r  r  )i12r  r  r  )i2r  r  r  )i2r  r  r  )i]2r  r  r  )i2r  r  r  )i%2r  r  r  )i2r  r  r  )i2r  r  r  )iQ2r  r  r  )i2r  r  r  )iy2
ףp=
?Q?r  )i2r  r  r  )iA2r  r  r  )i2r  r  r  )i	2r  r  r  )im2r  r  r  )i2r  r  r  )i52r  r  r  )i2r  r  r  )i2r  r  r  )ia2r  r  r  )i%3r  r  r  )i3(\?Gz?r  )i3r  r  r  )iQ3r  r  r  )i3r  r  r  )i3r  r  r  )i}3r  r  r  )i3r  r  r  )iE3r  r  r  )i3r  r  r  )i3r  r  r  )iq3r  r  r  )i5)3r  r  r  )i)3)\(?Q?r  )i)3r  r  r  )ia*3r  r  r  )i*3r  r  r  )i)+3r  r  r  )i+3r  r  r  )i+3r  r  r  )iU,3r  r  r  )i,3r  r  r  )i-3r  r  r  )i-3r  r  r  )iEP3r  r  r  )iP3
ףp=
?r   Q?)iQ3r  r   r  )iqQ3r  r   r  )iQ3r  r   r  )i9R3r  r   r  )iR3r  r   r  )iS3r  r   r  )ieS3r  r   r  )iS3r  r   r  )i-T3r  r   r  )iT3r  r   r  )iUw3r  r   r  )iw3333333?=
ףp=?(\?)ix3r  r  r  )ix3r  r  r  )ix3r  r  r  )iIy3r  r  r  )iy3r  r  r  )iz3r  r  r  )iuz3r  r  r  )iz3r  r  r  )i={3r  r  r  )i{3r  r  r  )ie3r  r  r  )iɞ3p=
ף?r  RQ?)i-3r  r  r  )i3r  r  r  )i3r  r  r  )iY3r  r  r  )i3r  r  r  )i!3r  r  r  )i3r  r  r  )i3r  r  r  )iM3r  r  r  )i3r  r  r  )iu3r  r  r  )i3皙?r  r   )i=3r  r  r   )i3r  r  r   )i3r  r  r   )ii3r  r  r   )i3r  r  r   )i13r  r  r   )i3r  r  r   )i3r  r  r   )i]3r  r  r   )i3r  r  r   )i3r  r  r   )i3p=
ף?Gz?r   )iM3r  r  r   )i3r  r  r   )i3r  r  r   )iy3r  r  r   )i3r  r  r   )iA3r  r  r   )i3r  r  r   )i	3r  r  r   )im3r  r  r   )i3r  r  r   )i4r  r  r   )i4rg   皙?r   )i]4rg   r  r   )i4rg   r  r   )i%4rg   r  r   )i4rg   r  r   )i4rg   r  r   )iQ4rg   r  r   )i4rg   r  r   )i4rg   r  r   )i}4rg   r  r   )i4rg   r  r   )i:4rg   r  r   r   i3  iÙ r   i3  rI   )r  re   r   r|   r   r}   r~   requiredRangeleftAxisPercentleftAxisOrigShiftMinleftAxisOrigShiftIPCr   toColorr{   r'   r   s    r<   re   zSplitLinePlot.__init__\  s    d###.00'// xM  xM  xM	(,%*+'/0,/0,$*N8$<$<
1!$*N8$<$<
1!$*N8$<$<
1!!!r;   N)r/   r0   r1   re   r:   r;   r<   r  r  [  s#        = = = = =r;   r  c           	          t          | t          t          f          s| f} d | D             } | r4t          t          t	          t
          ||fd|                               pdS )z0return max stringWidth for the list of strings Tc                     g | ]}||S r:   r:   )r   _fs     r<   r   z_maxWidth.<locals>.<listcomp>l  s    2r;   c                      || ||          S r@   r:   )tsWfNfSs       r<   <lambda>z_maxWidth.<locals>.<lambda>m  s    PRPRSTUWXZP[P[ r;   r   )r   tupler   r   r   r   )TfontNamer  s      r<   	_maxWidthr  i  sh    at%%/A4qaA`T#+h[[[\]^^__``edeer;   c            
           e Zd ZdZ ed+i ded eed          d eed          d eed	          d
 ee	d          d eedd          d eed          d eed          d ee
d          d ee
d          d eed          d ee	d          d ee	d          d eed          d  eed!          d" eed#          d$ eed%          Zd& Zd' Zd,d)Zd* Zd(S )-ScatterPlotzA scatter plot widgetrL   r   z!Width of the area inside the axesr"   r   z"Height of the area inside the axesouterBorderOnz/Is there an outer border (continuation of axes)outerBorderColorzColor of outer border (if any)labelOffsetz.Space between label and Axis (or other labels)r   r$   axisTickLengthszLenth of the ticks on both axesaxisStrokeWidthzStroke width for both axesxLabelzLabel for the whole X-AxisyLabelzLabel for the whole Y-Axisr~   z#Data points - a list of x/y tuples.r'   z#Color used for border of plot area.r)   rz   leftPaddingzPadding on left of drawingrightPaddingzPadding on right of drawing
topPaddingzPadding at top of drawingbottomPaddingzPadding at bottom of drawingc                    t                               |            d| _        d| _        d| _        t
          j        | _        d | _        d}d}d}d | j	        _
        d | j	        _        d | j	        _        d| j	        _        d| _        d	| j        j        _        d
| _        d	| j	        j        _        g d| _        d| _        d| _        d| _        d| _        d| _        | j        |z   |dz  z   | _        | j        t5          t7          | j	        j                  | j	        j        j        | j	        j        j                  z   | _        | j        |z   |z   | j        j        j        z   | _        | | j        j        _        || j        _        || j        _         d| j        _!        | | j	        j        _"        || j	        _#        || j	        _         d| j	        _!        d| _$        d| j%        _        d| j%        _&        d| j%        _"        d| _'        tQ          dd          | j)        _*        tQ          dd          | j)        d         _*        tQ          dd          | j)        d         _*        t
          j+        | j)        d         _,        d S )N   M   r   r   rI   r   z%szX Labler   zY Lable)))gQ?g=
ףp]O@)gl?gX9v.K@)g~jt?gX91@))g(\?gˡE='@)gx&1?g rhI@)g+?gE<Q@))gv?gFԸU@)gMb?g
ףp=A@)gK7A?gfffffB@r   r   r   r  z%.2fer   )r   r   FilledSquare)-rs   re   r   r   r  r   r   r  r  r}   r   r   r   r  r  r|   r  r  r  r~   ry   r  r  r  r  r   r  r   r  r   r  tickDownr&   
rangeRoundr  r  rw   rv   r  ru   r   r{   r*   greenr'   )rF   _labelOffset_axisTickLengths_axisStrokeWidths       r<   re   zScatterPlot.__init__  sB   $
 &#' #' $(!+/'*+'*+'
& 
& 
&	 !"22LNCviDO$< = =t?U?^`d`o`v`  A  A  A#$44\A$/BXBaa%1M!#3 &6##)"%1M!#3 &6##)"##$ $'!)+$^;;;
'Q???
1'A>>>
1$*L
1!!!r;   c                    | j         | j        j        z   | j        j        j        dz  z   | j        j        j        z   }|dt          t          | j        j	                  | j        j        j
        | j        j        j                  z  z   }|| j        z   | j        z   }d| j        j	        z  }|t          || j        j        j
        | j        j        j                  z   }| j        | j        j        z   | j        j        j        dz  z   | j        j        j        dz  z   }|| j        j        j        z   | j        z   | j        z   }||fS )NrI   r   z%.2f%%)r  r}   r  r  r  r|   r  r  r   r   r  r   r  r  r   r  r   r  )rF   txr  tys       r<   _getDrawingDimensionsz!ScatterPlot._getDrawingDimensions  s   do668N8QRS8STUYUdUkUttq3t788$/:P:Y[_[j[q[z{{{|dj=**DO,,yDO2;T_=S=\]]^ 88$/:P:STU:UVX\XgXnXwxyXyzdo$--dk9$/I2wr;   Nc                     |s'|                                  \  }}t          ||          }|                    |                                            |S r@   )r	  r   rh   r  )rF   r   r  r  s       r<   r   zScatterPlot.demo  sK     	%,,..EBrbnnGDIIKK   r;   c                    t          | j        j        j                  j        j        }|dk    rd}|| j        j        j        z  }t                              |           }| j	        }|rt                      }| j        | j        z   dz  |_        d|_        | j        j        j        |_        | j        j        j        |_        |                    |           |                    |           | j        }|rt                      }d|_        d|_        | j        | j        dz  z   |_        | j        j        j        |_        | j        j        j        |_        |                    |           |                    |           | j        rL|                    t+          | j        | j        | j        | j        | j        | j        j        d                      |                    | j        | j                   |S )Nr   g`"?g       @Z   )r'   r&   r)   )r   r|   r  r  faceascentr  rs   r  r  r   r   r   r   r   rh   r  r  r   r}   r  r
   r  r&   shiftr  r  )rF   r  rQ   r  xlr  yls          r<   r  zScatterPlot.draw  s   t-677<C199Fdo,55 ]]4   	wwBF4:%s*BDBD/09BK/09BKJJvFF2JJJ 	wwBBHBDF4;s?*BD/09BK/09BKJJvFF2JJJ  	*FF4
DK%)%:%)_%@#') ) ) * * *
 	!4#5666	r;   r:   r@   )r/   r0   r1   ri   r2   rs   r3   r4   r8   r5   isString
isAnythingr9   re   r	  r   r  r:   r;   r<   r  r  o  sM       w   HH (L8[\\\\)\(9]^^^^ %1LAr$s$s$s$s (4|MHh'i'i'i'i	
 #/,x>n}~"""" '3l8Bc&d&d&d&d '3l8B^&_&_&_&_ *\(9UVVVV *\(9UVVVV (<
9^____ #/,}Ch"i"i"i"i !-]As t t t t #/,x>Z"["["["[ $0<?\#]#]#]#] ".h=X!Y!Y!Y!Y  %1L@^$_$_$_$_!H&@1 @1 @1D	 	 	   ' ' ' ' 'r;   r  c                     t          dd          } ddg}t                      }d|_        d|_        d|_        d|_        ||_        d|_        t          j	        |_
        t          d	          |j        _        d
|j        d         _        d|j        d         _        d|j        _        d|j        _        d|j        _        d|j        _        d|j        _        d|j        _        |                     |           | S )2A line plot with non-equidistant points in x-axis.r   r   r   r   r   r   r   r   UK_FlagrI   r   r   r   r   )r   rs   r   r   r   r   r~   ry   r   r   r'   r   r{   r*   r&   r|   r   r   r   r}   rh   r   r~   rQ   s      r<   sample1ar    s     c3G 23
D
 
BBDBDBIBHBGBN\BN ++BHOBHQKBHQKBMBMBMBMBMBMKKOOONr;   c                     t          dd          } ddg}t                      }d|_        d|_        d|_        d|_        ||_        d|_        t          d	          |j	        _
        d
|_        t          j        |_        d|j        _        d|j        _        g d|j        _        d|j        _        d|j        _        d|j        _        d|j        _        |                     |           | S )r  r   r   r   r   r   r   r   r   Circler   r   r   r   rI   r   r   r   r   %2.1fr   )r   rs   r   r   r   r   r~   ry   r   r{   r*   rw   r   r   r'   r|   r   r   
valueStepsr  r}   r   rh   r  s      r<   sample1br  (  s     c3G 23
D
 
BBDBDBIBHBGBN **BHO B\BNBMBM333BM$+BM!BMBMBMKKOOONr;   c                  $   t          dd          } ddg}t                      }d|_        d|_        d|_        d|_        ||_        d|_        t          d	          |j	        d
         _
        t          d          |j	        d         _
        d|_        t          j        |_        d
|j        _        d|j        _        g d|j        _        d|j        _        d
|j        _        d|j        _        g d|j        _        |                     |           | S )r  r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r   )r   rI   r   r   r   )r   rs   r   r   r   r   r~   ry   r   r{   r*   rw   r   r   r'   r|   r   r   r  r  r}   rh   r  s      r<   sample1cr   L  s     c3G 23
D
 
BBDBDBIBHBGBN#N33BHQK#H--BHQK B\BNBMBM333BM$+BM!BMBM.BMKKOOONr;   c                     d | D             S )z=Convert date strings into seconds and multiply values by 100.c                 N    g | ]"}t          |d                    |d         dz  f#S )r   r   r  )str2seconds)r   r   s     r<   r   z"preprocessData.<locals>.<listcomp>t  s1    :::a[1!S):::r;   r:   )seriess    r<   preprocessDatar%  q  s     ;:6::::r;   c                     t          dd          } dg}t          |d                   |d<   t                      }d|_        d|_        d|_        d|_        ||_        d|_        t          d	          |j
        _        t          j        |_        t          t!          d
                    }t          t!          d                    }t          t!          d                    }t          t!          d                    }t          t!          d                    }t          t!          d                    }t          t!          d                    }	||j        _        |	|j        _        |||||||	g|j        _        t*          |j        _        d|j        j        d         _        d|j        j        d         _        d|j        _        d|j        _        d|j        _        d|j        _        |                     |           | S )r  r   r   ))
25/11/1991r   )
30/11/1991gea?)
31/12/1991ga+e?)z
31/01/1992gvq-?)z
29/02/1992gm4@?)
31/03/1992gyT?)z
30/04/1992g )
k?)z
31/05/1992gcȎ{?)
30/06/1992gy,?)z
31/07/1992gQ צ?)z
31/08/1992g[B>٬?)
30/09/1992gY)?)z
31/10/1992g~@?)z
30/11/1992g30?)
31/12/1992g`"?r   r   r   r   r   r   r'  r(  r)  r*  r+  r,  r-  iirI   z%4.2fr  n   )r   r%  rs   r   r   r   r   r~   ry   r   r{   r*   r   r   r'   r   r   r|   r   r   r  seconds2strr  r  r  r}   r   rh   )
r   r~   rQ   r  t0t1t2t3t4ends
             r<   sample2r6  w  s    c3G	
D& T!W%%DG	BBDBDBIBHBGBN 11BHO\BN;|,,--E	L))	*	*B	L))	*	*B	L))	*	*B	L))	*	*B	L))	*	*B
\**
+
+C"BM BM %r2r2r3?BM$/BM!!$BM!$BM$+BM! BM BMBMKKOOONr;   c                  v   t          dd          } t                      }|                     |           t          |j        d         d          |j        d         g|_        t          t          j        d          dd           |j        d         _	        d |j        d         _
        d |j        d         _
        | S )Nr   r   r   r   z#9f9f9f)r)   r&   r'   )r   r~  rh   r   r~   r`   r   r  r{   r,   r'   )dcharts     r<   sampleFillPairedDatar:    s    CA ""EEE%LLL Aq11%*Q-@EJ!FN9,E,ERS`deeeEKN!%EKN!%EKNHr;   N)C__version__ri   r  r   reportlab.lib.validatorsreportlab.lib.attrmapreportlab.lib.utilsr   r   r$  r   r	   r
   r   r   r   reportlab.graphics.widgetbaser   r   r   $reportlab.graphics.charts.textlabelsr   reportlab.graphics.charts.axesr   r   r   r   reportlab.graphics.charts.utils"reportlab.graphics.widgets.markersr   r    reportlab.graphics.widgets.gridsr   r   r   reportlab.pdfbase.pdfmetricsr   r   reportlab.graphics.charts.areasr   utilsr   r!   rA   r>   rH   rZ   r`   rl   rp   rF  rq   rs   r'  r  r~  r  r  r  r  r  r  r  r   r%  r6  r:  r:   r;   r<   <module>rH     s  
 G             & & & & # # # # . . . . . . . . ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ Y Y Y Y Y Y Y Y Y Y 6 6 6 6 6 6 f f f f f f f f f f f f - - - - I I I I I I I I L L L L L L L L L L = = = = = = = = 4 4 4 4 4 4 ! ! ! ! ! !
 
 
 
 
 
 
 
    #   
% 
% 
% 
% 
%_ 
% 
% 
%       : : : : : : : : 	 	 	 	 	vm 	 	 		 	 	 	 	 	 	 	 C B B B B B@' @' @' @' @'  @' @' @'DM M M M M M M M^  @  A? B& & & & &8 & & &R R R R R' R R Rh    8   2= = = = =L = = =f f fQ Q Q Q Q( Q Q Qf# # #L! ! !H" " "J; ; ;: : :x    r;   