Ë
    áß²jåU  ã                  ód  — U d Z ddlmZ ddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZ  eh d£«      Zdjd„Zd	Zd
Zdkd„Zdld„Z G d„ de«      Zddej,                  j.                  ddfdddddddddfZded<   ej4                  j.                  ej,                  j.                  ej,                  j.                  ej6                  j.                  ej6                  j.                  ej8                  j.                  ej8                  j.                  dœZded<   dmd „Zdnd!„Zdod"„Z d#Z!d$Z"ej4                  j.                  d%ejF                  j.                  d%ej6                  j.                  d&ej,                  j.                  d'ej8                  j.                  d(iZ$d)ed*<   d+Z%ejL                  j.                  d,ejN                  j.                  d-ejP                  j.                  d.ejR                  j.                  d/ejT                  j.                  d0ejV                  j.                  d1iZ,d)ed2<   d3Z-d4d5d6œZ.d)ed7<   d8Z/ej8                  j.                  d9ej4                  j.                  d:ejF                  j.                  d:ej6                  j.                  d;ej,                  j.                  d<ej`                  j.                  d=d>d=ejb                  j.                  d?ejd                  j.                  d?ejV                  j.                  d@ejL                  j.                  dAejf                  j.                  dBdCdDdEdDiZ4d)edF<   dGdHdIœdpdJ„Z5dKdLdMe!z   dNz   dOe"z   dNz   dPdQœZ6d)edR<   dSdTdUdVdWe"z   dNz   dXdYdZd[œZ7d)ed\<   i e6¥e7¥Z8d)ed]<   dqd^„Z9dd_œdrd`„Z:dsdtda„Z;dldb„Z<dldc„Z=dddœ	 	 	 	 	 	 	 	 	 	 	 dude„Z>dvdf„Z?dwdxdg„Z@ G dh„ dieA«      ZBy)yaá  User-facing copy and ``failure_reason`` stamping for terminal failed-turn results.

Every terminal result dict the turn loop returns must carry ``failure_reason`` (a
``FailoverReason`` value or one of :data:`SITE_FAILURE_CODES`) and ``failure_retryable`` so
``agent/error_surface.py`` yields a specific descriptor instead of ``unknown``. The copy
tables here say WHAT happened and WHAT TO DO in plain words; raw provider detail rides a
trailing "Provider said:" / "Details:" line.
é    )ÚannotationsN)ÚAnyÚDictÚ
NamedTupleÚOptionalÚTuple)ÚFailoverReason)Údisplay_hermes_home>   Ú	truncatedÚ
loop_errorÚsession_busyÚempty_responseÚcontext_overflowÚinvalid_responseÚinterpreter_shutdownc                ó,   — || d<   t        |«      | d<   | S )zHStamp the UI verdict fields on a terminal result (in place; returns it).Úfailure_reasonÚfailure_retryable)Úbool)ÚresultÚreasonÚ	retryables      ú</home/ubuntu/.hermes/hermes-agent/agent/turn_failure_copy.pyÚstamp_failurer      s!   € à%€FÐÑÜ"& y£/€FÐÑØ€Mó    zSYour request was not processed. Send it again if you still want me to carry it out.zeThis turn did not complete. Some actions may already have run; verify their effects before resending.c                óÊ   — | xs dD ]U  }t        |t        «      sŒ|j                  d«      dk(  s'|j                  d«      dk(  sŒ=|j                  d«      sŒOt        c S  t        S )zVBoundary copy for a failed turn: never claim "not processed" when a tool may have run.© ÚroleÚtoolÚ	assistantÚ
tool_calls)Ú
isinstanceÚdictÚgetÚPARTIAL_FAILED_TURN_NOTICEÚFAILED_TURN_NOTICE)Úturn_messagesÚrows     r   Úfailed_turn_noticer)   0   sY   € àÒ" ò .ˆÜ�cœ4Õ Ø�G‰G�F‹O˜vÒ%¨#¯'©'°&«/¸[Ó*HÈSÏWÉWÐUaÕMbä-Ò-ð	.ô
 Ðr   c                ó8   — ddl m}  |t        | xs d«      «      S )uT   Human-friendly provider name for chat copy (``"OpenRouter"``, ``"Nous Portal"``â€¦).r   )Úprovider_labelÚ )Úhermes_cli.modelsr+   Ústr)Úproviderr+   s     r   Úprovider_label_forr0   :   s   € å0áœ#˜hšn¨"Ó-Ó.Ð.r   c                  ó4   — e Zd ZU dZded<   ded<   dZded<   y)	ÚExitFailureu_  Verdict for a loop exit. ``fails_turn`` False = advisory: the descriptor fields are
    stamped so Desktop/TUI show a specific code, but ``failed``/``completed`` keep the values
    the loop chose â€” cron silence, the kanban dispatcher breaker and gateway transcript
    persistence all key on ``failed`` and must not change because a code was added.r.   r   r   r   TÚ
