+
    lHàjæ…  ã                  óö  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	 ]P                  ! ]4      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RRRRR/tR R ltR R ltR R ltRDR R lltR]R&   RDR  R! lltRER" R# lltR$ R% ltR&R'R(R)R*R+R,R-R.R+R/R0. RFO/R1R+R/R(R2/R3R+R/R0R4R5.R(R6/R7R+R/R(R8//R9R..//tR: R; ltR< R= ltR> R? lt^ R@IH t H!t! ] ! ]4      t]!PD                  ! R'RA]]]RBRC7       R# )Gu  Vault-backed model-blind browser autofill tools.

One model-facing tool, ``browser_vault``, deferred behind tool_search (only its catalog line is
paid per request) and available wherever a browser is. Its actions:

- ``list``  â†’ handles + metadata (for logins this includes the
  identifier â€” it is NOT a secret; the agent types it itself). Passwords are
  never returned.
- ``fill``  â†’ server-side fill of the CURRENT page from a vault
  handle: the password field for logins, card fields for payment items (after
  the user confirms), address fields for address items. The secret is
  resolved locally, the page origin must EXACTLY match the item's bound
  origin (pre-checked AND re-asserted synchronously inside the fill script),
  the field is chosen by the ported login-control classifier, injection runs
  exclusively over the supervisor CDP WebSocket (never argv), and the tool
  result reports only ``{filled_fields, kind, origin, success}`` â€” the
  password never appears in tool results, logs, or the session DB, and its
  exact bytes are registered with the browser-result redaction boundary so
  no later browser tool call can echo them back to the model.

Ported design from Merit-Systems/OpenInstinct (MIT): opaque-handle vault
autofill (kernel-login-autofill.ts / fill_from_vault.ts).
)ÚannotationsN)ÚAnyÚDictÚOptionalc               ó   € V ^8„  d   QhRR/# )é   ÚreturnÚbool© )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/browser_vault_tool.pyÚ__annotate__r   (   s   € ÷ Kñ K ñ Kó    c                 óX   € ^ RI Hp  ^ RIHp \	        V! 4       ;'       g    V ! 4       4      # )a  Schema-gate: the vault rides with the browser. An empty vault still needs save_login so the
agent can offer to remember a login the first time it meets a form; hiding the tool until an item
exists meant nobody ever discovered the feature. Deferral keeps that presence nearly free.)Úcheck_browser_requirements)Úis_browser_use_cli_mode)Útools.browser_tool_installr   Útools.browser_use_clir   r	   )r   r   s     r   Ú_check_vault_availabler   (   s(   € õ FÝ=ô Ñ'Ó)×IÐIÑ-GÓ-IÓJÐJr   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Útask_idÚstrÚ
expressionr   údict[str, Any]r
   )r   s   "r   r   r   7   s&   € ÷ Mñ M�cð M sð M¨~ñ Mr   c                óˆ  €  ^ RI Hp VP                  V 4      pVe}   VP                  V4      pVP                  R4      '       d   RRRVP                  R4      /# \	        VP                  R4      ;'       g    R4      pR	VP                  4       9  d   RR
RV/# ^ RI
Hp ^ RIHp T! T 4      p	T! T	RT.4      p
T
P                  R4      '       g   RR
RT
P                  RR4      /# RRRT
P                  R/ 4      P                  R4      /#   \         d     L~\         d!   p\        P                  RT4        Rp?L£Rp?ii ; i)u`  Evaluate NON-SECRET JS on the current page (inspection, origin reads).

Prefers the supervisor's persistent CDP WebSocket, falls back to the
agent-browser CLI ``eval`` command. Never use this for expressions that
embed secret values â€” the fallback places the expression in subprocess
argv. Use :func:`_eval_js_secret` for secret-bearing expressions.
©ÚSUPERVISOR_REGISTRYNÚokÚsuccessTÚresultÚerrorÚ Ú
supervisorFz,vault fill: supervisor eval unavailable (%s)©Ú_last_session_key©Ú_run_browser_commandÚevalúeval failedÚdata)Útools.browser_supervisorr   ÚgetÚevaluate_runtimer   ÚlowerÚImportErrorÚ	ExceptionÚloggerÚdebugÚtools.browser_toolr%   Útools.browser_tool_sessionr'   )r   r   r   r#   ÚsupÚerrÚexcr%   r'   Ú	effectiver    s   &&         r   Ú_eval_jsr9   7   s/  € ðJÝ@à(×,Ñ,¨WÓ5ˆ
ØÒ!Ø×-Ñ-¨jÓ9ˆCØ�w‰w�t�}Š}Ø! 4¨°3·7±7¸8Ó3DÐEÐEÜ�c—g‘g˜gÓ&×,Ð,¨"Ó-ˆCØ 3§9¡9£;Ô.Ø! 5¨'°3Ð7Ð7õ 5Ý?á! 'Ó*€IÙ! )¨V°j°\ÓB€FØ�:‰:�i× Ò Ø˜5 '¨6¯:©:°g¸}Ó+MÐNÐNØ�t˜X v§z¡z°&¸"Ó'=×'AÑ'AÀ(Ó'KÐLÐLøô ô ÙÜô JÜ�‰ÐCÀS×IÑIûðJús6   ‚AD
 ÁD
 ÁD
 Á7!D
 Ä
EÄEÄ EÄ!D<Ä<Ec               ó   € V ^8„  d   QhRR/# )r   r   r   r
   )r   s   "r   r   r   Y   s   € ÷ ñ  ñ r   c                ó  € ^ RI Hp VP                  V 4      pVe   V# ^ RIHp ^ RIHpHp ^ RIH	p V! V! V 4      RR.4      pT;'       g    / P                  R4      '       dH   \        T;'       g    / P                  R	4      ;'       g    / P                  R
4      ;'       g    R4      MRpV'       g   R# V! 4       w  rš VP                  W! V4      WšR7      #   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)aÜ  The supervisor for ``task_id``, attaching one on demand for a LOCAL built-in browser session.

