+
    lHàj'A  ã                   óœ  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIHt ]P                  ! R4      t]! R4      tR R ltR	 R
 ltR,R R lltR R lt]P*                  ! R]P,                  ]P.                  ,          4      t]P*                  ! R4      t]P*                  ! R4      tR R lt];QJ d    . R R- 4       F  NK  	  5M! R R- 4       4      t]P<                  R3R R3R R33tR R lt R R lt!]P*                  ! R4      t"]P*                  ! R4      t#R.t$R  R! lt%R" R# lt&R$ R% lt'R& R' lt(R( R) lt)R* R+ lt*R# )/að  Pre-execution guards for the terminal tool.

Pure functions that decide whether a command may run at all: workdir
validation, the foreground long-lived/background-operator guidance, the
supervised-gateway lifecycle block, and the Windows self-repo git guard.
Each ``*_block`` helper returns a finished JSON error string, or None when
the command may proceed. Split out of tools/terminal_tool.py; the origin
module re-imports every public helper so ``tools.terminal_tool.<name>``
keeps resolving.
N)ÚPath)ÚAnyÚOptional)Ústrip_inert_heredoc_bodiesztools.terminal_toolz/\:_-.~ +@=,c                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚchÚreturn©ÚstrÚbool)Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/tools/terminal_tool_guards.pyÚ__annotate__r       s   € ÷ ;ñ ;œcð ;¤dñ ;ó    c                 ó˜   € V '       d!   \        V 4      ^ 8  g   \        V 4      ^8X  d   R# V P                  4       ;'       g
    V \        9   # )é    F)ÚordÚisalnumÚ_WORKDIR_SAFE_ASCII_CHARS)r   s   &r   Ú_is_safe_workdir_charr       s6   € ß”�R“˜2”¤ R£¨C¤ÙØ�:‰:‹<×:Ð:˜2Ô!:Ñ:Ð:r   c                ó>   € V ^8„  d   QhR\         R\         R,          /# )r   Úworkdirr	   N©r   )r   s   "r   r   r   &   s   € ÷ 	ñ 	œsð 	¤s¨T¥zñ 	r   c                ó`   € T ;'       g    R F  p\        V4      '       d   K  RV: R2u # 	  R# )z�Error message if *workdir* has a disallowed character, else None.
Allowlist rather than deny-list so novel metacharacters can't slip through.Ú z/Blocked: workdir contains disallowed character z<. Use a simple filesystem path without shell metacharacters.N)r   )r   r   s   & r   Ú_validate_workdirr   &   s?   € ð �mˆm˜ŠmˆÜ$ R×(Ô(àAÀ"Áð HMð Mòñ ñ r   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   ÚcommandÚlimitr	   )r   Úintr   )r   s   "r   r   r   2   s!   € ÷ 	-ñ 	-¤3ð 	-¬sð 	-¼Sñ 	-r   c                ó¶   € V f   R# \        V \        4      '       d   V RV #  \        V 4      RV #   \         d    R\	        T 4      P
                   R2u # i ; i)z>Return a log-safe preview for possibly-invalid command values.Nz<None>Ú<Ú>)Ú
isinstancer   ÚreprÚ	ExceptionÚtypeÚ__name__)r   r   s   &&r   Ú_safe_command_previewr)   2   sb   € à‚ÙÜ�'œ3×ÒØ�v˜ˆÐð-Ü�G‹}˜V˜eÐ$Ð$øÜô -Ø”4˜“=×)Ñ)Ð*¨!Ð,Ò,ð-ús   £1 ±$AÁAc                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   ÚerrorÚstatusr	   r   )r   s   "r   r   r   >   s&   € ÷ lñ lœð l¤cð l¬cñ lr   c           
     óB   € \         P                  ! RRR^RV RV/RR7      # )z<The guard result envelope: exit_code 1 + *error* + *status*.Úoutputr   Ú	exit_coder+   r,   F)Úensure_ascii)ÚjsonÚdumps)r+   r,   s   &&r   Ú_blocked_jsonr3   >   s%   € ä�:Š:�x  [°!°W¸eÀXÈvÐVÐejÔkÐkr   z=(?:^|[;&|]\s*|&&\s*|\|\|\s*|\$\(\s*)(?:nohup|disown|setsid)\bz\s&\sz\s&\s*(?:#.*)?$c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r   r	   r   )r   s   "r   r   r   J   s   € ÷ ,ñ ,œ3ð ,¤3ñ ,r   c                ó¨   € \        V 4      p\        P                  ! RRV4      p\        P                  ! RRV4      p\        P                  ! RRV4      # )u¤  Blank quoted / backtick content and provably-inert heredoc bodies so
