Files
intellecton/venv/lib/python3.12/site-packages/matplotlib/__pycache__/sankey.cpython-312.pyc
T

392 lines
35 KiB
Plaintext
Raw Normal View History

Ë
†Rj7ãó²dZddlZddlmZddlZddlZddlm Z ddl
m Z ddl m
Z
ddlmZeje«ZdZd gZd
Zd ZdZd Zd
ZGdd«Zy)z7
Module for creating Sankey diagrams using Matplotlib.
éN)ÚSimpleNamespace)ÚPath)Ú PathPatch)ÚAffine2D)Ú
_docstringzKevin L. Daviesz
Yannick CopinÚBSDz
2011/09/16éécó‚eZdZdZ d
dZd dZdZdZejfdZ
e j d d«Z
d „Zy)
ÚSankeyab
Sankey diagram.
Sankey diagrams are a specific type of flow diagram, in which
the width of the arrows is shown proportionally to the flow
quantity. They are typically used to visualize energy or
material or cost transfers between processes.
`Wikipedia (6/1/2011) <https://en.wikipedia.org/wiki/Sankey_diagram>`_
Nc  óÎ|dkr td«||kDr td«| dkr td«| dkr td«|€,ddlm}
|
j«}|j dddgg¬«}g|_||_||_||_||_ ||_
||_ ||_ ||_
|
|_tj tj"d| d z z
zd
z «|_| |_tj(tj*tj* tj*tj* f«|_t/| «r|j0d i| ¤Žyy) a
Create a new Sankey instance.
The optional arguments listed below are applied to all subdiagrams so
that there is consistent alignment and formatting.
In order to draw a complex Sankey diagram, create an instance of
`Sankey` by calling it without any kwargs::
sankey = Sankey()
Then add simple Sankey sub-diagrams::
sankey.add() # 1
sankey.add() # 2
#...
sankey.add() # n
Finally, create the full diagram::
sankey.finish()
Or, instead, simply daisy-chain those calls::
Sankey().add().add... .add().finish()
Other Parameters
----------------
ax : `~matplotlib.axes.Axes`
Axes onto which the data should be plotted. If *ax* isn't
provided, new Axes will be created.
scale : float
Scaling factor for the flows. *scale* sizes the width of the paths
in order to maintain proper layout. The same scale is applied to
all subdiagrams. The value should be chosen such that the product
of the scale and the sum of the inputs is approximately 1.0 (and
the product of the scale and the sum of the outputs is
approximately -1.0).
unit : str
The physical unit associated with the flow quantities. If *unit*
is None, then none of the quantities are labeled.
format : str or callable
A Python number formatting string or callable used to label the
flows with their quantities (i.e., a number times a unit, where the
unit is given). If a format string is given, the label will be
``format % quantity``. If a callable is given, it will be called
with ``quantity`` as an argument.
gap : float
Space between paths that break in/break away to/from the top or
bottom.
radius : float
Inner radius of the vertical paths.
shoulder : float
Size of the shoulders of output arrows.
offset : float
Text offset (from the dip or tip of the arrow).
head_angle : float
Angle, in degrees, of the arrow heads (and negative of the angle of
the tails).
margin : float
Minimum space between Sankey outlines and the edge of the plot
area.
tolerance : float
Acceptable maximum of the magnitude of the sum of flows. The
magnitude of the sum of connected flows cannot be greater than
*tolerance*.
**kwargs
Any additional keyword arguments will be passed to `add`, which
will create the first subdiagram.
See Also
--------
Sankey.add
Sankey.finish
Examples
--------
.. plot:: gallery/specialty_plots/sankey_basics.py
rzS'gap' is negative, which is not allowed because it would cause the paths to overlapz`'radius' is greater than 'gap', which is not allowed because it would cause the paths to overlapzp'head_angle' is negative, which is not allowed because it would cause inputs to look like outputs and vice versaz3'tolerance' is negative, but it must be a magnitudeNr )ÚxticksÚyticksg€f@ç)Ú
ValueErrorÚmatplotlib.pyplotÚpyplotÚfigureÚ add_subplotÚdiagramsÚaxÚunitÚformatÚscaleÚgapÚradiusÚshoulderÚoffsetÚmarginÚnpÚtanÚpiÚpitchÚ toleranceÚarrayÚinfÚextentÚlenÚadd)ÚselfrrrrrrrrÚ
head_angler r%ÚkwargsÚpltÚfigs úT/home/antigravity/intellecton/venv/lib/python3.12/site-packages/matplotlib/sankey.pyÚ__init__zSankey.__init__*sdðf Š7Üð
 CŠ<Üð
 ˜Š>ÜðIóJð
Jð qŠ=ÜØGð
Gð ˆ:Ý —*‘*“,ˆCØ  A q°¸BÓ?ˆBàˆŒ
ðˆŒØˆŒ ؈Œ ؈Œ
؈ŒØˆŒ Ø ˆŒ
؈Œ ؈Œ Ü—V‘VœBŸE™E °eÑ);Ñ%;Ñ<¸CˆŒ
ØŒô—h‘h¤§¡¬¯©¨´·±¼"¿&¹&¸ÐBˆŒ ô ˆvŒ;Ø ˆDH‰HÑ  ð óc ó‚tjtjtjtjtjtjtjg}tjddgddgddgddgddgddgddgg«}|dvr|r|}n\|ddddd …f}nO|r'tj
|ddd
f |ddd ff«}n&tj
|ddd f |ddd
ff«}|d
kDr| }t
t|||ztj||jd d
f«z««S) a+
Return the codes and vertices for a rotated, scaled, and translated
90 degree arc.
Other Parameters
----------------
quadrant : {0, 1, 2, 3}, default: 0
Uses 0-based indexing (0, 1, 2, or 3).
cw : bool, default: True
If True, the arc vertices are produced clockwise; counter-clockwise
otherwise.
radius : float, default: 1
The radius of the arc.
center : (float, float), default: (0, 0)
(x, y) tuple of the arc's center.
çð?ggw,îó£÷Ð?gùÈÚS ì?gƒ¢òè à?g>˜efž æ?)réNéÿÿÿÿr r)
rÚLINETOÚCURVE4r!r&Ú column_stackÚlistÚzipÚtileÚshape)r+ÚquadrantÚcwrÚcenterÚ ARC_CODESÚ ARC_VERTICESÚverticess r0Ú_arcz Sankey._arc©sgô(—[‘[Ü—[‘[Ü—[‘[Ü—[‘[Ü—[‘[Ü—[‘[Ü—[‘[ð
"ˆ ô—xx .°.Ð!AØ"0°.Ð!AØ"0°.Ð!AØ"0°.Ð!AØ"0°.Ð!AØ"0°.Ð!Að#1°.Ð!Að!CóDˆ ð  ÙØ'à©4¨R¨4¨Ñ0‘ñäŸ?™?¨\º!¸Q¸$Ñ-?Ð,?Ø-9º!¸Q¸$Ñ-?ð,AóBôŸ?™?¨\º!¸Q¸$Ñ-?Ð,?Ø-9º!¸Q¸$Ñ-?ð,AóBà aŠ<ØWˆ”C˜  6¨HÑ#4ÜŸ ¨×);Ñ);¸AÑ)>ÀÐ(BÓ$DóEóFð Fr2c ó |ddgddgfS|dd\}}|dz |jz}|tk(r||z}||z||dz zg}|jtj||gftj|ftj|||zgftj||j
z||zgfg«|d|j z
|dg} || fS||j
z}|tk(rd}
nd}
||dz z
||
||z
zz
g}|tk(rd} nd} |jrU|j|j| |tk(|j||jz||
|jzz
f¬««n#|jtj||gf«|jtj|||
|zz
gftj|ftj||z
||
|zz
gfg«|j|j| |tk(||jz||jz||
|jzz
f¬««|jtj||z
||
|zzgf«|d|d|
|j zz
g} || fS)zP
Add an input to a path and return its tip and label locations.
rr6r r5r©r>r?rr@) r$ÚRIGHTÚextendrr7rrÚUPÚDOWNrrDÚappend) r+ÚpathÚangleÚflowÚlengthÚdipdepthÚdipÚlabel_locationÚsignr>s r0Ú
_add_inputzSankey._add_inputâð ˆq6˜A˜q˜6 ˜8˜A;‰DˆAˆqؘq™ D§J¡JÑ.ˆHØœŠ~ØV‘ ؘ8‘| Q¨°©¡^Ð4Ø œdŸk™k¨A¨q¨6Ð"Ÿk™k¨3Ð"Ÿk™k¨A¨q°4©x¨=Ð"Ÿk™k¨A°·±©L¸!¸d¹(Ð+CÐFôGð#& a¡&¨4¯;©;Ñ"6¸¸Ð!?ðD˜Ð &ðAT—XX
ØœB’;Ø‘Dà˜4 !™8| °¸(Ñ1BÑ)CÑ%CÐDØœD’=Ø ‘Hà —;’;Ø—K§ ¡ °8Ø-2´b©[Ø15·±Ø23°d·k±k±/Ø23°d¸T¿[¹[Ñ6HÑ2Hð2Jð!*ó!KõLð —K‘K¤§¡¨q°!¨fÐ 5Ô œdŸk™k¨A¨q°4¸&±=Ñ/@Ð+AÐ"Ÿk™k¨3Ð"Ÿk™k¨A°©H°a¸¹-Ñ6GÐ+HÐKôLð ˜DŸI™I¨xØ).´$©Ø-1°D·K±KÑ-?Ø./°$·+±+©oØ./°$¸¿¹Ñ2DÑ.Dð.FðGôHð
 œTŸ[™[¨1¨t©8°Q¸À¹±_Ð*EÐGØ"% a¡&¨#¨a©&°4¸$¿+¹+Ñ3EÑ*EÐ!Fà˜Ð &r2c ó:|ddgddgfS|dd\}}|j|dz z
|jz}|tk(rÞ||z
}||z||dz zg}|jtj
||gftj
|||jzgftj
|ftj
|||jz
|zgftj
|||zgftj
||j z
||zgfg«|d|jz|dg} || fS||j z
}|tk(rd\}
} nd\}
} ||dz z
||
||zzzg}|jrU|j|j| |tk(|j||jz
||
|jzzf¬««n#|jtj
||gf«|jtj
|||
|zzgftj
||jz
||
|zzgftj
|ftj
||jz|z
||
|zzgftj
||z
||
|zzgfg«|j|j| |tk(|j|z
||jz
||
|jzzf¬««|jtj
||z
||
|zzgf«|d|d|
|jzzg} || fS) z‰
Append an output to a path and return its tip and label locations.
.. note:: *flow* is negative for an output.
rr6r r5r)r r
)r6rrF)
rr$rGrHrr7rrrIrrDrKrJ) r+rLrMrNrOrPrQÚ tipheightÚtiprTrUr>s r0Ú _add_outputzSankey._add_outputsBð ˆq6˜A˜q˜6 ˜‘8˜A‘;‰DˆAˆqØŸ¨°©Ñ1°T·Z±ZÑ?ˆIØœŠ~ØV‘ ؘ9‘} a¨$°©*¡nÐ5Ø œdŸk™k¨A¨q¨6Ð"Ÿk™k¨A¨q°4·=±=Ñ/@Ð+AÐ"Ÿk™k¨3Ð"Ÿk™k¨A¨q°4·=±=Ñ/@À4Ñ/GÐ+HÐ"Ÿk™k¨A¨q°4©x¨=Ð"Ÿk™k¨A°·±©L¸!¸d¹(Ð+CÐ FôGð #& a¡&¨4¯;©;Ñ"6¸¸Ð!?ð@˜Ð &ð=T—XX
ØœB;Ø%)ND™(à%*ND˜˜4 #™:~ q¨4°6¸IÑ3EÑ+FÑ'FÐGà—;—K§ ¡ °8Ø-2´b©[Ø15·±Ø23°d·k±k±/Ø23°d¸T¿[¹[Ñ6HÑ2Hð2Jð!*ó!KõLð —K‘K¤§¡¨q°!¨fÐ 5Ô œdŸk™k¨A¨q°4¸&±=Ñ/@Ð+AÐ"Ÿk™k¨A°·
±
Ñ,=Ø,-°°v±
Ñ,=ð,?ð@ä"Ÿk™k¨3Ð"Ÿk™k¨A°·
±
Ñ,=ÀÑ,DØ,-°°v±
Ñ,=ð,?ð@ä"Ÿk™k¨A°©H°a¸¹-Ñ6GÐ+HÐ
KôLð ˜DŸI™I¨xØ).´$©Ø-1¯[©[¸4Ñ-?Ø./°$·+±+©oØ./°$¸¿¹Ñ2DÑ.Dð.FðGôHð
 œTŸ[™[¨1¨t©8°Q¸À¹±_Ð*EÐGØ"% a¡&¨#¨a©&°4¸$¿+¹+Ñ3EÑ*EÐ!FؘР&r2cóXg}|}|dddD]\}}|j||f«|}Œ|S)z
A path is not simply reversible by path[::-1] since the code
specifies an action to take from the **previous** point.
Nr6)rK)r+rLÚ first_actionÚ reverse_pathÚ next_codeÚcodeÚpositions r0Ú_revertzSankey._revertLsIð
ˆ Ø ˆ Ø"¡4 R 4™jò ‰NˆD × Ñ  ¨HÐ 5Ô ‰Ið ðÐr2c
 óŠ!|tjddg«ntj|«}|jd} | €d} n| dz} |d} tj|| «} tj|| «}|dkr t d
«t tj |««|jkDr*tjd tj |«|«|j|z} t
d | D««}
t
d
| D««}|y|dkr t d«t|«dkr t d«|t|j«k\r%t d|dt|j«d«|dt|j|j«k\r>t dj|dt|j|j«««|d| k\rt d|dd| d«|j|j |dt d|dd|d«|j|j|d||dz}t |«|jk\rt d|d|jd«dg| z}t#|«D]R\}}||jk\rd||<Œ||j krd||<Œ1tjd |||j«ŒTdg| z}t#t%||««D]k\}\}}|dk(r|r
t&||<Œ|dusŒt(||<Œ)|dk(r
|Œ1t*||<Œ;|d!k7rt d"|d#|d$«|r
t(||<Œ^|dusŒct&||<Œmtj,|«r*t|«| k7r»t d%| d&t|«d'«|}|}|}|}t/|¬(«}|Dcgc]}|j1|d«Œ}}t#t%||| ««D]8\}\}}}|t&k(r
|r |||<||z
}Œ |t(k(sŒ*|dusŒ/|||<||z}Œ:t#t3t5t%||| ««««D]D\}\}}}|t(k(r|r||| |z
dz
<||z
}Œ&|t&k(sŒ0|dusŒ5||| |z
dz
<||z}ŒFd}t#t3t5t%||t%| |«««««D]&\}\}}}|t*k(sŒ|sŒ|r d|| |z
dz
<Œ%d}Œ(d}t#t%||t5t%| |««««D]"\}\}}}|t*k(sŒ|dusŒ|rd||<Œ!d}Œ$t6j8|j:|d)z z
|
d)z gft6j<|j:|d)z z
d)z |
d)z gft6j>|j:|d)z z
d*z |
d)z gft6j>|d)z |j:z
d*z | d)z gft6j<|d)z |j:z
d)z | d)z gft6j<|d)z |j:z
| d)z gfg}t6j<|d)z |j:z
|d)z gft6j<|d)z |j:z
d)z |d)z gft6j>|d)z |j:z
d*z |d)z gft6j>|j:|d)z z
d*z |
d)z gft6j<|j:|d)z z
d)z |
d)z gft6j<|j:|d)z z
|
d)z gfg} t6j<|d)z |j:z
|d)z gfg}!t6j<|j:|d)z z
|
d)z gfg}"tj@| d+f«}#tj@| d+f«}$t#t%||t5t%| |««««D]n\}\}}}|t&k(r(|r&|jB|"|g|¢­Ž\|#|ddf<|$|ddf<Œ;|t(k(sŒE|dusŒJ|jD||g|¢­Ž\|#|ddf<|$|ddf<Œpt#t3t5t%||t5t%| |««««««D\}\}}}|t(k(r8|r6|jB| |g|¢­Ž\}%}&|%|#| |z
dz
ddf<|&|$| |z
dz
ddf<ŒK|t&k(sŒU|dusŒZ|jD|!|g|¢­Ž\}%}&|%|#| |z
dz
ddf<|&|$| |z
dz
ddf<Œd}t#t3t5t%||t5t%| |««««««D]\}\}}}|t*k(sŒ|sŒ|sN| d!dd|"d!ddkDr5| jGt6j<|"d!dd| d!ddgf«d}|jB| |g|¢­Ž\}%}&|%|#| |z
dz
ddf<|&|$| |z
dz
ddf<Œd}t#t%||t5t%| |««««D]\}\}}}|t*k(sŒ|dusŒ|sN|d!dd|!d!ddkr5|jGt6j<|!d!dd|d!ddgf«d}|jD||g|¢­Ž\|#|ddf<|$|ddf<Œ|s |"jI«| jI«|s |!jI«|jI«||jK|!«z| z|jK|"«zt6jL|ddfgz}'t%|'Ž\}(})tj|)«})d,„}*|€{| dk7rT|Dcgc] }|*|| «Œ
}}tO«jQ| d-z«jR}+|+|#«}#|+|$«}$|+|)«})|jTjWdd|d.d.¬/«},n|j|j |d||dz
} |Dcgc] }|*|| «Œ
}}tO«jQ| d-z«jR}+|+|#«}#|j|jX|d|#|dz
}-tO«jZ|-ŽjR}.|.|#«}#|.|+|$««}$|.|+|)««})t/|d.d.¬/«}/|jTjV|-i|/¤Ž},t\j^d0rE|
jId1|
jId2d3««}0|
jId4|
jId5d6««}1nD|
jId1|
jId2d««}0|
jId4|
jId5d««}1|0€$|jTj`jc«}0tet7|)|(«f|0|1d7œ|
¤Ž}2|jTjg|2«g}3t%||||$«D\}4}}5}6|5|d8}5n|jhtk|jtl«r&|jt |4«z|jhz}7n2to|j«r|j|4«}7n tqd9«|5d8k7r|5d:z
}5|5|7z
}5|3jG|jTjW|6d|6d|5d.d.¬;««ŒÒttj|)dddf«tj|$dddf«|jrd«tutjt|)dddf«tjt|$dddf«|jrd«ttj|)dddf«tj|$dddf«|jrd+«tutjt|)dddf«tjt|$dddf«|jrd<«f|_9|jjGtw|2|||#|,|3¬=««|S#t$r:t dtj|«dtj|«d«dwxYw#t$r:t dtj|«d tj|«d«dwxYwcc}wcc}wcc}w)>u
Add a simple Sankey diagram with flows at the same hierarchical level.
Parameters
----------
patchlabel : str
Label to be placed at the center of the diagram.
Note that *label* (not *patchlabel*) can be passed as keyword
argument to create an entry in the legend.
flows : list of float
Array of flow values. By convention, inputs are positive and
outputs are negative.
Flows are placed along the top of the diagram from the inside out
in order of their index within *flows*. They are placed along the
sides of the diagram from the top down and along the bottom from
the outside in.
If the sum of the inputs and outputs is
nonzero, the discrepancy will appear as a cubic Bézier curve along
the top and bottom edges of the trunk.
orientations : list of {-1, 0, 1}
List of orientations of the flows (or a single orientation to be
used for all flows). Valid values are 0 (inputs from
the left, outputs to the right), 1 (from and to the top) or -1
(from and to the bottom).
labels : list of (str or None)
List of labels for the flows (or a single label to be used for all
flows). Each label may be *None* (no label), or a labeling string.
If an entry is a (possibly empty) string, then the quantity for the
corresponding flow will be shown below the string. However, if
the *unit* of the main diagram is None, then quantities are never
shown, regardless of the value of this argument.
trunklength : float
Length between the bases of the input and output groups (in
data-space units).
pathlengths : list of float
List of lengths of the vertical arrows before break-in or after
break-away. If a single value is given, then it will be applied to
the first (inside) paths on the top and bottom, and the length of
all other arrows will be justified accordingly. The *pathlengths*
are not applied to the horizontal inputs and outputs.
prior : int
Index of the prior diagram to which this diagram should be
connected.
connect : (int, int)
A (prior, this) tuple indexing the flow of the prior diagram and
the flow of this diagram which should be connected. If this is the
first diagram or *prior* is *None*, *connect* will be ignored.
rotation : float
Angle of rotation of the diagram in degrees. The interpretation of
the *orientations* argument will be rotated accordingly (e.g., if
*rotation* == 90, an *orientations* entry of 1 means to/from the
left). *rotation* is ignored if this diagram is connected to an
existing one (using *prior* and *connect*).
Returns
-------
Sankey
The current `.Sankey` instance.
Other Parameters
----------------
**kwargs
Additional keyword arguments set `matplotlib.patches.PathPatch`
properties, listed below. For example, one may want to use
``fill=False`` or ``label="A legend entry"``.
%(Patch:kwdoc)s
See Also
--------
Sankey.finish
Nr4gð¿rg€V@zThe shapes of 'flows' z and 'orientations' z are incompatiblez and 'labels' zR'trunklength' is negative, which is not allowed because it would cause poor layoutzWThe sum of the flows is nonzero (%f; patchlabel=%r); is the system not at steady state?c3ó4K|]}t|d«Œy­w©rN)Úmax©Ú.0rNs r0ú <genexpr>zSankey.add.<locals>.<genexpr>Õóèø€Ò9 D”3t˜Q—<Ñ9ùóc3ó4K|]}t|d«Œy­wrd)Úminrfs r0rhzSankey.add.<locals>.<genexpr>Örirjz*The index of the prior diagram is negativez2At least one of the connection indices is negativez"The index of the prior diagram is z, but there are only z other diagramszTThe connection index to the source diagram is {}, but that diagram has only {} flowsr z(The connection index to this diagram is z, but this diagram has only z flowszHThe connection cannot be made, which may occur if the magnitude of flow z of diagram z% is less than the specified tolerancez)The scaled sum of the connected flows is z%, which is not within the tolerance (ú)TFzwThe magnitude of flow %d (%f) is below the tolerance (%f).
It will not be shown, and it cannot be used in a connection.r6zThe value of orientations[z] is z, but it must be -1, 0, or 1zThe lengths of 'flows' (z) and 'pathlengths' (z) are incompatible)rGrg @r5có|y||zS)Nr)Úrs r0Ú
_get_anglezSankey.add.<locals>._get_angle´s؈à˜1u r2éZr@)ÚhaÚvaz_internal.classic_modeÚfcÚ facecolorz#bfd1d4ÚlwÚ linewidthgà?)rvrxÚz*format must be callable or a format stringú
)rPrQrsrtrur
)ÚpatchÚflowsÚanglesÚtipsÚtextÚtexts)<r!r&r=Ú broadcast_torÚabsÚsumr%Ú_logÚinforrlr)rr}rr~Ú enumerater;rJrIrGÚiterableÚdictÚgetÚreversedr:rÚMOVETOrr7r8ÚzerosrVrZrKÚpopraÚ CLOSEPOLYrÚ
rotate_degÚtransform_affinerr€rÚ translateÚmplÚrcParamsÚ_get_patches_for_fillÚget_next_colorrÚ add_patchrÚ
isinstanceÚstrÚcallableÚ TypeErrorr(rer)8r+Ú
patchlabelr}Ú orientationsÚlabelsÚ trunklengthÚ pathlengthsÚpriorÚconnectÚrotationr-Ú scaled_flowsÚgainÚlossÚ
flow_errorÚ
are_inputsÚirNr~ÚorientÚis_inputÚurlengthÚullengthÚlrlengthÚlllengthÚdrMÚhas_left_inputÚspecÚhas_right_outputÚurpathÚllpathÚlrpathÚulpathrÚlabel_locationsrYrTrLÚcodesrCrqÚrotater€rrÚkwdsrvrxr|rÚnumberÚlabelÚlocationÚquantitys8 r0r*z
Sankey.add^sEðn*/¨˜#˜t˜Ô%¼B¿H¹HÀU»OˆØ K‰K˜‰NˆØ Р؉Hð
˜Ñ ˆHØ Ð ØˆLð ÜŸ?™?¨<¸Ó;ˆ  Ü—_‘_ V¨QÓ/ˆF𠘊?Üð
 Œrv‰ve‹}Ó  §¡Ò I‰Ið—f‘f˜U“m 
—z‘z EÑ ÜÑ9¨LÔÜÑ9¨LÔØ Ñ ØqŠyÜ Ð!MÓ7‹|˜aÒÜ ØJðJàœ˜DŸM™MÓ Ø¸ð@ Ü # D§M¡MÓ 2Ð3°?ðDóEðEðq‰zœS §¡¨uÑ!5×!;Ñ!;Ó ð5ß5;±VØ 
¤C¨¯
©
°eÑ(<×(BÑ(BÓ$Có6EóFðFðq‰z˜Ü Ø>¸wÀq¹z¸K1Ø12°°6ð}‰}˜#×*¨7°1©:Ñ ð)Ø)0°©¨ °LÀÀðHŸ-™-¨Ñ4°W¸Q±ZÑ ¨¡
Ñ,ˆJä:‹ $§.¡.Ò Ø