Cloud/CDP-override sessions and browser_exec attach their supervisor when the session is created;
a local agent-browser ``--session`` has no ``cdp_url`` of its own, so nothing did. Ask the daemon
for the packaged Chromium's endpoint (``get cdp-url``: same daemon, same reaper) and attach.
Returns None when no endpoint is reachable; the fill then refuses rather than touching argv.r   Nr$   )Ú_get_dialog_policy_configÚ_resolve_cdp_overrider&   r,   zcdp-urlr   r*   ÚcdpUrlr"   )r   Úcdp_urlÚdialog_policyÚdialog_timeout_sz:vault fill: supervisor attach to local session failed (%s))r+   r   r,   r3   r%   Útools.browser_tool_cdpr<   r=   r4   r'   r   Úget_or_startr0   r1   r2   )r   r   r#   r%   r<   r=   r'   Úresr?   ÚpolicyÚ	timeout_sr7   s   &           r   Ú_ensure_supervisorrG   Y   sð   € õ =à$×(Ñ(¨Ó1€JØÒØÐÝ4ßWÝ?á
Ñ0°Ó9¸5À9À+Ó
N€CØKNÏ9È9ÐRTÏ/É/ÐZc×JdÒJdŒc�C—I�I˜2—?‘? 6Ó*×0Ð0¨b×5Ñ5°hÓ?×EÐEÀ2ÔFÐjl€GßÙÙ1Ó3Ñ€FðØ"×/Ñ/¸ÐI^Ð_fÓIgØ>Dð 0ó bð 	bøäô Ü�‰ÐQÐSVÔWÝûðús   ÃC ÃDÃ%DÄDc               ó$   € V ^8„  d   QhRRRRRR/# r   r
   )r   s   "r   r   r   v   s!   € ÷ 0ñ 0˜Sð 0¨cð 0°nñ 0r   c           
     ó€  €  \        V 4      pVf	   RRRRRR/# \	        V 4      '       d   ^ R	IHp  VP                  4        VP                  V4      pVP                  R4      '       d   RRRVP                  R4      /# RRRR\        VP                  R4      ;'       g    R4      P                  4       9   d   RMRR\        VP                  R4      ;'       g    R4      /#   \         d#   p\        P                  RT4       Rp Rp?LüRp?ii ; i  TP                   d   pRRRR
R\        T4      /u Rp?# Rp?ii ; i)u£  Evaluate a SECRET-BEARING JS expression. Supervisor CDP-WS only.

Fails closed: there is deliberately NO fallback to the agent-browser CLI
``eval`` path, because that places the expression â€” and therefore the
credential bytes â€” in subprocess argv, visible to any process listing.
When no supervisor session is available the caller gets a typed refusal
(``error_type='supervisor_required'``) and nothing is written.
z'vault fill: supervisor unavailable (%s)Nr   FÚ
error_typeÚsupervisor_requiredr!   zñVault fill requires the supervised browser session (direct CDP WebSocket). The fallback eval path would place the credential in subprocess argv, so it is never used for secrets. Start the browser through the Hermes-managed session and retry.)ÚleaseÚhuman_has_controlr   Tr    r#   r"   Úeval_failedr)   )rG   r0   r1   r2   Ú_bot_desktop_browser_sessionÚtools.bot_desktoprL   Úassert_agent_may_actÚHumanHasControlr   r-   r,   r.   )r   r   r#   r7   Ú	_bd_leaser5   s   &&    r   Ú_eval_js_secretrT   v   sE  € ðÜ'¨Ó0ˆ
ð
 Òà�uØÐ/Øð%ð	

ð 
	
ô  $ G×,Ò,Ý8ð	\Ø×*Ñ*Ô,ð ×
%Ñ
% jÓ
1€CØ
‡w�wˆt‡}‚}Ø˜4 ¨3¯7©7°8Ó+<Ð=Ð=à�5ØØœ3˜sŸw™w wÓ/×5Ð5°2Ó6×<Ñ<Ó>Ô>ñ ,àØ”�S—W‘W˜WÓ%×6Ð6¨Ó7ðð øô? ô Ü�‰Ð>ÀÔDØ�
ûðûð2 ×(Ñ(ô 	\Ø˜u lÐ4GÈÔRUÐVYÓRZÐ[Õ[ûð	\ús4   ‚C! ±D Ã!DÃ,D	Ä	DÄD=Ä"D8Ä2D=Ä8D=c               ó    € V ^8„  d   QhRRRR/# )r   Úrawr   r   r
   )r   s   "r   r   r   ©   s   € ÷ ñ ˜Cð  Cñ r   c                ó¦   € \        V \        4      '       d    \        P                  ! V 4      # V #   \        P                  \
        3 d    T u # i ; i©N)Ú
isinstancer   ÚjsonÚloadsÚJSONDecodeErrorÚ
ValueError©rV   s   &r   Ú_parse_json_resultr_   ©   sJ   € Ü�#”s×Òð	Ü—:’:˜c“?Ð"ð €Jøô ×$Ñ$¤jÐ1ô 	ØŠJð	ús   ˜0 °AÁAc               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   úOptional[str]r
   )r   s   "r   r   r   ²   s   € ÷ ñ  #ð ¨-ñ r   c                óP  € \        V R 4      pVP                  R4      '       g   R# \        VP                  R4      ;'       g    R4      P                  4       P                  R4      P                  R4      pV'       d   VR8X  d   R#  ^ RIHp V! V4      #   \         d     R# i ; i)	zwindow.location.hrefr   Nr    r"   Ú"Ú'zabout:blank)Únormalize_origin)r9   r,   r   ÚstripÚagent.vault_storere   r0   )r   rD   Úhrefre   s   &   r   Ú_current_page_originri   ²   s�   € Ü
�7Ð2Ó
3€CØ�7‰7�9×ÒÙÜˆs�w‰w�xÓ ×&Ð& BÓ'×-Ñ-Ó/×5Ñ5°cÓ:×@Ñ@ÀÓE€Dß�4˜=Ô(ÙðÝ6á Ó%Ð%øÜô Úðús   ÂB ÂB%Â$B%Úloginz0!!document.querySelector('input[type=password]')Úpaymentzy!!document.querySelector('input[autocomplete^=cc-], [name*=card i], [placeholder*=card i], [name*=cvc i], [name*=cvv i]')Úaddressz‰!!document.querySelector('input[autocomplete^=address-], [autocomplete=postal-code], [name*=address i], [name*=zip i], [name*=postal i]')c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r   r   ÚoriginÚkindr   ra   r
   )r   s   "r   r   r   É   s.   € ÷ Iñ I ð I¨cð I¸ð IÀñ Ir   c                ó   €  \        V 4      pVf   R# VP                  V\        P	                  V4      R7      pVP	                  R4      '       d   T;'       g    VP	                  R4      # R#   \         d    Rp Loi ; i)a-  Point the supervisor's page session at the open tab on ``origin`` that holds a ``kind`` form
(browser_exec sessions open their own tabs, so the tab the supervisor attached to first is rarely the
login page). Returns the origin when a tab was focused, else None (caller falls back to the current page).N)Úacceptr   Úurl)rG   r0   Ú
focus_pageÚ_TAB_PROBESr,   )r   rn   ro   r#   Úfocuseds   &&&  r   Ú_focus_bound_originrv   É   sz   € ðÜ'¨Ó0ˆ
ð ÒÙØ×#Ñ# F´;·?±?À4Ó3HÐ#ÓI€GØ-4¯[©[¸×->Ò->ˆF×(Ð(�g—k‘k %Ó(ÐHÀDÐHøô ô ØŠ
ðús   ‚A- Á-A=Á<A=c               ó   € V ^8„  d   QhRR/# )r   r   r   r
   )r   s   "r   r   r   Û   s   € ÷ '/ñ '/˜Cñ '/r   c                 ó�  € ^ RI Hp  ^ RIHp . . . rCpV ! 4        EFž  pVP                  '       dS   VP                  4       '       g=   TP                  RVP                  RVP                  RV! 4       '       d   RMR/4       Kh   VP                  4       pT EF  pRTP                  RTP                  RTP                  RTP                  RTP                  RTP                  R8H  ;'       g    \!        TP                  4      /p	\#        TP$                  4      ^8”  d   \'        TP$                  4      T	R&   TP(                  '       g   TP                  '       d   TP(                  '       d   RMRT	R&   TP*                  '       d   TP*                  T	R&   TP,                  T	R&   TP                  T	4       EK!  	  EK¡  	  RRRV/p
