§
    	Êj«%  ã                  ót  — U d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZmZmZ d
dlmZmZ d
dlmZ  ej        e¦  «        Z G d„ de¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z eee dœZ!de"d<    G d„ d¦  «        Z# G d„ d¦  «        Z$dS )a  Account pool: scheduling, per-account concurrency limits, health state and failover.

Usage::

    async with pool.lease(exclude={...}, hint=conversation_key) as lease:
        ... use lease.account ...
        lease.fail(exc)   # optional; success is recorded automatically otherwise
é    )ÚannotationsN)Údefaultdict)ÚAsyncIteratorÚIterable)Úasynccontextmanager)ÚProtocolé   )ÚNoAccountAvailableÚUpstreamAuthErrorÚUpstreamQuotaErrorÚUpstreamTimeouté   )ÚAccountÚAccountStatus)ÚAccountStorec                  ó   — e Zd Zd	d„ZdS )
ÚStrategyÚ
candidatesúlist[Account]Úhintú
str | NoneÚreturnr   c                ó   — d S ©N© ©Úselfr   r   s      ú2C:\Projects\Muse2API\src\muse2api\accounts\pool.pyÚchoosezStrategy.choose   s   € € € ó    N©r   r   r   r   r   r   ©Ú__name__Ú
__module__Ú__qualname__r   r   r    r   r   r      s   € € € € € ØQÐQÐQÐQÐQÐQr    r   c                  ó   — e Zd Zdd„Zdd	„Zd
S )ÚRoundRobinStrategyr   ÚNonec                ó6   — t          j        ¦   «         | _        d S r   )Ú	itertoolsÚcountÚ_counter©r   s    r   Ú__init__zRoundRobinStrategy.__init__"   s   € Ý!œÑ)Ô)ˆŒˆˆr    r   r   r   r   r   c                óz   — t          |d„ ¬¦  «        }|t          | j        ¦  «        t          |¦  «        z           S )Nc                ó   — | j         S r   ©Úid©Úas    r   ú<lambda>z+RoundRobinStrategy.choose.<locals>.<lambda>&   s   € °1´4€ r    ©Úkey)ÚsortedÚnextr,   Úlen)r   r   r   Úordereds       r   r   zRoundRobinStrategy.choose%   s6   € Ý˜¨¨Ð8Ñ8Ô8ˆØ•t˜DœMÑ*Ô*­S°©\¬\Ñ9Ô:Ð:r    N©r   r(   r!   )r#   r$   r%   r.   r   r   r    r   r'   r'   !   s<   € € € € € ð*ð *ð *ð *ð;ð ;ð ;ð ;ð ;ð ;r    r'   c                  ó   — e Zd Zd	d„ZdS )
ÚLRUStrategyr   r   r   r   r   r   c                ó&   — t          |d„ ¬¦  «        S )Nc                ó   — | j         S r   )Úlast_used_atr3   s    r   r5   z$LRUStrategy.choose.<locals>.<lambda>,   s   € ¨Q¬^€ r    r6   )Úminr   s      r   r   zLRUStrategy.choose+   s   € Ý�:Ð#;Ð#;Ð<Ñ<Ô<Ð<r    Nr!   r"   r   r    r   r>   r>   *   s(   € € € € € ð=ð =ð =ð =ð =ð =r    r>   c                  ó$   — e Zd ZdZddd„Zdd„ZdS )ÚAffinityStrategyz¦Sticks a hint (e.g. conversation id / user id) to the account that served it last,
    so a driver can reuse warm browser tabs or upstream threads. Falls back to LRU.é   Úmax_entriesÚintr   r(   c                óH   — i | _         || _        t          ¦   «         | _        d S r   )Ú_mapÚ_maxr>   Ú	_fallback)r   rF   s     r   r.   zAffinityStrategy.__init__3   s   € Ø$&ˆŒ	ØˆŒ	Ý$™œˆŒˆˆr    r   r   r   r   r   c                ón  — |r0| j                              |¦  «        x}r|D ]}|j        |k    r|c S Œ| j                             ||¦  «        }|ret          | j         ¦  «        | j        k    r9| j                              t          t          | j         ¦  «        ¦  «        ¦  «         |j        | j         |<   |S r   )
