
    g                       d dl mZ d dlmZ d dlmZ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 d dlmZmZ d dlZd dlmZ d dlZd dlZd d	lm Z m!Z!m"Z"  ejF                  ejH                         ejF                  d
      k\  Z%dZ& e'eeeee      Zg dg dz   g dz   g dz   Z(g dZ)g dZ*g dZ+e(e)z   e*z   e+z   Z,ejZ                  ej\                  ej^                  ej`                  ejb                  ejd                  gZ3e3ejh                  ejj                  ejl                  gz  Z3 G d de7      Z8 e8       Z9[8da:d Z;d Z< edg d      Z= edg d      Z>d Z?d Z@d ZAd ZBd  ZCd! ZDd" ZEd# ZFd$ ZGd% ZHd& ZId' ZJd( ZKd) ZLd* ZMd+ ZNd, ZOd- ZPd. ZQd/ ZRd0 ZSd1 ZTd2 ZUd3 ZVd4 ZWd5 ZXdAd6ZYd7 ZZd8 Z[d9 Z\d: Z]d; Z^d< Z_d= Z`d> ZadBd?Zbd@ Zcy)C    N)
namedtupleOrderedDict   )IdentityMapConstantRange)olslowessrolling	expandingewm)ColorscaleValidator)qualitative
sequential)version)make_subplots_set_trace_grid_reference_subplot_type_for_trace_typez2.2.0px_no_color_constant)r
   r   r   r   r	   )basexyzabcrthetasizex_startx_end)
hover_nametextnamesvaluesparents
wide_cross)idserror_xerror_x_minuserror_yerror_y_minuserror_z)error_z_minuslatlon	locationsanimation_group)
dimensionscustom_data
hover_datapathwide_variable)animation_frame	facet_row	facet_col
line_group)colorsymbol	line_dashpattern_shapec                        e Zd Zg dZd Zd Zy)
PxDefaultstemplatewidthheightcolor_discrete_sequencecolor_discrete_mapcolor_continuous_scalesymbol_sequence
symbol_mapline_dash_sequenceline_dash_mappattern_shape_sequencepattern_shape_mapsize_maxcategory_orderslabelsc                 $    | j                          y N)resetselfs    Q/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/plotly/express/_core.py__init__zPxDefaults.__init__E   s    

    c                     d | _         d | _        d | _        d | _        i | _        d | _        d | _        i | _        d | _        i | _	        d | _
        i | _        d| _        i | _        i | _        y )N   rB   rU   s    rW   rT   zPxDefaults.resetH   st    
'+$"$&*##"&&*#!#!rY   N)__name__
__module____qualname__	__slots__rX   rT    rY   rW   rA   rA   2   s    I$rY   rA   c                     | a y)z
    Arguments:
        token: A Mapbox token to be used in `plotly.express.scatter_mapbox` and         `plotly.express.line_mapbox` figures. See         https://docs.mapbox.com/help/how-mapbox-works/access-tokens/ for more details
    N)MAPBOX_TOKEN)tokens    rW   set_mapbox_access_tokenrd   a   s	     LrY   c                     | j                   S )a  
    Extracts fit statistics for trendlines (when applied to figures generated with
    the `trendline` argument set to `"ols"`).

    Arguments:
        fig: the output of a `plotly.express` charting call
    Returns:
        A `pandas.DataFrame` with a column "px_fit_results" containing the `statsmodels`
        results objects, along with columns identifying the subset of the data the
        trendline was fit on.
    )_px_trendlines)figs    rW   get_trendline_resultsrh   l   s     rY   Mapping)show_in_trace_namegrouperval_mapsequenceupdatervariablefacet	TraceSpecconstructorattrstrace_patchmarginalc                 6    	 | d   |   S # t         $ r |cY S w xY w)NrQ   )	Exception)argscolumns     rW   	get_labelr{      s*    H~f%% s   
 c                     | d   j                         D ci c]  \  }}||
 }}}	 ||   S c c}}w # t        $ r |cY S w xY w)zInvert mapping.
    Find key corresponding to value column in dict args["labels"].
    Returns `column` if the value does not exist.
    rQ   )itemsrx   )ry   rz   keyvaluereversed_labelss        rW   invert_labelr      sX    
 7;8n6J6J6LMlsEuczMOMv&& N  s   -3 A Ac                 8    | |   j                   j                  dv S )Nifc)dtypekind)dfcol_names     rW   _is_continuousr      s    h<""e++rY   c                    t        | |      x}}d| v r|dk(  s"|dk(  rd| v r| d   dk(  s|dk(  rd| v r| d   dk(  r| d   xs d}|dk7  r|d	|}nd}d
| v r]| d
   X|dk(  r| d
   }nM| d
   }|dk(  r"|dk(  rdd	|}n6|dk(  r|d	|}n)|d|}n!|dk(  rdd|}n|dk(  rdd|}n|d	|}d| v r| d   |d| d   d}|S )Nhistfuncr   r   orientationhr   vcountz of histnormsumprobabilityfractionpercentz weighted by z of sum of barnormz (normalized as ))r{   )ry   rz   roleoriginal_labellabelr   r   s          rW   get_decorated_labelr      s2   &tV44NUT	CKMT1d=6IS6PCKMT1d=6IS6P
#.ww"*E2EE$z"2">Z(
+u$=0.8% @!Y..6 >7? P.1;UCE*1:EBE*2E:Ei!</4d9oFELrY   c           
         dk(  sdk(  rt        d|    i dgd d       S dk(  sdk(  rCdk(  rd	nd
}t        d||    i t        dd      D cg c]  }| c}d dk(  rd      S d      S j                  d      ^}}dk(  rd}dk(  rd}d}dv rd}d}| |dz      dk(  rt               }n| |dz      j	                         }t        d| |   || |dz      fdd       S c c}w )Nr;   r8   F c                     |S rS   r`   tracer   s     rW   <lambda>zmake_mapping.<locals>.<lambda>       a rY   )rj   rk   rl   rm   ro   rn   rp   r9   r:   r   r   r     c                     |S rS   r`   r   s     rW   r   zmake_mapping.<locals>.<lambda>   r   rY   rowcol)rj   ro   rk   rl   rm   rn   rp   .r<   color_discretedashr>   )patternshaper?   _mapidentityT	_sequencec                 T    | j                  dj                  gz         |ii      S )Nr   )updatejoin)r   r   other_variablesparentro   s     rW   r   zmake_mapping.<locals>.<lambda>   s-    chhzO;<a@A"
 rY   )ri   rangesplitr   copy)	ry   ro   letterivprefixarg_namerl   r   r   s	    `     @@rW   make_mappingr      sd   <8/@#@$NT'
 	
 ;(k"9 K/S$N!&q$0Aa0'#{2%
 	
 9>
 	
 ,4>>#+>(VXGH7"6''"!Gf+-w'(--/Xg+,
 
 
' 1s   	C.c                 b   d| v r)| d   r$t        j                  ||j                  dd g      }|j                  j	                         xs i }d}d}|j
                  D ]  }| |   }	t        | |	|      }
|dk(  r|j                         D cg c]  \  }}|	r||	v rx|j                  t        j                  k7  st        | d   |      rL|j                  t        j                  k7  s+|	||	v s%t        | d   |   j                               | d   k  r||f }}}|D cg c]  \  }}t        t!        | |      |       c}}|d<   |j                  t        j"                  k(  s|d   D ]  }t        d	
      |d<    d|d<   d|d<   +|	4|dk(  r3d|vrt               |d<   ||	   |d   d<   d|d   d<   ||d   d<   d||
<   f|dk(  r&|j                  t        j$                  k(  sd|d<   |dk(  r&|j                  t        j$                  k(  sd|d<   |dk(  r| d   s| d   st        || d   | d   g   j'                               dkD  s|j)                  | d         }|| d      j*                  }|| d      j*                  }|j,                  j.                  t0        j2                  k(  r#|j5                  t0        j6                        dz  }nG|j,                  j.                  t0        j8                  k(  r 	 |j5                  t0        j:                        }|j,                  j.                  t0        j8                  k(  r 	 |j5                  t0        j:                        }t1        j>                  t1        j@                  t1        jB                  |      t1        jB                  |                  }|| d      |   |d<   tD        |	   } || d    || d      ||| d   | d   |      \  }}}t        |      t        |d         k(  sJ d!       ||d<   d|t!        | | d         <   d"|t!        | | d         <   |jG                  d#      r0|dd$ }|jI                  d%      rd&nd'}||vri ||<   ||	   ||   |<   |d(k(  rt        |	      d)kD  s3||	   |d*<   =|d+k(  rP|j                  t        j$                  t        jJ                  t        jL                  fvs||	   |d,<   |dk(  sd-}|d.k(  r|j                  t        j$                  t        jJ                  t        jL                  fvstO        |	t              }| jQ                  d(      xs g }|	D ]y  }|r|	|   s|| jQ                  d      | jQ                  d      | jQ                  d/      | jQ                  d0      fv rP	 | d(   jS                  |      }t        | |d      }d1|z  ||<   { t        |      d)kD  s||   |d*<   |d2k(  r|j                  t        jZ                  t        j\                  t        j^                  fv r||	   |d/<   d3|d4<   d5||
<   |j                  t        j`                  t        jb                  t        jd                  t        jf                  t        jh                  fv rd|vrt               |d<   | jQ                  d6      r||	   |d   d7<   d3|d   d4<   d8||
<   {g |d   d7<   | d9   | d9   j	                         }ni }||	   D ]P  }|jQ                  |      #| d:   t        |      t        | d:         z     ||<   |d   d7   jY                  ||          R d}|j                  t        j                  t        j                  fv rd;}||vrt               ||<   ||	   ||   d2<   d3||   d4<   d<|z  ||
<   V|d=k(  r
||	   |d><   e|d?k(  r||	   ||<   d@||
<   y|dAk(  r||	   ||<   |
dAk(  rdBn|
}dC||<   |dDk(  r||	   ||<   |
dDk(  rdEn|
}dF||<   |d>k(  r||	   ||<   |
d>k(  rdGn|
}dH||<   |dIk(  r{|j                  t        j`                  t        jb                  t        jd                  t        jf                  t        jh                  fv r||	   |dJ<   |
dIk(  rdKn|
}dL||<   F||	   ||<   P||	   ||<   dM|z  ||
<   b|j                  t        j$                  k(  r|dNv s5|j                  t        jJ                  t        jL                  fv s|d/k(  sdM|z  ||
<    |j                  t        j                  t        j                  fvrtk        |      } | d.   rtO        | d.   t              rt|j                         D ]a  \  }!}"tm        | |!      }#|#| d.   v s| d.   |#   d)   }$|$r*tO        |$tn              s8|"jq                  dOdP|$z        | |!<   Q| js                  |!      }%c | j                         D !"cg c]  \  }!}"|!dQz   |"z    }&}!}"|dRju                  |&      z   |dS<   |dSxx   dTz  cc<   ||fS c c}}w c c}}w # t<        $ r t=        d| d   z        w xY w# t<        $ r t=        d      w xY w# t<        tT        tV        f$ r  t        |      }|jY                  |       Y w xY wc c}"}!w )Ua:  Populates a dict with arguments to update trace

    Parameters
    ----------
    args : dict
        args to be used for the trace
    trace_spec : NamedTuple
        which kind of trace to be used (has constructor, marginal etc.
        attributes)
    trace_data : pandas DataFrame
        data
    mapping_labels : dict
        to be used for hovertemplate
    sizeref : float
        marker sizeref

    Returns
    -------
    trace_patch : dict
        dict to be used to update trace
    fit_results : dict
        fit information to be used for trendlines
    