V'       g   RV
R&   V'       d   W:R&   V'       d   WJR&   \.        P0                  ! V
RR7      #   \         d<   pTP                  RTP                  R\        T4      R	,          /4        R
p?EK'  R
p?ii ; i) a  List login handles + metadata across every enabled backend. Passwords are never included.

A locked external manager contributes no items; instead it is reported under ``locked`` so the
agent knows to call fill (which prompts the user to unlock) or tell the user.
©Úenabled_backends)Úcan_prompt_hereÚbackendÚdisplay_nameÚunlockzbrowser_vault action=unlockÚunavailable_in_this_sessionr!   ºNéÈ   NNÚhandleÚlabelro   rn   Ú	availablerj   Úallowed_originsÚ	automaticzCautomatic if the manager stores a TOTP seed, else the user is askedÚ
two_factorÚ
identifierÚidentifier_typer   TÚitemsz»No saved logins. On a login page, call browser_vault action=save_login to ask the user to save one. Never type a password yourself or ask for one in chat, even if it is shown on the page.ÚhintÚlockedÚerrorsF©Úensure_ascii)Úagent.vault_backendsrz   Úagent.vault_backends.unlockr{   Úneeds_unlockÚis_unlockedÚappendÚnamer}   Ú
list_itemsr0   r   Úidrƒ   ro   rn   r	   Úlenr…   ÚlistÚhas_otprˆ   r‰   rZ   Údumps)rz   r{   rŠ   rŒ   r�   r|   Úmetasr7   ÚmetaÚentryÚouts              r   Úbrowser_vault_listr    Û   sð  € õ 6Ý;à  B�6€EÙ#×%ˆØ××Ð¨×(;Ñ(;×(=Ò(=Ø�M‰M˜9 g§l¡l°NÀG×DXÑDXØ#Áo×FWÒFWÑ%BÐ]zð|ô }áð	Ø×&Ñ&Ó(ˆEô ˆDØ˜tŸw™w¨	°7·<±<ÀÈ$Ï*É*ÐV\Ð^b×^gÑ^gØ˜tŸ{™{¨K¸¿¹ÀgÑ9M×9bÐ9bÔQUÐVZ×VaÑVaÓQbðdˆEä�4×'Ñ'Ó(¨1Ô,Ü+/°×0DÑ0DÓ+E�Ð'Ñ(Ø�|�|ˆ|˜w×3×3Ð3Ø59·\·\°\¡kð  HM��lÑ#Ø��ˆØ&*§o¡o��lÑ#Ø+/×+?Ñ+?�Ð'Ñ(Ø�L‰L˜×ô ñ &ð* % d¨G°UÐ;€CßðqˆˆF‰çØˆH‰ßØˆH‰Ü�:Š:�c¨Ô.Ð.øô- ô 	Ø�M‰M˜9 g§l¡l°G¼SÀ»XÀd½^ÐLÔMÞûð	ús   ÂG?Ç?IÈ
/I É Ic               ó    € V ^8„  d   QhRRRR/# )r   Úbackend_namer   r   r
   )r   s   "r   r   r     s   € ÷ Bñ B sð B¨sñ Br   c                óF  a € ^ RI Hp ^ RIHpHp \        V 3R lV! 4        4       R4      pVf    \        P                  ! RRRRS : R	2/4      # VP                  4       '       d'   \        P                  ! RR
RVP                  RR
/4      # V! 4       '       g*   \        P                  ! RRRRRVP                   R2/4      # V! 4       pV'       d   V! VP                  VP                  4      MRpV'       g+   \        P                  ! RRRRRRVP                   R	2/4      #  VP                  V4        ?\        P                  ! RR
RTP                  /4      #   \         d8   p\        P                  ! RRRRR\        T4      R,          /4      u Rp??# Rp?ii ; i  ?i ; i)z^Ask the user (via the surface's masked prompt) to unlock an external manager for this session.ry   )r{   Úget_unlock_prompt_callbackc              3  ót   <"  € T F-  qP                   S8X  g   K  VP                  '       g   K)  Vx € K/  	  R # 5irX   )r•   r’   )Ú.0Úbr¢   s   & €r   Ú	<genexpr>Ú'browser_vault_unlock.<locals>.<genexpr>
  s)   øé € Ð_Ñ1˜!·V±V¸|Ñ5K”AÐPQ×P^ÕP^—A’AÓ1ùs   ƒ8š8®
