+
    lHàjÔt  ã                  óF  € R t ^ RIHt ^ RIHt ^ RIHt ^RIHtH	t	H
t
Ht ^RIHtHtHtHtHt ^RIHt  ! R R]4      t ! R	 R
]4      t ! R R]
4      t]! R]]RR7        ! R R]4      t ! R R]
4      t]! R]]RR7        ! R R]
4      t]! R]]RR7        ! R R]4      t ! R R]
4      t]! R]]RR7        ! R  R!]	4      t ! R" R#]
4      t]! R$]]R%R7        ! R& R']4      t ! R( R)]
4      t]! R*]]R+R7        ! R, R-]4      t  ! R. R/]
4      t!]! R0] ]!R1R7        ! R2 R3]
4      t"]! R4]]"R5R7        ! R6 R7]
4      t#]! R8]]#R9R7        ! R: R;]4      t$ ! R< R=]
4      t%]! R>]$]%R?R7        ! R@ RA]
4      t&]! RB]]&RCR7        ! RD RE]4      t']! RF]']&RGR7        ! RH RI]4      t( ! RJ RK]
4      t)]! RL](])RMR7        ! RN RO]4      t* ! RP RQ]
4      t+]! RR]*]+RSR7        ! RT RU]4      t, ! RV RW]
4      t-]! RX],]-RYR7        ! RZ R[]4      t.]! R\].]R]R7        ! R^ R_]4      t/]! R`]/]RaR7        ! Rb Rc]4      t0]! Rd]0]ReR7        ! Rf Rg]4      t1]! Rh]1]RiR7        ! Rj Rk]	4      t2 ! Rl Rm]	4      t3 ! Rn Ro]4      t4 ! Rp Rq]
4      t5]! Rr]4]5RsR7        ! Rt Ru]4      t6 ! Rv Rw]
4      t7 ! Rx Ry]
4      t8 ! Rz R{]
4      t9 ! R| R}]
4      t: ! R~ R]
4      t; ! R€ R�]
4      t< ! R‚ Rƒ]4      t= ! R„ R…]
4      t>]! R†]6]>R‡R7        ! Rˆ R‰]	4      t? ! RŠ R‹]
4      t@]! RŒ]?]@R�R7        ! RŽ R�]
4      tA ! R� R‘]
4      tB ! R’ R“]
4      tC ! R” R•]
4      tD ! R– R—]
4      tE ! R˜ R™]
4      tF ! Rš R›]
4      tG ! Rœ R�]
4      tH ! Rž RŸ]4      tI ! R  R¡]
4      tJ]! R¢]I]JR£R7        ! R¤ R¥]4      tK ! R¦ R§]	4      tL ! R¨ R©]4      tM ! Rª R«]
4      tN ! R¬ R­]
4      tO]! R®]M]OR¯R7        ! R° R±]4      tP ! R² R³]4      tQ ! R´ Rµ]
4      tR ! R¶ R·]
4      tS]! R¸]P]SR¹R7       Rº# )»a  Contracts: config, setup readiness, free tier, model inventory, connectors, diagnostics,
image generation and structured session control.

Handlers: ``tui_gateway/methods_config.py`` (``config.get``, ``setup.*``, ``diagnostics.share_nous``),
``methods_config_set.py`` (``config.set``), ``methods_free_tier.py``, ``methods_shared_metrics.py``,
``methods_complete.py``
(``model.options``), ``methods_connectors.py``, ``methods_images.py``, ``methods_session_control.py``
and ``methods_session.py`` (``verification.status``).
)Úannotations)ÚLiteral)ÚField)Ú	JsonValueÚParamsÚResultÚWireEnum)ÚOkResultÚ	OpenModelÚ	PlanUsageÚProfileParamsÚSessionLiveInfo)Úmethodc                  óB   € ] tR t^t$ RtR]R&   RtR]R&   RtR]R&   RtR# )	ÚConfigGetParamsz«``key`` selects one getter from ``_CONFIG_GETTERS``; ``cwd`` feeds the ``project`` getter,
``session_id`` lets ``reasoning`` / ``fast`` answer with the session's live pin.ÚstrÚkeyNú
str | NoneÚcwdÚ
session_id© )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   Ú__static_attributes__r   ó    ÚS/home/ubuntu/.hermes/hermes-agent/tui_gateway/contracts/config_free_tier_control.pyr   r      s#   ‡ ñXð 
ƒHØ€CˆÓØ!€J�
×!r   r   c                  óZ   € ] tR t^!t$ RtR]R&   R]R&   ]! ]R7      tR]R&   Rt	R	]R
&   Rt
R# )ÚConfigProviderRefz7``hermes_cli/models.py::list_available_providers`` row.r   ÚidÚlabel©Údefault_factoryú	list[str]ÚaliasesFÚboolÚauthenticatedr   N)r   r   r   r   r   r   r   Úlistr'   r)   r   r   r   r   r!   r!   !   s(   ‡ ÙAàƒGØƒJÙ¨tÔ4€GˆYÓ4Ø€M�4×r   r!   c                  óÒ   € ] tR t^*t$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   RtR	]R
&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚConfigGetResulta  Union of every getter's payload: ``value`` for the simple words, ``config`` for ``full``,
``mtime`` / ``mcp_rev`` for the poller, ``model`` / ``provider`` / ``providers`` for ``provider``,
``home`` / ``display`` for ``profile``, ``cwd`` / ``branch`` for ``project``, ``prompt``.Nr   ÚvalueÚdisplayÚtool_progressÚmodelÚproviderzlist[ConfigProviderRef] | NoneÚ	providersÚhomer   Úbranchzdict[str, JsonValue] | NoneÚconfigÚpromptúfloat | NoneÚmtimeÚmcp_revr   )r   r   r   r   r   r-   r   r.   r/   r0   r1   r2   r3   r   r4   r5   r6   r8   r9   r   r   r   r   r,   r,   *   sŽ   ‡ ñað €Eˆ:ÓØ€GˆZÓØ $€M�:Ó$Ø€Eˆ:ÓØ€HˆjÓØ04€IÐ-Ó4Ø€Dˆ*ÓØ€CˆÓØ€FˆJÓØ*.€FÐ'Ó.Ø€FˆJÓØ€Eˆ<ÓØ€GˆZ×r   r,   z
config.getz[Read one normalised config value (or the whole effective config) the way the UIs render it.)ÚparamsÚresultÚdocc                  ó^   € ] tR t^Et$ RtR]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   Rt
R# )ÚConfigSetParamsa   ``key`` picks the setter (``_CONFIG_SETTERS``, ``details_mode.<section>``, display toggles);
``value`` is the raw word/string the setter normalises (falsy non-strings are reported back in
the error). ``scope`` applies to ``yolo`` / ``reasoning``; ``confirm_expensive_model`` to ``model``.r   r   Ú r   r-   Nr   r   ÚscopeFr(   Úconfirm_expensive_modelr   )r   r   r   r   r   r   r-   r   r@   rA   r   r   r   r   r>   r>   E   s8   ‡ ñlð 
ƒHØ€Eˆ9ÓØ!€J�
Ó!Ø€Eˆ:ÓØ$)Ð˜T×)r   r>   c                  óÀ   € ] tR t^Qt$ RtR]R&   RtR]R&   RtR]R&   RtR	]R
&   Rt	R]R&   Rt
R]R&   RtR	]R&   RtR]R&   RtR]R&   RtR]R&   RtR	]R&   RtR]R&   RtR# )ÚConfigSetResulta\  ``{key, value}`` plus the setter's extras: model switches add ``warning`` /
``confirm_required`` / ``confirm_message`` / ``scope`` / ``deferred``; ``focus`` adds
``tool_progress``; ``cwd`` adds ``cwd`` / ``branch``; ``personality`` adds ``history_reset`` /
``info``; ``yolo`` reports its ``scope``. ``value`` is a bool only for the display toggles.r   r   Nzstr | bool | Noner-   r   Úwarningúbool | NoneÚconfirm_requiredÚconfirm_messager@   Údeferredr/   r   r4   Úhistory_resetzSessionLiveInfo | NoneÚinfor   )r   r   r   r   r   r   r-   rD   rF   rG   r@   rH   r/   r   r4   rI   rJ   r   r   r   r   rC   rC   Q   s€   ‡ ñcð
 
ƒHØ#€EÐÓ#Ø€GˆZÓØ$(Ð�kÓ(Ø"&€O�ZÓ&Ø€Eˆ:ÓØ €HˆkÓ Ø $€M�:Ó$Ø€CˆÓØ€FˆJÓØ!%€M�;Ó%Ø#'€DÐ
 ×'r   rC   z
config.setzWChange one config key (persisted or session-scoped) and read back the normalised value.c                  óÄ   € ] tR t^lt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   RtR	]R
&   RtR	]R&   RtR]R&   RtR	]R&   RtR	]R&   RtR]R&   RtR]R&   RtR# )ÚSetupStatusResulta  ``provider_configured`` is the loose answer; the boot record's fields (``ready``,
``free_tier_account``, ``free_tier_route``, ``other_providers``, ``inference_provider``) ride along
on the launch profile. An unknown ``profile`` answers ``ok=False`` + ``error``.NrE   Úprovider_configuredÚreadyÚfree_tier_accountÚfree_tier_routeÚother_providersr   Úinference_providerÚprofileÚokÚerrorÚ
error_codeÚ	retryableú
int | NoneÚretry_afterr   )r   r   r   r   r   rM   r   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rY   r   r   r   r   rL   rL   l   s…   ‡ ñWð (,Ð˜Ó+Ø€Eˆ;ÓØ%)Ð�{Ó)Ø#'€O�[Ó'Ø#'€O�[Ó'Ø%)Ð˜
Ó)Ø€GˆZÓØ€BˆÓØ€Eˆ:ÓØ!€J�
Ó!Ø!€Iˆ{Ó!Ø"€K�×"r   rL   zsetup.statusz`Loose provider check: is ANY provider auth state discoverable for the (launch or named) profile.c                  ó&   € ] tR t^ƒt$ RtR]R&   RtR# )ÚSetupRuntimeCheckParamsNr   r1   r   )r   r   r   r   r1   r   r   r   r   r   r[   r[   ƒ   s   ‡ Ø€Hˆj×r   r[   c                  óz   € ] tR t^‡t$ RtR]R&   RtR]R&   RtR]R&   RtR]R&   Rt	R]R	&   Rt
R
]R&   RtR]R&   RtR# )ÚSetupRuntimeCheckResultz‚``ok=False`` + ``error`` when the resolved model can't be served; ``free_tier_route`` says the
selected route is the welcome host.r(   rT   Nr   r1   r0   ÚsourcerU   rE   rP   rS   r   )r   r   r   r   r   r   r1   r0   r^   rU   rP   rS   r   r   r   r   r]   r]   ‡   sJ   ‡ ñ+ð 	ƒHØ€HˆjÓØ€Eˆ:ÓØ€FˆJÓØ€Eˆ:ÓØ#'€O�[Ó'Ø€GˆZ×r   r]   zsetup.runtime_checkz]Strict provider check through the same runtime resolution the agent uses on session creation.c                  óB   € ] tR t^›t$ RtR]R&   RtR]R&   RtR]R&   RtR# )	ÚDiagnosticsShareNousParamsNr   Úerror_contextúdict[str, str] | NoneÚextra_filesrX   Ú	log_linesr   )	r   r   r   r   ra   r   rc   rd   r   r   r   r   r`   r`   ›   s!   ‡ Ø $€M�:Ó$Ø)-€KÐ&Ó-Ø €Iˆz× r   r`   c                  ó^   € ] tR t^¡t$ RtR]R&   RtR]R&   RtR]R&   RtR]R&   Rt	R]R	&   R
t
R# )ÚDiagnosticsShareNousResultzXStructured envelope: ``ok=False`` + ``error`` renders inline instead of failing the RPC.r(   rT   Nr   Úview_urlÚ	upload_idÚ
expires_atrU   r   )r   r   r   r   r   r   rg   rh   ri   rU   r   r   r   r   rf   rf   ¡   s2   ‡ ÙbàƒHØ€HˆjÓØ €IˆzÓ Ø!€J�
Ó!Ø€Eˆ:×r   rf   zdiagnostics.share_nouszJUpload a force-redacted debug bundle to Nous-internal diagnostics storage.c                  ó\   € ] tR t^²t$ RtR]R&   R]R&   R]R&   R]R	&   R]R
&   ^ tR]R&   RtR# )ÚFreeTierChallengePayloadz¶``hermes_cli/anon_challenge.py::BrowserChallenge.as_payload``: the ``free_tier.challenge``
event, and ``free_tier.status``'s ``challenge`` field for a client that connected after it.zLiteral['browser']Útyper   Úurlr(   ÚrequiredÚintÚ
expires_inÚmessageÚattemptr   N)r   r   r   r   r   r   rr   r   r   r   r   rk   rk   ²   s.   ‡ ñcð ÓØ	ƒHàƒNØƒOØƒLØ€GˆS×r   rk   c                  óº   € ] tR t^¿t$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R
tR]R&   R
tR]R&   R
tR]R&   R
t	R]R&   R
t
R]R&   R
tR]R&   R
tR]R&   RtR
# )ÚFreeTierStatusResultzŠ``available`` = an identity exists AND the tier is on; whether inference runs on it is
``setup.runtime_check.free_tier_route``'s question.r(   Ú	has_guestÚenabledÚ	availableÚnotice_pendingr   r0   r#   Nr   rU   rV   rE   rW   rX   rY   zFreeTierChallengePayload | NoneÚ	challengeÚnudge_due_inÚconnector_nudge_due_inr   )r   r   r   r   r   r   rU   rV   rW   rY   ry   rz   r{   r   r   r   r   rt   rt   ¿   sr   ‡ ñ;ð ƒOØƒMØƒOØÓØƒJØƒJØ€Eˆ:ÓØ!€J�
Ó!Ø!€Iˆ{Ó!Ø"€K�Ó"à15€IÐ.Ó5ð  $€L�*Ó#à)-Ð˜J×-r   rt   zfree_tier.statuszZPure read of the focused profile's free-tier identity state (no network, no side effects).c                  ó:   € ] tR t^Út$ R]R&   ^ tR]R&   R]R&   RtR# )	ÚFreeTierChallengeResultParamsr   rm   ro   rr   zQLiteral['done', 'failed', 'closed', 'timeout', 'refused', 'error', 'unsupported']Úoutcomer   N)r   r   r   r   r   rr   r   r   r   r   r}   r}   Ú   s   ‡ Ø	ƒHØ€GˆSÓØ^×^r   r}   c                  ó"   € ] tR t^àt$ R]R&   RtR# )ÚFreeTierChallengeResultr(   Úacceptedr   N©r   r   r   r   r   r   r   r   r   r€   r€   à   ó   ‡ Ø‡Nr   r€   zfree_tier.challenge_resultz]Report a browser window outcome for the matching pending attempt; mint remains authoritative.c                  ód   € ] tR t^èt$ R]R&   R]R&   RtR]R&   RtR]R&   RtR]R	&   RtR
]R&   Rt	R# )ÚFreeTierProvisionResultr(   ru   rv   Nr   rU   rV   rE   rW   rX   rY   r   )
r   r   r   r   r   rU   rV   rW   rY   r   r   r   r   r…   r…   è   s4   ‡ ØƒOØƒMØ€Eˆ:ÓØ!€J�
Ó!Ø!€Iˆ{Ó!Ø"€K�×"r   r…   zfree_tier.provisionzZExplicit retry of the free-tier identity mint when the boot bootstrap could not create it.c                  ó"   € ] tR t^õt$ R]R&   RtR# )ÚFreeTierAckNoticeResultr(   Úackedr   Nr‚   r   r   r   r‡   r‡   õ   s   ‡ Ø‡Kr   r‡   zfree_tier.ack_noticezIMark the one-time availability notice as shown on the free-tier identity.c                  ó&   € ] tR t^ýt$ RtR]R&   RtR# )ÚFreeTierClaimNudgeParamsÚtrialzLiteral['trial', 'connector']Úkindr   N)r   r   r   r   rŒ   r   r   r   r   r   rŠ   rŠ   ý   s   ‡ Ø*1€DÐ
'×1r   rŠ   c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚFreeTierClaimNudgeResulti  r(   Úclaimedr   Nr‚   r   r   r   rŽ   rŽ     s   ‡ Ø‡Mr   rŽ   zfree_tier.claim_nudgezVClaim the due sign-in offer; true for exactly one caller each time an offer comes due.c                  óH   € ] tR tRt$ RtR]R&   R]R&   R]R&   RtR]R&   R	tR
# )ÚSharedMetricsConsentResulti  a1  The focused profile's ``telemetry.shared_metrics`` opt-ins. ``send`` is never true while
``enabled`` is false; ``decided`` = either key is written in config.yaml (the shipped defaults
are not an answer) and it is not a ``reask``: an "off" from before the type-ahead fix, offered
once more with the reason.r(   rv   ÚsendÚdecidedFÚreaskr   N)r   r   r   r   r   r   r”   r   r   r   r   r‘   r‘     s"   ‡ ñ"ð
 ƒMØ
ƒJØƒMØ€Eˆ4×r   r‘   zshared_metrics.statuszYPure read of the focused profile's shared-metrics opt-ins (collection, upload, answered).c                  óB   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR	# )
ÚSharedMetricsSetParamsi  zY``send`` is ignored unless ``enabled``; ``first_run`` marks the Desktop first-run answer.r(   rv   Fr’   Ú	first_runr   N)	r   r   r   r   r   r   r’   r—   r   r   r   r   r–   r–     s   ‡ ÙcàƒMØ€Dˆ$ÓØ€Iˆt×r   r–   zshared_metrics.setzcWrite both shared-metrics opt-ins at once (send requires collection) and reconcile consent windows.c                  ó4   € ] tR tRt$ RtR]R&   RtR]R&   RtR# )	ÚSharedMetricsSlashCommandParamsi(  z¶``command`` is the raw typed name (no leading ``/``, no args); the backend canonicalizes it
against the published registry. ``session_id`` scopes the count to that session's profile.r   ÚcommandNr   r   r   )r   r   r   r   r   r   r   r   r   r   r   r™   r™   (  s   ‡ ñbð ƒLØ!€J�
×!r   r™   c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚSharedMetricsSlashCommandResulti0  r(   rT   r   Nr‚   r   r   r   rœ   rœ   0  ó   ‡ Ø‡Hr   rœ   zshared_metrics.slash_commandz[Count one user-typed slash command (fire-and-forget; a no-op unless shared metrics are on).c                  óB   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R	&   R
tR# )Ú!SharedMetricsStartupLatencyParamsi9  a  ``elapsed_ms`` = the client's own launch (TUI process start / Desktop app start) to ready
(TUI gateway ready / Desktop backend attached), measured once per launch by the client. The
client names its surface because a Desktop may attach to a URL/cloud backend where
``HERMES_DESKTOP`` is unset; without it the backend falls back to its own client detection.
``launch_id`` is an opaque per-launch token the backend latches on (never recorded), so a
reconnect re-sending the same launch counts once while a new launch counts again.ÚfloatÚ
elapsed_msNz'Literal['desktop_attach', 'tui'] | NoneÚsurfacer   Ú	launch_idr   )	r   r   r   r   r   r   r¢   r£   r   r   r   r   rŸ   rŸ   9  s%   ‡ ñYð ÓØ7;€GÐ4Ó;Ø €Iˆz× r   rŸ   c                  ó"   € ] tR tRt$ R]R&   RtR# )Ú!SharedMetricsStartupLatencyResultiF  r(   rT   r   Nr‚   r   r   r   r¥   r¥   F  r�   r   r¥   zshared_metrics.startup_latencyzbRecord one client launch-to-ready latency (fire-and-forget; a no-op unless shared metrics are on).c                  ó^   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR	]R
&   Rt	R	]R&   Rt
R# )ÚSharedMetricsUpdateRunParamsiP  aÂ  One Desktop PACKAGED self-update (electron-updater / App Installer / Store). Source-checkout
hand-offs run ``hermes update`` and are counted from its receipt, never here. Raw words; the
backend buckets them: ``outcome`` success|failed|noop|refused, ``failed_stage``
download|verify|apply|restart, ``mechanism`` the updater strategy kind, ``duration_ms`` wall
time, ``from_commit_date`` the updated-from build's commit time (epoch seconds) when known.r   r~   Nr   Úfailed_stageÚ	mechanismr7   Úduration_msÚfrom_commit_dater   )r   r   r   r   r   r   r¨   r©   rª   r«   r   r   r   r   r§   r§   P  s8   ‡ ñcð ƒLØ#€L�*Ó#Ø €IˆzÓ Ø $€K�Ó$Ø%)Ð�l×)r   r§   c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚSharedMetricsUpdateRunResulti^  r(   rT   r   Nr‚   r   r   r   r­   r­   ^  r�   r   r­   zshared_metrics.update_runzgCount one Desktop packaged self-update outcome (fire-and-forget; a no-op unless shared metrics are on).c                  ó&   € ] tR tRt$ RtR]R&   RtR# )Ú$SharedMetricsDesktopFeatureUseParamsih  u§   ``area`` is a Desktop surface id (``command_palette``, ``terminal_pane``, ``settings_<view>`` â€¦);
the backend collapses anything outside its closed set to ``other``.r   Úarear   N©r   r   r   r   r   r   r   r   r   r   r¯   r¯   h  s   ‡ ñKð ‡Ir   r¯   z"shared_metrics.desktop_feature_usezbCount one Desktop area used today (fire-and-forget; once per area per UTC day; a no-op unless on).c                  ó0   € ] tR tRt$ RtR]R&   R]R&   RtR# )Ú"SharedMetricsDesktopFrictionParamsit  zê``kind`` notice_dismissed|error_toast|renderer_crash|backend_disconnect|slow_frame; ``detail`` a
closed code-defined word for that kind (notice id, error category, crash reason, drop reason, frame
duration bucket), never message text.r   rŒ   Údetailr   Nr±   r   r   r   r³   r³   t  s   ‡ ñ-ð ƒIØ‡Kr   r³   zshared_metrics.desktop_frictionzVCount one Desktop friction event (fire-and-forget; capped per day; a no-op unless on).c                  ó0   € ] tR tRt$ RtR]R&   R]R&   RtR# )Ú$SharedMetricsDesktopOnboardingParamsi‚  zL``step`` a Desktop first-run step id; ``event`` reached|completed|abandoned.r   ÚstepÚeventr   Nr±   r   r   r   r¶   r¶   ‚  s   ‡ ÙVà
ƒIØ‡Jr   r¶   z!shared_metrics.desktop_onboardingzfCount one Desktop first-run step transition (fire-and-forget; once per step+event; a no-op unless on).c                  óB   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R	&   R
tR# )Ú!SharedMetricsDesktopDislikeParamsiŽ  u7  ``signal`` quick_close|cancelled|setting_off_default|rage_click|undo|feature_disabled; ``target`` a
closed code-defined id for that signal (area, flow, action, undo path, feature toggle); ``setting`` a
config key for setting_off_default only (the value is never sent â€” the backend compares it to the
default).r   Úsignalr?   ÚtargetNr   Úsettingr   )	r   r   r   r   r   r   r¼   r½   r   r   r   r   rº   rº   Ž  s"   ‡ ñð
 ƒKØ€FˆCÓØ€GˆZ×r   rº   zshared_metrics.desktop_dislikezaCount one Desktop dislike signal (fire-and-forget; capped per signal per day; a no-op unless on).c                  ó>   € ] tR tRt$ R]R&   ^ tR]R&   ^ tR]R&   RtR	# )