line_closeNr   r   r3   
data_framedimensions_max_cardinality)r   r%   T)matchesaxisz%{x}z%{xaxis.title.text}z%{y}z%{yaxis.title.text}r   markerareasizemodesizerefz%{marker.size}
marginal_xr   
marginal_y	trendliner   r   byi ʚ;zCould not convert value of 'x' ('%s') into a numeric type. If 'x' contains stringified dates, please convert to a datetime column.z3Could not convert value of 'y' into a numeric type.trendline_optionsz/missing-data-handling failure in trendline codez%{y} <b>(trend)</b>error   minus
arrayminusarrayr4   r   
customdatar"   	hovertextz<b>%{hovertext}</b><br><br>r5   r   r   z%%{customdata[%d]}r<   
coloraxis1	coloraxisz%{z}color_is_continuouscolorsz%{color}rG   rF   linez%%{%s.color}r2   r(   r1   z%{location}r%   r   z%{value}r&   r   z	%{parent}idz%{id}r$   rQ   r   z%{label}z%%{%s}r   r   }z%s}=z<br>hovertemplatez<extra></extra>);pdconcatilocru   r   rt   r   r}   rs   go	Parcoordsr   Parcatslenuniquedictr{   Splom	Histogramdropnasort_valuesr%   r   typenp
datetime64astypeint64object_float64
ValueErrorlogical_not
logical_orisnantrendline_functions
startswithendswithHistogram2dHistogram2dContour
isinstancegetindexAttributeErrorKeyErrorappend
ChoroplethChoroplethmapChoroplethmapboxSunburstTreemapIciclePie
Funnelarear   r   strreplacepopr   )'ry   
trace_spec
trace_datamapping_labelsr   ru   fit_resultshover_header	attr_name
attr_value
attr_labelnamerz   dimsdsorted_trace_datar   r   non_missingtrendline_functiony_outerror_xyarrhover_is_dictcustomdata_colsr   positionattr_label_colmappingcat	colorable_labelmapping_labels_copykr   k_args	formatter_hover_liness'                                          rW   make_trace_kwargsr(     sh   0 t\ 2YY
JOOBQ,?@A
((--/52KKL%% h>	)_
(z9E
$ '1&6&6&8"T6#);**bll:%d<&8$? **bjj8".4:3E4-d3::<=89: vD " '+)"T6 9T40@)K% %%1$\2 3A $T 2AfI38>458>45#F";.,0FK)0::0FH%f-4:H%j13:H%i0-=z*l*))R\\9.4N7+l*))R\\9.4N7+k)IS	JS	49'=>EEGH1L )3(>(>$s)(>(L%)$s)4;;A)$s)4;;Aww||r}}4HHRXX.63 ! 4A ww||rzz1 ! 4A #%..bhhqk288A;?#K (9c'CK'PK$)<Z)H&7I01)$s)4S	S	#84E< u:#C(*  IHI  (-K$AGN9T49#=>AVN9T49#=>%%g.$Ra=&/&8&8&Alw;.,.K)-7
-CH%c*m+z?Q& 1;:0FK-l*))LLNN))2 
 0:*/EK,#r)'Dl*))LLNN))2 
 %/z4$@M&*hh}&=&CO) (C$ HHSM HHSM HHSM HHV,	#  %8'+M':'@'@'EH *=T3)M9M$:~6!( ?+a/ 5?4OL1g%))MM$$''. 
 (2*'=K$/;K,17N:.++KKJJIIFFMM0   {204H-xx 56:DZ:PH-h7=IH-k:5?z2:<H-h7 45A&*+?&@&E&E&GG&(G#-j#9 QC&{{3/7/34M/N$'L3t<U7V3W$W0" (1(;BB73<PQ !)I!--"**bll1KK$*	 315I.6@6LK	*73:FK	*;71?)1KN:.//%/
%;E"k))3J)?I&-:z*h&)3J)?I&$.($:
)3v&i')3J)?I&%/9%<*)4v&e#)3J)?I&!+u!4*)0v&g%))KKJJIIFFMM.  -7z,BK)(2g(=W:F-7N6*-7
-CK	*)3J)?I&-5	-Az*$$4j9P""r~~r7L7L&MMS  *2I)=N:&Qh>R bllBJJ%?? *.9*T,-?"F&,,. 	71%dA.T,// $\ 26 :1 =I %i556YYsEIDU5V/2/33A6	7 0C/H/H/JKtq!q3w{KK'3fkk+6N'NO$O$(99$##o)R  * ",!j"&s)!,#   * ", U# J !+NHE 8'*?';H+22378\ Ls=   Bh2!h8 h>i(i45j+>ii140j('j(c                 \   t         j                  t        t         j                  t        t         j
                  t        t         j                  t        t         j                  t        t         j                  t        t         j                  t        t         j                  t        t         j                  t        t         j                  t        t         j                   t        t         j"                  t$        t         j&                  t$        i}t(        D ]  }t*        ||<    ||v r ||   | ||       y y rS   )r   	Scatter3dconfigure_3d_axesScatterternaryconfigure_ternary_axesScatterpolarconfigure_polar_axesScatterpolarglBarpolar
Scattermapconfigure_mapr   
DensitymapScattermapboxconfigure_mapboxr   Densitymapbox
Scattergeoconfigure_geor   
cartesiansconfigure_cartesian_axes)ry   rs   rg   ordersconfiguratorsr   s         rW   configure_axesr>    s    
'
1
-
/
)
}
-
}
*
-
*
}
}M  43a4m#"k"4f5 $rY   c                 t   d|z   }d|z   }|| v r>| |   r9d|d<   || v rA| |   r<| |   D cg c]  }t        j                  |d       c}|d<   n|| v r| |   r| |   |d<   | |   |v rOd|d<   t        |t        j                  j
                        r|| |      nt        t        || |                  |d	<   y y c c}w )
Nlog_range_logr   
   r   r   categoryordercategoryarray)mathrB  r   r   layoutXAxislistreversed)ry   r   r   r<  log_key	range_keyr   s          rW   set_cartesian_axis_optsrM  *  s    voG6!I$4=Vi6:9oFTXXa_FDM	d	tIYWF|v '_ $		0 4< hvd6l345 	_ 	 Gs   B5c                    d| d   | d   fv rd|j                   d<   t        |j                        }t        |j                  d         }|j                  d      D ]  }t	        | |d	|        |j                  d
      D ]  }t	        | |d|        | d   r|j                  dddd |       | d   j                   j                  j                  |j                  | d   dk(  |       | d   j                   j                  j                  |j                  d|       | d   r|j                  dddd |       | d   j                   j                  j                  |j                  | d   dk(  |       | d   j                   j                  j                  |j                  d|       t        | | d	   d	      }| d   r|j                  |dd       n(t        d|dz         D ]  }|j                  ||d        t        | | d   d      }	| d   r|j                  |	dd       n(t        d|dz         D ]  }
|j                  |	d|
        d| v r| d   r|j                  d       d| v r| d   r|j                  d       d	t        |dz         z   }| d   r)t        d|dz   d      D ]  }|j                  |d |        | d   r*t        d|dz   d      D ]  }
|j                  dd |
        y y )N	histogramr   r   overlaybarmoder   r   r   r   r   r   Fr   )showticklabelsshowlineticksr   r   rC   )showgridr   T)rT  rU  rV  r   r   )rW  r   )