fails_turnN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r3   r   r   r   r2   r2   C   s   … ñWð
 ƒKØƒOØ€J�Ôr   r2   )Úempty_response_exhaustedr   TFÚ!all_retries_exhausted_no_responseT)r   r   FT)Úlocal_processing_errorr   FF)Úrepeated_outer_errorsr   TT)Úerror_near_max_iterationsr   TT)Úcontext_compression_timeoutr   FT)Úcontext_compression_exhaustedr   FT)Ú ollama_runtime_context_too_smallr   FT)Úredirect_restart_limit_exceededr   TF)Úrebuilt_restart_limit_exceededr   TFz'Tuple[Tuple[str, str, bool, bool], ...]Ú_EXIT_REASON_FAILURES)i­  iô  iö  i÷  i  iø  i  zDict[int, str]Ú_INVALID_RESPONSE_CODESc                óþ   — | �t        | dd«      nd}|�t        |dd«      nd}|€!t        |t        «      r|j                  d«      }	 |�t        j                  t        |«      d«      S dS # t        t        f$ r Y yw xY w)zÙ``failure_reason`` for an empty/malformed HTTP-200 body: the embedded provider error
    code when there is one (so the desktop shows Retry + Switch provider consistently), else
    the ``invalid_response`` site code.NÚerrorÚcoder   )Úgetattrr"   r#   r$   rD   ÚintÚ	TypeErrorÚ
ValueError)ÚresponseÚerrrG   s      r   Úinvalid_response_failure_reasonrN   k   sˆ   € ð /7Ð.BŒ'�(˜G TÔ
*È€CØ),¨Œ7�3˜ Ô%¸d€DØ€|œ
 3¬Ô-Ø�w‰w�v‹ˆð"ØMQÐM]Ô&×*Ñ*¬3¨t«9Ð6HÓIÐuÐcuÐuøÜ”zÐ"ò "Ù!ð"ús   Á A* Á(A* Á*A<Á;A<c                ó‚   — t        | xs d«      }t        D ]'  \  }}}}|j                  |«      sŒt        |||«      c S  y)zO:class:`ExitFailure` for a loop exit that carries a failure verdict, else None.r,   N)r.   rC   Ú