regex checks can't match keywords (nohup, setsid, '&') inside strings.

Heredocs are masked FIRST: their delimiter may itself be quoted
(``<<'EOF'``). ``strip_inert_heredoc_bodies`` is conservative â€” only a
quoted, terminated delimiter on a simple opener fed to a known non-shell
consumer is masked, so a real background operator can't hide in one.
z'[^']*'z''z"(?:[^"\\]|\\.)*"z""z`[^`]*`z``)r   ÚreÚsub)r   Úresults   & r   Ú_strip_quotesr:   J   sF   € ô (¨Ó0€FÜ�VŠV�J  fÓ-€FÜ�VŠVÐ(¨$°Ó7€FÜ�6Š6�*˜d FÓ+Ð+r   c              #   ól   "  € T F*  p\         P                  ! V\         P                  4      x € K,  	  R # 5i©N)r7   ÚcompileÚ
IGNORECASE)Ú.0Úps   & r   Ú	<genexpr>rA   Y   s,   é € ð 	(ñ 	OÈ¬¯
ª
°1´b·m±m×(DÐ(Dó 	Oùs   ‚24a	  Foreground command uses shell-level background wrappers (nohup/disown/setsid). Re-send WITHOUT the wrapper as terminal(command="<cmd>", background=true, notify_on_complete=true) so Hermes tracks the process, then run readiness checks and tests in separate commands.c                 óf   € \         P                  V 4      ;'       g    \        P                  V 4      # r<   )Ú_INLINE_BACKGROUND_AMP_REÚsearchÚ_TRAILING_BACKGROUND_AMP_RE©Úss   &r   Ú<lambda>rH   n   s(   € Ô+×2Ñ2°1Ó5×^Ð^Ô9T×9[Ñ9[Ð\]Ó9^Ð^r   uã   Foreground command uses '&' backgrounding. Re-send WITHOUT the '&' as terminal(command="<cmd>", background=true) â€” add notify_on_complete=true for bounded jobs â€” then run health checks and tests in follow-up terminal calls.c                 óˆ   a € \         ;QJ d#    V 3R  l\         4       F  '       g   K   R# 	  R# ! V 3R  l\         4       4      # )c              3   óD   <"  € T F  qP                  S4      x € K  	  R # 5ir<   )rD   )r?   r@   rG   s   & €r   rA   Ú<lambda>.<locals>.<genexpr>t   s   øé € ÐKÑ+J a—h‘h˜q—k�kÓ+Jùs   ƒ TF)ÚanyÚ_LONG_LIVED_FOREGROUND_PATTERNSrF   s   fr   rH   rH   t   s*   ø€ —#“#ÔKÕ+JÓK—#”#ÐK’#ÐK�#ÔKÕ+JÓKÔKr   zÁThis foreground command appears to start a long-lived server/watch process. Run it with background=true, verify readiness (health endpoint/log signal), then execute tests in a separate command.c                ó0   € V ^8„  d   QhR\         R\        /# r5   r
   )r   s   "r   r   r   |   s   € ÷ ñ ´ð ¼ñ r   c                óä   € RP                  V P                  4       P                  4       4      pRV9   ;'       g8    VP                  R4      ;'       g    RV9   ;'       g    VP                  R4      # )zGReturn True for informational invocations that should never be blocked.Ú z --helpz -hz
 --versionz -v)ÚjoinÚlowerÚsplitÚendswith)r   Ú