title_textr   r   log_xrB  r   log_y   )r   r   r   x2)r   r   r   )rG  r   	_grid_refselect_yaxesrM  select_xaxesupdate_yaxesyaxisrW  xaxisupdate_xaxesr   r   r  )ry   rg   r<  nrowsncolsrb  rc  y_titler   x_titler   	matches_ys               rW   !configure_cartesian_marginal_axesrj  =  s[   tL)4+=>> )

9Ea !E !!a!( :eS&9: !!a!( :eS&9: L 5$E 	 	
 
""((119d<&8K&GUS
""((119d6L 5$E 	 	
 
""((119d<&8K&GUS
""((119d6 "$S	37GLG:EAI& 	ACSa@	A "$S	37GLG:EAI& 	ACQC@	A $4=e$ $4=e$ c%!)n$ILEAIq) 	DCYTsC	D LEAIq) 	?CT#>	? rY   c                 d   d| v r| d   s	d| v r| d   rt        | ||       y t        | | d   d      }|j                  d      D ]"  }|j                  |       t	        | |d|       $ t        | | d   d      }|j                  d      D ]&  }d	| vr|j                  |       t	        | |d|       ( d
| v r| d
   r|j                  d       d| v r| d   r|j                  d       d	| v r|j                  d       d| v r.| d   dk(  r|j                  d       y |j                  d       y y )Nr   r   r   r   rR  rX  r   rS  is_timelinerY  rB  rZ  r[  dateecdfmoder   r   tozero)	rangemode)rj  r   r_  r   rM  r`  rd  ra  )ry   rg   r<  rg  rb  rh  rc  s          rW   r;  r;    sf   l!3l!3)$V< "$S	37G!!a!( :(eS&9:
 "$S	37G!!a!( :$LLGL,eS&9: $4=e$ $4=e$f%T#%x0x0	 rY   c                     |j                  t        t        | | d               t        t        | | d               t        t        | | d                      y )Nr   rl  r   r   )aaxisbaxiscaxis)update_ternariesr   r{   ry   rg   r<  s      rW   r-  r-    sN    id3i89id3i89id3i89  rY   c                 ~   t        t        | d   | d         t                     }dD ]#  \  }}| |   |v sd||   d<   || |      ||   d<   % |d	   }| d
   r5d|d<   | d   r8| d   D cg c]  }t        j                  |d       c}|d<   n| d   r| d   |d<   | d   r| d   |d<   |j                  |       y c c}w )N	directionstart_angle)ry  rotation)angularaxis
radialaxis))r   r}  )r   r|  r   rD  rE  r}  log_rrB  r   range_rrC  r   range_thetasector)r   rF  rB  update_polars)ry   rg   r<  patchvarr   r}  r   s           rW   r/  r/    s    4#4tM?RS6E
 E =	T9+2E$K(+1$s)+<E$K(=
 |$JG}"
6	?<@O"Lq488Ar?"LJw	?"&y/JwM}-he #Ms   *B:c                    t        t        t        | | d               t        t        | | d               t        t        | | d                     }dD ]x  }||dz      }| d|z      r;d	|d
<   | d|z      rA| d|z      D cg c]  }t        j                  |d       c}|d<   n| d|z      r| d|z      |d<   | |   |v sid|d<   || |      |d<   z |j	                  |       y c c}w )Nr   rl  r   r   )rc  rb  zaxis)r   r   r   r   r@  rB  r   rA  rC  r   r   rD  rE  )r   r{   rF  rB  update_scenes)ry   rg   r<  r  r   r   r   s          rW   r+  r+    s   id3i89id3i89id3i89E " 9Vf_%  DLHv%&:>x&?P:Q RQ!R RWHv%& $X%6 7W<6!$+D!$*4<$8D!9 e !Ss    C#c                     | d   }|sCd| v r?d| v r;t        | d   | d      j                         | d   | d      j                               }|j                  t        || d   | d          y )	Ncenterr/   r0   r   r/   r0   zoommapbox_style)accesstokenr  r  style)r   meanupdate_mapboxesrb   ry   rg   r<  r  s       rW   r6  r6    s    (^Fetm\"4;/446\"4;/446
  &\>"	  rY   c                     | d   }|sCd| v r?d| v r;t        | d   | d      j                         | d   | d      j                               }|j                  || d   | d          y )	Nr  r/   r0   r   r  r  	map_style)r  r  r  )r   r  update_mapsr  s       rW   r3  r3    s}    (^Fetm\"4;/446\"4;/446
 OO&\;  rY   c           
      b    |j                  | d   | d   | d   | d   t        | d                y )Nr  scope	fitboundsbasemap_visible
projectionrZ  )r  r  r  visibler  )update_geosr   rw  s      rW   r9  r9    s?    OOH~7m{#&'T,/0  rY   c                    fd}d| v r| d   rt        |j                        dkD  rd  |d      gdddd g |d      gd	ddgd
dddddddddd	g|j                  _        ddd
dt	        | | d         dz   idddddd|j                  D cg c]%  }|j
                  g |d      g|j
                  dd' c}d	g|j                  _        y y y y c c}w )Nc                 @    | t         j                  k7  ddd| dddS )N)durationredraw	immediateTlinear)r  easing)framemodefromcurrent
transition)r   Scatter)r  rs   s    rW   
frame_argsz0configure_animation_controls.<locals>.frame_args  s,    "*kRZZ6OP'/8D	
 	
rY   r8   r   i  z&#9654;animate)ry   r   methodr   z&#9724;leftrC  F   )r   tFbuttonsg?righttop)	r  ry  pad
showactiver   r   xanchorr   yanchorprefixr   <   )r   r  g?)	activer  r  currentvaluer  r   r   r   steps)r   framesrG  updatemenusr{   r  sliders)ry   rs   rg   r  fs    `   rW   configure_animation_controlsr    s1   
 D T*;%<SZZSTAT
 "&z# 7!*"+ #'A 7!*"+ $b)#!" )"


4  !id3D.EFL!  b) !ZZ 	 #$&&:a= 9!""+


3 BU%< Js   *Cc                    |t         j                  t         j                  fv ryd| v ru| d   dk(  s2| d   dk(  ret        | d         dkD  rT| j	                  d      dk7  r@| d   ;|t         j                  k(  rt         j
                  }d	|v r|d	= nt         j                  }t        |||d       g}d
D ]u  }d|z   | v s| d|z      sd }t        |dk(  rdnd|dk(  rdnd      }| d|z      dk(  r/t        t         j                  |d|z   gt        d-d|d||      }n| d|z      dk(  r+t        t         j                  |ddgt        |      |      }n|| d|z      dk(  r+t        t         j                  |ddgt        d      |      }nF| d|z      dk(  r;dd d
}t        t         j                  |ddgt        d!d"d!id#d$d%d&||   i'      |      }d"|v sd"| vr?d(|j                  vrt               |j                  d(<   | d)   d$   }	|	|j                  d(   d"<   |j                  |       x | j	                  d*      r0| j	                  d+d,      d,k(  r|j                  t        | |             |S ).Nrender_modewebglautor   r   
line_shapespliner8   r   r   	marginal_r   x1r]  r   y1y2)rc  rb  rO        ?)opacitybingrouprr   violinr"   r5   )
scalegroupboxT)notchedrugzline-ns-openzline-ew-openzrgba(255,255,255,0)r<   allr   pointsr=   )	fillcolorr   	boxpointsjitterhoveronr   r   rH   r   trendline_scoper   r`   )r   r  r.  r   r   	Scatterglr0  rq   r   r   ViolinBoxru   r   make_trendline_spec)
ry   rs   rt   ru   resultr   r	  axis_mapsymbolsfirst_default_colors
             rW   make_trace_specr  ?  s   rzz2??33D 7*]#v-\*+d2HH\*h6*+3 bjj( ll K/#M2 //UK>?F  0&4'Dv1E,FJ$md$mdH K&()[8& "!;#78 $ NS6 NX N#	
 kF*+x7& "		!<> $ 7#	
 kF*+u4& "!<> $T 2#	
 kF*+u4 .^D& "!<> $"7%'<="'  ( ('&/:! $
 %7$#6:#9#997;vJ**84&*+C&DQ&G#<O
&&x09MM*%a0&f xx*;W!E!P)$<=MrY   c                     t        |t        j                  k(  rt        j                  nt        j                  dgt	        d      d       }| d   rt	        | d         |j
                  d<   |S )Nr   lines)r  rr   trendline_color_overrider<   r   )rq   r   r  r  r   ru   )ry   rs   r	  s      rW   r  r    sd    ",,& LLZZmg&J &')-D9S4T)U
v&rY   c                      yNr   r`   r   s    rW   	one_groupr    s    rY   c                 J   t         j                  D ]   }|| v s| |   t        t         |      | |<   " | d   =t        j                  j
                  t        j                  j
                  | d<   nd| d<   	 t        j                  | d      | d<   d| v rw| d   Z| d   j                  j                  j                  r7| d   j                  j                  j                  D cg c]  }|d   	 c}| d<   | d   t        j                  | d<   d| v rR| d   5| d   j                  j                  r| d   j                  j                  | d<   | d   t        j                  | d<   d| v rv| d   W| d   j                   j"                  r>| d   j                   j"                  D cg c]  }|j$                  j&                   c}| d<   | d   rt)        | d         sg d| d<   d| v rv| d   W| d   j                   j"                  r>| d   j                   j"                  D cg c]  }|j*                  j,                   c}| d<   | d   rt)        | d         sg d	| d<   d