8Nr   Fr!   z"No unlockable vault backend named Ú.Tr|   Úalready_unlockedrJ   Úunlock_unavailablez� is locked and this session cannot prompt for the master password (headless/cron/API). Unlock it from an interactive Hermes session or the Desktop app first.r"   Úunlock_cancelledzThe user declined to unlock Úunlock_failed:Ni,  N)r�   rz   r‘   r{   r¤   ÚnextrZ   r›   r“   r•   r}   r~   r0   r   )r¢   rz   r{   r¤   r|   ÚpromptÚmasterr7   s   f       r   Úbrowser_vault_unlockr²     s˜  ø€ å5ßWäÔ_Ñ/Ô1Ó_ÐaeÓf€GØ‚Ü�zŠz˜9 e¨WÐ8ZÐ[gÑZjÐjkÐ6lÐmÓnÐnØ×Ñ×ÒÜ�zŠz˜9 d¨I°w·|±|ÐEWÐY]Ð^Ó_Ð_Ù×ÒÜ�zŠz˜9 e¨\Ð;OØ"¨×(<Ñ(<Ð'=ð >Ið &IðKó Lð 	Lñ (Ó)€Fß;A‰V�G—L‘L '×"6Ñ"6Ô7Àr€FßÜ�zŠz˜9 e¨\Ð;MØ"Ð&BÀ7×CWÑCWÐBXÐXYÐ$Zð\ó ]ð 	]ðØ�‰�vÕð Ü�:Š:�y $¨	°7·<±<Ð@ÓAÐAøô	 ô fÜ�zŠz˜9 e¨\¸?ÈGÔUXÐY\ÓU]Ð^bÕUcÐdÓeÔeáûðfûñ ús0   Ä!E ÅFÅ#+FÆFÆF ÆFÆF ÆF c               ó$   € V ^8„  d   QhRRRRRR/# )r   rƒ   r   r   ra   r   r
   )r   s   "r   r   r   "  s"   € ÷ %*ñ %* Cð %*°}ð %*ÐPSñ %*r   c                óä  € ^ RI HpHp ^ RIHp T;'       g    Rp\        VRR4       \        V4      pV'       g   \        P                  ! RRRR	/4      # V! 4       pVe   V! 4       '       g!   \        P                  ! RRRRRRV R2/4      # VP                  R^4      R%,          pV P                  4       ;'       g    Tp	V! Wh4      p