rI   Úgetr2   rK   r   r:   rJ   Úpopr9   Úiter)r   r   r   Úacc_idÚaccs        r   r   zAffinityStrategy.choose8   s¸   € Øð 	˜tœyŸ}š}¨TÑ2Ô2Ð2�Vð 	Ø!ð ð �Ø”6˜VÒ#Ð#Ø�J�J�Jð $àŒn×#Ò# J°Ñ5Ô5ˆØð 	%Ý�4”9‰~Œ~ ¤Ò*Ð*Ø”	—’�d¥4¨¬	¡?¤?Ñ3Ô3Ñ4Ô4Ð4Ø!œfˆDŒI�d‰OØˆ
r    N)rE   )rF   rG   r   r(   r!   )r#   r$   r%   Ú__doc__r.   r   r   r    r   rD   rD   /   sM   € € € € € ðWð Wð'ð 'ð 'ð 'ð 'ð

ð 
ð 
ð 
ð 
ð 
r    rD   )Úround_robinÚlruÚaffinityzdict[str, type]Ú
STRATEGIESc                  ó   — e Zd Zd
d„Zdd„Zd	S )ÚLeaseÚaccountr   r   r(   c                ó"   — || _         d | _        d S r   )rY   Úerror©r   rY   s     r   r.   zLease.__init__N   s   € ØˆŒØ+/ˆŒ
ˆ
ˆ
r    ÚexcÚBaseExceptionc                ó   — || _         d S r   )r[   )r   r]   s     r   Úfailz
Lease.failR   s   € ØˆŒ
ˆ
ˆ
r    N)rY   r   r   r(   )r]   r^   r   r(   )r#   r$   r%   r.   r`   r   r    r   rX   rX   M   s<   € € € € € ð0ð 0ð 0ð 0ðð ð ð ð ð r    rX   c                  ó¬   — e Zd Zdddddœd2d„Zd3d„Zd3d„Zd4d„Zd5d„Zd6d„Zd7d„Z	d8d„Z
d9d#„Zd:d$„Zd%d&d'œd;d*„Zd<d=d-„Zd>d/„Zed%d&d'œd?d1„¦   «         Zd&S )@ÚAccountPoolrT   r   g      ^@g      N@)ÚstrategyÚmax_concurrencyÚcooldownÚacquire_timeoutÚstorer   rc   Ústrrd   rG   re   Úfloatrf   r   r(   c               óü   — || _         t          |         ¦   «         | _        t          d|¦  «        | _        || _        || _        i | _        t          t          ¦  «        | _
        t          j        ¦   «         | _        d S )Nr   )rg   rV   rc   Úmaxrd   re   rf   Ú	_accountsr   rG   Ú	_inflightÚasyncioÚ	ConditionÚ_cond)r   rg   rc   rd   re   rf   s         r   r.   zAccountPool.__init__X   sh   € ð ˆŒ