startswithr2   )Úturn_exit_reasonr   ÚprefixrG   r   r3   s         r   Úexit_reason_failurerS   y   sL   € äÐ!Ò' RÓ(€FÜ/Dò <Ñ+ˆ��i Ø×Ñ˜VÕ$Ü˜t Y°
Ó;Ò;ð<ð r   c                ój  — t        | t        «      sy| j                  d«      du s| j                  d«      du ry| j                  d«      dury| j                  d«      }t        |t        «      r|j	                  d«      syt        t        | j                  d«      xs d	«      j                  «       «      S )
ur  A non-failed, non-interrupted ``max_iterations_reached(N/N)`` result that still carries a
    summary. ``completed`` is False because the work did not finish in that turn, but the turn
    itself is a resumable boundary â€” not a failure â€” so cron delivers the summary and an active
    ``/goal`` may judge it (#102213). Provider/API failures never match (cf. #63180).FÚfailedTÚinterruptedÚ	completedrQ   zmax_iterations_reached(Úfinal_responser,   )r"   r#   r$   r.   rP   r   Ústrip)r   r   s     r   Úis_max_iteration_handoffrZ   ‚   s›   € ô
 �fœdÔ#ØØ‡z�z�(Ó˜tÑ# v§z¡z°-Ó'@ÀDÑ'HØØ‡z�z�+Ó eÑ+ØØ�Z‰ZÐ*Ó+€FÜ�vœsÔ#¨×(9Ñ(9Ð:SÔ(TØÜ”�F—J‘JÐ/Ó0Ò6°BÓ7×=Ñ=Ó?Ó@Ð@r   z<Wait a minute and send /retry, or switch models with /model.zœYour message is saved. Send `continue` to try again, or start a new session with /new. If it happens again, run `hermes doctor` and share the error details.z5{label} rate-limited every one of {attempts} attemptsz={label} reported it was overloaded on all {attempts} attemptsz:{label} returned a server error on all {attempts} attemptsz<{label} didn't respond in time on any of {attempts} attemptszDict[str, str]Ú_EXHAUSTED_LEADSz/{label} didn't answer after {attempts} attemptsz~Model '{model}' isn't available on {label}. Pick a different model with /model (or `hermes model` in a terminal).{prefix_hint}z±{label} rejected this request as malformed, so the model didn't answer. Start a clean session with /new or switch models with /model; if it keeps happening, run `hermes doctor`.z¥{label} requires user and assistant turns to strictly alternate and rejected this conversation's shape. Start a clean session with /new or switch models with /model.u  Hermes couldn't verify {label}'s security certificate, so the connection was refused. This is usually a corporate proxy or an outdated certificate store on this computer â€” see the terminal or `{home}/logs/agent.log` for the exact fix, or try another provider with /model.z¢{label}'s account settings don't allow this model for your request, so it didn't answer. Check the provider's data/privacy settings, or switch models with /model.zçA firewall/CDN in front of {label} blocked the request before it reached the model, so your key is probably fine. Set a custom User-Agent via the provider's extra_headers, check the proxy/WAF rules, or switch providers with /model.Ú_NONRETRYABLE_COPYz†{label} rejected the request and retrying won't help. Pick another model with /model, or check the details in `{home}/logs/agent.log`.zY{label} rejected your sign-in, so the model can't be reached. Sign in again: `{relogin}`.u‡   {label} rejected your API key, so the model can't be reached. Update it in Settings â†’ Providers, or run `hermes setup` in a terminal.)ÚoauthÚapi_keyÚ
_AUTH_COPYzeTry rewording your message or removing sensitive attachments, or switch to another model with /model.z,the AI model service did not respond in timez9the AI model service was rate-limited (too many requests)z,the AI model service is overloaded right nowz/the AI model service returned an internal errorzHthe AI model service says the account's usage or credit limit is reachedÚbilling_unverifiedz)the AI model service rejected the sign-inzCa firewall/CDN in front of the AI model service blocked the requestz>the model {subject} uses was not found at the AI model servicez9the AI model service's safety filter rejected the requestr   z1{possessive} request grew too large for the modelÚpayload_too_largeÚFAILURE_CAUSE_GLOSSÚitÚits©ÚsubjectÚ
possessivec               ót   — t         j                  t        | xs d«      «      }|r|j                  ||¬«      S dS )zTPlain clause for a classified ``failure_reason``; None when the reason has no gloss.r,   re   N)rb   r$   r.   Úformat)r   rf   rg   Útemplates       r   Úfailure_cause_glossrk   ì   s6   € ä"×&Ñ&¤s¨6ª<°RÓ'8Ó9€HÙFNˆ8�?‰? 7°zˆ?ÓBÐXÐTXÐXr   zýThis conversation has grown too long for {model} to read, and Hermes couldn't shrink it enough automatically. Start a new session with /new (your history is kept), or try /compress once more. Switching to a model with a bigger context window also works.zëThe model's reply was cut off before it finished (it hit its output length limit), so Hermes didn't run the incomplete action. Nothing was changed. Send `continue`, ask for the work in smaller steps, or raise max_tokens for this model.up   {label} sent back an empty or broken reply {attempts} times â€” it is probably overloaded or rate-limiting you. z

Details: {detail}zOHermes hit repeated errors and stopped this turn so it wouldn't keep retrying. u}   Hermes was shutting down and stopped this turn. Your conversation is saved â€” reopen it{resume} and send your message again.)r   r   r   r   r   Ú_FAILURE_CODE_COPYz×This conversation (including attachments) has grown too large to send to {model}, and Hermes couldn't shrink it enough automatically. Start a new session with /new (your history is kept), or try /compress once more.zÚThis conversation is too long for {model} and automatic shrinking is turned off in your settings (compression.enabled). Run /compress to shrink it now, /new to start fresh, or pick a model with a bigger context window.uù  The model server rejected this request as too large, but this conversation is only about {tokens:,} tokens â€” well under the {window:,}-token window Hermes knows for {model} â€” so shrinking it would not help. Another request on the same server (for example a background memory review from an earlier session) was probably holding its capacity, or the server runs {model} with a smaller window than Hermes assumes. Wait a moment and send /retry; if it keeps happening, check the server's context setting.z½The connection to {label} kept dropping while the model was writing a large action, so nothing was run. Check your network and send /retry; asking for the file in smaller pieces also helps.zUHermes hit an internal error while handling the model's reply and stopped this turn. uë   âš ï¸� {model} spent all of its output budget thinking and never wrote an answer. Lower its reasoning effort with `/reasoning low`, or switch to a different model with /model. Its last thoughts, which may contain the answer:

{preview}z°I ran out of steps for this turn ({limit} tool calls) before finishing, and couldn't produce a summary. Send `continue` to keep going, or raise `max_iterations` in your config.zƒWait for the reset and send /retry, or switch models with /model. To avoid waits, add a backup provider with `hermes fallback add`.)ra   Úcompression_disabledÚserver_context_rejectionÚstream_dropped_tool_callr;   Úreasoning_onlyÚmax_iterations_no_summaryÚnous_rate_limitÚ_ONE_OFF_COPYÚ
_SITE_COPYc                óx   — |j                  dt        «       «       t        |    j                  t	        |«      «      S )z^Chat copy for a failure code or one-off loop outcome; unknown fields default to empty strings.Úhome)Ú
setdefaultr
   rt   Ú
format_mapÚ	_Defaults)rG   Úfieldss     r   Ú	site_copyr{   B  s1   € à
×Ñ�fÔ1Ó3Ô4Ü�dÑ×&Ñ&¤y°Ó'8Ó9Ð9r   )Úreset_secondsc               ó²   — t         j                  | t        «      j                  ||¬«      }|�|dk\  rddlm} d ||«      › d�}n	dt        › �}|› d|› d	|› �S )
z¾Chat copy once retries + fallback are exhausted (``max_retries_exhausted_result``). A rate
    limit whose reset window is known names it: an 8.6h plan quota is not "wait a minute" (#89401).)ÚlabelÚattemptséx   r   )Úformat_reset_windowzits usage limit resets in z7. Send /retry after that, or switch models with /model.z"it looks temporarily unavailable. u    â€” z\ To avoid this in future, add a backup provider with `hermes fallback add`.

Provider said: )r[   r$   Ú_EXHAUSTED_DEFAULT_LEADri   Úagent.retry_utilsr�   Ú_NEXT_STEPS_RETRY)r   r~   r   Úsummaryr|   Úleadr�   Ú	situations           r   Úexhausted_copyrˆ   H  s†   € ô ×Ñ Ô(?Ó@×GÑGÈeÐ^fÐGÓg€DØÐ  ]°cÒ%9Ý9Ø1Ñ2EÀmÓ2TÐ1Uð VMð M‰	ð 9Ô9JÐ8KÐLˆ	àˆ&��i�[ð !OØOVÈið	Yðr   c                ó  — |€t        j                   «       n|}t        | |z
  «      }|dk  ryt        |dz   dz  d«      \  }}|r	|› d|d›d�n|› d�}dt        j                  d	t        j                  | «      «      › d