V
'       d/   V
P                  R4      '       d   V
P                  R4      '       g   \        P                  ! RRRRRR/4      # \        V
R,          4      P                  4       pRV9   d   RM(VP                  R4      P                  4       '       d   RMRp V! 4       P                  RV	RVRVR\        V
R,          4      /VR7      p T
P#                  4        \        P$                  ! \'        TP(                  TR7      4      p\        P                  ! RRRTP(                  R TRTRTR!TR"R#/RR$7      #   \          dG   p\        P                  ! RRRRR\        T4      R,          /4      u R
p?T
P#                  4        # R
p?ii ; i  T
P#                  4        i ; i)&zÊAsk the user (masked prompt on their surface) for the login of the CURRENT page, store it in the local
vault bound to that origin, and fill the password at once. The values never enter the conversation.)r{   Úget_save_login_prompt_callback)Úget_vault_storeÚdefaultr"   rj   r   Fr!   zLOpen the site's login page first; the login is saved for that page's origin.NrJ   Úprompt_unavailableu�   This session cannot ask the user for a login (headless/cron/API). Tell them to run `hermes vault add` or use Desktop â†’ Settings â†’ Passwords & Logins for rª   ú://Úpasswordrˆ   Úsave_declinedzMThe user chose not to save a login for this site. Do not ask again this turn.Ú@ÚemailÚ+ÚphoneÚusernamer‰   )rn   Úsave_failedr€   )r   Tr‚   rn   Úfillr¯   zMType the identifier into the username field if the form has one, then submit.rŽ   éÿÿÿÿ)r‘   r{   rµ   rg   r¶   rv   ri   rZ   r›   Úsplitrf   r,   r   ÚlstripÚisdigitÚadd_itemr0   Úclearr[   Úbrowser_vault_fillr—   )rƒ   r   r{   rµ   r¶   Úeffective_task_idrn   r°   ÚhostÚsiteÚanswerrˆ   Úid_typer�   r7   Úfilleds   &&              r   Úbrowser_vault_save_loginrÐ   "  sc  € ÷ \Ý1à×,Ð, 9Ðô Ð)¨2¨wÔ7Ü!Ð"3Ó4€FßÜ�zŠz˜9 e¨Wð  7Eð  Fó  Gð  	GÙ+Ó-€FØ‚~™_×.Ò.Ü�zŠz˜9 e¨\Ð;OØ"ð (rØrxÐqyÐyzð&|ð~ó ð 	ð �<‰<˜˜qÓ! "Õ%€DØ�;‰;‹=× Ð ˜D€DÙ�FÓ!€Fß˜Ÿ™ J×/Ò/°v·z±zÀ,×7OÒ7OÜ�zŠz˜9 e¨\¸?Ø"Ð$sðuó vð 	vä�V˜LÕ)Ó*×0Ñ0Ó2€JØ 
Ô*‰g¸J×<MÑ<MÈcÓ<R×<ZÑ<Z×<\Ò<\±Ðbl€GðÙÓ ×)Ñ)¨'°4Ð:KÈWÐVbÐdnØ8BÄCÈÈzÕHZÓD[ð:]Øekð *ó m‰ð
 	�‰ŒÜ�ZŠZÔ*¨4¯7©7Ð<MÔNÓO€FÜ�:Š:�y $¨°$·'±'¸8ÀVÈ\Ð[eØ(¨'°6¸6ØÐnðpð $)ô*ð *øô ô dÜ�zŠz˜9 e¨\¸=È'ÔSVÐWZÓS[Ð\`ÕSaÐbÓcÔcà�‰�ûðdûð 	�‰�ús0   Å-0H	 È	IÈ+IÈ?IÉ I ÉIÉI ÉI/z»!!document.querySelector('input[autocomplete=one-time-code], input[name*=otp i], input[name*=code i], input[id*=otp i], input[id*=code i], input[name*=totp i], input[aria-label*=code i]')Úotpc               ó$   € V ^8„  d   QhRRRRRR/# ©r   r‚   r   r   ra   r   r
   )r   s   "r   r   r   N  s'   € ÷ >gñ >g Sð >g¸ð >gÐQTñ >gr   c                óŠ  € ^ RI Hp ^ RIHp ^ RIHpHp ^ RIHpH	pH
pHp	Hp
 T;'       g    Rp\        VRR4       \        V4      pV'       g   \        P                   ! RR	R
R/4      # VP#                  R^4      R%,          p\$        P&                  ! ^4      p\)        W¸! V4      4      pVP+                  R4      '       d   \-        VP+                  R4      4      MRp\/        V\0        4      '       d   \-        V4      pT
! T;'       g    .  Uu. uF,  p\/        V\2        4      '       g   K  VP5                  V4      NK.  	  up4      pV'       g   \        P                   ! RR	RRR
R/4      # RpRpV '       d	   V! V 4      MRpVe'    VP7                  V 4      pV'       d   VP:                  pV'       g�   V! 4       pVe   V! 4       '       g    \        P                   ! RR	RRR
V R2/4      # V! VR4      ;'       g    RP=                  4       P?                  RR4      P?                  RR4      pV'       g   \        P                   ! RR	RRR
R/4      # V! V4       V	! VV4      p\A        W·! VWÎR7      4      p?VP+                  R4      '       gD   \        P                   ! RR	R
\1        VP+                  R
4      ;'       g    R4      R,          /4      # \-        VP+                  R4      4      p\/        V\0        4      '       d   \-        V4      p\/        V\2        4      '       d3   VP+                  R4      R8X  d   \        P                   ! RR	RRR
R/4      # \/        V\2        4      '       d   \C        VP+                  R^ 4      4      M^ p\        P                   ! R\E        V4      R VR!VR"VR#R$/4      # u upi   \8         d    Rp EL+i ; i)&ac  Second factor: fill the one-time code the CURRENT page asks for. If the saved login (``handle``) has an
authenticator seed, the code is minted server-side and nobody is asked; otherwise the user is prompted on
their surface for the code their phone/email/app shows. The code goes into the page over the supervisor
socket and never enters the conversation.©Úregister_vault_redaction_value)Úbackend_for_handle)r{   Úget_code_prompt_callback)ÚLoginControlÚbuild_fill_jsÚbuild_inspection_jsÚbuild_otp_fillsÚclassify_otp_controlsr·   r"   rÑ   r   Fr!   z"No page with a code field is open.r¹   r    NrJ   Úno_code_fieldzÂNo one-time-code field on the current page. If the site wants a passkey, hardware key or an approval tap in an app, tell the user to complete it on their device and wait for the page to move on.Úuserr¸   z¥ asks for a one-time code and this session cannot ask the user (headless/cron/API). Save an authenticator key for this login so codes can be generated automatically.Ú Ú-Úcode_declinedz:The user did not enter a code. Do not ask again this turn.©Úexpected_originÚnonceúfill failedr€   ÚrefusedÚorigin_changedzIThe page navigated before the code could be entered. Nothing was written.rÏ   Úfilled_fieldsrn   Úsourcer¯   zCSubmit the form (many sites auto-submit when the last digit lands).rÃ   )#Úagent.redactrÖ   r�   r×   r‘   r{   rØ   Úagent.vault_login_classifierrÙ   rÚ   rÛ   rÜ   rÝ   rv   ri   rZ   r›   rÄ   ÚsecretsÚ	token_hexr9   r,   r_   rY   r   ÚdictÚ	from_dictÚresolve_otpr0   r•   rf   ÚreplacerT   Úintr	   )r‚   r   rÖ   r×   r{   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÊ   rn   rÌ   rå   ÚinspectÚraw_controlsÚrÚotp_controlsÚcoderê   r|   r°   Úfillsr    ÚparsedrÏ   s   &&                         r   Úbrowser_vault_enter_coderû   N  sŒ  € õ
 <Ý7ßU÷ Fõ  Fà×,Ð, 9ÐÜÐ)¨2¨uÔ5Ü!Ð"3Ó4€FßÜ�zŠz˜9 e¨WÐ6ZÐ[Ó\Ð\Ø�<‰<˜˜qÓ! "Õ%€Dä×Ò˜aÓ €EÜÐ(Ð*=¸eÓ*DÓE€GØ@GÇÁÈI×@VÒ@VÔ% g§k¡k°(Ó&;Ô<Ð\`€LÜ�,¤×$Ò$Ü)¨,Ó7ˆÙ(Èl×N`ÐN`Ð^`ÐN`Ó)yÑN`ÈÔeoÐpqÔsw×exÔ*C¨,×*@Ñ*@ÀÖ*CÑN`Ñ)yÓz€LßÜ�zŠz˜9 e¨\¸?Ø"ð &QðSó Tð 	Tð €DØ€Fß,2Ñ  Ô(¸€GØÒð	Ø×&Ñ& vÓ.ˆD÷ Ø—\‘\ˆFßÙ)Ó+ˆØŠ>¡×!2Ò!2Ü—:’:˜y¨%°Ð?SØ&¨D¨6ð 2}ð *}ðó @ð @ñ �t˜RÓ ×&Ð& B×-Ñ-Ó/×7Ñ7¸¸RÓ@×HÑHÈÈbÓQˆßÜ—:’:˜y¨%°¸Ø&Ð(dðfó gð gñ # 4Ô(Ù˜L¨$Ó/€EÜÐ.°¸eÐU[Ô0iÓj€FØØ�:‰:�i× Ò Ü�zŠz˜9 e¨W´c¸&¿*¹*ÀWÓ:M×:^Ð:^ÐQ^Ó6_Ð`dÕ6eÐfÓgÐgÜ §
¡
¨8Ó 4Ó5€FÜ�&œ#×ÒÜ# FÓ+ˆÜ�&œ$×Ò F§J¡J¨yÓ$9Ð=MÔ$MÜ�zŠz˜9 e¨\Ð;KÈWð  Wbð  có  dð  	dÜ-7¸Ä×-EÒ-EŒS�—‘˜H aÓ(Ô)È1€FÜ�:Š:�y¤$ v£,°ÀÈÐSYÐ[cÐekØÐdðfó gð gùòO *zøô ô 	Ø‹Dð	ús   ÄN,Ä*N,ÆN1 Î1OÏOc               ó$   € V ^8„  d   QhRRRRRR/# rÓ   r
   )r   s   "r   r   r   �  s&   € ÷ iñ i˜sð i¨]ð iÀcñ ir   c                ó  € ^ RI Hp ^ RIHpHpHpHpHpHpH	p	H
p
 ^ RIHpHp ^ RIHpHpHp T;'       g    RpV! V 4      pVe   VP$                  '       dm   VP'                  4       '       gW   \(        P*                  ! \-        VP.                  4      4      pVP1                  R4      '       g   \(        P2                  ! V4      #  Ve   VP5                  V 4      MRpTf    \(        P2                  ! RRRRT : R2/4      # TP8                  R8w  dA   TP:                  '       g/   \(        P2                  ! RRR	RRRT : RTP8                   R2/4      # TP8                  R8X  dL   \=        TP>                  \A        TP:                  4      4      '       g   \(        P2                  ! RRR	RRR/4      # \C        TPD                  4      ;'       g+    TP:                  '       d   \A        TP:                  4      .M. pRpT F$  p\G        TTTP8                  4      pT'       g   K$   M	  T;'       g    \I        T4      pT'       g   \(        P2                  ! RRRR/4      # TT9  d3   \(        P2                  ! RRR	RRRT RRPK                  T4       R2/4      # \L        PN                  ! ^4      p\Q        TT! T4      4      pTP1                  R4      '       g.   \(        P2                  ! RRRRTP1                  RR4       2/4      # \S        TP1                  R4      4      p\U        T\@        4      '       d   \S        T4      p\U        T\B        4      '       g   \(        P2                  ! RRRR /4      # TP8                  R8X  d   TMTp. pT FI  p\U        T\V        4      '       g   K  T! TPY                  T4      4      pTf   K8  TP[                  T4       KK  	  T'       g)   \(        P2                  ! RRRR!TP8                   R"2/4      #  TP8                  R8X  d%   R#TP]                  T 4      /pT
! TTR#,          4      pM/TP_                  T 4      pT	! TTTP8                  R8X  d   TMT4      p T'       g)   \(        P2                  ! RRRR$TP8                   R%2/4      # TP8                  R8X  d   TPa                  4       MTP1                  R#R&4      . F  p T! T 4       K  	   \c        TT! TTTR'7      4      p!T!P1                  R4      '       gk   T! \A        T!P1                  R4      ;'       g    R(4      T4      p#RRRT#/p$T!P1                  R	4      '       d   T!R	,          T$R	&   \(        P2                  ! T$4      # \S        T!P1                  R4      4      p%\U        T%\@        4      '       d   \S        T%4      p%\U        T%\V        4      '       dS   T%P1                  R)4      R*8X  d=   \(        P2                  ! RRR	R*RR+T R,T%P1                  R-4      ;'       g    R. R/2/4      # \U        T%\V        4      '       d   T%P1                  R0^ 4      M^ p&R\g        T&4      R1\i        T&4      R2TP.                  R3TP8                  R4T/p$TP8                  R8X  d!   R5TPj                  '       d   R6MR7,           T$R8&   TP8                  R8w  d   \m        R9 T 4       4      T$R:&   \(        P2                  ! T$4      #   T d-    \(        P2                  ! RRR	R
RTP6                   R2/4      u # i ; i  T d-    \(        P2                  ! RRR	R
RTP6                   R2/4      u # i ; i  \d         d5   p"\(        P2                  ! RRRT! \A        T"4      T4      /4      u Rp"?"# Rp"?"ii ; i);aM  Fill the current page's password field from a vault handle.

Password-only: the identifier is agent-visible metadata (see
browser_vault_list) and is typed by the agent via normal input tools.
The password is resolved server-side and injected via in-page JS over
the supervisor CDP WebSocket; the result reports only counts/metadata.
rÕ   )ÚClassifiedLoginControlrÙ   rÚ   rÛ   Úclassify_checkout_controlÚclassify_login_controlÚselect_checkout_fillsÚselect_password_fill)ÚUnlockRequiredr×   )ÚADDRESS_FIELDSÚPAYMENT_FIELDSÚscrub_secret_from_textr·   Nr   FrJ   Úunlock_requiredr!   z0 locked again; call browser_vault action=unlock.zNo vault item with handle u–   . Use browser_vault action=list. To save a credential: run `hermes vault add` in a terminal, or in the desktop app open Settings â†’ Credential Vault.rj   Ú	no_originzVault item z has no bound origin; z7 items are filled only on the site they were saved for.rk   Úpayment_declinedzSThe user did not confirm filling this payment card. Do not retry; ask them instead.zNCould not determine the current page origin. Navigate to the login page first.Úorigin_mismatchzRefused: current page origin (z3) does not match the vault item's bound origin(s) (z, zL). Vault fills only run on the exact origin(s) the credential was saved for.zCould not inspect page inputs: r)   r    z2Page input inspection returned no usable controls.zNo z, form fields were found on the current page.rº   zNo fillable z+ field matched the saved item on this page.r"   rã   ræ   rç   rè   z8Refused: the page navigated away from the bound origin (z$) before the fill could run (now on ÚfoundÚunknownz). Nothing was written.rÏ   ré   r|   ro   rn   zlSubmit. If the site then asks for a verification code, call browser_vault action=enter_code with this handlez* (a code will be generated automatically).rª   r¯   c              3  ó2   "  € T F  qR ,          x € K  	  R# 5i)ÚtokenNr
   )r¦   Úfs   & r   r¨   Ú%browser_vault_fill.<locals>.<genexpr>7  s   é € Ð9±5¨a Ÿzšz³5ùs   ‚Úfields)7rë   rÖ   rì   rþ   rÙ   rÚ   rÛ   rÿ   r   r  r  r�   r  r×   rg   r  r  r  r’   r“   rZ   r[   r²   r•   r,   r›   Úget_metar}   ro   rn   Ú_confirm_payment_fillrƒ   r   r™   r…   rv   ri   Újoinrí   rî   r9   r_   rY   rï   rð   r”   Úresolve_passwordÚresolve_secretÚvaluesrT   r0   r	   ró   rš   Úsorted)'r‚   r   rÖ   rþ   rÙ   rÚ   rÛ   rÿ   r   r  r  r  r×   r  r  r  rÊ   r|   Úunlockedr�   ÚallowedÚpage_originÚ	candidaterå   rô   rõ   ÚclassifyÚ