normalizeds   & r   Ú#_looks_like_help_or_version_commandrV   |   sp   € à—‘˜'Ÿ-™-›/×/Ñ/Ó1Ó2€Jà�ZÑ÷ 	&ð 	&Ø×Ñ˜uÓ%÷	&ð 	&à˜:Ñ%÷	&ð 	&ð ×Ñ˜uÓ%ð	r   c                ó>   € V ^8„  d   QhR\         R\         R,          /# ©r   r   r	   Nr   )r   s   "r   r   r   ‡   s"   € ÷ Sñ S¬Sð S´S¸4µZñ Sr   c                ót   a€ \        V 4      '       d   R# \        V 4      o\        V3R l\         4       R4      # )zŒGuidance text when a foreground command looks long-lived or uses shell
backgrounding (it should be a managed background session), else None.Nc              3   óL   <"  € T F  w  rV! S4      '       g   K  Vx € K  	  R # 5ir<   © )r?   ÚhitÚmsgÚunquoteds   &  €r   rA   Ú2_foreground_background_guidance.<locals>.<genexpr>�   s   øé € ÐKÑ%9™˜¹SÀ¿]—’Ó%9ùs   ƒ$š
$)rV   r:   ÚnextÚ_FOREGROUND_GUIDANCE)r   r^   s   &@r   Ú_foreground_background_guidancerb   ‡   s1   ø€ ô +¨7×3Ò3ÙÜ˜WÓ%€HÜÔKÕ%9ÓKÈTÓRÐRr   z&&|\d*[<>]&(?:\d+|-)?|&>>?|\|&z\s&\s*$c                ó0   € V ^8„  d   QhR\         R\         /# r5   r   )r   s   "r   r   r   š   s   € ÷ ñ ¤ð ¬ñ r   c                óP  € V P                  4       RR p\        V4      pV'       d}   W^,
          ,          P                  4       '       dZ   \        VRV^,
           4      \        VRV^,
           P                  R4      4      ,
          pV^,          '       d   MV^,          pK„  VRV # )a  *command* minus its final `&` and the UNESCAPED whitespace right before it.

A backslash-escaped space is part of the last argument (`trailing\ ` is the word `trailing `),
so trimming stops at the first whitespace byte preceded by an odd run of backslashes.
NÚ\éÿÿÿÿ)ÚrstripÚlenÚisspace)r   ÚbodyÚendÚbackslashess   &   r   Ú_strip_trailing_amprm   š   s‹   € ð �>‰>Ó˜C˜RÐ €DÜ
ˆd‹)€Cß
�$˜Q•w•-×'Ñ'×)Ò)Ü˜$˜x  a¥˜.Ó)¬C°°X°c¸Aµg°×0EÑ0EÀdÓ0KÓ,LÕLˆØ˜�?Œ?ØØˆq�ŠØ��ˆ:Ðr   c                ó0   € V ^8„  d   QhR\         R\        /# r5   )r   Útuple)r   s   "r   r   r   ª   s   € ÷ ñ ¤ð ¬ñ r   c           
     óÒ   € ^ RI Hp ^ RIHpHp ^ RIHpHpHp \        V! V 4      4      \        V! V 4      4      \        V! V 4      4      V! V 4      V! V 4      \        V! V 4      4      3# )a	  Everything the approval path keys a decision on for *command*: hardline verdict, the
dangerous pattern key/description (what session/permanent approvals are stored under), the
sudo-stdin floor, runtime self-delete, the user's deny rules and the permanent allowlist.)Úcommand_deletes_runtime)Ú$_command_matches_permanent_allowlistÚ_match_user_deny_rule)Ú_check_sudo_stdin_guardÚdetect_dangerous_commandÚdetect_hardline_command)Úagent.runtime_self_protectionrq   Útools.approvalrr   rs   Útools.approval_detectionrt   ru   rv   ro   r   )r   rq   rr   rs   rt   ru   rv   s   &      r   Ú_approval_identityrz   ª   sc   € õ FßZßsÑsäÑ% gÓ.Ó/ÜÑ& wÓ/Ó0ÜÑ% gÓ.Ó/Ù Ó(Ù˜gÓ&ÜÑ1°'Ó:Ó;ðð r   c                ó>   € V ^8„  d   QhR\         R\         R,          /# rX   r   )r   s   "r   r   r   »   s   € ÷ ñ ¬Sð ´S¸4µZñ r   c                óÖ  a € \        S \        4      '       d   \        S 4      '       d   R# \        ;QJ d#    V 3R l\         4       F  '       g   K   RM	  RM! V 3R l\         4       4      '       d   R# \        S 4      p\        P                  V4      '       d&   S P                  4       P                  R4      '       g   R# VP                  4       RR pRV9   g1   RV9   g*   RV9   g#   R	V9   g   \        P                  V4      '       d   R# R\        P                  R
V4      9   d   R# \        S 4      pVP                  4       '       g   R# \        S 4      \        V4      8w  d   R# V# )a¸  The command without its trailing `&` when that `&` is its ONLY backgrounding, else None.