ÚSharedMetricsDesktopModeDayiž  zLiteral['bots', 'sessions']Úmoder    Ú	active_msro   Úmessages_sentr   N)r   r   r   r   r   rÁ   rÂ   r   r   r   r   r¿   r¿   ž  s   ‡ Ø
%Ó%Ø€IˆuÓØ€M�3×r   r¿   c                  ó6   € ] tR tRt$ R]R&   R]R&   R]R&   RtR	# )
ÚSharedMetricsDesktopActionDayi¤  r   Úactionz/Literal['click', 'menu', 'palette', 'shortcut']Úviaro   Úcountr   Nr‚   r   r   r   rÄ   rÄ   ¤  s   ‡ ØƒKØ	8Ó8Ø‡Jr   rÄ   c                  ól   € ] tR tRt$ RtR]R&   ^ tR]R&   ]! ]R7      t	R]R	&   ]! ]R7      t
R
]R&   RtR# )ÚSharedMetricsDesktopDailyParamsiª  z¬One finished UTC day of Desktop use, aggregated on the client. ``day`` (YYYY-MM-DD) only latches
a resend and is never recorded; the raw counts are bucketed by the backend.r   Údayro   Ú	bot_countr$   z!list[SharedMetricsDesktopModeDay]Úmodesz#list[SharedMetricsDesktopActionDay]Úactionsr   N)r   r   r   r   r   r   rË   r   r*   rÌ   rÍ   r   r   r   r   rÉ   rÉ   ª  s9   ‡ ñSð 
ƒHØ€IˆsÓÙ/4ÀTÔ/J€EÐ,ÓJÙ38ÈÔ3N€GÐ0×Nr   rÉ   c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚSharedMetricsDesktopDailyResulti´  r(   Úrecordedr   Nr‚   r   r   r   rÏ   rÏ   ´  rƒ   r   rÏ   zshared_metrics.desktop_dailyzaRecord one finished Desktop day (mode use + button presses); recorded=false keeps it for a retry.c                  óP   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   R
t	R# )ÚModelOptionsParamsiÁ  Nr   r   Fr(   Úexplicit_onlyÚinclude_unconfiguredÚrefreshr   )
r   r   r   r   r   r   rÓ   rÔ   rÕ   r   r   r   r   rÒ   rÒ   Á  s+   ‡ Ø!€J�
Ó!Ø€M�4ÓØ!&Ð˜$Ó&Ø€GˆT×r   rÒ   c                  ór   € ] tR tRt$ RtR]R&   R]R&   RtR]R&   R	]R
&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R# )ÚModelPricingiÊ  uŒ   ``hermes_cli/inventory.py::_apply_pricing`` â€” formatted $/Mtok strings (``""`` unknown,
``"free"``); the sale fields are Nous Portal-only.r   ÚinputÚoutputNr   Úcacher(   ÚfreerX   Údiscount_percentÚ	was_inputÚ
was_outputr   )r   r   r   r   r   r   rÚ   rÜ   rÝ   rÞ   r   r   r   r   r×   r×   Ê  sA   ‡ ñ:ð ƒJØƒKØ€Eˆ:ÓØ
ƒJØ#'Ð�jÓ'Ø €IˆzÓ Ø!€J�
×!r   r×   c                  óL   € ] tR tRt$ RtR]R&   RtR]R&   R]R&   RtR	]R
&   RtR# )ÚModelCapabilitiesi×  z1``hermes_cli/inventory.py::_apply_capabilities``.r(   ÚfastFÚ	ultrafastÚ	reasoningNrE   Úcan_disable_reasoningr   )	r   r   r   r   r   r   râ   rä   r   r   r   r   rà   rà   ×  s$   ‡ Ù;à
ƒJØ€IˆtÓØƒOØ)-Ð˜;×-r   rà   c                  óB   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R	&   R
tR# )ÚProviderLimitià  uÃ   ``hermes_cli/inventory.py::_apply_limits`` â€” ``account``: the whole login is rate-limited until
``resets_at`` (ISO, absent when unknown); ``models``: only these models are, each until its time.zLiteral['account', 'models']r@   Nr   Ú	resets_atrb   Úmodelsr   )	r   r   r   r   r   r   rç   rè   r   r   r   r   ræ   ræ   à  s%   ‡ ñið (Ó'Ø €IˆzÓ Ø$(€FÐ!×(r   ræ   c                  óL   € ] tR tRt$ RtR]R&   R]R&   RtR]R	&   R
tR]R&   RtR# )ÚProviderUsageWindowié  uÖ  One subscription usage window (``agent/account_usage.py::AccountUsageWindow``): e.g. the 5-hour
session or the weekly cap, with how much of it is spent and when it rolls over (ISO).

