
    Kwg                       d Z dZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZ dd	lmZmZ dd
lmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7  G d de"      Z8 G d de3      Z9 G d de9      Z: G d de9      Z; G d d      Z< G d de9      Z= G d de=e:      Z> G d  d!e=e;      Z?d" Z@d# ZAd$ ZBd% ZCd& ZDd' ZEd( ZFd) ZGd* ZHd+ ZId, ZJd- ZKg d.ZLd/ ZMd0 ZNd1 ZOd2 ZPd3 ZQd4 ZRd5 ZSd6 ZTd7 ZUd8 ZVd9 ZWd: ZXd; ZYd< ZZd= Z[d> Z\d? Z]d@ Z^g d.ZLdA Z_dB Z`dC ZadD ZbdE ZcdF ZddG ZedH Zf G dI dJe(      Zgy)Kz3.3.0zThis module defines a variety of Bar Chart components.

The basic flavors are stacked and side-by-side, available in horizontal and
vertical versions. 

    N)literal_eval)colors)isNumberisNumberOrNoneisColorOrNoneisString
SequenceOf	isBooleanisStringOrNoneNoneOrisListOfNumbersOrNoneEitherOrOneOfisInt)isStryieldNoneSplits)uSymbol2SymbolisSymbol)AttrMapAttrMapValue)stringWidth)TypedPropertyCollection
PropHolder
tpcGetItem)LineRectGroupDrawingPolyLine)XCategoryAxis
YValueAxisYCategoryAxis
XValueAxis)BarChartLabelNoneOrInstanceOfNA_Label)PlotArea)_objStrcmpc                       e Zd Z e eed       eed       eed       eed       eddd	       eed
       e e	e
      dd	       eed       e e	e      d      	      Zd Zy)BarChartPropertieszColor of the bar border.desczColor of the bar interior area.zWidth of the bar border.zDash array of a line.Nz,A widget to be used instead of a normal bar.   r-   advancedUsagez0Text to be associated with a bar (eg seriesname)z!None or makeMarker('Diamond') ...z(minimum width/height that will be drawn.z%if this bar should be drawn as a line)	strokeColor	fillColorstrokeWidthstrokeDashArraysymbolnameswatchMarkerminDimenisLinec                 f    d | _         t        j                  | _        d| _        d | _        d | _        y )N      ?)r1   r   bluer2   r3   r5   r4   selfs    Z/var/www/horilla/myenv/lib/python3.12/site-packages/reportlab/graphics/charts/barcharts.py__init__zBarChartProperties.__init__,   s,    #    )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r
   _attrMapr@    rA   r?   r+   r+      s    "=7QR 5VW"82LM&'<CZ[d)WfghH+]^#F8$4;^mno5_`fY/6]^

H$rA   r+   c                      e Zd ZdZ edNi ded e ee ee	e
f      f      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 edd	      d eddd      d edd	      d eed d      d! eed"d      d# edd$	      d% ee
d&	      d' e ed(d)d*      d+	      d, edd-d      d. eed/	      d0 eed1d      d2 e e eed3d3d4      d3dd4      d5      Zd6 ZdOd7Zd8 Zd9 Zd: Zd; Zd< Zd= Zd> Zd? Zd@ ZdA ZdB ZdPdCZdQdDZdE Z dF Z!dG Z"dH Z#dI Z$dJ Z%dK Z&dL Z'dM Z(y)RBarChartz(Abstract base class, unusable by itself.BASEuseAbsolutezrFlag to use absolute spacing values; use string of gsb for finer control
(g=groupSpacing,s=barSpacing,b=barWidth).r.   r/   barWidthzThe width of an individual bar.r,   groupSpacingzWidth between groups of bars.
barSpacingzWidth between individual bars.barsNzHandle of the individual bars.	valueAxiszHandle of the value axis.categoryAxiszHandle of the category axis.dataz/Data to be plotted, list of (lists of) numbers.	barLabelsz!Handle to the list of bar labels.barLabelFormatzZFormatting string or function used for bar labels. Can be a list or list of lists of such.barLabelCallOutz`Callout function(label)
label._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0)barLabelArrayzGexplicit array of bar label values, must match size of data if present.reversePlotOrderz,If true, reverse common category plot order.naLabelzLabel to use for N/A values.annotationsz<list of callables, will be called with self, xscale, yscale.categoryLabelBarSizez=width to leave for a category label to go between categories.categoryLabelBarOrderfirstlastautoz,where any label bar should appear first/last	barRecordzJcallable(bar,label=labelText,value=value,**kwds) to record bar informationzIndexOverridesa!  None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are
    background=0,
    categoryAxis=1,
    valueAxis=2,
    bars=3,
    barLabels=4,
    categoryAxisGrid=5,
    valueAxisGrid=6,
    annotations=7categoryNALabelz'Label to use for a group of N/A values.seriesOrderr   )emptyOKNoneOKloz#dynamic 'mixed' category style casec           
      n   | j                   }|t        |      z  }||   }t        |dt        |dd             }	t        |dt        |dd             }
t        |dt        |dd             }t        |dt        |dd             }t        |dt        |dd             }|rt        |||dz  z   ||dz  z   |
      S t        |dd      r||dz  z   }t	        |d	      r|j
                  }nt	        |d	      r|j
                  }nd }t        ||||z   ||j                  xs |j                  |j                  |j                  
      }|r,t        |||dz  z   ||j                  xs |j                        }|r0|r.t               }|j                  |       |j                  |       |S |xs |S t        ||||||	||
      S )Nr1   r2   r4   r3   r7          @r9   Fr5   r1   r3   r4   )r3   r1   r4   r2   )rN   lengetattrr   hasattrr5   r   r1   r2   r3   r4   r   addr   )r>   rowNoxywidthheight	baseStylestyleIdxstyler1   r2   r4   r3   r7   yh2SLgs                     r?   makeSwatchSamplezBarChart.makeSwatchSampleW   s   II	3y>)(#e]GImTX4YZE;	+d0ST	!%):GIN_`d<efe]GE=QU4VWungiX\6]^!,qrz!F2I+iPPU8E*F2I+Cuh'LLH-$$QsAeGS % 1 1 DU__ % 1 1&+&;&;=A
 nQqrz#e6G6G6Z5??[!QGaa6M!E&[[(7)M MrA   c                 H    t        t        | j                  |   d|            S )zreturn series name i or defaultr6   )r'   ri   rN   )r>   idefaults      r?   getSeriesNamezBarChart.getSeriesNamez   s    wtyy|F7;<<rA   c                 0   | j                   j                  dvsJ d| j                   j                  z         | j                  rt               | _        t               | _        nt               | _        t               | _        t        dddd      | j                  j                  d   _        t        j                  |        d| _        d| _        d	d
g| _        d| _        d| _        d| _        d| _        t)        t*              | _        d| j,                  _        d| j,                  _        d | _        d | _        d| j,                  _        t)        t8              | _        d| j:                  _        t>        j@                  | j:                  _!        d | j:                  _"        t>        jF                  | j:                  d   _$        t>        jJ                  | j:                  d   _$        t>        jL                  | j:                  d   _$        d x| _'        | _(        d | _)        y )N)rH   
BarChart3DzAbstract Class %s Instantiatedstackedparallelparallel_3dmixedrs   r   )d   n   x      )F   P   U   Z   
      cmiddler.      )*	__class__rB   _flipXYr"   rP   r#   rO   r    r!   r   rE   validater&   r@   rM   rV   rQ   rJ   rK   rL   r   r$   rR   	boxAnchor