| v r| d
   a| d   j                   j.                  rH| d   j                   j.                  D cg c]"  }|j$                  j0                  j2                  $ c}| d
<   | d
   rt)        | d
         sg d| d
<   y y y # t        $ r) t        j                  j                  | d         | d<   Y }w xY wc c}w c c}w c c}w c c}w )NrC   plotlyrH   r   rF   rI   )circlediamondsquarer   crossrK   )soliddotr   longdashdashdotlongdashdotrM   )r   /\r   +r   )defaultsr_   getattrpio	templatesdefaultrx   r   rG  Template
colorscaler   Viridiscolorwayr   D3datascatterr   r=   anyr   r   barr   r   )ry   paramr   r  r  s        rW   apply_default_cascader    sX    ## 3D=T%[0!(E2DK3
 J==  ,"}}44D'D@==j)9:Z  4')*2Z ''22== #:.55@@KK.!.D)* ()1-7-?-?D)* D()*2tJ7G7N7N7W7W.2:.>.E.E.N.ND*+)*2.9nnD*+ D !"*tJ/?/D/D/L/L59*5E5J5J5R5R'*1%%'D"# %&c$7H2I.J&SD"#t#$%-$z2B2G2G2O2O15j1A1F1F1N1N*&-!!*D%& ()T:N5O1P*D%&  4'()1d:6F6K6K6O6O484D4I4I4M4M.-0

""((.D)* ,-S)*6
 .LD)*6
 (a  @99--d:.>?Z@. '*.s*   7K !LLL'L .LLc                 2    | |vr| S t        d| d| d      )Nz.A name conflict was encountered for argument 'z '. A column or index with name 'z' is ambiguous.)	NameError)
field_namereserved_namess     rW   _check_name_not_reservedr    s(    '@JJX
 	
rY   c                    | d   }t               }| D ]  }|t        vr|t        v r| |   n| |   g}|"|D ]  }|t        |t              r|j                  |       (t        |t        j                        r8|j                  }|sQt        ||      s^|||   u }|sh|j                  |       z||j                  u s|j                  |j                  |j                           |S )z
    This function builds a list of columns of the data_frame argument used
    as arguments, either as str/int arguments or given as columns
    (pandas series type).
    r   )setall_attrablesarray_attrablesr   r  addr   Seriesr  hasattrr   )ry   r   r
  fieldr$   argr   in_dfs           rW   _get_reserved_col_namesr    s     
l	BUN -%$7Ud5k]= 	-C{C%""3'C+88H 52h</E&**84SXX%9""388,	--( rY   c                 N   | t        |t              st        |t              ryt        |t        j                        ry	 t        |       |D ]7  }t        |t              st        |t              r	| || vs* y	 t        |       9 y# t        $ r Y yw xY w# t        $ r Y  yw xY w)zReturns True if arg looks like it's a list of columns or references to columns
    in df_input, and False otherwise (in which case it's assumed to be a single column
    or reference to a column).
    FT)r   r  intr   
MultiIndexiter	TypeError)columnsr  r   s      rW   _is_col_listr    s    
 {jc*jc.B#r}}%S	  aAs!3!7"2Q     s$    B :B	BB	B$#B$c                     t        | t              s0t        | t              rt        |       dk(  st        | t              s| yy)zReturns True if x is an iterable which can be transformed into a pandas Series,
    False for the other types of possible values of a `hover_data` dict.
    A tuple of length 2 is a special case corresponding to a (format, data) tuple.
    r\  FT)r   r  tupler   boolr  s    rW   _isinstance_listliker!  ,  s7     	1cq% SVq[a9rY   c                 <    | || v s||v rd|z   }| 
|| v r||v r|S )Nr&  r`   )r  r   extras      rW   _escape_col_namer$  <  s:    

8w#6(e:K> 
8w#6(e:KOrY   c                 P    t        j                  | |      j                  d      S )aU  
    assuming x is list-like or even an existing pd.Series, return a new pd.Series with
    no index, without extracting the data from an existing Series via numpy, which
    seems to mangle datetime columns. Stripping the index from existing pd.Series is
    required to get things to match up right in the new DataFrame we're building
    r  T)drop)r   r  reset_index)r   r  s     rW   to_unindexed_seriesr)  B  s#     99QT"..D.99rY   c                 @   | d   }|du}i }i }g }t               }	|rt        |       n	t               }
d| v r5| d   0|st        d      |j                         D ci c]  \  }}||
 }}}d| v xr | d   xr t	        | d   t
              }|rr| d   D ]j  }t        | d   |         rd| d   |   f| d   |<   t	        | d   |   t              s| d   |   df| d   |<   |sM| d   |   d   Y||v s^t        d|z         t        D ]Y  }|t        vr| j                  |      gn| j                  |      }||dgu r7|t        vr|gn0t        t        |            D cg c]  }|d	z   t        |      z    c}}t        t        ||            D ]  \  }\  }}t        |      r t        |t!        t#        |                     nd
}|:d}t	        |t$        j&                        rt)        d|z        t	        |t*              st	        |t,              rat/        |j0                  t        |j0                        n||
      }t	        |t*              r|j2                  ||<   n|j5                  |       nt	        |t              st7        |d      sa|dk(  r|r| d   t        |         d   rt        |      }| d   |   d   }|rIt        |      |k7  r;t        d|t        |      t        t9        |j;                                     |fz        t=        ||      ||<   n|st        d|z        ||j>                  vrF|r|||fv rd|dt        t9        |j>                              d|}|dk(  r|dz  }t        |      |rOt        ||         |k7  r>t        d|t        ||         t        t9        |j;                                     |fz        t        |      }t=        ||   |      ||<   n|rt7        |d      r~||j@                  u r9|jB                  |jB                  |v rd}n|jB                  }tE        ||||g      }n7|jB                  +|jB                  |v r|||jB                     u r|jB                  }|t/        ||
      }|rIt        |      |k7  r;t        d|t        |      t        t9        |j;                                     |fz        t=        |t        |            |t        |      <   |J d       |t        vrt        |      | |<   n%t	        | |   t
              rnt        |      | |   |<   |dk7  s|	jG                  t        |              \ t        |      r t        |t!        t#        |                     nd
}|jI                  |D ci c]  }|t=        t        |      |       c}       |jI                  |D ci c]  }|t=        ||   g|z  |       c}       t%        jJ                  |      }||	fS c c}}w c c}w c c}w c c}w )ac  
    After this function runs, the `all_attrables` keys of `args` all contain only
    references to columns of `df_output`. This function handles the extraction of data
    from `args["attrable"]` and column-name-generation as appropriate, and adds the
    data to `df_output` and then replaces `args["attrable"]` with the appropriate
    reference.
    r   Nr3   zjNo data were provided. Please provide data either with the `data_frame` or with the `dimensions` argument.r5   Tr   zIAmbiguous input: values for '%s' appear both in hover_data and data_framer&  r   ziArgument '%s' is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.__len__zAll arguments should have the same length. The length of hover_data key `%s` is %d, whereas the length of previously-processed arguments %s is %dzString or int arguments are only possible when a DataFrame or an array is provided in the `data_frame` argument. No DataFrame was provided, but argument '%s' is of type str or int.z
Value of 'z?' is not the name of a column in 'data_frame'. Expected one of z but received: r   z6
 To use the index, pass it in directly as `df.index`.zAll arguments should have the same length. The length of column argument `df[%s]` is %d, whereas the length of  previously-processed arguments %s is %dr  zAll arguments should have the same length. The length of argument `%s` is %d, whereas the length of  previously-processed arguments %s is %dzData-frame processing failure, likely due to a internal bug. Please report this to https://github.com/plotly/plotly.py/issues/new and we will try to replicate and fix it.r7   )&r  r  r   r}   r   r   r!  r  r  r  r   r   r   r  	enumeratezipnextr  r   r  r  r   r   r  r   r   r   r  rI  keysr)  r  r   r  r$  r  r   	DataFrame)ry   	wide_modevar_name
value_namedf_inputdf_provided	df_output	constantsrangeswide_id_varsr
  r   serieshover_data_is_dictr#  r	  argument_listr   
field_listargumentr  lengthr   real_argumenterr_msgs                            rW   process_args_into_dataframerB  L  s    L!H$&K
 IIF5L6A,T2suN t\ 2 :|  9A8HIffIII 	 	1	1tL)40  l# 		A#D$6q$9:)-tL/A!/D(E\"1%d<03U;)-l);A)>(E\"1%tL1!4Q7CX _ 		 $ S0
 0 XXj!"*% 	  MdV$;
 0 L5:3};M5NO*s"SV+O 	 %.c-.L$M @	0 A %>A)nS4Y#89:RSFH(BMM2%',-  (H-He1L3+3>>+EC'5" h1*2..Ih'MM(+Hc*'(I2N,.*\*3x=9!<H  #8}H$($6x$@$CM#m"4">(P !) #M 2 #D)9$: ; &	
 
 +>mX*VIh'$$6 9>>  X%5%55 X*h1G%G 
  %c$x/?/?*@&A8M  
 $w.#'``G(11HX$6 76 A$M " 23Y^^%5 67"	
 
  #8}H*= *H+Ih'
 78V#<8>>1#==0HMMX4M'.H'/}}H#3$h:0F$
 %MM5 ( 9 (HX]],C C'/}}H#7~NHc(mv5$M !#h-T)..:J5K1LfUV  ,?xX+W	#h-( ' (' 0#&x=Z D,d3&)(mZ #_,  X/A@	0'S0j 7:)nS4Y012!FPVWH&uV}h?	?W  &	
  )9X+>*?&*H(SS	
 Y'Il""o JH PP 	X	
s   XXXXc                 f  # | D ]h  }|t         v s| |   t        | |   t              rt        | |         | |<   7|dv rt        | |   t              r
| |   g| |<   Xt	        | |         | |<   j | d   du}d}|rut        | d   t
        j                        sWt        | d   d      r~t        j                  t
        j                        t        j                  d      k\  rEddl}| d   }|j                         | d<   t        j                  | d   j                               #d}nt        | d   d	      r&| d   j                         | d<   | d   j                   #nt        | d   d
      r&| d   j#                         | d<   | d   j                   #ntt        | d   d      r&| d   j%                         | d<   | d   j                   #n?t        j                  | d         | d<   | d   j                   #n|r| d   j                   #nd#| d   }| j'                  d      du }| j'                  d      du }	|rdnt)        #| d         }
|	rdnt)        #| d         }d}d}d}d}t*        j,                  t*        j.                  g}|t*        j0                  k(  xs d| v }|t2        v rR|
r|rt5        d      |r|r|	rd}t        #t
        j6                        rt9        d      t	        #      | d<   t        #t
        j                        r#j:                  }nd}|dv s|#v rd}|t*        j<                  k(  r| j'                  d      xs d}n| j'                  d      xs d}|| d<   d| d<   n|
|k7  rd}|r| d   n| d   | d<   |r| d   #u r#j:                  }t        | d   t
        j                        rt	        | d         | d<   |dv s|r|#v rd}|r|
rdnd}n|rdnd}d| |rdnd<   d| d<   |s|	s|rdnd}|rt?        #dg       }t?        #|g       }|r	 |st        | d   d      s0t
        j@                  jB                  jE                  | d         | d<   n| jG                         D ch c]  }t        |t              s|#v s| }}| D ].  }| |   	|t         v s|jI                  #fd| |   D               0 t	        |      #t
        j@                  jB                  jE                  | d   jK                  #            | d<   | d   }d}|t*        jP                  t*        jR                  t*        j<                  g|z   v r|s|sa||	k7  r\dD ]W  }| j'                  |      |r|jT                  n	tW               | |<   |t*        jR                  k(  r|}F| d   L|dk(  rdnd| d<   Y |rr|p||	k7  r| d   	|rdnd| d<   |r?t        |jT                  t
        j6                        rt9        d      |jT                  | d<   ntW        t?        |d||g             | d<   d}tY        | j'                  d!            t        k(  r| d!   tZ        k(  rd}d| d!<   t]        | |||      \  }}t?        |d"||g      }|sI|rG|t*        jR                  k(  r4|dk(  rdnd}t_        || |         s|| |<   d#||<   n| d   |dk(  rdnd| d<   ||v r| d= |r
| d   D cg c]	  }||vs| }}| d= |dk(  r| d   }n|dk(  r| d   }n| d   }| d= d}|D ]8  } ||    j`                  jb                  }!|!d$v rd%n|!}!||!})||!k7  s/t5        d&       |je                  ||||'      }tg        |j                         tg        ti        |j                               k(  sJ d(       ||   jk                  t              ||<   dk(  }"|r || |"rdnd<   || |"rdnd<   | d!   xs || d!<   n|t*        jP                  t*        j<                  g|z   v rB|| |"rdnd<   || |"rdnd<   |t*        j,                  k7  r| d!   xs || d!<   d)| v r| d)   xs || d)<   n|t*        jR                  k(  rOt_        ||      r|| |"rdnd<   || |"rdnd<   | d!   xs || d!<   n\|| |"rdnd<   || |"rdnd<   d#||<   | d!   xs || d!<   n8|t*        jl                  t*        jn                  fv r|xs || |"rdnd<   || |"rdnd<   |rQ|t*        jP                  k(  r>| d   | d   d*| d+<   n.| d   d| d+<   d| d<   || d<   d#||<   nd| d+<   d| d<   || d<   d#||<   |rd| d!<   || d<   | S c c}w # tL        tN        f$ rm}t        d
      r|j#                         | d<   nBt        |d      r|j%                         | d<   n"t        |d	      r|j                         | d<   n|Y d}~d}~ww xY wc c}w ),a  
    Constructs a dataframe and modifies `args` in-place.

    The argument values in `args` can be either strings corresponding to
    existing columns of a dataframe, or data arrays (lists, numpy arrays,
    pandas columns, series).

    Parameters
    ----------
    args : OrderedDict
        arguments passed to the px function and subsequently modified
    constructor : graph_object trace class
        the trace type selected for this figure
    N)r4   r5   r   F__dataframe__z2.0.2r   T	to_pandastoPandasto_pandas_dfr   r   ro  zPCannot accept list of column references or list of columns for both `x` and `y`.znData frame columns is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.r7   )Nr   r   ro   r   r   r   r'   __x____y__r   select_columns_by_namec              3   ,   K   | ]  }|v s|  y wrS   r`   ).0r   r  s     rW   	<genexpr>z"build_dataframe.<locals>.<genexpr>  s     0Xq1PW<0Xs   	r   zlData frame index is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.r   )r   r<   r   r   )r   r  unumberzLPlotly Express cannot process wide-form data with columns of different type.)id_vars