|› d�S )a  One chat/CLI line naming when the provider says the limit lifts (#98852): the Retry-After
    / ``resets_at`` the loop already honours for backoff, shown to the user instead of a bare
    "wait a minute". Local wall-clock time plus the remaining wait; empty once it has passed.r   r,   é;   é<   zh Ú02dÚmzLimit resets at z%H:%Mz (in z).)ÚtimerI   ÚdivmodÚstrftimeÚ	localtime)Ú	resets_atÚnowÚ	remainingÚhoursÚminutesÚwaits         r   Úlimit_reset_copyr˜   X  s’   € ð ˜Œ$�)‰)Œ+¨#€CÜ�I ‘OÓ$€IØ�A‚~ØÜ˜Y¨™^°Ñ2°BÓ7�N€Eˆ7Ù).ˆeˆW�B�w˜s�m 1Ñ%°w°i¸q°M€DØœdŸm™m¨G´T·^±^ÀIÓ5NÓOÐPÐPUÐVZÐU[Ð[]Ð^Ð^r   c                ó    — ddl m} t        | xs d«      j                  «       j	                  «       }|dk(  rd |«       › d�S d |«       › d|› d�S )	aP  The exact re-login command for a rejected OAuth grant, naming the provider slug and the active
    named profile: a profile's credentials are its own (93889b770da), so a bare ``hermes auth`` from
    the root profile re-signs the wrong store and the goal judge, reading a bare 401, guesses which
    service revoked the token (#114012).r   ©Úprofile_cli_selectorr,   Únousúhermes Úportalú	auth add z --type oauth)Úhermes_constantsr›   r.   rY   Úlower)r/   r›   Úslugs      r   Úoauth_relogin_commandr£   e  s\   € õ
 6äˆxŠ~˜2Ó×$Ñ$Ó&×,Ñ,Ó.€DØˆv‚~ØÑ-Ó/Ð0°Ð7Ð7ØÑ)Ó+Ð,¨I°d°V¸=ÐIÐIr   c                óÐ   — ddl m} t        | xs d«      j                  «       j	                  «       }|sd |«       › d�S ddlm}  ||«      dk(  rt        |«      S d |«       › d|› �S )	ur  Re-sign-in command for a rejected credential on surfaces that may not know the provider:
    the exact OAuth command for a known OAuth slug, ``hermes auth add <slug>`` for a known API-key
    slug, and the ``<provider>`` placeholder when the slug is unknown â€” always carrying the
    ``-p <profile>`` selector so a profile user never re-signs the ROOT store (#114012).r   rš   r,   r�   zauth add <provider>©Ú	auth_kindr]   rŸ   )r    r›   r.   rY   r¡   Úagent.error_surfacer¦   r£   )r/   r›   r¢   r¦   s       r   Úrelogin_command_hintr¨   r  sq   € õ
 6äˆxŠ~˜2Ó×$Ñ$Ó&×,Ñ,Ó.€DÙØÑ-Ó/Ð0Ð0CÐDÐDÝ-á�ƒ˜'Ò!Ü$ TÓ*Ð*ØÑ)Ó+Ð,¨I°d°VÐ<Ð<r   )Úprefix_suggestionc          	     óD  — t        |«      }t        | dd«      r#ddlm} t         |t        |xs d«      «         }n.t        j                  | j                  j                  t        «      }|rd|› d�nd}|j                  ||t        «       |t        |«      ¬«      }	|	› d	|› �S )
zYChat copy for a terminal non-retryable rejection (auth, model missing, TLS, generic 4xx).Úis_authFr   r¥   r,   uV    If you typed the name yourself it may be missing its vendor prefix â€” did you mean 'z'?)r~   Úmodelrv   Úprefix_hintÚreloginú

Provider said: )r0   rH   r§   r¦   r_   r.   r\   r$   r   ÚvalueÚ_NONRETRYABLE_DEFAULT_COPYri   r
   r£   )
Ú
classifiedr/   r¬   r…   r©   r~   r¦   rj   r­   Úbodys
             r   Únonretryable_copyr´   ƒ  s°   € ô ˜xÓ(€EÜˆz˜9 eÔ,Ý1ä™i¬¨HªN¸Ó(;Ó<Ñ=‰ä%×)Ñ)¨*×*;Ñ*;×*AÑ*AÔC]Ó^ˆñ ðØÐ˜bñ	"à"$ð ð
 �?‰? ¨eÔ:MÓ:OÐ]hÜ#8¸Ó#Bð ó D€DàˆVÐ& w iÐ0Ð0r   c                ó   — | › dt         › d|› �S )NzC's safety filter refused this request, so the model didn't answer. r¯   )ÚCONTENT_POLICY_NEXT_STEPS)r~   r…   s     r   Úcontent_policy_copyr·   ˜  s"   € àˆ'ÐTÜ$Ð
%Ð%8¸¸	ð	Cðr   c                óì   — t        | «      xs t        | «      j                  j                  «       j	                  «       }|r|d   nt        | «      j                  }t        |«      |k  r|S |d|dz
   dz   S )zLFirst line of an exception's text, capped, for a trailing ``Details:`` line.r   Né   u   â€¦)r.   Útyper4   rY   Ú