textAnchorrS   rU   nudger+   rN   r3   r   blackr1   r4   redr2   greenr<   rW   r`   r_   r=   s    r?   r@   zBarChart.__init__~   s   ~~&&.GG  	DIilplzlz  mD  mD  JD  	DG<< -D'\DN -D'\DN7<YzR_`g7h""7+4$ ! '$&	 0?#& $,!"!  ! ,,>?	 !		 &		$(		!!'		!!'		!!'		!.22t+#rA   c                     | j                   j                  dk(  rt        d      t        dd      }| j                         }|j	                  |       |S )zShows basic use of a bar chartrH   z#Abstract Class BarChart has no demo   r   )r   rB   NotImplementedErrorr   rk   )r>   drawingbcs      r?   demozBarChart.demo   sH    >>""J.%&KLL#s#^^BrA   c           	         t        | dd       }t        | j                        }|s!t        |      D cg c]  }|f }}|| _        y | j                  }t        t        |            }t               }g }|D ]v  }|D ch c]  }d|cxk  r|k  sn n| }	}|	D ch c]  }|j                  |dd      s| }
}|
r|	|
z  }	||
z  }||
z  }|	sX|j                  t        |	             ||	z  }x |r!|j                  d t        |      D               |r!|j                  d t        |      D               || _        y c c}w c c}w c c}w )Nra   r   r9   Fc              3   "   K   | ]  }|f 	 y wNrF   .0sss     r?   	<genexpr>z*BarChart.getSeriesOrder.<locals>.<genexpr>   s     82"8   c              3   "   K   | ]  }|f 	 y wr   rF   r   s     r?   r   z*BarChart.getSeriesOrder.<locals>.<genexpr>   s     72"7r   )ri   rh   rQ   rangerN   set	checkAttrappendtupleextendsorted_seriesOrder)r>   bsnr   RrN   unseenlinessrw   gls              r?   getSeriesOrderzBarChart.getSeriesOrder   s8   T--		N!&q*2"*A*( % 99Dq]FEEA 	 "#0Bq"xaxR00#$JRr(5(IbJJGARKEbLFHHU1X&aKF	  888777) + 1Js   
D;;E E E2Ec                 :   | j                   j                  }| j                  t        t	        t        t                          }|dvrHg fd}|dk(  r |  | _	        y | j                          | j                  D ]  } |fd|D           | _	        y )Nr   r   c                      t        d | D              dgz  }|d d  }| D ];  }t        |      D ]+  \  }}|xs d}|dk  r||xx   |z  cc<   ||xx   |z  cc<   - = j                  |       j                  |       y )Nc              3   2   K   | ]  }t        |        y wr   )rh   )r   ds     r?   r   zBBarChart._getConfigureData.<locals>._accumulate.<locals>.<genexpr>   s     /SV/s   r   ư)max	enumerater   )Dpdatandatar   rz   vrQ   s         r?   _accumulatez/BarChart._getConfigureData.<locals>._accumulate   s    /Q/0!4a *A(| *!Fe8!!HMH!!HMH** E"E"rA   r   c              3   (   K   | ]	  }|     y wr   rF   )r   j_datas     r?   r   z-BarChart._getConfigureData.<locals>.<genexpr>   s     !6q%(!6s   )
rP   rs   rQ   r   listmaprh   r   r   _configureData)r>   cAStyleccr   br   rQ   s        @@r?   _getConfigureDatazBarChart._getConfigureData   s    ##))yyc#dm$%44D# 	!U#
 # ##%** 8A!6A!678"rA   c                     | j                          | j                  j                  | j                         | j                  j                  | j                  j
                  fS )z Attempt to return the data range)r   rO   	_setRanger   	_valueMin	_valueMaxr=   s    r?   
_getMinMaxzBarChart._getMinMax   sE       !4!45~~'')A)AAArA   c                    | j                   }|j                  | j                  | j                  |       | j	                          |j                  | j                         |j                  d      }|j                  s||k\  r
|||z   k  r|S |S )z8Position and configure value axis, return crossing valuer   )	rO   setPositionrm   rn   r   	configurer   scale	forceZero)r>   orglengthvA	crossesAts        r?   
_drawBeginzBarChart._drawBegin   ss    ^^
tvvtvvv. 
T(() HHQK	LLY^	3v:@Uy_\__rA   c                 h	   | j                   }| j                  }|j                  | j                         | j	                          t               }t        | dd      }|s=|j                  | j                                t        |dd      }t        |dd      }|s|j                  || |j                         |s|j                  || |j                         |j                  | j                                |j                  |       |j                  |       |r|j                  || |j                         |r|j                  || |j                         t        | dd      D ]/  }|j                   || |j                  |j                               1 | `|S t        dd	d
ddddd      }|j                         j                  d      D ]  }	|	j                         }	|	s	 |	j                  d      \  }
}|
|vrPt!        d|
d|ddj#                  t%        |j'                               D 
cg c]  }
|
d||
    c}
            	 t)        |      }t+        |t,        t.        f      sJ 	 |||
<    |j1                         D 
cg c]	  \  }
}||
f }}
}|j3                          | j                         }|j4                  j7                  d      }|D ]  \  }}
|
dk(  r |j                  | j                                ,|
dk(  r|j                  |       C|
dk(  r|j                  || |j                         g|
dk(  r|j                  |       ~|
dk(  r|j                  || |j                         |
dk(  r|j                  |       |
d k(  r|j                  |       |
dk(  st        | dd      D ]/  }|j                   || |j                  |j                               1  | `|S #  t!        d|	d|ddj#                  t%        |j'                               D 
cg c]  }
|
d||
    nc c}
w c}
            xY wc c}
w #  t!        d||	|dj#                  t%        |j'                               D 
cg c]  }
|
d||
    nc c}
w c}
      fz        xY wc c}}
w )!z"finalize the drawing of a barchartr_   NdrawGridLastF)parentdimrX   rF   r   r.   r         r         )
backgroundrP   rO   rN   rR   categoryAxisGridvalueAxisGridrX   ,=zBadly formatted zIndex clause z in z
allowed variables are

zUnknown zIndex variable zCBad zIndex value %r in clause %r of zIndex
allowed variables are
%sr   rP   r   rO   r   rN   rR   )rP   rO   r   r   calcBarPositionsr   ri   rk   makeBackgroundmakeGridgetGridDimsmakeBarsr   dictstripsplit
ValueErrorjoinr   keysr   
isinstancefloatintitemssortcontentspop)r>   cAr   rw   zIndexcAdglvAdglaZzkr   r   bls                 r?   _drawFinishzBarChart._drawFinish  s   ^^
T(()G/5EE$%%'(B~e4EB~e4E"++at+H"++at+HEE$--/"EE"IEE"Ibkk!4R^^kDbkk!4R^^kDT-3UQUU1T"((288;T5UUb a !"	A \\^))#. GGI(pCAa A:$fghijnjsjs  QW  XY  X^  X^  X`  Qa  ub  LM  @A  BC  DE  BF  vG  ub  kc  &d  e  ev$QA%as444 ! #$''),31Q!A,A,FFHA#B ^!l?EE$--/0&EE"I**KK2>>KB^EE"I'KK2>>KBYEE!H^EE"I%$T-;]QUU1T"((SUS[S[C\=]]!^$ Cp$lmntuyu~u~  \b  cd  ci  ci  ck  \l  @m  WX  KL  MN  OP  MQ  AR  @m  @m  vn  &o  p  p ubv$%lpqrstz{  |E  |E  bh  ij  io  io  iq  br  Fs  ]^  QR  ST  UV  SW  GX  Fs  Fs  |t  pu  &u  v  v,s<   $O5.Q#QR.54Q)P;:Q1R+RR+c                 	  %&'()*+,-./0123456 | j                   ,,r| j                  /n| j                  /| j                  }|j                  +| j
                  }t        |      x}| _        t        t        t        t        |                  x| _        }| j                  }| j                  }| j                  }t        | dd      }t        | dd      }	|	dk(  r
,xr dxs d}	|	dk(  }	|j                   1| j"                  )t%        )fdt'        |      D              }
||
z
  }1dk(  rD| j(                  }t        |      |
z
  }||z  }|d	z
  |z  }|d	kD  r|}|}ndx}}||z  dgz  &&d
d
 'n-1dv rd	}||z  }|d	z
  |z  }|}|}n|}|dgz  &&d
d
 '|}dx}x}}||z   |z   x| _        -| j,                  22r.t/        2t0              sd2ndd	d2v z  z   dd2v z  z   dd2v z  z   2nd2t3         +d      d	         }||z
  }2dk(  r|-z  x| _        x}x}}n2dk(  rdx}x}}|j6                  %n2d	k(  rd}||z
  ||z   z  x}}nl2dk(  rd}||z
  ||z   z  x}}nW2dk(  rdx}}|r||z
  |z
  |z  nd}n>2dk(  rd}||z
  ||z   z  x}}n)2dk(  rdx}}||z
  |z
  |z  }n2dk(  rd	x}}||z
  |z
  |z  }| _        | _        | _        | j>                  }|j                  4|j@                  3|jB                  |jD                  }}|dcxk  r|k  rn n	 4d      *nd|k  r	 4|      *n|dk  r 4|      **| _#        ||z  5d|z  |z  }||z  ||z  z   }|r;|	r||dz  z   |z  }||z  }n|||z  z   ||z  z   |dz  z   |z  }||jH                  _%        g | _&        | jL                  jN                  }| jP                  }%&'(*+,-./0123456fd}1dk7  r~d} tS        |      D ]m  \  }!0g (|r|d	z
  |!z
  n|!6|6|z  z   6)jU                  |!dd      ..r| d	z  } ||d	z
  |z  dz  z   6n6| |z  z  6t'        |      D ]  }" ||"|"         |(       o y