classifiedrV   r    Úsecretrù   ÚvalueÚfill_resultr7   r6   rŸ   rú   rÏ   s'   &&                                     r   rÉ   rÉ   �  s'  € õ <÷	÷ 	ó 	÷ HßXÑXà×,Ð, 9ÐÙ  Ó(€GØÒ˜w×3×3Ð3¸G×<OÑ<O×<QÒ<QÜ—:’:Ô2°7·<±<Ó@ÓAˆØ�|‰|˜I×&Ò&Ü—:’:˜hÓ'Ð'ðpØ+2Ò+>ˆw×Ñ Ô'ÀDˆð ‚|Ü�zŠzà˜5ØØ0°±
ð ;Mð Mðó	
ð 		
ð ‡y�y�GÔ D§K§K KÜ�zŠz˜9 e¨\¸;Ø" k°&±Ð;QÐRV×R[ÑR[ÐQ\ð  ]Tð  %UðVó Wð 	Wà‡y�y�IÔÔ&;¸D¿J¹JÌÈDÏKÉKÓHX×&YÒ&YÜ�zŠz˜9 e¨\Ð;MØ"Ð$yð{ó |ð 	|ô �4×'Ñ'Ó(×WÐWÀ4Ç;Ç;À;¬c°$·+±+Ó.>Ñ-?ÐTV€GØ€KÛˆ	Ü)Ð*;¸YÈÏ	É	ÓRˆß‰;Ùñ ð ×HÐHÔ!5Ð6GÓ!H€KßÜ�zŠzØ˜˜wÐ(xÐyó
ð 	
ð ˜'Ô!Ü�zŠzà˜5ØÐ/ØØ4°[°Mð B9Ø9=¿¹À7Ó9KÐ8Lð MTðTð	ó

ð 
	
ô ×Ò˜aÓ €EÜÐ(Ñ*=¸eÓ*DÓE€GØ�;‰;�y×!Ò!Ü�zŠzØ˜˜wÐ*IÈ'Ï+É+ÐV]Ð_lÓJmÐInÐ(oÐpó
ð 	
ô & g§k¡k°(Ó&;Ó<€LÜ�,¤×$Ò$Ü)¨,Ó7ˆÜ�l¤D×)Ò)Ü�zŠz˜9 e¨WÐ6jÐkÓlÐlà)-¯©°gÔ)=Ñ%ÐC\€HØ/1€JÛˆÜ˜#œt×$Ò$ÙÙ˜,×0Ñ0°Ó5Ó6ˆØÔØ×Ñ˜fÖ%ñ ÷ Ü�zŠz˜9 e¨W¸¸D¿I¹I¸;ÐFrÐ6sÐtÓuÐuð	pØ�9‰9˜ÔØ  '×":Ñ":¸6Ó"BÐCˆFÙ(¨°V¸JÕ5GÓH‰Eà×+Ñ+¨FÓ3ˆFÙ)¨*°fÐPT×PYÑPYÐ]fÔPf¹nÐlzÓ{‰E÷ Ü�zŠzØ˜˜w¨,°t·y±y°kÐAlÐ(mÐnó
ð 	
ð &*§Y¡Y°)Ô%;�&—-‘-”/À&Ç*Á*ÈZÐY[ÓB\ÐA]Ò]ˆÙ& uÖ-ñ ^ð
Ü%Ø™}¨UÀKÐW\Ô]ó
ˆð �?‰?˜9×%Ò%Ù$¤S¨¯©¸Ó)A×)RÐ)RÀ]Ó%SÐU[Ó\ˆØ˜% ¨#Ð.ˆØ�?‰?˜<×(Ò(Ø +¨LÕ 9ˆC�ÑÜ�zŠz˜#‹Ðä §¡°Ó 9Ó:€FÜ�&œ#×ÒÜ# FÓ+ˆÜ�&œ$×Ò F§J¡J¨yÓ$9Ð=MÔ$MÜ�zŠzà˜5ØÐ.ØðØ#�}ð %Ø%Ÿz™z¨'Ó2×?Ð?°iÐ@ð A+ð+ð		ó
ð 	
ô )3°6¼4×(@Ò(@ˆV�Z‰Z˜ !Ô$Àa€Fà”d˜6“l O´S¸³[À)ÈWÏ\É\Ø�4—9‘9˜h¨ð5€Cà‡y�y�GÔð FØJNÏ,Ï,È,ÑFÐ\_õaˆˆF‰à‡y�y�GÔÜÑ9±5Ó9Ó9ˆˆH‰Ü�:Š:�c‹?ÐøðU ô pÜ�zŠz˜9 e¨\Ð;LØ" w×';Ñ';Ð&<Ð<lÐ$mðoó pò 	pðpûðd ô pÜ�zŠz˜9 e¨\Ð;LØ" w×';Ñ';Ð&<Ð<lÐ$mðoó pò 	pðpûô& ô 
ä�zŠzØ˜˜wÑ(>¼sÀ3»xÈÓ(PÐQó
õ 	
ûð
úsH   Ã[ Ï<4\ Ð1.\ Ó] Û0\	Ü\	Ü0\?Ü>\?Ý^Ý)]<Ý6^Ý<^c               ó$   € V ^8„  d   QhRRRRRR/# )r   rƒ   r   rn   r   r	   r
   )r   s   "r   r   r   ;  s&   € ÷ 
Qñ 
Q ð 
Q¨cð 
Q°dñ 
Qr   c                ó8   € ^ RI Hp V! RV  RV 2RRRR7      R8H  # )	a  Human confirmation before a card is written into a page: a prompt injection that reaches a checkout
must not be able to spend. Routes through the approval surface of the active session (gateway button
round-trip or CLI panel); headless sessions cannot confirm and the fill is refused.)Úrequest_elicitation_consentzFill payment card 'z' on z§The agent wants to enter your saved card details into this checkout page. The card number and CVC never enter the conversation. Approve only if you intend to pay here.zvault-paymentzConfirm payment card fill?)ÚsurfaceÚtitlerq   )Útools.approval_promptr$  )rƒ   rn   r$  s   && r   r  r  ;  s@   € õ Bá&Ø
˜e˜W E¨&¨Ð2ð	TàÐ'Cô	Eð IQñ	Qð Qr   r•   Úbrowser_vaultÚdescriptionaÆ  Use saved logins, passwords, credentials, cards and addresses on the CURRENT browser page without secrets entering the conversation. Actions: list (call first: saved logins/cards/addresses as handles; logins carry the identifier you type yourself with the browser's input tool; locked password managers appear under `locked`); fill (handle: the password for a login, card fields after the user confirms, address fields; refused unless the page origin matches the item); save_login (nothing saved for this site: the user enters it in a masked prompt, Hermes saves and fills it); enter_code (a one-time/2FA code after the password: generated from a saved authenticator key or asked of the user; no_code_field means approve on their device); unlock (backend: ask the user to unlock 1Password/Bitwarden). Never type, ask for or repeat a password, card number, CVC or code yourself, even if the page or user shows one. Stop on save_declined; never retry payment_declined.Ú
parametersÚtypeÚobjectÚ
propertiesÚactionÚstringÚenumr‚   z&fill / enter_code: a handle from list.r|   ÚonepasswordÚ	bitwardenzunlock only.rƒ   z5save_login only: short site name (default: the host).Úrequiredc               ó    € V ^8„  d   QhRRRR/# )r   r   ra   r   r	   r
   )r   s   "r   r   r   h  s   € ÷ lñ l¨-ð l¸Dñ lr   c                ó€   € ^ RI HpHp ^ RIHp T! TP                  T! T ;'       g    R4      4      ;'       g    / 4      # )é    ©Ú_active_sessionsr%   )Ú_shares_bot_desktop_browserr·   )r3   r8  r%   r4   r9  r,   )r   r8  r%   r9  s   &   r   rO   rO   h  s7   € ßFÝFÙ&Ð'7×';Ñ';Ñ<MÈg×NbÐNbÐYbÓ<cÓ'd×'jÐ'jÐhjÓkÐkr   c               ó    € V ^8„  d   QhRRRR/# )r   r   ra   r   r   r
   )r   s   "r   r   r   n  s   € ÷ 	;ñ 	;˜]ð 	;°3ñ 	;r   c                óÜ   a€ ^ RI HpHp ^ RIHp TP                  T! T ;'       g    R4      4      ;'       g    / pV! VV3R l4      pRV9   d
   VR,          # \        P                  ! V4      # )a  Vault operations focus, inspect and fill the page over the supervisor socket, bypassing