value_varsr2  r3  zWide-mode name-inference failure, likely due to a internal bug. Please report this to https://github.com/plotly/plotly.py/issues/new and we will try to replicate and fix it.r;   r   r   )8r  r   r   r  rI  r   r0  r  r   parse__version__pandas.api.interchangerD  Indexcolumn_namesrE  r  rF  rG  r   r  r   r   r   r   r:  r   r  r  r  Funnelr$  apiinterchangefrom_dataframer%   r   rJ  ImportErrorNotImplementedErrorr  Barr   r   r   NO_COLORrB  r   r   r   meltr   r  r   r  r  )$ry   rs   r  r5  needs_interchangingpandasdf_not_pandasr4  no_xno_ywide_xwide_yr1  r2  wide_cross_namer3  hist2d_typeshist1d_orientationwide_orientationr   necessary_columnsexcmissing_bar_dimaxno_colorr6  r9  
count_name	other_dimr   wide_value_varsr   r   v_dtypeorient_vr  s$                                      @rW   build_dataframeru  "  s
   "  	0O#U(?$u+t,"4;/U77JUS=  $E{mU"4;/U	0 |$D0K:d<&8",,G4%7GMMNN=
]]7#=$ * .M!.!<!<!>D
 hhtL1>>@AG"&T,'5!%l!3!=!=!?D<(00GT,'4!%l!3!<!<!>D<(00GT,'8!%l!3!@!@!BD<(00G!#d<.@!AD<(00G	|$,,L!H 88C=D D88C=D DUWd3i @FUWd3i @FIHOJNNB$9$9:L$4J
d8Jj fb  4DI'2==1% 
 %)MD!'288,"<<33x77J%bii'#'88M#:#Ac #'88M#:#Ac "2D!%DvI17DIT#YD!tO4?"<<$/:(,T/-B(C_%33G 3%!*03c *03c +/DC(!%D-3'%gw;
#GXr:	\(:<T U%'VV%7%7%F%F&&\"  ${{}%
1c0BqG|A%! % " YEE{.5O3K)000XDK0XXY 01%'VV%7%7%F%F&==gF&\"$ L!HO

BFFBII6EE"ddl  L88B<'1<x~~%'DH"bff,*,.69;s#D/L 0t|] 3 ;-1cs]#hnnbmm<#) 
 &.^^\"%**8Wx>TU&\" HDHHW#%$w-8*CW :i:I| ")Wx6LMJ[BFF-B
 +c1Cs	ii9$.D!$%Ij! M"*-<-Cc]#l" '+?&;Uq?T1UU!g%"3iO'"3iO"<0O  	Al((--G")_"<h'G}'! b 	 NN &!	 # 
	 9$$%S1B1B-C)DD 	
$	
D (188=	(#s*-7Dc*-<Dc* M5XDMRZZ3lBB-<Dc*-7Dc*bnn, $W 9Wt#%),%7%C8\"BFF"i41@HS#.1;HS#. $W 9W1;HS#.1;HS#.()	*% $W 9WRYY//-<-HDc*-7Dc*kRZZ79 T#Y%:$D#Y#D"%D"DI$%Ij!#D"%D"DI$%Ij!W"DKU% 01 	 }j1%2%;%;%=\"7%2%?%?%A\"4%2%<%<%>\"		h VsQ   Ad/ #d*9d*>d*d/ d/ A(d/ 	f.f.*d/ /f+>A"f&&f+c                    | j                  t        | j                              }|j                         }|j	                  t
              }t        j                  |j                  d      j                        d   }|D ]b  }|j                  |   }t        j                  |j                        d   d   }||d  j                         rKt        d|j                  |          d||<   t        |j                  d d            }t        |d d       D ]4  \  }}||dz      |v s|dz   |v st        d	|j                  |dz      d
       y )Nr   r   )r   r   z*None entries cannot have not-None childrenr   c                 $    dj                  |       S r  )r   r  s    rW   r   z-_check_dataframe_all_leaves.<locals>.<lambda>e  s     rY   z4Non-leaves rows are not permitted in the dataframe 