d} tS        | j(                        D ]  \  }#}$t        |$      d	k  rdnd1|$D ]u  }!|r|d	z
  |#z
  n|#6|6|z  z   6g (||!   0)jU                  |!dd      ..r| d	z  } ||d	z
  |z  dz  z   6n6| |z  z  6t'        |      D ]  }" ||"|"|z  |#z            |(       w  y
)zWorks out where they go. default vertical.

        Sets an attribute _barPositions which is a list of
        lists of (x, y, width, height) matching the data.
        rY   r   rZ   r]   r\   r[   c              3   V   K   | ]   }t        j                  |d d             " yw)r9   FN)r   r   )r   _rN   s     r?   r   z,BarChart.calcBarPositions.<locals>.<genexpr>o  s#     [1T^^Ahu=>[s   &)r   r.   Nr   r   r   r   rw   r   r         ?r   r   r   r;   g      @c                    dk(  r |       z  z   z   }n |       \  }}|z   }|    }|d }}ndvras_|dk  r- 	|         }r|k  rn|kD  r}	|xx   |z  cc<   	|   }n/ 
|         }r|kD  rn|k  r}
|xx   |z  cc<   
|   }n} |      |z
  }d|cxk  rdk  rn n	d}|dk  rd}j                  xr |||fxs |||f       y )Nr   r   r   :0yE:0yE>)r   )colNoaccxrm   rw   r  datumrp   rn   _cscaleaccumNegaccumPosbarRowbaseLinecScaleflipXY
groupWidthr9   r   rowrs   rJ   vARDvScalero   xVals           r?   _addBarz*BarChart.calcBarPositions.<locals>._addBar  s*   A~wu~-4s:AHJE} ::6e|"8D>2*.AhJAhJX %/ ("8D>2*.AhJAhJX %/ ( A*%%!FU{UFMM&7a&%7MAaf;MNrA   r9   Fr   r   )+r   rn   rm   rP   r   rQ   rh   _seriesCountr   r   r   
_rowLengthrL   rM   rK   ri   rs   rN   sumr   r   _groupWidthrJ   r   strr   _normFactor_scale_normFactorB_normFactorG_normFactorSrO   reverseDirectionr   r   	_baseLinelabelslabelPosFrac_barPositionsr   rV   r   r   )7r>   r   rQ   seriesCount	rowLengthwGrM   rK   clbsclbo	lineCountseriesMLineCountr   barsPerGroupwBwSbGapBbGapSaW0aWfBfGfSr   vmvMoffsbGaplbpfaBPrV   r  lineSeenrl   r  sbsgr  r  r  r  rN   r  r  r  r  r9   r   r  rs   rJ   r  r  ro   r  s7                                        @@@@@@@@@@@@@@@@@@r?   r   zBarChart.calcBarPositionsS  s+    &&C&&Cyy*-d)3d'&)$s3t}*=&>>)__
==t215t3F;< 16 <WW}yy[kHZ[\	&2'>""Br7Y.Lh&Bq.*,BA~ " !!#I-qc1H{H00L!(*B"1$j0BEE+L !}H{HB!""B"(*2b0:&&k#.!SK%7"88C;<N9OOPQSVZeSePffKF1IaL!4Z>.0m;D;r;B!^BbiiG!^B"ur"uo%B!^B"ur"uo%B!^MB"$"R%(B!B!^B"ur"uo%B!^MBR%(BB!^KBR%(BB ^^""r||B=b=ayHVbzH!VbzH!2vbyRxb T#Xs*RU
2b5(c136%)BII"  ''00	O 	O 	O@ '>H'o 
s3C|a'%/d4i'x?MH!1!!3T 9# ==DHTM)D"9- )EE%()F H"4#4#45  2&)"gqj
i  E4D<!+b0"D$t)+DFu+C!^^E8UCF A#\!^T$9#$==-!&y!1 ?eL&82&=>?K  rA   c                 t   | j                   }t        |t        t        f      r ||   }t        |t        t        f      r||   }|d}|S |dk(  r| j                  |   |   }|S t        |      r|| j                  |   |   z  }|S t        |d      r || j                  |   |         }|S d|z  }t        |      )zreturn formatted label textNvalues__call__z6Unknown formatter type %s, expected string or function)	rS   r   r   r   rU   r   rQ   rj   	Exception)r>   rl   r  labelFmt	labelTextmsgs         r?   _getLabelTextzBarChart._getLabelText  s    &&hU|,H(D<0#E?I  !**51%8I  8_ 499U#3E#::I  Xj) 5!1%!89I  KXUCC. rA   c                 <   |j                   }t        |dd      }|dk(  }|r| }|x}	}
|rd}
|d|z  z   }|dk\  xr dxs d|z  }|dk(  r	||dz  z   }n@|d	k(  r|
dk\  r	||
z   |z   }n-||z
  }|	 }	n$|d
k(  r|
dk  r	||
z   |z   }n||z
  }|	 }	n||
z   |z   }|	|_        |||	fS )zCompute x, y for a label	boxTargetnormalantir   r;   r.   r   midhird   )r   ri   _pmv)r>   labelrm   rn   ro   rp   r   btrT  pmvaluer  r   s                r?   _labelXYzBarChart._labelXY&  s    U;x06z%UE	Mq&B-u9&*AXaxI%ISXaxI%ISE	E!A
2vrA   c                 ~    | j                  ||      }|r)| j                  || j                  ||f   |||||||	       y y r   )rP  	_addLabelrR   )	r>   rw   rl   r  rm   rn   ro   rp   texts	            r?   _addBarLabelzBarChart._addBarLabelC  sI    !!%.NN4!?E5RSUVX]_ef rA   c
                    |	| j                   }	|	rp|	j                  rct        j                  |	      }	| j                  j                  dk  xr dxs d}
||
}||
}| j                  |	j                  |	||||||||
      S y y )Nr   r  r  )calcOnly)rW   r_  copyrO   r   r^  )r>   rw   rl   r  rm   rn   ro   rp   rb  nar   s              r?   _addNABarLabelzBarChart._addNABarLabelH  s    :DLLr"''2B((!+5=A}ae~v>>"''2q%1eV^f>gg 2rA   c                 z   |j                   rt        ||j                  |j                        }| j                  }|r| j                  ||||	|      \  }}}n| j                  |||||	      \  }}}t        |dd       }||j                  | |      }||}}|r|}n|}n|r|}||	dz  z   }n
||dz  z   }|}t        |dd       }||j                  | |      }|r|}n|}|dk  r&|rd|j                  z  }d}nd|j                  z  }d}ndx}}|
r
||z   ||z   fS |j                  ||z   ||z          |j                  |       |j                  |j                  }}|r#|r!|j                  dt        ||||||             |j!                  |       t        | dd       }|r| |||||||	||||f|_         ||       |`y y y )NfixedEndrf   
fixedStartr   )r1   r3   rT   )visibler   fontNamefontSizer   r\  ri   	_getValuedxdy	setOriginsetTextlineStrokeColorlineStrokeWidthinsertr   rk   _callOutInfo)r>   r_  rX  rw   rl   r  rm   rn   ro   rp   rb  
labelWidthr  y0x0rZ  rg  r   x00y00rh  rn  ro  sCsWalxs                             r?   r^  zBarChart._addLabelQ  s   ==$T5>>5>>JJ\\F!]]51VEB
B!]]51U6B
BuZ6H#&&tB/rSBBCF3J,CE#I+CC |T:J%((b1CC!tEHHBBEHHBBR2r"u,OOBrE2b5)MM$**E,A,ABb!((1T#c"RRUW%XYEE%L$06C&*1U51U6#cRTUW%X"E
& ] rA   c                     t        ||||      }|j                  |_        |j                  |_        |j                  |_        |j                  r|j                  |_        |j                  |       y r   )r   r3   r2   r1   r4   rk   )	r>   rw   rm   rn   ro   rp   rl   rs   rs	            r?   _makeBarzBarChart._makeBar  sY    Auf%))oo))   % 5 5A	arA   c                 	   | j                   }t        | dd       }| j                  }| j                  }| j                  }i }|rQg }	t        | j                        dz
  }