``scope``: ``account`` â€” exhausting the window exhausts the whole login (Codex session/weekly,
so a limited account's resets_at must wait for it); ``model`` â€” the window caps only one model
family (Anthropic Opus/Sonnet weekly) and can never imply the account itself is out of quota.r   r#   r    Úused_percentNr   rç   ÚaccountzLiteral['account', 'model']r@   r   )	r   r   r   r   r   r   rç   r@   r   r   r   r   rê   rê   é  s*   ‡ ñeð ƒJØÓØ €IˆzÓ Ø)2€EÐ&×2r   rê   c                  óh   € ] tR tRt$ RtR]R&   RtR]R&   ]! ]R7      t	R]R	&   R
]R&   Rt
R]R&   RtR# )ÚProviderUsageAccounti÷  u˜  One account of a provider's credential pool (``hermes_cli/inventory.py::_pool_usage_accounts``).
``id`` is a stable non-secret account identity (never a key or URL); ``label`` may be empty (UI
falls back to a localized "Account N"). ``windows`` is empty while the account's usage is not
yet known â€” state carries the meaning, never a fabricated gauge.

``state``: ``ready`` â€” live quota below the cap (numeric windows present); ``limited`` â€” a live
credential-wide cooldown or exhausted account-scoped quota windows; ``unknown`` â€” no live
numeric windows (failed/empty fetch, stale snapshot, provider without a usage API);
``unavailable`` â€” DEAD auth row (kept visible, never a quota row).