zis not a leaf.)r   rI  r  isnullr   r  r   nonzeror  r%   r   r  r   applyr,  )r   	df_sorted	null_masknull_indicesnull_row_indexr   r   row_stringss           rW   _check_dataframe_all_leavesr  W  sC   $rzz"23I  "I  %I::immm3::;A>L& nn^,JJszz"1%a(12w{{}<~. 	 Iiy';!DEKK,- 3q1u$!a%L)@Gq1u%  rY   c                    | d   | d   ddd   }t        |ddd             d}g }|D ]   }|dz   }|j                  |       |   |<   " |}d }i }d}| d   rP	 t        j                  | d            | d   <   | d
   r#| d
   | d   k(  r| d   dz   }	| d      |	<   |	| d<   | d   nUdj
                  vrdn:dj                  t        j
                        D 
cg c]  }
t        |
       c}
      d<   | d<   d|<   | d
   r$t        | d
         s|}d}nfd}|}||| d
   <   t        t        j
                        j                  |            }|D ]  }||vs|||<    t        t        |      t        g d      z
        }t        j                  g d|z         }|D ]&  }||   j                  |   j                        ||<   ( t        |      D ]  \  }}t        j                  |j
                        }j!                  ||d       j#                  |      }|j%                         }||   j'                         j                  t              |d<   d|d<   ||   j'                         j                  t              |d<   |t)        |      dz
  k  r|dz   }|t)        |      k  r~|||      j'                         j                  t              dz   |d   z   |d<   |||      j'                         j                  t              dz   |d   z   |d<   |dz  }|t)        |      k  r~|d   j                  j+                  d      |d<   |r||   ||<   t        j,                  ||gd      } | d
   rV|rTd}||j
                  v r|dz  }||j
                  v r| d
      j                  t              ||<   |j/                  |      }|| d<   d| d<   d| d<   d| d<   d| d<   | d
   r^| d   s| d
   g| d<   | S t1        | d   t2              r$| d   j5                  | d
         sd | d   | d
   <   | S | d   j                  | d
          | S # t        $ r t	        d	| d   z        w xY wc c}
w )!z^
    Build dataframe for sunburst, treemap, or icicle when the path argument is provided.
    r   r6   Nrx  F
_path_copyc                 J    | j                         }t        |      dk(  r|d   S y)Nr   r   z(?))r   r   )r   uniquess     rW   aggfunc_discretez5process_dataframe_hierarchy.<locals>.aggfunc_discrete  s&    ((*w<11:rY   r%   zDColumn `%s` of `df` could not be converted to a numerical data type.r<   _sumr   r   r   r   Tc                 d    t        j                  | j                  | j                  f         S )N)weights)r   averagelocr   )r   count_colnamer   s    rW   aggfunc_continuousz7process_dataframe_hierarchy.<locals>.aggfunc_continuous  s&    zz!RVVAGG]4J-KLLrY   )rQ   r   r   )r  rQ   r   r   r  )ignore_indexsort_color_if_discrete_color0r   r(   r$   r&   r5   )TN)r  r   r   
to_numericr   r  r   rI  r  r   r  
differencer0  r   r   r,  groupbyaggr(  r   r   rstripr   r   r   r   r   )ry   r6   discrete_colornew_pathr   new_col_namer  agg_faggfunc_colornew_value_col_nameelr  colsr   df_all_treesr   leveldf_treedfgjsort_col_namer  r   s                        @@rW   process_dataframe_hierarchyr  o  s    
l	B<"D4":/NH (,.%h<<( D EMH~	!#r$x./A!BBtH~ =G}X.%)(^f%<")+DN);%&!3XX bjj( D,<=b#b'=> 	 =&X E-G}b$w-0,M!NM /M,d7m BJJ**401D *e)E#J* D	C :;;<D<<(BT(IJL D(-44RW]]CSDdO M5,,|';';<jjab"&&u-ooJOO-44S9E
)005s4y1}AAc$i-QL%%'..s3c9GH<MM ! !$DG 1 1 3 : :3 ?# EPT UQ c$i- $H-1188=IGDMyy,!8tL)M. G}6|333S M |333&(g&7&>&>s&C]##//=/A &DDLDKDMDOG}L!"&w-D K \*D1%))$w-84@\"4=1 K %%d7m4K{  	Vx.! 	$ >s   !Q  Q3Q0c                    d| d<   | d   | d   t        d      	 t        j                  | d   | d            }t        j                  | d   | d            }||z
  j	                  d      t        j                  d	d
      z  | d   | d   <   | d   | d<   | d= | d   | d<   | d= | S # t         t        f$ r t        d      w xY w)z8
    Massage input for bar traces for px.timeline()
    Trm  r    r!   z#Both x_start and x_end are requiredr   zCBoth x_start and x_end must refer to data convertible to datetimes.ztimedelta64[ns]r   msr   r   )r   r   to_datetimer  r   r   timedelta64)ry   r    r!   s      rW   process_dataframe_timeliner    s     DI$w-"7>??
..l!3DO!DEtL1$w-@A */(@(@)
q$) DtG}% WDIW	?DLYK 	" 
Q
 	

s   <B$ $B?c                    | j                  d      }|| |fS | d   j                  |i       j                         }|s| |fS | d   }d|d<   d|d<   t        ||   j                               }t	        j
                  t        |      |z         D cg c]	  }||v s| }}|j                  |      j                  |   j                         | d<   | |fS c c}w )Nr$   rP   r   Fsort	clockwisery  )	r   r   rI  r   r   fromkeys	set_indexr  r(  )ry   ru   r$   order_inr   r  r   orders           rW   process_dataframe_pier    s    HHWE}[  %&**5"5::<H[  	l	BK*K2e9##%&G#,,T(^g-EFW1!w,QWEWe,007CCED Xs   	CCc                 x   t         t        z   D cg c]	  }|| v s| }}g }d}d| v r'| d   r"| d   | d      j                         | d   dz  z  }d| v rd| v rd| vr|j                  d       n| d   r)t	        | d   | d         r|j                  d       d	| d
<   n|t
        j                  t
        j                  t
        j                  fv r|j                  d       d| d
<   n|j                  d       nd| v s|t
        j                  k(  r|j                  d       nk|t
        j                  t
        j                  fv r8|j                  d       | d   r3| d   g | d<   | d   j                  | d          n|j                  d       t        d|v xro | d   xrh |t
        j                  t
        j                  fvxrD |t
        j                  t
        j                  t
        j                  fvxs | j                  d
            }nd}d| v r|j                  d       d| v r|j                  d       d| v r6|t
        j                  fv r|j                  d       n|j                  d       d| v r| d   d u}	| d   d u}
| d   u|t
        j                  t
        j                  fv r
|
rQ|	sOd| d<   nI|t
        j                   t
        j"                  t
        j$                  t
        j&                  fv r	|	r|