Ý",¨XÔ"6Ñ"8Ô"8ˆŒÝ" 1 oÑ6Ô6ˆÔØ ˆŒØ.ˆÔØ-/ˆŒÝ)4µSÑ)9Ô)9ˆŒÝÔ&Ñ(Ô(ˆŒ
ˆ
ˆ
r    c              ƒ  óÀ   K  — d„ | j                              ¦   «         ƒ d {V —†D ¦   «         | _        t                               dt          | j        ¦  «        ¦  «         d S )Nc                ó   — i | ]
}|j         |“ŒS r   r1   ©Ú.0r4   s     r   ú
<dictcomp>z$AccountPool.load.<locals>.<dictcomp>l   s   € ÐCÐCÐC a˜!œ$ ÐCÐCÐCr    zloaded %d account(s))rg   Úloadrl   ÚlogÚinfor:   r-   s    r   rv   zAccountPool.loadk   s^   è è € ØCÐC°´·²Ñ1BÔ1BÐ+BÐ+BÐ+BÐ+BÐ+BÐ+BÐCÑCÔCˆŒÝ�ŠÐ'­¨T¬^Ñ)<Ô)<Ñ=Ô=Ð=Ð=Ð=r    c              ƒ  ó’   K  — | j                              t          | j                             ¦   «         ¦  «        ¦  «        ƒ d {V —† d S r   )rg   ÚsaveÚlistrl   Úvaluesr-   s    r   ÚpersistzAccountPool.persisto   sH   è è € ØŒj�oŠo�d 4¤>×#8Ò#8Ñ#:Ô#:Ñ;Ô;Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r    r   c                óN   — t          | j                             ¦   «         ¦  «        S r   )r{   rl   r|   r-   s    r   ÚallzAccountPool.allr   s   € Ý�D”N×)Ò)Ñ+Ô+Ñ,Ô,Ð,r    Ú
account_idúAccount | Nonec                ó6   — | j                              |¦  «        S r   )rl   rM   )r   r€   s     r   rM   zAccountPool.getu   s   € ØŒ~×!Ò! *Ñ-Ô-Ð-r    rY   r   c              ƒ  óð   K  — | j         4 ƒd {V —† || j        |j        <   | j                              ¦   «          d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |                      ¦   «         ƒ d {V —† |S r   )rp   rl   r2   Ú
notify_allr}   r\   s     r   ÚupsertzAccountPool.upsertx   s  è è € Ø”:ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$Ø)0ˆDŒN˜7œ:Ñ&ØŒJ×!Ò!Ñ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð �lŠl‰nŒnÐÐÐÐÐÐÐØˆs   �)AÁ
AÁAÚboolc              ƒ  óÞ   K  — | j         4 ƒd {V —† | j                             |d ¦  «        d u}d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |r|                      ¦   «         ƒ d {V —† |S r   )rp   rl   rN   r}   )r   r€   Úremoveds      r   ÚremovezAccountPool.remove   s)  è è € Ø”:ð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	GØ”n×(Ò(¨°TÑ:Ô:À$ÐFˆGð	Gð 	Gð 	Gñ 	Gô 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gøøøð 	Gð 	Gð 	Gð 	Gàð 	!Ø—,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Øˆs   �A Á 
A
ÁA
údict[str, int]c                ó`  ‡— t          j         ¦   «         Št          | j        ¦  «        t          ˆfd„| j                             ¦   «         D ¦   «         ¦  «        t          d„ | j                             ¦   «         D ¦   «         ¦  «        t          | j                             ¦   «         ¦  «        dœS )Nc              3  óF   •K  — | ]}|                      ‰¦  «        ¯d V — ŒdS ©r   N)Úis_available)rt   r4   Únows     €r   ú	<genexpr>z$AccountPool.stats.<locals>.<genexpr>Š   s5   øè è € ÐWÐW 1À1Ç>Â>ÐRUÑCVÔCVÐW˜QÐWÐWÐWÐWÐWÐWr    c              3  óD   K  — | ]}|j         t          j        k    ¯d V — ŒdS r�   )Ústatusr   ÚINVALIDrs   s     r   r�   z$AccountPool.stats.<locals>.<genexpr>‹   s1   è è € ÐcÐc ÀÄÍ]ÔMbÒAbÐAb˜1ÐAbÐAbÐAbÐAbÐcÐcr    )ÚtotalÚ	availableÚinvalidÚinflight)Útimer:   rl   Úsumr|   rm   )r   r�   s    @r   ÚstatszAccountPool.stats†   s™   ø€ ÝŒi‰kŒkˆå˜œÑ(Ô(ÝÐWÐWÐWÐW¨¬×(=Ò(=Ñ(?Ô(?ÐWÑWÔWÑWÔWÝÐcÐc d¤n×&;Ò&;Ñ&=Ô&=ÐcÑcÔcÑcÔcÝ˜DœN×1Ò1Ñ3Ô3Ñ4Ô4ð	
ð 
ð 	
r    ÚexcludeúIterable[str]ú(tuple[list[Account], bool, float | None]c                ó®  — t          j         ¦   «         }t          |¦  «        }g dd}}}| j                             ¦   «         D ]�}|j        |v s|j        r|j        t          j        k    rŒ(| 	                    |¦  «        s|€|j
        nt          ||j
        ¦  «        }Œ\| j        |j                 | j        k    rd}Œz|                     |¦  «         Œ�|||fS )z‡Returns (free candidates, whether a usable account is merely busy, and the
        earliest time a cooling account comes back, if any).FNT)r˜   Úsetrl   r|   r2   Úenabledr’   r   r“   rŽ   Úcooldown_untilrB   rm   rd   Úappend)r   r›   r�   ÚexcludedÚfreeÚbusyÚback_atrQ   s           r   Ú_candidateszAccountPool._candidates�   sã   € õ Œi‰kŒkˆÝ�w‘<”<ˆØ  %¨�GˆdˆØ”>×(Ò(Ñ*Ô*ð 		ð 		ˆCØŒv˜Ð!Ð!¨¬Ð!¸¼
ÅmÔF[Ò8[Ð8[ØØ×#Ò# CÑ(Ô(ð Ø07°˜#Ô,Ð,ÅSÈÐRUÔRdÑEeÔEe�ØØŒ~˜cœfÔ%¨Ô)=Ò=Ð=Ø�ØØ�KŠK˜ÑÔÐÐØ�T˜7Ð"Ð"r    c                ó†   ‡— t          |¦  «        Št          ˆfd„| j                             ¦   «         D ¦   «         ¦  «        S )zVWhether an enabled, valid account exists outside ``exclude`` (busy or cooling counts).c              3  ób   •K  — | ])}|j         ‰vo|j        o|j        t          j        k    V — Œ*d S r   )r2   r    r’   r   r“   )rt   r4   r£   s     €r   r�   z.AccountPool.has_alternative.<locals>.<genexpr>¥   sT   øè è € ð 5ð 5Øð ”4˜xÐ'Ð[¨A¬IÐ[¸!¼(ÅmÔF[Ò:[ð 5ð 5ð 5ð 5ð 5ð 5r    )rŸ   Úanyrl   r|   )r   r›   r£   s     @r   Úhas_alternativezAccountPool.has_alternative¢   sT   ø€ å�w‘<”<ˆÝð 5ð 5ð 5ð 5Ø œN×1Ò1Ñ3Ô3ð5ñ 5ô 5ñ 5ô 5ð 	5r    r   N©r›   r   r   r   c             ƒ  óH  K  — t          |¦  «        }t          j        ¦   «         | j        z   }| j        4 ƒd {V —† 	 |                      |¦  «        \  }}}|ra| j                             ||¦  «        }| j        |j	        xx         dz  cc<   t          j        ¦   «         |_
        |cd d d ¦  «        ƒd {V —† S |t          j        ¦   «         z
  }|€d n|t          j        ¦   «         z
  }	|s|	€t          d¦  «        ‚|dk    s|s|	|k    r|rdnd}
t          d|
› d�¦  «        ‚|	€|nt          |t          |	d	¦  «        ¦  «        }	 t          j        | j                             ¦   «         |¬
¦  «        ƒ d {V —† n# t          j        $ r Y �ŒPw xY w�ŒU# 1 ƒd {V —†swxY w Y   d S )NTr   zno usable account in poolr   r¥   zcooling downzall accounts are z, try again latergš™™™™™©?)Útimeout)Útupler˜   Ú	monotonicrf   rp   r§   rc   r   rm   r2   rA   r
   rB   rk   rn   Úwait_forÚwaitÚTimeoutError)r   r›   r   Údeadliner¤   r¥   r¦   rQ   Ú	remainingÚback_inÚreasonr²   s               r   ÚacquirezAccountPool.acquire¨   sh  è è € Ý˜‘.”.ˆÝ”>Ñ#Ô# dÔ&:Ñ:ˆØ”:ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðØ&*×&6Ò&6°wÑ&?Ô&?Ñ#��d˜GØð Øœ-×.Ò.¨t°TÑ:Ô:�CØ”N 3¤6Ð*Ð*Ô*¨aÑ/Ð*Ð*Ñ*Ý'+¤y¡{¤{�CÔ$Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð %¥t¤~Ñ'7Ô'7Ñ7�	Ø") /˜$˜$°wÅÄÁÄÑ7L�Øð J  Ý,Ð-HÑIÔIÐIØ ’>�>¨$�>°7¸YÒ3FÐ3Fà'+Ð?˜V˜V°�FÝ,Ð-ZÀÐ-ZÐ-ZÐ-ZÑ[Ô[Ð[à$+ O�y�y½¸YÍÈGÐUYÑHZÔHZÑ9[Ô9[�ðÝ!Ô*¨4¬:¯?ª?Ñ+<Ô+<ÀdÐKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKøÝÔ+ð ð ð Ø‘Hðøøøñ'ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s=   ºA+FÂ8BFÅ3E9Å8FÅ9FÆFÆFÆFÆ
FÆFr[   úBaseException | Nonec              ƒ  ó^  K  — | j         4 ƒd {V —† t          d| j        |j                 dz
  ¦  «        | j        |j        <   |                      ||¦  «         | j                              ¦   «          d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |                      ¦   «         ƒ d {V —† d S )Nr   r   )rp   rk   rm   r2   Ú_apply_resultr„   r}   )r   rY   r[   s      r   ÚreleasezAccountPool.releaseÂ   s5  è è € Ø”:ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$Ý),¨Q°´¸w¼zÔ0JÈQÑ0NÑ)OÔ)OˆDŒN˜7œ:Ñ&Ø×Ò˜w¨Ñ.Ô.Ð.ØŒJ×!Ò!Ñ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð �lŠl‰nŒnÐÐÐÐÐÐÐÐÐs   �A BÂ
BÂBrQ   c                ó  — |€?|xj         dz  c_         d |_        |j        t          j        k    rt          j        |_        d S |xj        dz  c_        t          |¦  «        d d…         |_        t          |t          ¦  «        r4t          j
        |_        t                               d|j        |¦  «         d S t          |t          ¦  «        rat          j        |_        t          j        ¦   «         t!          | j        d¦  «        z   |_        t                               d|j        ¦  «         d S t          |t&          ¦  «        rd S t)          |dd¦  «        r3t          j        |_        t          j        ¦   «         | j        z   |_        d S d S )Nr   iô  zaccount %s marked invalid: %si  z%account %s out of quota, cooling downÚ	retryableF)Úsuccess_countÚ
last_errorr’   r   ÚCOOLINGÚACTIVEÚ
fail_countrh   Ú
isinstancer   r“   rw   Úwarningr2   r   r˜   rk   re   r¡   r   Úgetattr)r   rQ   r[   s      r   r»   zAccountPool._apply_resultÉ   sX  € Øˆ=ØÐÔ Ñ"ÐÔØ!ˆCŒNØŒz�]Ô2Ò2Ð2Ý*Ô1�”
ØˆFØˆŒ˜!ÑˆŒÝ˜U™œ D S DÔ)ˆŒÝ�eÕ.Ñ/Ô/ð 	=Ý&Ô.ˆCŒJÝ�KŠKÐ7¸¼ÀÑGÔGÐGÐGÐGÝ˜Õ1Ñ2Ô2ð 
	=Ý&Ô.ˆCŒJÝ!%¤¡¤­s°4´=À$Ñ/GÔ/GÑ!GˆCÔÝ�KŠKÐ?ÀÄÑHÔHÐHÐHÐHÝ˜�Ñ/Ô/ð 	=ð ˆDÝ�U˜K¨Ñ/Ô/ð 	=Ý&Ô.ˆCŒJÝ!%¤¡¤¨t¬}Ñ!<ˆCÔÐÐð	=ð 	=r    úAsyncIterator[Lease]c              ón  K  — |                       ||¬¦  «        ƒ d {V —†}t          |¦  «        }	 |W V — n7# t          j        t          f$ r ‚ t
          $ r}|j        p||_        ‚ d }~ww xY w	 |                      ||j        ¦  «        ƒ d {V —† d S # |                      ||j        ¦  «        ƒ d {V —† w xY w)Nr¬   )r¸   rX   rn   ÚCancelledErrorÚGeneratorExitr^   r[   r¼   )r   r›   r   rQ   Úleaser]   s         r   rË   zAccountPool.leaseá   sü   è è € ð —L’L¨°t�LÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<ˆÝ�c‘
”
ˆð		1ØˆKˆKˆKˆKˆKøÝÔ&­Ð6ð 	ð 	ð 	àÝð 	ð 	ð 	Øœ+Ð,¨ˆEŒKØøøøøð	øøøð	 ð —,’,˜s E¤KÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ø�$—,’,˜s E¤KÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøs&   °6 µB ¶ A*ÁA%Á%A*Á*B Â#B4)rg   r   rc   rh   rd   rG   re   ri   rf   ri   r   r(   r<   )r   r   )r€   rh   r   r�   )rY   r   r   r   )r€   rh   r   r†   )r   rŠ   )r›   rœ   r   r�   )r›   rœ   r   r†   )r›   rœ   r   r   r   r   r   )rY   r   r[   r¹   r   r(   )rQ   r   r[   r¹   r   r(   )r›   rœ   r   r   r   rÇ   )r#   r$   r%   r.   rv   r}   r   rM   r…   r‰   rš   r§   r«   r¸   r¼   r»   r   rË   r   r    r   rb   rb   W   sv  € € € € € ð
 Ø ØØ!%ð)ð )ð )ð )ð )ð )ð&>ð >ð >ð >ð=ð =ð =ð =ð-ð -ð -ð -ð.ð .ð .ð .ðð ð ð ðð ð ð ð
ð 
ð 
ð 
ð#ð #ð #ð #ð$5ð 5ð 5ð 5ð 9;Ètð ð ð ð ð ð ð4ð ð ð ð ð=ð =ð =ð =ð0 à*,Àð1ð 1ð 1ð 1ð 1ñ Ôð1ð 1ð 1r    rb   )%rR   Ú
__future__r   rn   r*   Úloggingr˜   Úcollectionsr   Úcollections.abcr   r   Ú
contextlibr   Útypingr   Úerrorsr
   r   r   r   Úmodelr   r   rg   r   Ú	getLoggerr#   rw   r   r'   r>   rD   rV   Ú__annotations__rX   rb   r   r    r   ú<module>rÖ      s6  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð à _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð à€gÔ˜Ñ!Ô!€ðRð Rð Rð Rð Rˆxñ Rô Rð Rð;ð ;ð ;ð ;ð ;ñ ;ô ;ð ;ð=ð =ð =ð =ð =ñ =ô =ð =ð
ð ð ð ð ñ ô ð ð. &ØØ ðð €
ð ð ð ñ ðð ð ð ð ñ ô ð ðY1ð Y1ð Y1ð Y1ð Y1ñ Y1ô Y1ð Y1ð Y1ð Y1r    