Only the unambiguous shape converts: one line, one and-or list or pipeline (`a && b | c &`
backgrounds the whole list in bash, exactly what background=true runs), nothing after the
`&`. Inline `a & b`, `;` sequences, multi-line scripts/heredocs, nohup/disown/setsid and any
executable substitution (`$(...)`, backticks, `<(...)`/`>(...)`) keep the refusal: the tool
cannot prove there is no other background job or that later commands don't depend on a
readiness check. Quoted `&` (and inert heredoc bodies) never count. Conversion must leave
the approval identity untouched, otherwise the refusal stands.
Nc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir<   r[   )r?   Úmarkerr   s   & €r   rA   Ú2trailing_amp_background_command.<locals>.<genexpr>È   s   øé € Ð
LÑ+K �WÖÓ+Kùs   ƒTFÚ&Ú
ÚÚ;Ú#r   rf   )r$   r   rV   rL   Ú _EXECUTABLE_SUBSTITUTION_MARKERSr:   Ú_TRAILING_AMP_ONLY_RErD   rg   rT   Ú_SHELL_LEVEL_BACKGROUND_REÚ_NON_BACKGROUND_AMP_REr8   rm   Ústriprz   )r   r^   rj   Ústrippeds   f   r   Útrailing_amp_background_commandr‹   »   s  ø€ ô �gœs×#Ò#Ô'JÈ7×'SÒ'SÙß
ƒsÔ
LÕ+KÓ
L‡s‡s‚sÔ
LÕ+KÓ
L×LÒLÙÜ˜WÓ%€HÜ ×'Ñ'¨×1Ò1¸¿¹Ó9I×9RÑ9RÐSV×9WÒ9WÙØ�?‰?Ó˜S˜bÐ!€DØˆt„|�t˜t”| s¨d¤{°c¸T´kÔE_×EfÑEfÐgk×ElÒElÙØ
Ô$×(Ñ(¨¨TÓ2Ô2ÙÜ" 7Ó+€HØ�>‰>×ÒÙô ˜'Ó"Ô&8¸Ó&BÔBÙØ€Or   c                ój   € V ^8„  d   QhR\         R\        R\        R\        R\        \        ,          /# )r   ÚenvÚ	guard_cwdÚscript_pathÚ	max_bytesr	   )r   r   r    r   )r   s   "r   r   r   Ý   s7   € ÷ ñ ¤ð ´ð Ä#ð ÔRUð ÔZbÔcfÕZgñ r   c                óî  € V f   R#  \        V4      P                  4       pVP                  4       '       g   \        V4      V,          pVP                  4       '       d„   VP	                  4       p\        P
                  ! VP                  4      '       dN   VP                  V8:  d=   VP                  4       p\        V4      V8:  d   RV9   d   R# VP                  RRR7      #  T P                  RT^,            R\        P                  ! T4       24      pTP                  RR4      ^ 8X  d&   TP                  R	R
4      pT'       d
   RT9   d   R# T#  R#   \         d     Li ; i  \         d     R# i ; i)a  Best-effort script read: host filesystem first, then a bounded
``env.execute('head -c ... < path')`` for remote backends. Binary content
(NUL byte) is not a script: feeding it to the guard tokenizes machine code
into bogus paths and crashes the scanner, so it yields None.Nó    zutf-8Úreplace)Úerrorszhead -c z < Ú
returncoder.   r   Ú rf   )r   Ú
expanduserÚis_absoluteÚis_fileÚstatÚS_ISREGÚst_modeÚst_sizeÚ
read_bytesrh   Údecoder&   ÚexecuteÚshlexÚquoteÚget)	r�   rŽ   r�   r�   Ú
local_pathÚmetadataÚdatar9   r.   s	   &&&&     r   Ú_read_script_for_guardr§   Ý   sP  € ð
 ‚{ÙðÜ˜+Ó&×1Ñ1Ó3ˆ
Ø×%Ñ%×'Ò'Ü˜i›¨:Õ5ˆJØ×Ñ×ÒØ!—‘Ó(ˆHÜ�|Š|˜H×,Ñ,×-Ò-°(×2BÑ2BÀiÔ2OØ!×,Ñ,Ó.�Ü�t“9 	Ô)Ø#*¨d¤?˜4Ð^¸¿¹ÀGÐT]¸Ó8^Ð^ðØ—‘˜x¨	°A­ °c¼%¿+º+ÀkÓ:RÐ9SÐTÓUˆØ�:‰:�l BÓ'¨1Ô,Ø—Z‘Z ¨"Ó-ˆFß! f°Ô&6�4ÐB¸FÐBð -ñ
 øô ô Ùðûô ô ØÙðúsC   ˆAE Á5E Â9E ÃE Ã#A"E% ÅE% ÅE% ÅE"Å!E"Å%E4Å3E4c                ó˜   € V ^8„  d   QhR\         R\        R\         R\         R\        \         ,          R\         R\        \         ,          /# )r   r   r�   Úenv_typeÚcwdr   Úsession_keyr	   )r   r   r   )r   s   "r   r   r   ÿ   sa   € ÷ Uñ UäðUô 
ðUô ð	Uô
 
ðUô ”c�]ðUô ðUô Œc…]ñUr   c                ó
  aaa€ ^ RI Hp ^ RIHpHp V! 4       '       g   R# ^ RIHoHp	Hp