sd| d<   | d   :|	r8|
r6t	        | d   | d         }t	        | d   | d         }|r|sd| d<   |r|sd| d<   | d   d| d<   |t
        j                  k(  rA|	r|
r| d   
dx| d<   |d<   | d   }| d   }|dk(  r|nd |d<   |dk(  rd n||d <   |dk(  rdnd|d!<   | d   |d<   |t
        j                   t
        j"                  fv r\|t
        j"                  k(  rd"nd#}||   6| d   1| d   | d   k(  r| d   dk(  rd$||<   n| d   | d   k(  r| d   dk(  rd$||<   ||   d%||<   |t
        j(                  k(  r| d&   | d   
dx| d<   |d<   | j                  d'd      durn|t
        j(                  t
        j                  fv rd&}n"|t
        j$                  k(  r| d   dk(  rdnd}nd(}| d'   d	u rd)|z   d*z   |d+<   nd)|z   d,z   | d'   z   d*z   |d+<   |t
        j(                  t
        j*                  t
        j,                  fv rd	}d-|d.<   d/| v r| d/   d0| v r| d0   d$k(  rzt/        d12      |d3<   nj|t
        j*                  t
        j,                  t
        j                  t
        j&                  t
        j                  fv r	| d/   |d/<   nt/        | d/   2      |d3<   d| v sd| v rt1               }| j                  d4d	      r|j3                  d4       | j                  d5      s"| j                  d      s| j                  d6      r|j3                  d6       | j                  d5      r|j3                  d5       t5        |      dk(  r|j3                  d4       d7j7                  t9        |            |d8<   nH|t
        j:                  k7  r5d| v s"|t
        j<                  t
        j>                  fv rd6| d5   rd9nd:z   |d8<   d;| v rt/        | d;   <      |d=<   nd>| v rt/        | d>   d?k(  rd@ndA<      |d=<   dB| v r.| dC   |dC<   tA        | dB   dD      s| dB   n| dB   jB                  |dB<   dE| v r%| d   dk(  rdFndG}| d   dk(  rdFndG}| dE   | |<   d | |<   t5        | d         dk(  r
d x| dH<   | dI<   | j                  dI      | j                  dG      d | dG<   | j                  dH      | j                  dF      d | dF<   | j                  dF      "| j                  dG      | j                  dH      d| dJ<   dK| v r6| dK   1| dK   tD        vr&tG        dL| dK   dMtD        jI                               dN| v r| dN   t/               | dN<   dO| v r0| j                  dOd       dPvrtG        dQdR| dO   z  z         | dO   | dS<   tJ        D ]  }|| v s|j                  |        |D cg c]  }tM        | |       }}tO        | |||      }||||fS c c}w c c}w )TNr   r   r   rO   r\  r<   rH   rF   Tr   Fzmarker.colorr;   z
line.colorr5   r>   z	line.dashr=   zmarker.symbolr?   zfillpattern.shapezmarker.pattern.shaper   r   r   r   r   r   r   nbinsnbinsxnbinsyr  boxmode
violinmoderP  groupr   	text_autor   z%{r   texttemplate:r   r   r  rQ  r  )r  r   r  r#   markersr  r  z+textr   r  )r   r   ro  rJ  vhhvgeojsonfeatureidkey__geo_interface__rv   r   r   r9   r:   facet_col_wrapr   zValue 'z!' for `trendline` must be one of r   ecdfnorm)Nr   r   z<`ecdfnorm` must be one of None, 'percent' or 'probability'. z'%s' was provided.r   )(direct_attrablesr  maxr   r   r   r  r  r  r   r  r  r   r   r  r   r  r  r]  rW  r   r4  r7  r   r  r  r   r   sortedr   r2  r5  r  r  r   r   r/  group_attrablesr   r  )ry   rs   ru   layout_patchr#  rt   grouped_attrsr   show_colorbarhas_xhas_yx_is_continuousy_is_continuousr   r  r  r   modesr  other_positionr   grouped_mappingstrace_specss                          rW   infer_configr    s	   (?:H1a4iQHEHM G~$v,|$T&\26684
;Kq;PP $#t+(4W%=^D4FW%VLL)26D./ R[["**bii$HHLL)27D./!((8T![B4I4I%I  .RVVR]]33LL!G}%-)+D&\"))$w-8  0u WBFFBMM#:: BJJRYY#GG 38812
 d[)4_-$2::,&  !45  !78S	%S	%&r||RZZ88*-D'BFFBFFBII FF*-D'&5U,T,-?cKO,T,-?cKO&)]#&)]#&"%D",,&4
#3#;=BBZ ;z#:}-KME-8C-?ETK!,73,>DEK!-8C-?cSK
#%)-%8M"299bff-- +rvv 59<DD!)d7m.G9W-$}2E2L)2L&#Y$w-/D4G34N)2L&D!)%,T" 	r~~%I!$5::Z;z2xxU#502>>2+@+@AAFBFF" /36SCFF$*.-#*=K'*.-#*=[@Q*QTW*WK'r~~r}}b6F6FGG#/K D	?"D T)_	%A(,S(9H%MMFFIIMM
 
 &*)_K	"$(i$AK!t 388GT"IIg88Ftxx1TXXi5HIIi 88FIIfu:?IIg!hhve}5F		 DKBMM2;K;K+LL'd6l7KFt"l);<F	t	"z*j8$d
F D&*>&:N# 4	?,?@ Oi22 	I T#'#6##=<<)-m)<)Cj)X#^ 4!#044[D- xx(TXXl-C-O!\xx(TXXl-C-O!\ 	*88L!-88K ,!"dtK0<$77$&9&>&>&@B 
 d"t,?'@'H$(F !T88J%-MMN&j)99:   
+Z  $9  #$
 8EE!T1-EE "$UKHK('=@@A Ix Fs   	b2b2	b7c           	         d| vri n| d   j                         g }t               }|D ]  t        k(  r|j                  d       |vr"t	        | d      j                               |<   |   }t        |      dk(  r|j                  |d          vr|<   ut	        t        j                  t	                 |z               <    | d   }t        |      t        |      k(  rt        |      |i}|fS |D cg c]  }|t        k7  s| }}|j                  |dd      }	|	j                  }
|
D cg c]  }t        |      dk7  r|n|f }}t        t	        t        |                  D ]  \  t        |fd	
      } |D cg c]  }t	        |       }}t        |      D ](  \  t        k(  s|D ]  }|j                  d        * |D cg c]  }t        |       }}i }t!        ||      D ]^  \  }}t        |      dkD  r|	j#                  |      ||<   )t$        r|	j#                  |d   f      ||<   H|	j#                  |d         ||<   ` |fS c c}w c c}w c c}w c c}w )a  
    `orders` is the user-supplied ordering with the remaining data-frame-supplied
    ordering appended if the column is used for grouping. It includes anything the user
    gave, for any variable, including values not present in the dataset. It's a dict
    where the keys are e.g. "x" or "color"

    `groups` is the dicts of groups, ordered by the order above. Its keys are
    tuples like [("value1", ""), ("value2", "")] where each tuple contains the name
    of a single dimension-group
    rP   r   r   r   r   FT)r  observedc                 J    |       v r   j                  |          S dS )Nrx  r   )gr   r   r<  s    rW   r   z'get_groups_and_orders.<locals>.<lambda>)  s.    19LfSk//!5 RT rY   r~   )r   r   r  r   rI  r   r   r   r  r  r  indicesrJ  r,  r  insertr-  	get_grouppandas_2_2_0)ry   rk   single_group_nameunique_cacher  r   groupsr  required_groupergroupedgroup_indicessorted_group_namesr  full_sorted_group_namessfsr   r   r<  s                   @@@rW   get_groups_and_ordersr    s    %D0Rd;L6M6R6R6TF 6L V)$$R(,&$(l);C)@)G)G)I$JS!"3'G7|q !((4& %s";#7#7VC[8IG8S#TUsV 
l	B
W-)*B/D 6>A (/A!!y.AAA**54  
  ?L
:;%&!+A!5
 
 tI.>$?@A 	FAs!'"T"	 5G"Gq47"G"G( 	$FAsi0 $AHHQO$	$ 6M"M58"M"M02DE 	9EB1vz$..q1r
!(!2!2AaD7!;F2J!(!2!21Q4!8F2J	9 6>A B

 #H
 #Ns   I(I(<I-I2!I7c                    7 |xs i }|xs i }t                t         |       |t        j                  t        j                  t        j
                  fv r d   t                |t        j                  fv rt         |      \   }|dk(  rt        j                  }t                t         |||      \  }}}}|D cg c]  }|j                  xs t         c}xs t        g}	t         |	      \  }
7g }g }dx}}|D ]&  }|j                  7vr|j                  d   |j                   d<   /7|j                     }|j"                  dk(  r8t%          d         dz   }|D cg c]  }|t'        |      z    }}t)        |      }|j"                  d	k(  r8t%          d
         dz   }|D cg c]  }|t'        |      z    }}t)        |      }|D ]V  }||j                   vs|j                  t)        |j                         t)        |j                        z     |j                   |<   X ) t+         |       j,                        }i }t/               }g }d } j1                  dd      }|