t        |      D ])  \  }}t        |      D ]  \  }\  }}}}d ||fvsd||<    + g j                  }g j                  }t        |      D ]  \  }}t        |      }||z  }||   }|j                  |dd      }g j                  }t        |      D ]  \  }\  }}}}||f|v xr |||f   xs |}d ||fv r|r||v r| j                  |||||||       n|r|	vr| j                  |||||||d|	      }|r[|
   |   \  }}}}| j                  ||
|||||d|	      }|d   |d   z   dz  }|d   |d   z   dz  }| j                  ||
|||dd|	       |	j                  |       |r |d        d }t        |d
      r t        j                  |j                        }n,t        | j                   d
      r| j                   j                  }t        |dd       }|ri|r4|dk  rt        |j                    |      }nJt#        |j                   |      }n3|dk  rt        |j                    |      }nt#        |j                   |      }|rj|s||z   }||dz  z   }n||z   }||dz  z   } ||        ||       |rt%        t'        ||      |||j(                  xs |j*                        } | r ||        n|r.||_        ||_        ||_        ||_        |j5                  |       nt7        |      dkD  ryt7        |      dk\  rk|j*                  |j(                  S| j9                  |||||||       |r: ||j:                  d   | j=                  ||      | j                  |   |   ||       | j?                  |||||||        tA        |jB                        D ]F  }|s |tE        ||j(                  xs |j*                  |jF                  |jH                               H  |jB                  D ]  }!|j5                  |!        |jB                  D ]  } |j5                  |         y )Nr^   r.   r9   FTr   rf   g-C6?)rd  r5   r8   r;   gHz>r   )rX  r[  rl   r  rg   )%rN   ri   r.  r   r`   rh   rQ   r   r   r   re  rj   rc  deepcopyr5   minr8   r   r   r   r1   r2   rm   rn   ro   rp   rk   absr  r   rP  r`  r   __self__r   r3   r4   )"r>   rw   lgrN   brBPr  catNALcatNNACBLrowNoLrl   r  r  rm   rn   ro   rp   r   lineSyms
styleCountrr   rowStyler9   linePtsrs   r0r1r5   r8   yLxLsympls"                                     r?   	_makeBarszBarChart._makeBars  s   yyT+d+%%C^a'F'm *
s4=cN *0E0Aq%E&>1()u**
 		99#B- K	IJE3TJz)HH~H^^E8U;FiiG-6s^ >C))!E&!%(D0KT8E:J5KWxE&>)!Uf_++BuU1QuVLE$4!00E%!E&QUV\]24V*U2C/Aq%!%!4!4RuQqvVZ[a!bB!#Ar!uc 1A!#Ar!uc 1A //6%!F6U[/\

5)wt} 5(+!]]5<<8FTYY1!YY--F z$7 7$'$>E$'u$=E!!8%(%..%@F%(%?F!Zs]Y^BKBK,Zu-EbEL]L]Lpafapapq FH FH#(FL$*FMEE&MZ_Vd):@[_d_p_p_|MM!AafU5A2ajjn43E3EeE3RY]YbYbchYijoYpw|  DI  J!!"U51U6B}>C@ +7+;+;< I(7(0(<(<(R@R@R(0(<(<.6.F.FH IIMK	IZ .. 	BEE"I	$$ 	CEE#J	rA   c	                    |j                   r8t        ||j                  |j                        }	| j                  }
|
r| j                  |||||      \  }}}n| j                  |||||      \  }}}t        |dd       }||j                  | |      }||}}|
r|}n|}n|
r|}||dz  z   }n
||dz  z   }|}t        |dd       }||j                  | |      }|
r|}n|}|dk  r&|
rd|j                  z  }d}nd|j                  z  }d}ndx}}|j                  ||z   ||z          |j                  |       ||j                         fS y )Nrg  rf   rh  r   ri  )rj  r   rk  rl  r   r\  ri   rm  rn  ro  rp  rq  	getBounds)r>   r_  rX  rl   r  rm   rn   ro   rp   rv  r  rw  rx  rZ  rg  r   ry  rz  rh  rn  ro  s                        r?   _computeLabelPositionzBarChart._computeLabelPosition  sj   ==$T5>>5>>JJ\\F!]]51VEB
B!]]51U6B
BuZ6H#&&tB/rSBBCF3J,CE#I+CC |T:J%((b1CC!tEHHBBEHHBBROOBrE2b5)MM$eoo'''S rA   c                    | j                   | j                  }}|r||_        |r||_        | j                  rL|j	                  | j                  | j                  | j                        | j                  | j                         nK|j	                  | j                  | j                  | j                  | j                        | j                         |j                  | j                         | j                          y)zRInformation function, can be called by charts which want to with space around barsN)rP   rO   joinAxisr   r   r   rm   ro   rn   rp   r   r   r   r>   r   r   s      r?   _computeBarPositionszBarChart._computeBarPositions  s    ""DNNBRr{Rr{<<NN4??466$**=tvvt{{SNN4664??466$++#F

S
T(()rA   c                    | j                   }| j                          t        | j                        }| j                  }g }|j
                  }|r| j                  }|| j                  z   }	| j                  | j                  z   }
|D ]R  }|D ]K  \  }}}}||z   }||z   } |t        ||      t        ||      t        ||      |z
  |	t        ||      z
  f       M T n| j                  }|| j                  z   }	| j                  | j                  z   }
|D ]R  }|D ]K  \  }}}}||z   }||z   } |t        ||      t        ||      t        ||      |z
  |	t        ||      z
  f       M T |j                          |d   g}|D ]x  }|d   }|d   |d   k  rU|d   |d   k  rJt        |d   |d         t        |d   |d         t        |d   |d         t        |d   |d         f|d<   h|j                  |       z |}d}d}t        |      }t        |      D ]  \  }}|d   }||z   }||
kD  r ||fS |}dx}}||k  rE||   d   |k  r:t        ||   d   |      }t        ||   d   |      }|dz  }||k  r||   d   |k  r:||kD  r3||kD  su|}|xr ||||z   ||z   dfxs ||||z   ||z   df}||k\  s ||fS ||kD  s|}|xr |	|z
  ||	||z   dfxs ||	|z
  ||z   |	df}||k\  s ||fS  ||fS )	ak  helper for madmen who want to put stuff inside their barcharts
        basically after _computebarPositions we slide a line of length size
        down the bar profile on either side of the bars to find the
        maximum space. If the space at any point is >= required then we're
        done. Otherwise we return the largest space location and amount.
        r   r   r.   r   r   i  Ni)r   r  rh   rQ   r.  r   rm   ro   rn   rp   r  r   r   r   )r>   sizerequiredr  lenDatar  CaCrd   rV  endbprm   rn   whr   r  r   r   r  maxSmaxPnCrz   civ0v1r   aloahis                                  r?   _computeMaxSpacezBarChart._computeMaxSpace+  s    !!#dii.XXBdjjB&&$C J"$ JJAq!Q!A!AAaQq3q8b="s1Qx-HIJJ Bdkk!B&&#C K"$ KJAq!Q!A!AAa#a(C!HrM2Aa=IJKK
 	