splitlinesÚlen)ÚexcÚlimitÚtextÚfirsts       r   Úshort_detailrÁ   Ÿ  si   € ä�‹HÒ*œ˜S›	×*Ñ*×1Ñ1Ó3×>Ñ>Ó@€DÙˆD�ŠG¤ c£×!3Ñ!3€EÜ˜“J %Ò'ˆ5ÐG¨U°;°U¸Q±YÐ-?À%Ñ-GÐGr   c                  ó   — e Zd Zdd„Zy)ry   c                 ó   — y)Nr,   r   )ÚselfÚkeys     r   Ú__missing__z_Defaults.__missing__§  s   € Ør   N)rÅ   r.   Úreturnr.   )r4   r5   r6   rÆ   r   r   r   ry   ry   ¦  s   „ ôr   ry   )r   úDict[str, Any]r   r.   r   r   rÇ   rÈ   )r'   r   rÇ   r.   )r/   r   rÇ   r.   )rL   r   rÇ   r.   )rQ   r   rÇ   zOptional[ExitFailure])r   r   rÇ   r   )r   r   rf   r.   rg   r.   rÇ   úOptional[str])rG   r.   rz   r   rÇ   r.   )r   r.   r~   r.   r   rI   r…   r.   r|   úOptional[float]rÇ   r.   )N)r’   Úfloatr“   rÊ   rÇ   r.   )r²   r   r/   r   r¬   r   r…   r.   r©   rÉ   rÇ   r.   )r~   r.   r…   r.   rÇ   r.   )éÈ   )r½   r   r¾   rI   rÇ   r.   )Cr7   Ú
__future__r   rŽ   Útypingr   r   r   r   r   Úagent.error_classifierr	   r    r
   Ú	frozensetÚSITE_FAILURE_CODESr   r&   r%   r)   r0   r2   Úserver_errorr°   rC   r8   Ú
rate_limitÚ
overloadedÚtimeoutrD   rN   rS   rZ   r„   Ú_NEXT_STEPS_LOOPÚupstream_rate_limitr[   r‚   Úmodel_not_foundÚformat_errorÚrole_alternationÚssl_cert_verificationÚprovider_policy_blockedÚupstream_blockedr\   r±   r_   r¶   ÚbillingÚauthÚauth_permanentÚcontent_policy_blockedrb   rk   rl   rs   rt   r{   rˆ   r˜   r£   r¨   r´   r·   rÁ   r#   ry   r   r   r   ú<module>râ      sš  ðòõ #ã ß 9Õ 9å 1Ý 0ñ ò  ó Ð óð Zð ðð óó/ô�*ô ð @Ø(¨.×*EÑ*E×*KÑ*KÈTÐSWÐXØAà:Ø7Ø;ØDØFØIàBØAðBÐ Ð>ó ð( 
×	"Ñ	"×	(Ñ	(Ø	×	$Ñ	$×	*Ñ	*°×1LÑ1L×1RÑ1RØ	×	"Ñ	"×	(Ñ	(¨~×/HÑ/H×/NÑ/NØ	×	Ñ	×	%Ñ	%¨N×,BÑ,B×,HÑ,Hñ	+Ð ˜ó ó"óóAð& SÐ ðLð ð ×Ñ×#Ñ#Ð%\Ø×&Ñ&×,Ñ,Ð.eØ×Ñ×#Ñ#Ð%dØ×Ñ×%Ñ%Ð'cØ×Ñ× Ñ Ð"`ð$Ð �.ó ð LÐ ð ×"Ñ"×(Ñ(ð	:ð ×Ñ×%Ñ%ð	fð ×#Ñ#×)Ñ)ð	^ð ×(Ñ(×.Ñ.ð	ð
 ×*Ñ*×0Ñ0ð	\ð ×#Ñ#×)Ñ)ð	@ð1&Ð �Nó ð<7ð ð
 ið	Gñ€
ˆNó ðð ð ×Ñ× Ñ Ð"PØ×Ñ×#Ñ#Ð%`Ø×&Ñ&×,Ñ,Ð.iØ×Ñ×#Ñ#Ð%SØ×Ñ×%Ñ%Ð'XØ×Ñ× Ñ Ð"làÐdØ×Ñ×ÑÐJØ×!Ñ!×'Ñ'Ð)TØ×#Ñ#×)Ñ)Ð+pØ×"Ñ"×(Ñ(Ð*jØ×)Ñ)×/Ñ/Ð1lØÐKØÐLð'Ð �^ó ð& 8<Èuõ Yð	]ð
	Ið
	!Ø#4ñ	5Ø7Nñ	Oð 	ZØ
ñ	Ø4ñ	5ð	2ñ)&Ð �Nó ð:	8ð
	?ð	]ð	ð 	`Ø
ñ	Ø4ñ	5ð	Hð
	fð	8ñU-!€ˆ~ó -ð\ EÐ 2ÐD°mÐD€
ˆNÓ Dó:ð nrõ ô 
_ó
Jó=ð$ eiñ1Øð1Ø"%ð1Ø.1ð1Ø<?ð1ØTað1àó1ó*ôHô�õ r   