j3                         D ]  \  }}t/               }t/               }d}t5        |	||      D ]p  \  }}}|t        k7  st%         |      }t7        |j                   t8              s(t'        |      ||<   |j:                  rt'        |      ||<   |j<                  dk(  so|}r dj?                  |jA                               } ||vrtC               ||<   ||   }!|D ]   }"|"jE                  |       }#|"jD                  t        jF                  t        jH                  t        jJ                  t        jL                  t        jN                  t        jP                  t        jR                  t        jT                  t        j                  t        j                  t        j
                  fvr|#jW                  | | dk7  xr | |!v       |"jD                  t        j                  t        jX                  t        jZ                  t        j\                  fv r|#jW                  d|        |!j_                  |        d|#_0        d|#_1        te        |      D ]  \  }$}||$   }	 |jg                  |#|j                   |          |j"                  d	k(  r|j                   |   }%n% j1                  d      |"jl                  dk7  rd}%nd}%|j"                  dk(  r(|j                   |   }|r+d|dz
  |z  z   }%d|dz
  |z  z   }n|"jl                  dk(  rd}nd}|%dkD  r|%|#_0        |dkD  s||#_1         |d   jD                  t        jn                  k(  rc|"jD                  t        jZ                  k(  rF|#jp                  jr                  r0|#jW                  tk        |#jp                  jr                               d v rԉ d   dk(  r d   n d   }& d   d k(  r d   n d   }' j1                  dd!      d"k7  }(|ju                  |&|(#      }||'   jw                         })||'   jy                         ||'<   |(s|ju                  |&d#      } j1                  dd!      d$k(  r|)||'   z
  ||'<    d%   d&k(  r||'   |)z  ||'<   n d%   d'k(  rd(||'   z  |)z  ||'<   t{         |"||j}                         |      \  }*}+|#jW                  |*       |+'|j                  |j}                                |+|d)   d*<   ||vrtk        g |+      ||<   ||   d,   j                  |#       #  |jA                         D ,cg c]  },|, }-},t)        |-      dkD  rt        |- 7fd-.      }-|r|t        jT                  t        jP                  t        jR                  fv rd/nd}. d0   xs d d g}/t        d1d2      }0tk        |0j                   d3          d4   |/d   |/d   tk        t          |.   |.      5      6      |d7<   d8D ]  }1 |1   s	 |1   ||1<    tk        d9      |d:<   |rdj?                  |      |d:   d;<    d<   r	 d<   |d;<   n* d=   j                  j                  j                  d>d?i|d@<   dA v r0 dA   r+ d=   j                  j                  j                  dB|d:   dC<   |r$t        j                  ||z        }t        ||      } j1                  d      |dz  } j1                  dD      |dz  }t         ||-||||      }2|-D ]d  }3|3d,   D ]Z  }#t7        |#t        j                        rt        |#|2j                  |2j                  ||#j`                  z
  dz   |#jb                         \ f |2j                  t)        |-      dkD  r|-d   d,   ng        |2j                  |       d= v r d=   |2j                   d=   dE       |-D ]  },t'        |,dF         |,dF<    t)        |      dkD  r|-ng |2_R         j1                  dG      r j1                  dHdI      dJk(  rt         |      }4|4jE                  dKdKdL      }5dM|4j                  vrh|D ]c  }|j<                  dk(  s|j                  t)        |j                         t)        |j                        z     }6tk        |6      |4j                  dM<   e t{         |4 dN   i |      \  }*}+|5jW                  |*       |2j                  |5dOdOdP       |2j                  d)dQ       |+|j                  tk        |+R             t        j                  |      |2_Y        t         ||27       t         ||2       |2S c c}w c c}w c c}w # th        $ rO |"|d   k7  r:|"jD                  t        jX                  t        jZ                  fv r|j<                  dv s+|"jD                  t        j\                  fv r|j<                  dv rn|"|d   k7  rV|"jD                  t        j\                  fv r9|j<                  dk(  r*|#jW                  tk        |j                   |                n|"jD                  t        jJ                  t        jL                  t        jN                  fv rC|j<                  dk(  r4|#jW                  dgt)        |      z  |j                   |   gdz  dd       n Y "w xY wc c},w )SNr6   timeliner   r   r   r   r:   r   r   r9   r  r8   z, r&  )legendgroup
showlegendT)alignmentgroupoffsetgroup)r=   r   r   )r=   r   r<   r  )r   r\  F)r   r  	showscaler  r   r   r   ro  r   r   r   standardrJ  )r   	ascendingcomplementaryr  r   r   g      Y@rx  px_fit_results)r  r  r  c                 8    d      j                  | d         S )Nr8   r  r  )r  ry   r<  s    rW   r   zmake_figure.<locals>.<lambda>	  s!    fT2C-D&E&K&KAfI&V rY   r  r   range_colorr  make_figurerH   color_continuous_midpointrl  )r  cmidcmincmaxcolorbarr   )rE   rD   )tracegroupgaplegendrX  titlerC   r  r  marginr   constant
itemsizingr   )rC   	overwriter  r   r  r   overallzOverall Trendline)r  r  r  r   r   r  )r   r   exclude_empty_subplots)selectorr  )r  )\r  ru  r   r  r  r  r  r  r  r]  r  r  rk   r  r  rm   rl   rp   r{   r  r   r   r   r   r   r}   r-  r   r   rj   ro   r   r%   r  rs   r   r   r   r   r   r4  r7  r   r   r  r  r   r  _subplot_row_subplot_colr,  rn   r   r   rv   r   r   r<   r   r   cumsumr(  r   r   r  r   validate_coercer   rG  r  r  r  r  rF  ceilmininit_figurer   r   r^  
add_tracesupdate_layoutr  r  ru   	add_traceupdate_tracesr   r0  rf   r>  r  )8ry   rs   ru   r  r  r  r   r  r   rk   r  
col_labels
row_labelsre  rf  msorted_valuesr  r  valsubplot_typetrace_names_by_framer  trendline_rowstrace_name_labelsr  
group_namer  r  
frame_namer   r~   
trace_nametrace_namesr	  r   r   r   r   r  r  	group_sumr  r  r  
frame_listcolorvarr  colorscale_validatorr   rg   r  trendline_spectrendline_trace
next_colorr<  s8   `                                                      @rW   r  r  @  s   #K%2L$4-Drzz2;;		::tF|?W*40rvvh1$Dkj ff)$/<Hk;=9K!7M 0@@!qyy%I%@OYKG*49NFFJJEE R99F"JJqMAIIbM"199-Mww%"4k):;cA7DE!fs1voE
EJww%"4k):;cA7DE!fs1voE
EJ$ Raii'%&ZZAIIQZZ0P%QAIIcNRR" 00B0BCL]FNXX.2N#\\^ S5
E$'M
w
4DE 	%KCaic*!!))[9*-c(N3'++14S)#.::!22!$J	% YY0779:
11/2u ,*:6% A	5J**
*;E%%

  ##  

		.   * *b 0 RZ{5R   %%"&&"))RVVR\\)RRDjIOOJ' "#E!"E!"23 B-1 m"IIeQYYs^4H 77e#))C.C .:&//36 77e#))C.C%C!G#>?C!G~#=>!**c17),E&7),E&EB-H A**b.C.CC**bff4JJ$$Duzz/?/?$@AT!$($73$>tCyDI#'#6##=d3i49 HHZ<
J	))TY)G!#JNN,	"3Z..0c
 !---FE88J
3F!*U3Z!7E#J
#}4!&si!7E#J*%2!&s!3i!?E#J!2j%)<)<)>"E; LL&%%n&9&9&;<7Br"#34'%)r
%Cz":v&--e4CA	5%S5h $]]_-!-J-
:V

  r~~r}}b>N>NOO  	
 =)9dD\2<O%)+;;-. 12QQ.tT(^XN
&
\" ! &7"1gLO& "2L/3yy9J/KX|,G}%)']\"	j		 	 	'	'	)	)	1"%rX$L##**55=/9X|,		%.01E>*xx)
xx)

lJuj*C
  6] 	E%*%

***Q.""	 NNC
Oa,?:a=(RHl#Td:.:4
#3tD #&	N&	#"6{QBCJxx*;W!E!R,T;?(44$2ERW 5 
 333% P::(!"C		NS_,L!MJ9=J9ON..v6P /.$|"4b'
{ 	u%E$ 	 	
 	2$7"!!$k"BCn5C4c62 {C8Jy A F F~ "   #k!n4&22ryy"&&6II !

.K K '22r||nD !

.@ @ "k!n4&22r||nDJJ'1Dqyy~,FG"..MM2+;+;R=P=PQRJJ'1 cCJ.()		#'7!';&+'+	 %  A D .s+    n#n!*n&n+	t+Et	t	c                    t        |      D cg c]  }t        |xs d      g|z   }}dg|z  }	dg|z  }
| j                  dd      }|dk(  r| j                  d      )| d   dk(  s	d	| v r| d	   rd
}nd}|g|dz
  z  d|z
  gz   }
d}n-|r| j                  d      xs d}n| j                  d      xs d}| j                  d      )| d   dk(  s	d	| v r| d	   rd
}nd}|g|dz
  z  d|z
  gz   }	d}nX| j                  d      xs d}nB|r| j                  d      xs d}n| j                  d      xs d}| j                  d      xs d}|rwd g|z  |z  }t        |      ||z  k  r#|j	                  d        t        |      ||z  k  r#t        |      D ],  }t        |      D ]  }||dz
  |z
  |z  |z      |||z  |z   <    . d }	 t        |||dd|rg nt        t        |            |rg n||rng |||
|	d      }j                  j                  D ]  }|j                  d         |S c c}w # t        $ r} ||dd        ||dd       Y d }~Vd }~ww xY w)NdomainrZ  g      ?r  r   xyr   rO  r<   gGz?gzG?r   g{Gz?facet_row_spacinggQ?gQ?r   g{Gzt?facet_col_spacingg{Gz?c                     |d| j                   d   v r*| j                   d   dj                  |      z   f| _         | y)z
        Translates the spacing errors thrown by the underlying make_subplots
        routine into one that describes an argument adjustable through px.
        z spacingr   z5
Use the {facet_arg} argument to adjust this spacing.)	facet_argN)ry   format)ery  r+  s      rW   _spacing_error_translatorz.init_figure.<locals>._spacing_error_translator	  sS    
 &'AFF1I5q	88>' 9? 9AF G 6rY   r  zbottom-left)rowsr  specsshared_xaxesshared_yaxes
row_titlescolumn_titlessubplot_titleshorizontal_spacingvertical_spacingrow_heightscolumn_widths
start_cell
HorizontalVertical)font)r   r   r   r   r   r   rI  rJ  r   rG  annotationsr   )ry   r  r  re  rf  r  r  r&  r0  r9  r8  r  	main_sizer7  r6  subplot_labelsr   r  r.  rg   r-  annots                         rW   r  r  p	  s   DI%LQqd012U:QEQ EEMM%%-KXX.2N t88L!-L![0W_g 	 	$+3q9}oEK##xx(;<D#xx(;<D88L!-L![0W_g 	 	&K5195YGM!&!%*=!>!F$ #xx(;<D#xx(;<D!XX&9:Bd%%/*o-d# *o-u 	XA5\ X0:EAIMU;RUV;V0Wq5y1}-X	X F+rhz6J1K ."J-;>1-#'$
( ''  $  Jy Rh  F!!\3FG!!Z1DEEFs   H)6H. .	I7IIrS   )NN)dplotly.graph_objs
graph_objsr   	plotly.ioior  collectionsr   r   _special_inputsr   r   r   r   r	   r
   r   r   r   _plotly_utils.basevalidatorsr   plotly.colorsr   r   rF  	packagingr   ra  r   numpyr   plotly._subplotsr   r   r   rR  rS  r  r^  r   r  r  r  renameable_group_attrablesr  r  r  r]  rW  r  r  r:  r   r   r   objectrA   r  rb   rd   rh   ri   rq   r{   r   r   r   r   r(  r>  rM  rj  r;  r-  r/  r+  r6  r3  r9  r  r  r  r  r  r  r  r  r!  r$  r)  rB  ru  r  r  r  r  r  r  r  r  r`   rY   rW   <module>rO     s;     / 9 9 E E < 1      w}}R^^,g0FF!7yc  UHIPQ FF  WM  &8;UU  jj",,		266299M
 
r||R^^R-B-BC C
% %P <   {$WX		,#L/dX$v6,
&A?H#1L2,7
tJZILX
>2 :S#lrj	0zz6 aAHBJm`	^rY   