``resets_at``: for a limited account, the LATEST of its exhausted account-scoped windows (or a
live cooldown when later); ``None`` when unknown (the frontend renders its own advisory, e.g.
the earliest limited sibling).r   r"   r?   r#   r$   úlist[ProviderUsageWindow]Úwindowsz5Literal['ready', 'limited', 'unknown', 'unavailable']ÚstateNr   rç   r   )r   r   r   r   r   r   r#   r   r*   rð   rç   r   r   r   r   rî   rî   ÷  s7   ‡ ñ&ð 	ƒGØ€Eˆ3ƒOÙ).¸tÔ)D€GÐ&ÓDØ@Ó@Ø €Iˆz× r   rî   c                  óF   € ] tR tRt$ Rt]! ]R7      tR]R&   Rt	R]R&   R	t
R# )
ÚProviderUsagei  uU  ``hermes_cli/inventory.py::_apply_usage`` â€” the provider's subscription usage, from cache.

Multi-entry credential pools carry ``accounts`` (one row per account; the legacy ``windows``
stays EMPTY there â€” a provider-wide percentage across different logins would be fabricated).
Single-account providers keep the legacy ``windows`` gauge.r$   rï   rð   Nz!list[ProviderUsageAccount] | NoneÚaccountsr   )r   r   r   r   r   r   r*   rð   r   rô   r   r   r   r   ró   ró     s%   ‡ ñCñ */¸tÔ)D€GÐ&ÓDØ26€HÐ/×6r   ró   c                  ó€  € ] tR tRt$ RtR]R&   R]R&   ]! ]R7      tR]R&   R	t	R
]R&   R	t
R]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R&   R	tR]R &   R	tR]R!&   R	tR"]R#&   R	tR$]R%&   R	tR&]R'&   R	tR(]R)&   R*tR	# )+ÚModelOptionProvideri  z¶One ``hermes_cli/inventory.py::build_models_payload`` provider row (the union of every field
the builder sets; ``pricing_pending`` / ``free_tier_pending`` mark the cached-only path).r   ÚslugÚnamer$   r&   rè   NrX   Útotal_modelsrE   Ú
is_currentÚis_user_definedr   r^   úlist[str] | Noner'   Úapi_urlÚ	auth_typer)   Úkey_envrD   Úfeatured_modelsz#dict[str, ModelCapabilities] | NoneÚcapabilitieszdict[str, ModelPricing] | NoneÚpricingÚpricing_pendingÚ	free_tierÚfree_tier_pendingÚfree_tier_rowÚunavailable_modelszPlanUsage | NoneÚ
plan_usagerb   Úusage_levelszProviderLimit | NoneÚlimitzProviderUsage | NoneÚusager   ) r   r   r   r   r   r   r   r*   rè   rù   rú   rû   r^   r'   rý   rþ   r)   rÿ   rD   r   r  r  r  r  r  r  r  r  r	  r
  r  r   r   r   r   rö   rö     s
  ‡ ñað ƒIØ