qTF 	A"AtAaDyQqT!A$YQqT!A$AaD1s1Q4!~c!A$qQRtnU"	 VaL 	+DAbABDB#vu  Tz A""C#B$1Q47B;!A$q'#&!A$q'#&Q B$1Q47B; 3wt8D!>r"RVBtGA&>Z2bDQSTWQWXYBZDx'
 Tz	 T:2c6"R4":Vr"S&DQSTU>V8#UTz'	+& TzrA   c                    | j                   | j                  }}|r||_        |r||_        | j                  rL|j	                  | j                  | j                  | j                        | j                  | j                         nK|j	                  | j                  | j                  | j                  | j                        | j                         |j                  | j                         | j                          | j                  }g j                  }| j                  }t!        |      D ]  \  }}g j                  }t!        |      D ]  \  }	\  }
}}}d||fv r| j"                  }|rs|j$                  rgt'        j&                  |      }| j                  j(                  dk  xr dxs d}||}||} || j+                  |j$                  |||	|
|||              |d       | j-                  ||	      }|r. || j+                  || j.                  ||	f   ||	|
|||              |d         ||j0                          |j0                  S )zLInformation function, can be called by charts which want to mess with labelsNr   r  r  )rP   rO   r  r   r   r   rm   ro   rn   rp   r   r   r   rN   r   r.  r   rW   r_  rc  r   r  rP  rR   r  )r>   r   r   rN   r   r  rl   r  r  r  rm   rn   ro   rp   rd  r   r_  s                    r?   _computeSimpleBarLabelPositionsz(BarChart._computeSimpleBarLabelPositionsk  s   ""DNNBRr{Rr{<<NN4??466$**=tvvt{{SNN4664??466$++#F

S
T(()yyII#B- 	JE3		A09#  ,,1eVE&>)Bbgg!YYr] NN44a7AEIT =!%!>A6$44RWWb%PQSTV[]cde$--eE:D$44T4>>5RW.;Y[`bgijlmotv|}~$! " ajjM'	( zzrA   c                 t    t               }t               }| j                  ||       |j                  |       |S r   )r   r  rk   )r>   rw   r  s      r?   r   zBarChart.makeBars  s.    GWq	b	rA   c                 ,   | j                   j                  }| j                  }t        |      }t	        t        t        t        |                  }|dk(  r#|dz
  | j                  z  || j                  z  z   }n| j                  }|| j                  |z   z  S )z:for dynamically computing the desired category axis lengthr   r.   )
rP   rs   rQ   rh   r   r   r   rM   rK   rL   )r>   rs   rQ   r   mr  s         r?   _desiredCategoryAxisLengthz#BarChart._desiredCategoryAxisLength  s    !!''yyIST]#$*A#t.q>JJ$##J.//rA   c                    | j                   | j                  }}|r||_        |r||_        | j                  r[|j	                  | j                  | j                  | j                        | j                  | j                         | j                         S |j	                  | j                  | j                  | j                  | j                        | j                         | j                         S r   )rP   rO   r  r   r   r   rm   ro   rn   rp   r  r  s      r?   drawzBarChart.draw  s    ""DNNBRr{Rr{<<NN4??466$**=tvvt{{S !! NN4664??466$++#F

S!!rA   rF   r   )FN)F))rB   rC   rD   __doc__r   r&   r   r   r
   r   r   r%   r   r   r	   r   rE   rx   r|   r@   r   r   r   r   r   r  r   rP  r\  r`  re  r^  r  r  r  r  r  r  r   r  r  rF   rA   r?   rH   rH   4   s   . 
H 
"8Yx(@S7T,U#V  ^S  bc  d
/PQ
 $H3RS
 "(1QR	

 D'GH
 !,GH
 $D/MN
 D'XY
 !,OP
 &d  2N  O
 't  3V  ef  g
 %T0yz
 (	8fuvw
 7>\klm
 #4.lm
   ,H;z{!
" !-U76&-IP~ #
$ !,x  IJ  K%
& '~ = '
8 ''?Fo~  A9
: #:jqPQUV.W`aijno#p  rW  X;
H@!MF=;$z4#8B	`FP} ~(:g
h2'hcJ*(X
 >@#J
0"rA   rH   c                       e Zd ZdZdZy)VerticalBarChartz3Vertical bar chart with multiple side-by-side bars.r   NrB   rC   rD   r  r   rF   rA   r?   r  r    s
    9GrA   r  c                       e Zd ZdZdZy)HorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r.   Nr  rF   rA   r?   r  r    s
    ;GrA   r  c                   &    e Zd ZddZd Zd Zd Zy)
_FakeGroupNc                 F    g | _         t        j                  |      | _        y r   )r   	functools
cmp_to_key_key)r>   r)   s     r?   r@   z_FakeGroup.__init__  s    
((-	rA   c                 :    | j                   j                  |       y r   )r   r   )r>   whats     r?   rk   z_FakeGroup.add  s    

$rA   c                     | j                   S r   )r   r=   s    r?   r[  z_FakeGroup.value  s    zzrA   c                 P    | j                   j                  | j                         y )N)key)r   r   r  r=   s    r?   r   z_FakeGroup.sort  s    