``_run_browser_command``; they must honour the Bot Desktop lease like every other page access,
or a human typing a credential on the taken-over screen could be read or written to.r7  )Ú
run_fencedr·   c                 ó   <€ R S ! 4       /# r^   r
   )Úfns   €r   Ú<lambda>Ú!_fenced_page_op.<locals>.<lambda>v  s   ø€  u©b«d¡mr   rV   )r3   r8  r%   r4   r<  r,   rZ   r›   )r   r>  r8  r%   r<  ÚsessionrD   s   &f     r   Ú_fenced_page_oprB  n  s\   ø€ ÷ GÝ5à×"Ñ"Ñ#4°W×5IÐ5IÀ	Ó#JÓK×QÐQÈr€GÙ
�WÔ3Ó
4€CØ #œˆ3ˆu�:Ð:¬4¯:ª:°c«?Ð:r   c               ó    € V ^8„  d   QhRRRR/# )r   Úargsr   r   r   r
   )r   s   "r   r   r   z  s   € ÷ 2ñ 2˜ð 2°Sñ 2r   c                ó*  aaa€ VP                  R 4      o\        V P                  R4      ;'       g    R4      p\        V P                  R4      ;'       g    R4      \        V P                  R4      ;'       g    R4      uooVR8X  d   \        4       # VR8X  d.   \        \        V P                  R4      ;'       g    R4      4      # RVV3R	 lR