ƒIÙ¨dÔ3€FˆIÓ3Ø#€L�*Ó#Ø"€J�Ó"Ø#'€O�[Ó'Ø€FˆJÓØ $€GÐÓ$Ø€GˆZÓØ €IˆzÓ Ø!%€M�;Ó%Ø€GˆZÓØ€GˆZÓØ(,€OÐ%Ó,Ø8<€LÐ5Ó<Ø.2€GÐ+Ó2Ø#'€O�[Ó'Ø!€Iˆ{Ó!Ø%)Ð�{Ó)Ø!%€M�;Ó%Ø+/ÐÐ(Ó/Ø#'€JÐ Ó'à*.€LÐ'Ó.Ø"&€EÐÓ&Ø"&€EÐ×&r   rö   c                  ó>   € ] tR tRt$ R]R&   RtR]R&   RtR]R&   RtR	# )
ÚModelOptionsResulti8  zlist[ModelOptionProvider]r2   r?   r   r0   r1   r   N)r   r   r   r   r   r0   r1   r   r   r   r   r  r  8  s   ‡ Ø(Ó(Ø€Eˆ3ƒOØ€Hˆc×r   r  zmodel.optionsz]Provider/model inventory for the picker, layered over the session's live provider when given.c                  óP   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   R
t	R# )ÚImageGenerateParamsiE  Nr   r6   Úaspect_ratiozJsonValue | NoneÚproberX   Ú	max_bytesr   )
r   r   r   r   r6   r   r  r  r  r   r   r   r   r  r  E  s+   ‡ Ø€FˆJÓØ#€L�*Ó#Ø"€EÐÓ"Ø €Iˆz× r   r  c                  ó^   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   Rt
R# )ÚImageGenerateResultiL  z£``probe`` answers ``{available}`` alone; ``image_data`` (data URL) is omitted when the
download failed or exceeded ``max_bytes`` so callers fall back to ``image``.r(   rw   NrE   Úsuccessr   ÚimageÚ
image_datarU   r   )r   r   r   r   r   r   r  r  r  rU   r   r   r   r   r  r  L  s7   ‡ ñTð ƒOØ€Gˆ[ÓØ€Eˆ:ÓØ!€J�
Ó!Ø€Eˆ:×r   r  zimage.generatezZGenerate an image through the tool's provider dispatcher and hand the renderer a data URL.c                  ób   € ] tR tRt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R	&   R
tR# )ÚGoalContractSnapshoti^  z.``hermes_cli/goals.py::GoalContract.to_dict``.r?   r   r~   ÚverificationÚconstraintsÚ
boundariesÚ	stop_whenr   N)r   r   r   r   r   r~   r   r  r  r  r  r   r   r   r   r  r  ^  s7   ‡ Ù8à€GˆSÓØ€L�#ÓØ€K�ÓØ€J�ÓØ€Iˆs×r   r  c                  óN   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   RtR	]R
&   RtR# )ÚGoalGateSnapshotih  r   rš   ro   Útimeout_secondsÚmax_retriesÚattemptsNrX   Úlast_exit_coder   )r   r   r   r   r   r#  r   r   r   r   r  r  h  s"   ‡ ØƒLØÓØÓØƒMØ!%€N�J×%r   r  c                  ó:   € ] tR tRt$ R]R&   R]R&   RtR]R&   R	tR
# )ÚWaitBarrierUntilip  zLiteral['until']rl   r    Úuntil_atr?   r   Úreasonr   N©r   r   r   r   r   r'  r   r   r   r   r%  r%  p  s   ‡ Ø
ÓØƒOØ€FˆC×r   r%  c                  ó:   € ] tR tRt$ R]R&   R]R&   RtR]R&   R	tR
# )ÚWaitBarrierTargetiv  zLiteral['session', 'pid']rl   z	str | intr¼   r?   r   r'  r   Nr(  r   r   r   r*  r*  v  s   ‡ Ø
#Ó#ØÓØ€FˆC×r   r*  c                  óÆ   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R	]R
&   R]R&   R]R&   RtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   ]! RRR7      tR]R&   RtR# )ÚGoalSnapshoti|  u[   ``methods_session_control.py::_safe_goal_snapshot`` â€” the frontend-safe GoalState subset.r   ÚtitleÚstatusro   Ú
turns_usedÚ	max_turnsr  Úcontractr&   Úsubgoalszlist[GoalGateSnapshot]ÚgatesNr7   Ú
created_atÚ
updated_atr   Úpaused_reasonÚlast_verdictÚlast_reasonrl   )ÚdefaultÚdiscriminatorz+WaitBarrierUntil | WaitBarrierTarget | NoneÚwait_barrierr   )r   r   r   r   r   r   r4  r5  r6  r7  r8  r   r;  r   r   r   r   r,  r,  |  sp   ‡ ÙeàƒJØƒKØƒOØƒNØ"Ó"ØÓØ!Ó!Ø#€J�Ó#Ø#€J�Ó#Ø $€M�:Ó$Ø#€L�*Ó#Ø"€K�Ó"Ù@EÈdÐbhÔ@i€LÐ=×ir   r,  c                  óÄ   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
]R&   R]R&   R
]R&   R
]R&   R]R&   R]R&   R]R&   R]R&   R]R&   RtR]R&   RtR]R&   RtR# )ÚLoopSnapshotiŽ  uH   ``_safe_loop_snapshot`` â€” persisted LoopState fields, never its route.r   r6   r.  rÀ   r    Úinterval_secondsÚcurrent_delayro   ÚtimesÚuntilÚ	max_ticksÚticks_firedr4  Úlast_fired_atÚnext_due_atr(   Úawaiting_responseÚdeferred_by_goalNr   r6  Úlast_stop_reasonr   )	r   r   r   r   r   r   r6  rH  r   r   r   r   r=  r=  Ž  sh   ‡ ÙRàƒKØƒKØ
ƒIØÓØÓØƒJØƒJØƒNØÓØÓØÓØÓØÓØÓØ $€M�:Ó$Ø#'Ð�j×'r   r=  c                  óT   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   RtR# )ÚHeartbeatSnapshoti£  r   r6   r.  ro   r>  r    r4  rD  Ú
fire_countr   Nr‚   r   r   r   rJ  rJ  £  s#   ‡ ØƒKØƒKØÓØÓØÓØ‡Or   rJ  c                  óN   € ] tR tRt$ RtR]R&   R]R&   R]R&   R	]R
&   R]R&   RtR# )ÚSessionControlSnapshoti¬  už   ``_snapshot_control`` â€” ``revision`` is a hash of the visible state (``""`` when empty);
``updated_at`` is the newest persisted timestamp (``0`` when none).zGoalSnapshot | NoneÚgoalzLoopSnapshot | NoneÚloopzHeartbeatSnapshot | NoneÚ	heartbeatr   Úrevisionr    r5  r   Nr±   r   r   r   rM  rM  ¬  s'   ‡ ñKð ÓØ
ÓØ'Ó'ØƒMØ×r   rM  c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚSessionControlReadParamsi·  r   r   r   Nr‚   r   r   r   rS  rS  ·  s   ‡ Ø‡Or   rS  c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚSessionControlReadResulti»  rM  Úcontrolr   Nr‚   r   r   r   rU  rU  »  s   ‡ Ø#×#r   rU  zsession.control.readzQStable, allowlisted snapshot of one live session's goal / loop / heartbeat state.c                  óJ   € ] tR tRtRtRtRtRtRtRt	Rt
R	tR
tRtRtRtRtRtR# )ÚSessionControlActioniÃ  z
goal.pausezgoal.resumez
goal.clearzgoal.unwaitz
loop.pausezloop.resumez	loop.stopzsubgoal.addzsubgoal.removezsubgoal.clearzheartbeat.pausezheartbeat.resumezheartbeat.clearr   N)r   r   r   r   Ú
goal_pauseÚgoal_resumeÚ
goal_clearÚgoal_unwaitÚ
loop_pauseÚloop_resumeÚ	loop_stopÚsubgoal_addÚsubgoal_removeÚsubgoal_clearÚheartbeat_pauseÚheartbeat_resumeÚheartbeat_clearr   r   r   r   rX  rX  Ã  sD   † Ø€JØ€KØ€JØ€KØ€JØ€KØ€IØ€KØ%€NØ#€MØ'€OØ)ÐØ'„Or   rX  c                  ó8   € ] tR tRt$ RtRtR]R&   RtR]R&   RtR# )	ÚSessionControlArgsiÓ  zO``subgoal.add`` reads ``text``; ``subgoal.remove`` reads the 1-based ``index``.Nr   ÚtextrX   Úindexr   )	r   r   r   r   r   rh  r   ri  r   r   r   r   rg  rg  Ó  s   ‡ ÙYà€Dˆ*ÓØ€Eˆ:×r   rg  c                  ó>   € ] tR tRt$ RtR]R&   R]R&   RtR]R&   R	tR# )
ÚSessionControlParamsiÚ  z£``action`` is validated by the handler (unknown / gate actions answer ``4004``), so it stays a
string on the wire; ``SessionControlAction`` lists the accepted set.r   r   rÅ   NzSessionControlArgs | NoneÚargsr   )r   r   r   r   r   r   rl  r   r   r   r   rk  rk  Ú  s   ‡ ñLð ƒOØƒKØ&*€DÐ
#×*r   rk  c                  óN   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R	tR
# )ÚSessionControlDispatchiã  u`   ``_dispatch_envelope`` â€” the command result's user-visible envelope, every key always present.r   rl   rÙ   Únoticerq   r.   r   Nr±   r   r   r   rn  rn  ã  s#   ‡ Ùjà
ÓØÓØÓØÓØ×r   rn  c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )ÚSessionControlResultií  rM  rV  rn  Údispatchr   Nr‚   r   r   r   rq  rq  í  s   ‡ Ø#Ó#Ø$×$r   rq  zsession.controlzeRun one allowlisted goal / loop / subgoal / heartbeat action and return the exact resulting snapshot.c                  óB   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR# )ÚVerificationStatusParamsiù  Nr   r   Úsession_keyr   r   )	r   r   r   r   r   r   ru  r   r   r   r   r   rt  rt  ù  s    ‡ Ø!€J�
Ó!Ø"€K�Ó"Ø€Cˆ×r   rt  c                  óÄ   € ] tR tRt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R	&   Rt
R]R
&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚVerificationEvidenceRowiÿ  zEOne ``verification_events`` row (``agent/verification_evidence.py``).NrX   r"   r   r4  r   r   Úrootrš   Úcanonical_commandrŒ   r@   r.  Ú	exit_codeÚoutput_summaryr   )r   r   r   r   r   r"   r   r4  r   r   rx  rš   ry  rŒ   r@   r.  rz  r{  r   r   r   r   rw  rw  ÿ  s~   ‡ ÙOà€Bˆ
ÓØ!€J�
Ó!Ø!€J�
Ó!Ø€CˆÓØ€Dˆ*ÓØ€GˆZÓØ$(Ð�zÓ(Ø€Dˆ*ÓØ€Eˆ:ÓØ€FˆJÓØ €IˆzÓ Ø!%€N�J×%r   rw  c                  ó^   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R	&   RtR]R
&   Rt	R]R&   Rt
R# )ÚVerificationStatusInfoi  z¶``verification_status()``: ``disabled`` / ``not_applicable`` / ``unverified`` / ``stale`` or the
latest event's own status; ``root`` and friends only once a workspace was identified.r   r.  NzVerificationEvidenceRow | NoneÚevidencer   rx  r   rü   Úchanged_pathsr   )r   r   r   r   r   r   r~  rx  r   r  r   r   r   r   r}  r}    s9   ‡ ñ]ð ƒKØ/3€HÐ,Ó3Ø€Dˆ*ÓØ!€J�
Ó!Ø&*€MÐ#×*r   r}  c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚVerificationStatusResulti  r}  r  r   Nr‚   r   r   r   r�  r�    s   ‡ Ø(×(r   r�  zverification.statuszQBest known verification evidence for a cwd/session; read-only, never runs checks.N)Tr   Ú
__future__r   Útypingr   Úpydanticr   Úbaser   r   r   r   Úcommonr	   r
   r   r   r   Úregistryr   r   r!   r,   r>   rC   rL   r[   r]   r`   rf   rk   rt   r}   r€   r…   r‡   rŠ   rŽ   r‘   r–   r™   rœ   rŸ   r¥   r§   r­   r¯   r³   r¶   rº   r¿   rÄ   rÉ   rÏ   rÒ   r×   rà   ræ   rê   rî   ró   rö   r  r  r  r  r  r%  r*  r,  r=  rJ  rM  rS  rU  rX  rg  rk  rn  rq  rt  rw  r}  r�  r   r   r   Ú<module>rˆ     s]  ðñõ #å å ç 5Ó 5ß RÕ RÝ ô
"�mô "ô ˜	ô  ô�fô ñ( €|˜O°OØhõjô	*�mô 	*ô(�fô (ñ( €|˜O°OØdõfô#˜ô #ñ& €~˜mÐ4EØmõoô ˜mô  ô
˜fô 
ñ ÐÐ%<ÐE\Øjõlô! ô !ô ô ñ ÐÐ(BÐKeØWõYô
˜yô 
ô.˜6ô .ñ. Ð -Ð8LØgõiô_ Mô _ô˜fô ñ Ð#Ð,IÐRiØjõlô#˜fô #ñ Ð ]Ð;RØgõiô˜fô ñ Ð mÐ<SØVõXô2˜}ô 2ô˜vô ñ ÐÐ'?ÐH`Øcõeô	 ô 	ñ Ð }Ð=WØfõhô˜]ô ñ ÐÐ$:ÐC]Øpõrô" mô "ô fô ñ Ð%Ð.MØ-Øhõjô