DII&rA   r   )rB   rC   rD   r@   rk   r[  r   rF   rA   r?   r  r    s    . 'rA   r  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 Zy)r~   zdx/dzr,   zdy/dzzdepth of an individual serieszz gap around series)rI   theta_xtheta_yzDepthzSpacer;   Nc                 |   t         j                  |        | j                  }| j                  }|| j                  }| j
                  }|| j                  }| j                  j                  dk(  r||z  |dz   |z  z   }n|d|z  z   }|| j                  z  }| j                  |z  | _        | j                  |z  | _        y )Nr   r.   r   )rH   r   r   r  rK   r  rM   rP   rs   r%  r  _3d_dxr  _3d_dy)r>   r/  r  r  	_3d_depths        r?   r   zBarChart3D.calcBarPositions  s    !!$'''>DMM6>DOO6""M1#F*KM6+AAI6)IT%%%	ll9,ll9,rA   c                     | j                   }|| j                  }| j                  }|| j                  }| j                  j
                  dk(  r| j                  |||z   z  |z   z  }|S | j                  |z  }|S )Nr   )r  rK   r  rM   rP   rs   r%  )r>   rl   r  r  z0s        r?   _calc_z0zBarChart3D._calc_z0  s~    >DMM6>DOO6""M1!!5&-#8#?@B 	 !!&(B	rA   c                 v   | j                   }|| j                  }| j                  }	|	| j                  }	| j	                  |      }
|
|| j
                  z  z   }|dk  r||z  }| }||
| j                  z  z  }||
| j                  z  z  }| j                  r||	z  }n||	z  }|j                  d|
|||||||f	       y )Nr   )
r  rK   r  rM   r  r%  r  r  r   rk   )r>   rw   rm   rn   ro   rp   rl   rs   r  r  r  z1s               r?   r  zBarChart3D._makeBar  s    >DMM6>DOO6]]5!&))))7JAFE	R_	R_<<KAKA	qBq5e45rA   c                    | j                  |      }| j                  }	|	| j                  }	|}
||| j                  z  z  }||| j                  z  z  }| j
                  r||	z  }n||	z  }|j                  d||
||||||f	       y )Nr.   )r  r  rM   r  r  r   rk   )r>   rw   rl   r  rm   rn   ro   rp   r  r  r  s              r?   r`  zBarChart3D._addBarLabel  s    ]]5!>DOO6	R_	R_<<KAKA	qBq5e45rA   c                    ddl m} t        | j                        }| j	                  ||       |j                          t               }| j                  }| j                  }|j                         }| j                  j                  }|dk(  r|j                          n'|dk(  r"t        d |D              D cg c]  }|d   	 }}|D ]\  }	|	d   dk(  s|	dd  \  }
}}}}}}}||
z
  } |||||z   |||z   ||z  ||z  |j                  d |j                  |j                   d	       ^ |D ]2  }	|	dk(  s	|	dd  \  }
}}}}}}}t"        j%                  | |||||||       4 |S c c}w )
Nr   )_draw_3d_barr(   r   r   c              3   D   K   | ]  }|d    |d   |d   |d   f|f  yw)r.   r   r   r   NrF   )r   ts     r?   r   z&BarChart3D.makeBars.<locals>.<genexpr>  s.     -ZA!QqT!A$qt/DQ.G-Zs    r.   g?)r2   fillColorShadedr1   r3   shading)!reportlab.graphics.charts.utils3dr  r  _cmpZr  r   r   r  r  r[  rP   rs   reverser   r2   r1   r3   rH   r`  )r>   r  fgrw   r  r  fg_valuer   r  r  r  r  rm   rn   ro   rp   rl   rs   dzr  s                       r?   r   zBarChart3D.makeBars  s   BDJJ'r"
	G,,,,88:##))Ig&,-ZQY-Z&[\!\H\ 	*AtQw56qrU22a%uU"WQ1U7AqxGRZ&+oot(-(9(9uGXGX$(*		*  	KA!t56qrU22a%uU%%d1U51U6J	K  ]s   6E)rB   rC   rD   r   rH   r   r   rE   r  r  r  r  r   r  r  r`  r   rF   rA   r?   r~   r~     sg    Hxg6xg6h-LMh-BC	
H GGFF-	6$6rA   r~   c                       e Zd Zd Zy)VerticalBarChart3Dc                 b    t        |d    |d   |d   |d    f|d    |d   |d   |d    f      S )Nr.   r   r   r   r(   r>   r  r   s      r?   <lambda>zVerticalBarChart3D.<lambda>&  sG    #!uQqT!A$!u5!uQqT!A$!u6MN rA   NrB   rC   rD   r  rF   rA   r?   r  r  %  s    
NErA   r  c                       e Zd Zd Zy)HorizontalBarChart3Dc                 b    t        |d    |d   |d   |d    f|d    |d   |d   |d    f      S )Nr.   r   r   r   r(   r  s      r?   r  zHorizontalBarChart3D.<lambda>)  sG    S1Q4%!QqT1Q4%!81Q4%!QqT1Q4%9PQ rA   Nr  rF   rA   r?   r  r  (  s    QErA   r  c                  .   t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        ddg|j                  _        | j+                  |       | S )z9A slightly pathologic bar chart with only TWO data items.  r         2   }   ,  r   <      ne   ri     YingYangr   r  rm   rn   rp   ro   rQ   r   r   r1   rO   valueMinvalueMax	valueSteprP   r,  r   rn  ro  anglecategoryNamesrk   r   rQ   r   s      r?   	sampleV0ar  ,  s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$ !BOO "BOO#%BOO %+V$4BOO!KKONrA   c                  ,   t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d|j                  _        d	|j                  j                  _        d
|j                  j                  _        d|j                  j                  _        d|j                  j                  _        dg|j                  _        | j+                  |       | S )z/A pathologic bar chart with only ONE data item.r  r   *   r  r  r  r   r  r  r  ri  r  Jan-99r  r  s      r?   	sampleV0br
  K  s     c3G7D		BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$ !BOO "BOO#%BOO %-JBOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        d|j                  j                  _        g |j                  _        | j)                  |       | S )z8A really pathologic bar chart with NO data items at all!r  r   rF   r  r  r  r   r  r  r  r  ri  )r   r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   rn  ro  r  rk   r  s      r?   	sampleV0cr  i  s     c3G4D		BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$ !BOO "BOO$&BOO!KKONrA   c                  |   t        dd      } ddg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d	|j                  _        d
|j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        dj)                  d      }|D cg c]  }|dz   	 }}||j                  _        | j-                  |       | S c c}w )!Sample of multi-series bar chart.r  r   r  r   r     %   -      r      r         &   .   r  r   r  r  r  r   r  r  r  r  ri  r  Jan Feb Mar Apr May Jun Jul Aug -99)r   r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   rn  ro  r  r   r  rk   r   rQ   r   catNamesr   s        r?   sampleV1r    s    c3G +*D
 
	BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$ !BOO "BOO#%BOO 066s;H!)*A%*H*$,BOO!KKON	 +s   D9c                     ddg} d}t        dd      }t               }d|_        d|_        d|_        d|_        | |_        d	|_        d
|_        d
|_	        d|j                  _        d|j                  _        d|j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        ||j&                  _        d|j&                  j                  _        d|j&                  j                  _        d|j&                  j                  _        |j-                  |       |S )r  333333@r   r   gffffff"@333333?皙r   g333333@zQ3 2000zYear to Datez	12 monthszAnnualised
3 yearszSince 07.10.99r  r   r  r   r  r   r   r  r   	Helveticar  r   r   r   r  rm   rn   rp   ro   rQ   rM   rL   rK   rO   r  r   r  r,  rk  rl  r   r   rP   r  ro  rk   rQ   r,  r   r   s       r?   	sampleV2ar.    $    ##D7F c3G		BBDBDBIBHBGBMBOBKBLLBLLBLL#.BLL #$BLL $'BLL!%-BLL"$*BOO!&1BOO#&'BOO# #BOOKKONrA   c                     ddg} d}t        dd      }t               }d|_        d|_        d|_        d|_        | |_        d	|_        d
|_        d
|_	        d|j                  _        d|j                  _        d	|j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        ||j&                  _        d|j&                  j                  _        d|j&                  j                  _        d|j&                  j                  _        |j-                  |       |S )r  r!  r$  r(  r  r   r  r   r  r   r   r)  r  r*  r  r   r   r+  r,  r-  s       r?   	sampleV2br1    r/  rA   c                     ddg} d}t        dd      }t               }d|_        d|_        d|_        d|_        | |_        d	|_        d
|_        d
|_	        d|j                  _        d|j                  _        d|j                  _        d|j                  j                  _        d|j                  j                  _        ||j"                  _        d|j"                  j                  _        d|j"                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j"                  j                  _        d
|j,                  _        d|_        d|j,                  _        d|j,                  _        d|j,                  _        d|j,                  _        d|j,                  _        |j5                  |       |S )r  r"  r#  r   r   {G#@r%  r&  r'  r   r4  r(  r  r   r  r   r  r   r   r)  r  r   r*  r  r   r   r+  %0.2fr   r   )r   r  rm   rn   rp   ro   rQ   rM   rL   rK   rO   r  r   r  r,  rk  rl  rP   r  r   r   ro  rR   r   rS   rn  rk   r-  s       r?   	sampleV2cr7    sr    $$D7F c3G		BBDBDBIBHBGBMBOBKBLLBLLBLL#.BLL #$BLL $*BOO!&1BOO#&'BOO#$'BLL!%-BLL" #BOOBLLBBLLOBLLO BLL'BLLBLLKKONrA   c                     d} d}d}t        |       t        |      k(  sJ d       t        |       t        |      k(  sJ d       t        dd      }t               }d|_        d|_        d|_        d	|_        |f|_        t        j                  |j                  _        d
|_        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j*                  _        d|j*                  _        d|j*                  _        d|j*                  _        d|j4                  _        d|j4                  _        | |j4                  _        d|j4                  j<                  _        d|j4                  j<                  _        d|j4                  j<                  _        d|j4                  j<                  _        d|j4                  j<                  _        d|j4                  j<                  _        t?        |      }|jA                  dd       |jC                  d       |jE                  |       |S )zBFaked horizontal bar chart using a vertical real one (deprecated).
zUK EquitieszUS EquitieszEuropean EquitieszJapanese EquitieszPacific (ex Japan) EquitieszEmerging Markets EquitieszUK BondszOverseas BondszUK Index-LinkedCash
g      333333?r;   r  g?gffffff?g?g?r  r<  
g        Q?g?皙?g)\(?gp=
ף?g)\(?g)\(?r?  r>  bad datar  r   r   r      r6  r  r   r*  r   r   ri  r   r.   i   i)#rh   r   r  rm   rn   rp   ro   rQ   r   r   rN   r2   rS   rR   rn  ro  r   r  rk  rl  r   rO   rj  r  r   r  rP   tickUptickDownr  r,  r   	translaterotaterk   namesseries1series2r   r   rw   s         r?   sampleV3rK  -  s   GE BGHGu:W%1z1%u:W%1z1%c3G		BBDBDBIBHjBGBGGBBLLOBLLO BLLBLL'BLLBLLBLLBLLBLLBLLBLLBOO BOO$)BOO!#%BOO '*BOO$ !BOO $BOO&1BOO#&'BOO#b	AKKSHHSMKKNNrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        ddg|j                  _        | j'                  |       | S )AA bar chart showing value axis region starting at *exactly* zero.r  r   r  r  r  r  r   r  r  r   r  r  r   r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   ro  r  rk   r  s      r?   	sampleV4arP  e  s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        ddg|j                  _        | j'                  |       | S )<A bar chart showing value axis region starting *below* zero.r  r   r  r  r  r  r  r  r   rN  r  r  rO  r  s      r?   	sampleV4brT    s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        ddg|j                  _        | j'                  |       | S )z;A bar chart showing value axis region staring *above* zero.r  r   r  r  r  r  r   r  r  r   rN  r  r  rO  r  s      r?   	sampleV4crV    s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        ddg|j                  _        | j'                  |       | S )<A bar chart showing value axis region entirely *below* zero.r  r   iir  r  r  rS  r  r   rN  r  r  rO  r  s      r?   	sampleV4dr[    s     c3G<D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   ))r   r  )r  r  )r  (   )r\  r  c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|j                  _        d|j                  _        d|j                  _        d	|j                  j                   _        d
|j                  j                   _        ddg|j                  _        | j)                  |       | S )8A simple bar chart with no expressed spacing attributes.r  r   r  r  r  r   r  r  r   rN  r  r  )r   dataSample5r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   ro  r  rk   r  s      r?   	sampleV5ar`    s     c3GD		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                      t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|_        d|j                  _        d
|j                  _        d|j                  _        d|j&                  j(                  _        d|j&                  j(                  _        ddg|j&                  _        | j1                  |       | S )-A simple bar chart with proportional spacing.r  r   r  r  r  r   r\  r  r   r  r  r   rN  r  r  r   r_  r  rm   rn   rp   ro   rQ   r   r   r1   rJ   rK   rL   rM   rO   r  r   r  rP   r,  r   ro  r  rk   r  s      r?   	sampleV5brd         c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                      t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d|_        d|j                  _        d	|j                  _        d
|j                  _        d|j&                  j(                  _        d|j&                  j(                  _        ddg|j&                  _        | j1                  |       | S )6Make sampe simple bar chart but with absolute spacing.r  r   r  r  r  r.   r\  r   r  r  r   rN  r  r  rc  r  s      r?   
sampleV5c1rh    s     c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                      t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|_        d	|j                  _        d
|j                  _        d|j                  _        d|j&                  j(                  _        d|j&                  j(                  _        ddg|j&                  _        | j1                  |       | S )rg  r  r   r  r  r  r.   r\  r  r   r  r  r   rN  r  r  rc  r  s      r?   
sampleV5c2rj  =  s     c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                      t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|_        d|j                  _        d
|j                  _        d|j                  _        d|j&                  j(                  _        d|j&                  j(                  _        ddg|j&                  _        | j1                  |       | S )rg  r  r   r  r  r  r.   r\  r   r   r  r  r   rN  r  r  rc  r  s      r?   
sampleV5c3rl  ^  s     c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$ "BOO%+V$4BOO!KKONrA   c                      t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|_        d
|j                  _        d|j                  _        d|j                  _        d|j&                  j(                  _        d|j&                  j(                  _        ddg|j&                  _        | j1                  |       | S )rg  r  r   r  r  r  r.   r\  r  r   r   r  r  r   rN  r  r  rc  r  s      r?   
sampleV5c4rn    re  rA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        ddg|j                  _        | j'                  |       | S )z>Make a slightly pathologic bar chart with only TWO data items.r  r   r  r  r  r  r   r  r  ser  r  r  r   r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   r  r  rk   r  s      r?   	sampleH0arr    s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$#%BOO %+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d|j                  _        d	|j                  j                  _        d
|j                  j                  _        dg|j                  _        | j'                  |       | S )z4Make a pathologic bar chart with only ONE data item.r  r   r  r  r  r  r   r  rp  r  r	  rq  r  s      r?   	sampleH0brt    s     c3G7D		BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$#%BOO %-JBOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        d|j                  j                  _        g |j                  _        | j'                  |       | S )z=Make a really pathologic bar chart with NO data items at all!r  r   rF   r  r  r  r   r  r  rp  r  rq  r  s      r?   	sampleH0crv    s     c3G4D		BBDBDBIBHBG\\BNBLLBLLBLL'+BOO$#%BOO $&BOO!KKONrA   c                     t        dd      } ddg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d	|j                  _        d
|j                  _        d|j                  j                  _        dj#                  d      }|D cg c]  }|dz   	 }}||j                  _        | j'                  |d       | S c c}w )r  r  r   r  r  r  r  r  r   r  r  er  r  r  barchart)r   r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   r   r  rk   r  s        r?   sampleH1rz    s     c3G +*D
 
	BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$066s;H!)*A%*H*$,BOO!KKJN	 +s   6C)c                     ddg} d}t        dd      }t               }d|_        d|_        d|_        d	|_        | |_        d
|_        d|_        d|_	        d|j                  _        d|j                  _        d|j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        |j                  j'                  |j                         ||j(                  _        d|j(                  j                  _        d|j(                  j                  _        d|j(                  j                  _        |j/                  |       |S )r  r!  r$  r(  r  r   r   r  r   r  r   r   r)  r  r   r*  r  r   r   j)r   r  rm   rn   rp   ro   rQ   rM   rL   rK   rO   r  r   r  r,  rk  rl  r   r   r   rP   r  rn  rk   r-  s       r?   	sampleH2ar}    s:    ##D7F c3G		BBDBDBIBHBGBMBOBKBLLBLLBLL#.BLL #$BLL $'BLL!%-BLL"LL277#$*BOO!&1BOO#&'BOO# $BOOKKONrA   c                     ddg} d}t        dd      }t               }d|_        d|_        d|_        d	|_        | |_        d
|_        d|_        d|_	        d|j                  _        d|j                  _        d
|j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        ||j&                  _        d|j&                  j                  _        d|j&                  j                  _        d|j&                  j                  _        |j-                  |       |S )r  r!  r$  r(  r  r   r   r  r   r  r   r   r)  r  r*  r  r   r   r|  )r   r  rm   rn   rp   ro   rQ   rM   rL   rK   rO   r  r   r  r,  rk  rl  r   r   rP   r  rn  rk   r-  s       r?   	sampleH2br  @  s$    ##D7F c3G		BBDBDBIBHBGBMBOBKBLLBLLBLL#.BLL #$BLL $'BLL!%-BLL"$*BOO!&1BOO#&'BOO# $BOOKKONrA   c                     ddg} d}t        dd      }t               }d|_        d|_        d|_        d	|_        | |_        d
|_        d|_        d|_	        d|j                  _        d|j                  _        d|j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        d|j                  j                  _        ||j&                  _        d|j&                  j                  _        d|j&                  j                  _        d|j&                  j                  _        d|j,                  _        d|_        d|j,                  _        d|j,                  _        d|j,                  _        d|j,                  _        d|j,                  _        |j5                  |       |S )r  r3  r5  r(  r  r   r   r  r   r  r   r   r)  r  r   r*  r  r   r   r|  r6  r   r   )r   r  rm   rn   rp   ro   rQ   rM   rL   rK   rO   r  r   r  r,  rk  rl  r   r   rP   r  rn  rR   r   rS   ro  rk   r-  s       r?   	sampleH2cr  i  sr    $$D7F c3G		BBDBDBIBHBGBMBOBKBLLBLLBLL#.BLL #$BLL $'BLL!%-BLL"$*BOO!&1BOO#&'BOO# $BOOBLLBBLLOBLLO BLL'BLLBLLKKONrA   c                     d} d}d}t        |       t        |      k(  sJ d       t        |       t        |      k(  sJ d       t        dd      }t               }d|_        d|_        d	|_        d
|_        |f|_        t        j                  |j                  _        d|_        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j                  _        d|j(                  _        d|j(                  _        d|j(                  _        d|j(                  _        d|j2                  _        d|j2                  _        | |j2                  _        d|j2                  j:                  _        d|j2                  j:                  _        d|j2                  j:                  _        d|j2                  j:                  _        t=        |      }|j?                  |       |S )zEA really horizontal bar chart (compared to the equivalent faked one).r9  r;  r=  r@  r  r   r   r  rA     r6  r   r  r*  r   r   ri  r   r.   iV) rh   r   r  rm   rn   rp   ro   rQ   r   r   rN   r2   rS   rR   rn  ro  r   rk  rl  r   rO   rj  r  r   r  rP   tickLeft	tickRightr  r,  r   rk   rG  s         r?   sampleH3r    s   GE BGHGu:W%1z1%u:W%1z1%c3G		BBDBDBIBHjBGBGGBBLLOBLLO BLL'BLLBLLBLLBLLBLLBLLBLL BOO !BOO$)BOO!'*BOO$ $BOO&1BOO#&'BOO#b	AKKNNrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        ddg|j                  _        | j%                  |       | S )rM  r  r   r  r  r  r  r   r  r  rx  r  r  r   r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   r  rk   r  s      r?   	sampleH4ar    s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        ddg|j                  _        | j%                  |       | S )rR  r  r   r  r  r  r  rS  r  r  rx  r  r  r  r  s      r?   	sampleH4br    s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        ddg|j                  _        | j%                  |       | S )z<A bar chart showing value axis region starting *above* zero.r  r   r  r  r  r  r   r  r  rx  r  r  r  r  s      r?   	sampleH4cr    s     c3G:D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } dg}t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_	        d|j                  _        d|j                  _        d	|j                  _        d
|j                  j                  _        ddg|j                  _        | j%                  |       | S )rX  r  r   rY  r  r  r  rZ  rS  r  rx  r  r  r  r  s      r?   	sampleH4dr  !  s     c3G<D		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|j                  _        d|j                  _        d|j                  _        d	|j                  j                   _        d
dg|j                  _        | j'                  |       | S )r^  r  r   r  r  r  r   r  r  rx  r  r  )r   r_  r  rm   rn   rp   ro   rQ   r   r   r1   rO   r  r   r  rP   r,  r   r  rk   r  s      r?   	sampleH5ar  ?  s     c3GD		BBDBDBIBHBG\\BNBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|_        d|j                  _        d
|j                  _        d|j                  _        d|j&                  j(                  _        ddg|j&                  _        | j/                  |       | S )rb  r  r   r  r  r  r   r\  r  r   r  r  rx  r  r  r   r_  r  rm   rn   rp   ro   rQ   r   r   r1   rJ   rK   rL   rM   rO   r  r   r  rP   r,  r   r  rk   r  s      r?   	sampleH5br  Z       c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d|_        d|j                  _        d	|j                  _        d
|j                  _        d|j&                  j(                  _        ddg|j&                  _        | j/                  |       | S )z)A simple bar chart with absolute spacing.r  r   r  r  r  r.   r   r   r  r  rx  r  r  r  r  s      r?   
sampleH5c1r  z       c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|_        d	|j                  _        d
|j                  _        d|j                  _        d|j&                  j(                  _        ddg|j&                  _        | j/                  |       | S 'Simple bar chart with absolute spacing.r  r   r  r  r  r.   r   r  r   r  r  rx  r  r  r  r  s      r?   
sampleH5c2r    s     c3GD		BBDBDBIBHBG\\BNBNBKBOBMBLLBLLBLL'*BOO$%+V$4BOO!KKONrA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d	|_        d
|_        d	|j                  _        d|j                  _        d|j                  _        d|j&                  j(                  _        ddg|j&                  _        | j/                  |       | S )r  r  r   r  r     r  r.   r   r   r   r  r  rx  r  r  r  r  s      r?   
sampleH5c3r    r  rA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d|_        d	|j                  _        d
|j                  _        d|j                  _        d|j&                  j(                  _        ddg|j&                  _        | j/                  |       | S r  r  r  s      r?   
sampleH5c4r    r  rA   c                     t        dd      } t        }t               }d|_        d|_        d|_        d|_        ||_        t        j                  |_
        d|_        d|_        d|_        d	|j                  _        d
|j                  _        d|j                  _        d|j$                  j&                  _        ddg|j$                  _        d	dlm}  |       }t        j                  |_        t        j2                  |_        d|_        d	|_         |       }t        j                  |_        t        j:                  |_        d|_        d	|_         |       }t        j2                  |_        t        j<                  |_        d|_        d|_        d	|_        ||j@                  _!        ||j@                  d   _!        ||j@                  d   _!        | jE                  |       | S )(Simple bar chart using symbol attribute.r  r   r  r  r  r   r  r   r   r  rx  r  r  
ShadedRect
horizontalverticalr.   r   )#r   r_  r  rm   rn   rp   ro   rQ   r   r   r1   rK   rL   rM   rO   r  r   r  rP   r,  r   r   reportlab.graphics.widgets.gridsr  fillColorStartr<   fillColorEndorientationr3   pinkwhitecylinderModerN   r5   rk   )r   rQ   r   r  sym1sym2sym3s          r?   sampleSymbol1r    sz    c3GD		BBDBDBIBHBG\\BNBKBOBMBLLBLLBLL'*BOO$%+V$4BOO!;<D ,,DD#DD<D ,,DD#DD<D ++DD!DDDBGGNBGGAJBGGAJKKONrA   c                     t        dd      } t        }t               }d|j                  _        d|_        d|_        d|_        d|_        ||_	        t        j                  |_        d|_        d|_        d	|j                  _        d
|j                  j"                  _        ddg|j                  _        d	dlm}  |       |j,                  _        t        j0                  |j,                  j.                  _        t        j4                  |j,                  j.                  _        d|j,                  j.                  _        d|j,                  j.                  _        d	|j,                  j.                  _         |       |j,                  d   _        t        j>                  |j,                  d   j.                  _        t        j4                  |j,                  d   j.                  _        d|j,                  d   j.                  _        d|j,                  d   j.                  _        d	|j,                  d   j.                  _         |       |j,                  d   _        t        j@                  |j,                  d   j.                  _        t        j4                  |j,                  d   j.                  _        d|j,                  d   j.                  _        d|j,                  d   j.                  _        d	|j,                  d   j.                  _         |       |j,                  d   _        t        jB                  |j,                  d   j.                  _        t        j4                  |j,                  d   j.                  _        d|j,                  d   j.                  _        d|j,                  d   j.                  _        d	|j,                  d   j.                  _        | jE                  |       | S )r  r  r   r   r  r  r  r   r  r   rx  r  r  r  r  r.   r   r   )#r   r_  r  rP   rs   rm   rn   rp   ro   rQ   r   r   r1   rK   rL   rO   r  r,  r   r  r  r  rN   r5   r   r  r  r  r  r  r3   magentar   r<   rk   )r   rQ   r   r  s       r?   sampleStacked1r  /	  s    c3GD		B%BOOBDBDBIBHBG\\BNBKBOBLL'*BOO$%+V$4BOO!;\BGGN$*JJBGGNN!"(,,BGGNN!+BGGNN"#BGGNN!"BGGNN"BGGAJ'-~~BGGAJ$%+\\BGGAJ"$.BGGAJ!%&BGGAJ"$%BGGAJ!"BGGAJ'-||BGGAJ$%+\\BGGAJ"$.BGGAJ!%&BGGAJ"$%BGGAJ!"BGGAJ'-{{BGGAJ$%+\\BGGAJ"$.BGGAJ!%&BGGAJ"$%BGGAJ!KKONrA   c                       e Zd ZdZddZy)
SampleH5c4r  c                    t        j                  | ||g|i | t               }d|_        d|_        d|_        d|_        t        |_        t        j                  |_        d|_        d|_        d|_        d|_        d|j                   _        d|j                   _        d	|j                   _        d
|j(                  j*                  _        ddg|j(                  _        | j1                  |d       |j3                          y )Nr  r  r  r.   r   r  r   r  r  rx  r  r  HBC)r6   )r   r@   r  rm   rn   rp   ro   r_  rQ   r   r   r1   rJ   rK   rL   rM   rO   r  r   r  rP   r,  r   r  rk   r  )r>   ro   rp   argskwr   s         r?   r@   zSampleH5c4.__init__k	  s    eF6D626!	 ! "!#+.()/(8%
**,rA   N)r  r   )rB   rC   rD   r  r@   rF   rA   r?   r  r  h	  s
    --rA   r  )h__version__r  rc  r  astr   reportlab.libr   reportlab.lib.validatorsr   r   r   r   r	   r
   r   r   r   r   r   r   reportlab.lib.utilsr   r   "reportlab.graphics.widgets.markersr   r   reportlab.lib.attrmapr   r   reportlab.pdfbase.pdfmetricsr   reportlab.graphics.widgetbaser   r   r   reportlab.graphics.shapesr   r   r   r   r   reportlab.graphics.charts.axesr    r!   r"   r#   $reportlab.graphics.charts.textlabelsr$   r%   reportlab.graphics.charts.areasr&   !reportlab.graphics.charts.legendsr'   	reportlabr)   r+   rH   r  r  r  r~   r  r  r  r
  r  r  r.  r1  r7  rK  rP  rT  rV  r[  r_  r`  rd  rh  rj  rl  rn  rr  rt  rv  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rF   rA   r?   <module>r     s   	    B B B B 7 G 7 4 Y Y J J _ _ X 4 5 $ $*w"x w"rx  ' '` `DO$4 OR:&8 R><: F&R&R/d5p:::B 78BBBBF:88>'T&R/d/d8888 76@@@@>4l6r- -rA   