H	pH
pHp V! V 4      '       d   V! V 4      '       d   \        RR4      # V! V4      pVf   \        SRR4      ;'       g    TpV! WNWR\        SRR4      SR	7      oV! V SVVV3R
 lR7      w  ppV'       d   V'       d   \        RV R2R4      # V'       d5   V! V 4      '       d   V
! V 4      '       d   \        V	R4      # \        RR4      # R# )uø  Refuse gateway lifecycle commands issued from inside the supervised gateway.

``systemctl``/``launchctl``/``hermes gateway restart|stop|uninstall``
targeting hermes-gateway would SIGTERM the gateway â€” and this very
subprocess â€” before completing, so the service may never come back.
Applies unconditionally (``force=True`` cannot bypass it). Gated on the
SUPERVISED-gateway probe, not the raw ``_HERMES_GATEWAY`` marker: that
marker leaks into every process that merely imports gateway.run (hermes
serve, CLI, web server), which must still be able to restart the gateway;
an unsupervised foreground ``hermes gateway run`` has no KeepAlive to turn
a self-restart into a respawn loop, so it passes too.
Returns the JSON error string when blocked, else None.
)Ú_is_supervised_gateway_process)Ú_resolve_command_cwdÚget_session_cwdN)Ú_MAX_REFERENCED_SCRIPT_BYTESÚHOST_INTERPRETER_KILL_REJECTIONÚcontains_host_interpreter_killÚ!contains_launchctl_submit_commandÚ!lifecycle_scan_root_within_budgetÚscan_gateway_lifecyclea‘  Blocked: launchctl submit/bootstrap is restricted inside a supervised gateway regardless of the job label, to prevent indirect gateway restart loops. This guard does not inspect the job's KeepAlive settings or determine whether it is independent of Hermes. Perform authorized LaunchAgent maintenance from a separate shell outside the gateway, not by switching launchctl verbs to bypass this rejection.r+   rª   Úhost_cwd)r   Údefault_cwdr«   r©   Úmounted_hostr�   c                 ó    <€ \        SSV S4      # r<   )r§   )r@   r°   r�   rŽ   s   &€€€r   rH   Ú)gateway_lifecycle_block.<locals>.<lambda>:  s   ø€ Ô%;¸CÀÈAÐOkÔ%lr   )rª   Úread_remote_scriptzOBlocked: the lifecycle guard could not scan this command or referenced script: zÍ. Nothing in the command is known to contain a gateway lifecycle command, but a script the command executes must be scannable (a regular text file under 1 MiB) before it can run inside the gateway process.a+  Blocked: command or referenced script cannot restart, stop, or uninstall the gateway from inside the gateway process. The gateway would kill this command before it could complete (SIGTERM propagates to child processes). Run `hermes gateway restart` from a separate shell outside the running gateway.)Útools.process_registryr­   Útools.terminal_toolr®   r¯   Úcron.lifecycle_guardr°   r±   r²   r³   r´   rµ   r3   Úgetattr)r   r�   r©   rª   r   r«   r­   r®   r¯   r±   r²   r³   r´   rµ   Úguard_cwd_baseÚunsafeÚrefusalr°   rŽ   s   $d$$$$           @@r   Úgateway_lifecycle_blockrÃ   ÿ   s)  ú€ õ, FßIá)×+Ò+Ù÷÷ ñ )¨×1Ò1Ñ6WÐX_×6`Ò6`ÜðIð ó
ð 	
ñ % [Ó1€NØÒÜ   e¨TÓ2×9Ð9°cˆÙ$ØÀÜ˜S *¨dÓ3Øô€Iñ
 -ØØÞlô�O€FˆG÷
 —'ô Ø]Ð^eÐ]fð g<ð <ð ó
ð 	
÷ ñ -¨W×5Ò5Ñ:XÐY`×:aÒ:aÜ Ð!@À'ÓJÐJÜð:ð
 ó
ð 	
ñ r   c                ó€   € V ^8„  d   QhR\         R\         R\        \         ,          R\         R\        \         ,          /# )r   r   rª   r   r«   r	   )r   r   )r   s   "r   r   r   W  sD   € ÷ )ñ )äð)ô 
ð)ô ”c�]ð	)ô
 ð)ô Œc…]ñ)r   c                óÎ   € ^ RI HpHp ^ RIHp V! 4       '       g   R# V! W!VR7      pV! W4      w  r‰V'       g   R# \
        P                  R\        V 4      4       \        V	R4      # )u‡  Windows-only guard against git-mutating the checkout backing this interpreter.

NTFS locks loaded module files, so rewriting the live checkout can corrupt
the running process; POSIX keeps old inodes alive for open handles, so the
guard is off there (``guard_active``). Local backend only â€” remote
backends cannot reach that checkout. Returns the JSON error string when
blocked, else None.
)Údetect_self_repo_git_mutationÚguard_active)r®   N)r   r·   r«   z,Blocked self-repo git mutation (command: %s)Úblocked)	Útools.self_repo_guardrÆ   rÇ   r½   r®   ÚloggerÚwarningr)   r3   )
r   rª   r   r«   rÆ   rÇ   r®   rŽ   r\   r]   s
   $$$$      r   Úself_repo_blockrÌ   W  sW   € ÷ RÝ8á�>Š>ÙÙ$¨WÐS^Ô_€IÙ,¨WÓ@�H€CßÙÜ
‡N�NÐAÔCXÐY`ÓCaÔbÜ˜˜iÓ(Ð(r   )éÈ   )z@\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:dev|start|serve|watch)\bz\bdocker\s+compose\s+up\bz\bnext\s+dev\bz\bvite(?:\s|$)z\bnodemon\bz\buvicorn\bz\bgunicorn\bz$\bpython(?:3)?\s+-m\s+http\.server\b)z$(Ú`z<(z>()+Ú__doc__r1   Úloggingr7   r¡   rš   Úpathlibr   Útypingr   r   Útools.shell_heredocr   Ú	getLoggerrÊ   Ú	frozensetr   r   r   r)   r3   r=   r>   Ú	MULTILINEr‡   rC   rE   r:   ro   rM   rD   ra   rV   rb   rˆ   r†   r…   rm   rz   r‹   r§   rÃ   rÌ   r[   r   r   Ú<module>r×      sj  ðñ	ó Û Û 	Û Û Ý ß  å :à	×	Ò	Ð0Ó	1€ñ & oÓ6Ð õ;õ	÷	-õlð
  ŸZšZØDÀbÇmÁmÐVX×VbÑVbÕFbóÐ ð ŸJšJ xÓ0Ð Ø ŸjšjÐ);Ó<Ð õ,÷ #( %ñ 	(ñ 	Oó 	(§%¡%ñ 	(ñ 	Oó 	(ó 	#Ð ð 	#×)Ñ)ð	1ðñ 	_ð	]ðñ 	Lð	4ððÐ õ.õSð ŸšÐ$EÓFÐ ØŸ
š
 :Ó.Ð ð $;Ð  õõ õ"õDõDU÷p)r   