!¨ô 
!ô¨ô ñ Ð'Ð0QØ/Øoõqô* =ô *ô 6ô ñ Ð"Ð+GÐPlØtõvô¨=ô ñ Ð+Ð4XØØoõqô
¨ô ñ Ð(Ð1SØØcõeô
¨=ô ñ Ð*Ð3WØØsõuô
¨ô ñ Ð'Ð0QØØnõpô
 &ô ô Fô ôO mô Oô fô ñ Ð%Ð.MØ-Ønõpô˜ô ô
"�6ô 
"ô.˜ô .ô)�Fô )ô3˜&ô 3ô!˜6ô !ô,7�Fô 7ô'˜)ô 'ô@˜ô ñ €Ð1Ð:LØjõlô!˜&ô !ô˜&ô ñ ÐÐ 3Ð<OØgõiô˜6ô ô&�vô &ô�vô ô˜ô ôj�6ô jô$(�6ô (ô*˜ô ô˜Vô ô˜}ô ô$˜vô $ñ ÐÐ&>ÐG_Ø^õ`ô(˜8ô (ô ˜ô ô+˜=ô +ô˜Vô ô%˜6ô %ñ
 ÐÐ!5Ð>RØrõtô˜}ô ô&˜iô &ô"+˜Vô +ô)˜vô )ñ ÐÐ%=ÐF^Ø^÷`r   