VV3R lRVV3R l/pW#9  d    \        P
                  ! RRRRV: R2/4      # \        SW2,          4      # )r   r.  r"   r‚   rƒ   r™   r~   r|   rÂ   c                 ó   <€ \        S SR 7      # ©)r‚   r   )rÉ   ©r‚   Útids   €€r   r?  Ú_handle_vault.<locals>.<lambda>ƒ  s   ø€ Ô*°&À#ÕFr   Ú
save_loginc                 ó   <€ \        S SR 7      # ))rƒ   r   )rÐ   )rƒ   rI  s   €€r   r?  rJ  „  s   ø€ Ô6¸UÈCÕPr   Ú
enter_codec                 ó   <€ \        S SR 7      # rG  )rû   rH  s   €€r   r?  rJ  …  s   ø€ Ô6¸fÈcÕRr   r   Fr!   zUnknown action z3; use list, fill, save_login, enter_code or unlock.)r,   r   r    r²   rZ   r›   rB  )rD  Úkwargsr.  Úpage_opsr‚   rƒ   rI  s   &,  @@@r   Ú_handle_vaultrQ  z  s   ú€ Ø
�*‰*�YÓ
€CÜ�—‘˜(Ó#×)Ð) rÓ*€FÜ˜Ÿ™ Ó*×0Ð0¨bÓ1´3°t·x±xÀÓ7H×7NÐ7NÈBÓ3O€M€FˆEØ�ÔÜ!Ó#Ð#Ø�ÔÜ#¤C¨¯©°Ó(;×(AÐ(A¸rÓ$BÓCÐCàÕFØÕPØÕRð€Hð
 ÔÜ�zŠz˜9 e¨W¸ÈÁzð ROð 7Oð Pó Qð 	Qä˜3 Õ 0Ó1Ð1r   )Úno_cache_check_fnÚregistryÚbrowseru   ðŸ”�)r•   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemoji)r"   NrX   )r™   rÂ   rK  rM  r~   )#Ú__doc__Ú
__future__r   rZ   rí   ÚloggingÚtypingr   r   r   Ú	getLoggerÚ__name__r1   r   r9   rG   rT   r_   ri   rt   rv   r    r²   rÐ   rû   rÉ   r  ÚBROWSER_VAULT_SCHEMArO   rB  rQ  Útools.registryrR  rS  Úregisterr
   r   r   Ú<module>rc     sh  ðñõ0 #ã Û Û ß &Ñ &à	×	Ò	˜8Ó	$€õKõMõDõ:0õfõð" Ð?Øð  KØð  [ð€õIõ$'/õTB÷:%*ðPn€ˆEÑ ÷>g÷BiõX
Qð$ ˆOØð
	ð Ø�ØØ�v˜x¨Ò1gÐhØ�v˜x¨Ð8`ÐaØ˜ ¨&°=À+Ð2NÐP]Ð_mÐnØ�f˜h¨Ð7nÐoð	
ð 	�X�Jð	ðÐ õ8lõ	;õ2÷& 7á*Ð+AÓBÐ à × Ò Ø	ØØØØ#Ø
÷r   