+
    jHàj^¼  ã                   óp  a € ER tN0 t R t^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
HtHtHtHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ R	IHt ]'       d   ^ R
IHt ]P>                  ! R4      t R R lt!R R lt"R R lt#/ R]#! R.]"! 4       O5RRRR/ bR]#! R.]!! 4       O5!  bRRRRRRR/bR RR!RR"RR/bR#]#! R$R%R&R'R(R)R*4      bR+RRRR,/bR-]#! R.R/R0R1RR27      bR3]#! R4R5R64      bR7RR8RR9RR:/bR;]#! R<R=R>R:R?7      bR@RR8RRARR:/bRBRR8RRCRR:/bRD]#! RERF.]O5!  bRG]#! RHRIRJRKRLRMRNRORPRQRR4      bRS]#! RTR%RURKRNRLRJRV4      bRW]#! RX.]R%,          O5!  bRY]#! RZ.]RU,          O5!  b/ R[]#! R\.]RK,          O5!  bR]]#! R^R_R`RaRb4      bRc]#! Rd.]RN,          O5!  bRe]#! Rf.]RL,          O5!  bRg]#! Rh.]RJ,          O5!  bRi]#! RjRkRlRmRn4      bRo]#! RpRkRqRrRmRsRt4      bRu]#! RvRwRxRy4      bRz]#! R{R|R}R~4      bR]#! R€R�R‚Ry4      bRƒ]#! R„RkR…4      bR†]#! R‡RyRˆR‰4      bRŠ]#! R‹RŒR�RŽR�4      bR�]#! R‘R’R“R”RFR•4      bR–]#! R—R’RwR˜R™RšR›RœR�4	      bRž]#! RŸR R¡4      bR¢RR8RR£/bCR¤RR8RR¥/R¦RR!RR§/R¨RR!RR©//Ct$] ^ k / RªR:bR«R¬bR­R¬bR®R¬bR¯R¬bR°R¬bR±R¬bR²R:bR³R´bRµR´bR¶R¬bR·R¬bR¸R¬bR¹R¬bRºRbR»R¬bR¼R½bR¾R¬R¿R¬RÀR:RÁR¬RÂRRÃR¬RÄRRÅR¬RÆR¬RÇR:RÈR¬/Ct%] ^k ]&R83]'R!3](R!3])RÉ3]*RÊ33t+RË RÌ lt,ERRÍ RÎ llt-RÏ RÐ lt.].! 4       t/RÑ RÒ lt0RÓ RÔ lt1RÕ RÖ lt2R× RØ lt3RÙ RÚ lt4RÛ RÜ lt5ER	RÝ RÞ llt6ERRß Rà llt7Rá Râ lt8ER
t9] ^k 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ð lt@Rñ Rò ltARó Rô ltBRõ Rö ltCR÷ Rø ltDERRù Rú lltE]F! 4       tG] ^k Rû Rü ltHRý Rþ ltI]G3Rÿ ER  lltJR’]GR3ER ER lltKER ER ltLER ER ltMR# (  z¡Dashboard config schema and model-assignment logic: CONFIG_SCHEMA construction, dynamic provider options, web<->config normalisation, main/aux model assignment.
N)Úreplace)ÚHTTPException)ÚAnyÚDictÚListÚOptionalÚTupleÚTYPE_CHECKING)Úis_local_endpoint)ÚDEFAULT_CONFIGÚcfg_getÚ clear_model_endpoint_credentialsÚfind_provider_entryÚread_raw_config)Ú_normalize_memory_provider_name)ÚSTT_MODEL_CATALOG)Ú_PROVIDER_PREFERENCE)ÚModelSwitchResultzhermes_cli.web_serverc                ó:   € V ^8„  d   QhR\         \        ,          /# ©é   Úreturn©ÚlistÚstr)Úformats   "ÚA/home/ubuntu/.hermes/hermes-agent/hermes_cli/web_server_config.pyÚ__annotate__r       s   € ÷ (ñ (¤$¤s¥)ñ (ó    c                 óÎ   € R.p  ^ RI Hp V P                  V! 4       4       \        \        P                  V 4      4      #   \         d    \        P                  RRR7        LBi ; i)u–  Discovered memory providers for the ``memory.provider`` select.

Directory-scan only (no provider imports), so safe at module import time. ``""``
(built-in only) is always first; a discovery failure leaves only that.
The literal ``builtin`` alias is deliberately NOT offered â€” built-in memory is not a
provider plugin; ``_normalize_memory_provider_name`` maps legacy aliases back to ``""``.

See #49513.
Ú )Úlist_memory_provider_namesz memory provider discovery failedT©Úexc_info)	Úplugins.memoryr!   ÚextendÚ	ExceptionÚ_logÚdebugr   ÚdictÚfromkeys)Úoptionsr!   s     r   Ú_memory_provider_optionsr,       s^   € ð ˆd€GðFÝ=à�‰Ñ1Ó3Ô4ô ”—‘˜gÓ&Ó'Ð'øô ô FÜ�
‰
Ð5Àˆ
ÖEðFús   …? ¿"A$Á#A$c                ó:   € V ^8„  d   QhR\         \        ,          /# r   r   )r   s   "r   r   r   4   s   € ÷ ñ œ4¤�9ñ r   c                 ó|   €  ^ RI p \        V P                  4       4      ;'       g    R.#   \         d    R.u # i ; i)z?Return sorted IANA timezone identifiers, cached at import time.NÚUTC)ÚzoneinfoÚsortedÚavailable_timezonesr&   )r0   s    r   Ú_timezone_optionsr3   4   s>   € ðÛÜ�h×2Ñ2Ó4Ó5×@Ð@¸%¸Ð@øÜô ØˆwŠðús   ‚#* ¦* ª;º;c          
      ój   € V ^8„  d   QhR\         R\         R\        R\        \         \        3,          /# )r   Údescriptionr+   Úextrar   )r   r   r)   )r   s   "r   r   r   =   s6   € ÷ ]ñ ]œð ]¬ð ]´cð ]¼dÄ3ÌÀ8½nñ ]r   c                 ó(   € R RRV R\        V4      /VC# )ÚtypeÚselectr5   r+   )r   )r5   r+   r6   s   &*,r   Ú_selectr:   =   s   € Ø�H˜m¨[¸)ÄTÈ'Ã]Ð\ÐV[Ð\Ð\r   ÚtimezonezFIANA timezone (e.g. America/New_York). Blank uses the system timezone.Ú
searchableTÚ	clearableúmemory.providerzMemory provider pluginÚmodelr8   Ústringr5   z0Default model (e.g. anthropic/claude-sonnet-4.6)ÚcategoryÚgeneralÚmodel_context_lengthÚnumberz=Context window override (0 = auto-detect from model metadata)úterminal.backendzTerminal execution backendÚlocalÚdockerÚsshÚmodalÚdaytonaÚvercel_sandboxzterminal.vercel_imagezhVercel Sandbox image: a Vercel managed image (vercel/sandbox/universal:latest) or a VCR repository[:tag]zterminal.vercel_runtimezrLegacy Vercel Sandbox runtime (deprecated by Vercel; a pinned runtime overrides the image; clear to use the image)Únode24Únode22z
python3.13)r=   zterminal.modal_modezModal sandbox modeÚsandboxÚfunctionzproxy.enabledÚbooleanz†Docker-only egress credential firewall. Requires `hermes egress setup` and `hermes egress start`; Modal/SSH/Daytona are not wired yet.Úsecurityzproxy.credential_sourcez:Where iron-proxy loads real upstream secrets at start timeÚenvÚ	bitwarden)rA   zproxy.enforce_on_dockerzIRefuse Docker sandboxes when egress is enabled but not configured/runningzauth.adopt_external_loginsz¦Borrow and refresh the Codex CLI / Claude Code logins when Hermes has no usable login of its own. Off: Hermes uses only its own logins (`hermes auth add <provider>`).zwake_word.providerz_Wake engine. Auto selects a platform-supported engine; Porcupine requires PORCUPINE_ACCESS_KEY.Úautoztts.providerzText-to-speech providerÚedgeÚ
elevenlabsÚopenaiÚxaiÚminimaxÚmistralÚgeminiÚneuttsÚ	kittenttsÚpiperzstt.providerzSpeech-to-text providerÚgroqÚ	deepinfrazstt.local.modelzLocal faster-whisper model sizezstt.groq.modelzGroq Whisper modelzstt.openai.modelzOpenAI transcription modelzstt.openai.streaming_modelz/OpenAI live transcription model (stt.streaming)zgpt-live-transcribezgpt-transcribezgpt-4o-transcribezgpt-4o-mini-transcribezstt.mistral.modelz#Mistral Voxtral transcription modelzstt.xai.modelzxAI transcription modelzstt.elevenlabs.model_idzElevenLabs Scribe modelzdisplay.skinzCLI visual themeÚdefaultÚaresÚmonoÚslatezdashboard.themezWeb dashboard visual themeÚmidnightÚemberÚ	cyberpunkÚrosezdisplay.resume_displayz$How resumed sessions display historyÚminimalÚfullÚoffzdisplay.busy_input_modez%Input behavior while agent is runningÚ	interruptÚqueueÚsteerzapprovals.modezDangerous command approval modeÚmanualÚsmartzcontext.enginezContext management engineÚcustomzhuman_delay.modezSimulated typing delay modeÚtypingÚfixedzlogging.levelzLog level for agent.logÚDEBUGÚINFOÚWARNINGÚERRORzagent.service_tierzUFast mode: fast = always, auto = first N seconds of each turn, cold = first turn onlyr    ÚnormalÚfastÚcoldzdelegation.reasoning_effortz(Reasoning effort for delegated subagentsÚlowÚmediumÚhighÚxhighÚmaxÚultraz%updates.non_interactive_local_changeszþWhen the chat app / gateway updates Hermes (no terminal prompt), what to do with uncommitted local source edits. 'stash' keeps them and re-applies them after the update; 'discard' throws them away. Terminal updates always ask, regardless of this setting.ÚstashÚdiscardzupdates.refresh_cua_driverz‹Refresh an already-installed cua-driver during hermes update. Disable this on non-admin macOS accounts where /Applications is not writable.zbrowser.headedz¡Run the local browser in headed mode (visible window). Also keeps the window open between turns; idle sessions are still reaped after browser.inactivity_timeout.zplugins.hook_callback_timeouta#  Wall-clock cap (seconds) for timeout-bounded in-process Python plugin hook callbacks (hot-path observers + pre_tool_call). Timed-out pre_tool_call fails closed. 0 disables the cap; values above 600 are clamped. Caller-thread hooks such as subagent_stop are never moved onto a timeout worker.zplugins.load_timeout_secondszØDeadline (seconds) for one plugin's import + register() at load. A plugin that overruns it is skipped with the reason 'load timed out' and the rest keep loading. 0 disables the deadline; values above 600 are clamped.ÚprivacyÚcontextÚagentÚskillsÚcronÚnetworkÚ
models_devÚcheckpointsÚ	approvalsÚhuman_delayÚdisplayÚ	dashboardÚcode_executionÚprompt_cachingÚbot_modeÚgoalsÚupdatesÚ
onboardingÚtelegramÚdiscordÚmcpÚcomputer_useÚ	telemetryÚpluginsÚdoctorÚruntimeÚsessionÚnousÚconnectionsÚauthÚfallbackr   Úobjectc                ó0   € V ^8„  d   QhR\         R\        /# ©r   Úvaluer   )r   r   )r   s   "r   r   r   ë   s   € ÷ Qñ Q”sð Qœsñ Qr   c                ó8   a € \        V 3R l\         4       R4      # )z*Infer a UI field type from a Python value.c              3   óT   <"  € T F  w  r\        SV4      '       g   K  Vx € K  	  R # 5i©N)Ú
isinstance)Ú.0ÚpyÚuir¥   s   &  €r   Ú	<genexpr>Ú_infer_type.<locals>.<genexpr>í   s   øé € ÐE¡)™˜¬z¸%À×/D—’£)ùs   ƒ(ž
(r@   )ÚnextÚ	_UI_TYPES)r¥   s   fr   Ú_infer_typer±   ë   s   ø€ äÔE¥)ÓEÀxÓPÐPr   c          
      ó¢   € V ^8„  d   QhR\         \        \        3,          R\        R\         \        \         \        \        3,          3,          /# )r   ÚconfigÚprefixr   ©r)   r   r   )r   s   "r   r   r   ð   sA   € ÷ ñ ¤d¬3´¨8¥nð ¼cð Ì4ÔPSÔUYÔZ]Ô_bÐZbÕUcÐPcÕKdñ r   c           	     ó6  € / pV P                  4        EF  w  r4V'       d   V RV 2MTpVR8X  d   K   \        V\        4      '       d   VP                  \	        WE4      4       KR  R\        V4      RVP                  RR4      P                  RR4      P                  4       RV'       d   VP                  R4      ^ ,          MR	/pVP                  \        P                  V/ 4      4       \        P                  VR,          VR,          4      VR&   WbV&   EK  	  V# )
uF   Walk DEFAULT_CONFIG and produce a flat dot-path â†’ field schema dict.Ú.Ú_config_versionr8   r5   u    â†’ Ú_Ú rA   rB   )Úitemsr©   r)   ÚupdateÚ_build_schema_from_configr±   r   ÚtitleÚsplitÚ_SCHEMA_OVERRIDESÚgetÚ_CATEGORY_MERGE)r³   r´   ÚschemaÚkeyr¥   Úfull_keyÚentrys   &&     r   r½   r½   ð   sù   € à(*€FØ—l‘l—n‰
ˆß(.�f�X˜Q˜s˜eÑ$°CˆØÐ(Ô(ÙÜ�eœT×"Ò"Ø�M‰MÔ3°EÓDÔEÙð ”K Ó&Ø˜8×+Ñ+¨C°Ó9×AÑAÀ#ÀsÓK×QÑQÓSØ·˜Ÿ™ SÓ)¨!Ö,¸Ið!
ˆð
 	�‰Ô&×*Ñ*¨8°RÓ8Ô9Ü+×/Ñ/°°jÕ0AÀ5ÈÕCTÓUˆˆjÑØ ˆxÔñ %ð  €Mr   c                óh   € V ^8„  d   QhR\         \        \         \        \        3,          3,          /# r   rµ   )r   s   "r   r   r     s%   € ÷ ñ ¬D´´d¼3Ä¸8µnÐ1DÕ,Eñ r   c                 ó�   € / p \        \        4      P                  4        F"  w  rW V&   VR8X  g   K  \        R,          V R&   K$  	  V # )z�DEFAULT_CONFIG schema plus the virtual ``model_context_length`` field, inserted right
after ``model`` so it renders adjacent in the frontend.r?   rC   )r½   r   r»   rÀ   )ÚorderedrÄ   rÆ   s      r   Ú"_config_schema_with_virtual_fieldsrÊ     sJ   € ð *,€GÜ/´Ó?×EÑEÖG‰
ˆØ�‰Ø�'Ž>Ü.?Ð@VÕ.WˆGÐ*Ó+ñ Hð €Nr   c                ó0   € V ^8„  d   QhR\         R\        /# r¤   ©r   Úbool)r   s   "r   r   r     s   € ÷ >ñ >¤cð >¬dñ >r   c                óX  € \        V \        4      '       g   R# \        V P                  R4      ;'       g    R4      P	                  4       P                  4       pV'       d
   VR8w  d   R# V P                  R4      p\        V\        4      ;'       d    \        VP	                  4       4      # )aˆ  True when *value* declares a command-type voice provider.

Mirrors the runtime discriminators (``tools.tts_command_provider._is_command_provider_config`` /
``tools.transcription_command._is_command_stt_provider_config``) and the desktop's
``isCommandProvider``: ``type`` is OPTIONAL and case/space-insensitive (absent or
normalizing to ``"command"``); ``command`` MUST be a non-empty string.
Fr8   r    Úcommand)r©   r)   r   rÁ   ÚstripÚlowerrÍ   )r¥   ÚptyperÏ   s   &  r   Ú_is_command_provider_blockrÓ     s|   € ô �eœT×"Ò"ÙÜ�—	‘	˜&Ó!×'Ð' RÓ(×.Ñ.Ó0×6Ñ6Ó8€Eß�˜)Ô#ÙØ�i‰i˜	Ó"€GÜ�gœsÓ#×=Ð=¬¨W¯]©]«_Ó(=Ð=r   c          	      ó–   € V ^8„  d   QhR\         R\        \         ,          R\        \         \        3,          R\        \         ,          /# )r   ÚkindÚbuiltin_namesÚcfgr   )r   r   r)   r   )r   s   "r   r   r   %  s<   € ÷ 5ñ 5¤3ð 5´t¼Cµyð 5ÄtÌCÔQTÈHÅ~ð 5ÔZ^Ô_bÕZcñ 5r   c                ó¾  aa€ V Uu. uF  p\        V4      NK  	  upoS Uu0 uF   q3P                  4       P                  4       kK"  	  upoV R8X  d   ^ RIHp M^ RIHp R VV3R llpVP                  V 4      p\        V\        4      '       g   / pVP                  R4      p\        V\        4      '       d   V.M. pTP                  VP                  4        U	U
u/ uF  w  ršV	R8w  g   K  WšbK  	  up
p	4       V Ft  pVP                  4        F]  w  rÍ\        V\         4      '       g   K  VP                  4       P                  4       V9  g   KB  \        V4      '       g   KU  V! V4       K_  	  Kv  	   V R8X  d   ^ RIHp M^ RIHp V! 4        F  pV! \!        VRR	4      4       K  	  V! \%        W R
4      4       S# u upi u upi u up
p	i   \"         d     L1i ; i)uB  Merged ``tts``/``stt`` provider options without hard-coding vendor names.

Built-in display names first (original order), then, deduped case-insensitively:
1. Command-type providers from canonical ``<kind>.providers.<name>`` and the legacy
   top-level ``<kind>.<name>`` â€” the runtime's dual resolution order. Names colliding
   with a RUNTIME built-in are excluded (the runtime rejects them before config lookup);
   the runtime sets are used rather than the display shortlist, which drifts.
2. Plugin-registered names from the tts/transcription registries â€” opportunistic: this
   process may never call ``discover_plugins()``, so the registry may be empty.
3. The current ``<kind>.provider`` value, so a custom active name stays selectable.
Guard semantics mirror the desktop's ``commandProviderNames`` so both surfaces agree.
Útts)ÚBUILTIN_TTS_PROVIDERS)ÚBUILTIN_STT_PROVIDERSc                ó(   € V ^8„  d   QhR\         RR/# )r   Únamer   N)r   )r   s   "r   r   Ú._custom_provider_options.<locals>.__annotate__9  s   € ÷ 'ñ '”3ð '˜4ñ 'r   c                 óú   <€ \        V \        4      '       d   V P                  4       MR pV'       dJ   VP                  4       S9  d3   SP	                  V4       SP                  VP                  4       4       R# R# R# )r    N)r©   r   rÐ   rÑ   ÚappendÚadd)rÝ   ÚstrippedÚnamesÚseens   & €€r   Ú_addÚ&_custom_provider_options.<locals>._add9  sS   ø€ Ü#-¨d´C×#8Ò#8�4—:‘:”<¸bˆß˜Ÿ™Ó(°Ô4Ø�L‰L˜Ô"Ø�H‰H�X—^‘^Ó%Ö&ñ 5‰8r   Ú	providers)Úlist_providersrÝ   NÚprovider)r   rÐ   rÑ   Útools.tts_toolrÚ   Útools.transcription_commonrÛ   rÁ   r©   r)   rà   r»   rÓ   Úagent.tts_registryrè   Úagent.transcription_registryÚgetattrr&   r   )rÕ   rÖ   r×   ÚnÚ_runtime_builtinsrå   ÚsectionÚproviders_mapÚcandidate_blocksÚkÚvÚblockrÝ   r¥   Ú_list_voice_providersÚ_prã   rä   s   &&&             @@r   Ú_custom_provider_optionsrù   %  s…  ù€ ñ +Ó+™]˜ŒS�ŽV™]Ñ+€EÙ',Ó-¡u !�G‰G‹I�O‰OÖ¡uÑ-€DØˆu„}ÞMåY÷'ñ 'ð �g‰g�d‹m€GÜ�gœt×$Ò$ØˆØ—K‘K Ó,€MÜ5?ÀÌt×5TÒ5T =¡/ÐZ\ÐØ×Ñ¨g¯m©m¬oÔR©o¡d aÀÀkÑAQœT˜QšT©oÒRÔSÛ!ˆØ Ÿ;™;ž=‰KˆDä˜4¤×%Ô%Ø—J‘J“L×&Ñ&Ó(Ð0AÖAÜ.¨u×5Ô5á�T–
ó )ñ "ðØ�5Œ=ÞRå\Ù'Ö)ˆBÙ”˜˜V TÓ*Ö+ñ *ñ 	Œ�˜JÓ	'Ô(Ø€LùòQ ,ùÚ-ùó" Søô" ô Ùðús(   ‡F>¢&GÃG
Ã,G
Å55G ÇGÇGc                óh   € V ^8„  d   QhR\         \        \        3,          R\        \        ,          /# ©r   r×   r   )r)   r   r   r   )r   s   "r   r   r   ]  s&   € ÷ ñ ¬¬c´3¨h­ð ¼DÄ½Iñ r   c                óÈ   € \        4       pV P                  R4      p\        \        V\        4      '       d   VP                  R4      MR4      pV'       d   W19  d   . VOVNpV# )zªDiscovered memory providers plus the currently-configured one, so a value that is no
longer discoverable (e.g. plugin removed from disk) never vanishes from the dropdown.Úmemoryré   N)r,   rÁ   r   r©   r)   )r×   r+   rý   Úcurrents   &   r   Ú_memory_provider_schema_optionsrÿ   ]  sZ   € ô 'Ó(€GØ�W‰W�XÓ€FÜ-Ì
ÐSYÔ[_×H`ÒH`¨f¯j©j¸Ô.DÐfjÓk€Gß�7Ô)Ø%�GÐ%˜WÐ%ˆØ€Nr   c                ó\   € V ^8„  d   QhR\         R\        \        \         ,          ,          /# )r   rÄ   r   )r   r   r   )r   s   "r   r   r   h  s#   € ÷ :ñ :¤ð :¬´´cµÕ(;ñ :r   c                 ó²   € \         P                  V 4      p\        V\        4      '       d   VP                  R 4      MRp\        V\        4      '       d   V# R# )r+   N)ÚCONFIG_SCHEMArÁ   r©   r)   r   )rÄ   rÆ   r+   s   &  r   Ú_schema_select_optionsr  h  sE   € Ü×Ñ˜cÓ"€EÜ&0°¼×&=Ò&=ˆe�i‰i˜	Ô"À4€GÜ  ¬$×/Ò/ˆ7Ð9°TÐ9r   c                óh   € V ^8„  d   QhR\         \        \         \        \        3,          3,          /# r   rµ   )r   s   "r   r   r   n  s(   € ÷ &Fñ &F¬t´C¼¼cÄ3¸h½Ð4GÕ/Hñ &Fr   c            
     ó$  a	€ ^ RI Hp  ^ RIHp  V! 4       p/ o	R T	3R llpR	 F7  p\        T R24      pTf   K  T! T R2\        T\        T4      T4      4       K9  	  T! R\        T4      4       \        R4      pTeM    \        T ! 4        Uu0 uF  qwR,          kK  	  up\        T4      ,
          4      pT'       d   T! R. TOTO4       S	'       d   / \
        CS	C# \
        #   \         d
    \
        u # i ; iu upi   \         d    . p LXi ; i)
aÉ  CONFIG_SCHEMA with per-request discovery-driven ``*.provider`` options merged.

``_SCHEMA_OVERRIDES`` freezes option lists at import time, so a provider installed after
the server started never appears. Recomputing at request time reflects the CURRENT
(possibly profile-scoped) config.yaml and mid-session plugin installs for every surface
that reads the schema. ``CONFIG_SCHEMA`` is never mutated; changed entries are
shallow-copied onto a copied mapping.
)Ú_plugin_terminal_backend_rows©Úload_configc                óJ   € V ^8„  d   QhR\         R\        \         ,          RR/# )r   rÄ   r+   r   N)r   r   )r   s   "r   r   Ú;_schema_with_dynamic_provider_options.<locals>.__annotate__€  s*   € ÷ Fñ F”3ð F¤¤c¥ð F¨tñ Fr   c                 óˆ   <€ \        V 4      e4   V\        V ,          R,          8w  d   / \        V ,          CRV/CSV &   R # R # R # )Nr+   )r  r  )rÄ   r+   Úoverlays   &&€r   ÚmergeÚ4_schema_with_dynamic_provider_options.<locals>.merge€  sD   ø€ Ü! #Ó&Ò2°wÄ-ÐPSÕBTÐU^ÕB_Ô7_ØEœm¨CÕ0ÐE°)¸WÑEˆG�C‹Lñ 8`Ñ2r   z	.providerr>   rE   rÝ   )rÙ   Ústt)Úhermes_cli.web_server_profilesr  Úhermes_cli.configr  r&   r  r  rù   r   rÿ   r1   Úset)
r  r  r×   r  rÕ   ÚexistingÚ
tb_optionsÚrowÚplugin_namesr  s
            @r   Ú%_schema_with_dynamic_provider_optionsr  n  s)  ø€ õ MÝ-ðÙ‹mˆð *,€G÷Fð Fó ˆÜ)¨T¨F°)Ð*<Ó=ˆØÔÙ�T�F˜)Ð$Ô&>¸tÄTÈ(Ã^ÐUXÓ&YÖZñ ñ
 
Ð
Ô<¸SÓAÔBä'Ð(:Ó;€JØÒð	Ü!Ñ:WÔ:YÓ"ZÑ:Y°3 v§; ;Ñ:YÑ"ZÔ]`ÐakÓ]lÕ"lÓmˆL÷ ÙÐ$Ð&B¨
Ð&B°\Ð&BÔCç+2Ð'ŒmÐ'˜wÐ'ÐE¼ÐEøô3 ô ÜÒðüò& #[øÜô 	ØŠLð	ús5   �C# Â C? ÂC:ÂC? Ã#C7Ã6C7Ã:C? Ã?DÄDc                ó^   € V ^8„  d   QhR\         R\         R\        \         \         3,          /# )r   ré   r?   r   ©r   Útuple)r   s   "r   r   r   —  s.   € ÷ Dñ D¬sð D¼3ð DÄ5ÌÌcÈÅ?ñ Dr   c                ór  € ^ RI Hp ^ RI Hp ^ RIHpHpHp ^ RIHp ^ RI	H
pHp	 T ;'       g    RP                  4       p
T;'       g    RP                  4       pV! V
4      p V! 4       p\        V\        4      '       g   / pVP!                  R4      pT	! T
\        V\        4      '       d   TM/ 4      ;'       g    V! W£! V4      4      pVe   VP"                  V3# VR8H  ;'       g    VP%                  R	4      pWÅ9  d³   V'       g«   R
V9   d¤    VP!                  R/ 4      p\        V\        4      '       dB   \'        VP!                  RR4      ;'       g    R4      P                  4       P)                  4       MRpV'       d   V! V4      V9   d   V! V4      pTp
M^ RIHp V! R4      '       d   R;rÊWÅ9   d.   VP%                  R4      '       g    V! W¼4      ;'       g    TpW«3# W«3#   \         d    / p ELŽi ; i  \         d    Rp L�i ; i  \         d    \.        P1                  RY«RR7        Y«3# i ; i)u›  Normalize a main-slot (provider, model) pair before persisting.

The per-card "Use as â†’ Main model" menu can send the model's VENDOR prefix as the
provider (analytics rows with no ``billing_provider``), producing e.g.
``provider: anthropic`` + ``default: anthropic/claude-opus-4.6`` â€” an aggregator slug on
the native provider, which 400s. Two repairs at this single chokepoint:

1. Vendor-name â†’ Hermes-provider: when the provider is not a known provider/alias but the
   model is a vendor-prefixed slug, keep the user's CURRENT aggregator if on one, else
   openrouter. User-declared ``providers:``/``custom_providers:`` entries resolve first,
   and durable named-custom slugs (``custom`` / ``custom:<name>``) are excluded â€”
   ``_KNOWN_PROVIDER_NAMES`` lists only the bare ``custom`` bucket, so without this a
   LiteLLM proxy serving ``ollama/glm-5.2`` would be silently reassigned to openrouter.
   Matching only that syntax (not ``startswith("custom")``) avoids swallowing
   unconfigured vendors like ``customproxy``.
2. Model-format normalization for the resolved provider via
   ``normalize_model_for_provider`` (custom/user providers keep the model verbatim).
r  ©Úget_compatible_custom_providers)Ú_AGGREGATOR_PROVIDERSÚ_KNOWN_PROVIDER_NAMESÚnormalize_provider)Únormalize_model_for_provider)Úresolve_custom_providerÚresolve_user_providerr    rç   rq   zcustom:Ú/r?   ré   ©Úprovider_has_credentialsÚ
openrouterz$model normalization failed for %s/%sTr"   )r  r  r  Úhermes_cli.modelsr  r  r   Úhermes_cli.model_normalizer!  Úhermes_cli.providersr"  r#  rÐ   r&   r©   r)   rÁ   ÚidÚ
startswithr   rÑ   Úhermes_cli.models_detectr&  r'   r(   )ré   r?   r  r  r  r  r   r!  r"  r#  Úprov_inÚmodel_inÚ	canonicalr×   Úuser_providersÚdeclaredÚis_custom_provider_slugÚcur_cfgÚcur_providerr&  s   &&                  r   Ú _normalize_main_model_assignmentr6  —  s'  € õ& .ÝAßbÑbÝGßSà�~ˆ~˜2×$Ñ$Ó&€GØ—�˜×"Ñ"Ó$€HÙ" 7Ó+€IðÙ‹mˆô �cœ4× Ò ØˆØ—W‘W˜[Ó)€NÙ$Ø¤:¨n¼d×#CÒ#C‘Èó÷ Pð Pá	  Ð*IÈ#Ó*NÓ	Oð ð ÒØ�{‰{˜HÐ$Ð$à'¨8Ñ3×VÐV°y×7KÑ7KÈIÓ7VÐØÔ-×6MÐRUÐYaÔRað	Ø—g‘g˜g rÓ*ˆGäJTÐU\Ô^b×JcÒJc”�G—K‘K 
¨BÓ/×5Ð5°2Ó6×<Ñ<Ó>×DÑDÔFÐikð ÷
 Ñ.¨|Ó<Ð@UÔUÙ*¨<Ó8ˆIØ"‰GåIñ (¨×5Ò5Ø&2Ð2�	àÔ)°)×2FÑ2FÀx×2PÒ2Pð	aÙ3°HÓH×TÐTÈHˆHð ÐÐˆ7ÐÐøôK ô Ø‹ðûô$ ô 	ØŠLð	ûô  ô 	aÜ�J‰JÐ=¸wÐ[_ˆJÕ`àÐÐð	aúsC   Á"G' ÄAG; Å%G; ÇH ÇH Ç'G8Ç7G8Ç;HÈ
HÈ#H6È5H6c                óX   € V ^8„  d   QhR\         R\        R\        R\        R\        RR/# )r   r×   ré   r?   Úbase_urlÚapi_keyr   r   ©r)   r   )r   s   "r   r   r   Þ  s<   € ÷  ñ  Ü	ð Üð Ü%(ð Ü47ð ÜGJð àñ r   c                óf  € ^ RI Hp ^ RIHp \	        V P                  R4      \        4      '       d   V P                  R4      M/ pVP                  4       P                  4       R9   pT! Y!R\        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      V'       d   TM#\        VP                  R4      ;'       g    R4      V'       d   TMR\	        V P                  R	4      \        4      '       d   V P                  R	4      M/ V! V 4      R
7	      p	V	P                  '       g"   \        RV	P                  ;'       g    RR7      hV'       dK   VP                  4       '       d5   ^ RIHp
 VP                  4       p\        W›V
! V	P                   V4      R7      p	V	# )ab  Route a dashboard main-slot pick through ``switch_model`` (catalog/alias/credential
validation) seeded with the configured route, exactly like a ``/model <model> --provider
<provider> --global``. A bare ``custom`` target carries the submitted endpoint as the current
one, which is how ``switch_model`` binds a custom base_url/key. Rejections become 400s.r  )Úswitch_modelr?   Tré   r    ra   r8  rç   )	Ú	raw_inputÚexplicit_providerÚ	is_globalÚcurrent_providerÚcurrent_modelÚcurrent_base_urlÚcurrent_api_keyr1  Úcustom_providersé�  zmodel switch rejected©Ústatus_codeÚdetail)Údetermine_api_mode)r8  Úapi_mode>   rF   rq   )r  r  Úhermes_cli.model_switchr<  r©   rÁ   r)   rÐ   rÑ   r   Úsuccessr   Úerror_messager*  rI  r   Útarget_provider)r×   ré   r?   r8  r9  r  r<  Ú	model_cfgÚis_bare_customÚresultrI  Úurls   &&&&&       r   Ú_validated_main_model_selectionrS  Þ  sK  € õ BÝ4ä$.¨s¯w©w°wÓ/?Ä×$FÒ$F�—‘˜Ô ÈB€IØ—^‘^Ó%×+Ñ+Ó-Ð1DÑD€NÙØ¸tÜ˜YŸ]™]¨:Ó6×<Ð<¸"Ó=ÌSÐQZ×Q^ÑQ^Ð_hÓQi×QoÐQoÐmoÓMpß%3™¼¸Y¿]¹]È:Ó=V×=\Ð=\ÐZ\Ó9]ß#1™°rÜ/9¸#¿'¹'À+Ó:NÔPT×/UÒ/U�s—w‘w˜{Ô+Ð[]Ù8¸Ó=ô?€Fð �>�>ˆ>Ü¨°F×4HÑ4H×4cÐ4cÐLcÔdÐdß˜(Ÿ.™.×*Ò*õ 	<Ø�n‰nÓˆÜ˜Ù"4°V×5KÑ5KÈSÓ"QôSˆà€Mr   c                ó@   € V ^8„  d   QhR\         RRR\        R\        /# )r   rO  rQ  r   r9  r   )r   r   r)   )r   s   "r   r   r     s+   € ÷ ñ ¬Cð Ð9Lð ÔWZð Ôdhñ r   c                ó˜   € ^ RI Hp V! W4      p VP                  4       '       d&   VP                  4       V R&   V P                  RR4       V # )aQ  Apply a main-slot selection to a ``model`` config dict via the canonical /model shape
(``hermes_cli.model_switch.apply_model_selection``). An explicit key for a custom endpoint is
the one inline credential the runtime reads (``model.api_key``); the legacy ``api`` alias is
dropped so a stale secret cannot shadow it.

Returns a new dict.)Úapply_model_selectionr9  ÚapiN)rK  rV  rÐ   Úpop)rO  rQ  r9  rV  s   &&& r   Ú_apply_main_model_assignmentrY    s@   € õ >á% iÓ8€IØ‡}�}‡‚Ø&Ÿ}™}›ˆ	�)ÑØ�‰�e˜TÔ"ØÐr   c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# ©r   r³   r   rµ   )r   s   "r   r   r     s*   € ÷ ñ ¤d¬3´¨8¥nð ¼¼cÄ3¸h½ñ r   c                ó   € \        V 4      p V P                  R4      p\        V\         4      '       dW   VP                  R^ 4      pVP                  RVP                  RR4      4      V R&   \        V\        4      '       d   TM^ V R&   V # ^ V R&   V # )zÃFlatten a dict-form ``model`` to its string form (the schema is built from
DEFAULT_CONFIG where ``model`` is a string) and surface ``model_context_length``
as a top-level field (0 = auto-detect).r?   Úcontext_lengthra   rÝ   r    rC   )r)   rÁ   r©   Úint)r³   Ú	model_valÚctx_lens   &  r   Ú_normalize_config_for_webra    s‹   € ô �&‹\€FØ—
‘
˜7Ó#€IÜ�)œT×"Ò"Ø—-‘-Ð 0°!Ó4ˆØ#Ÿ-™-¨	°9·=±=ÀÈÓ3LÓMˆˆw‰Ü4>¸wÌ×4LÒ4L©ÐRSˆÐ%Ñ&ð €Mð *+ˆÐ%Ñ&Ø€Mr   c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# r   )r   r)   r   r   )r   s   "r   r   r   -  s    € ÷ ñ œ4¤¤S¬# X¥Õ/ñ r   c                 ó  €  ^ RI Hp  V ! 4        Uu. uF;  pVP                  R4      '       g   K  VR,          \        9  g   K0  \	        V4      NK=  	  up# u upi   \
         d    \        P                  RRR7       . u # i ; i)aÌ  Auxiliary tasks registered by plugins (``PluginContext.register_auxiliary_task``) for the
Hermes home active in this context.

Callers run inside ``_profile_scope`` / ``_config_profile_scope``, and ``get_plugin_manager()``
keys its manager on the same context-local home, so a request for profile B enumerates
B's plugins even though this process was started for profile A. Discovery failure is
fail-soft: the built-in slots must keep working without plugins.
)Úget_plugin_auxiliary_tasksrÄ   z#plugin auxiliary task lookup failedTr"   )Úhermes_cli.pluginsrd  rÁ   Ú_AUX_TASK_SLOTSr)   r&   r'   r(   )rd  rÆ   s     r   Ú_plugin_aux_tasksrg  -  s~   € ðÝAÙ)CÔ)Eó MÑ)E Ø—9‘9˜U×#ô Ø(-¨e­¼OÑ(Kô ”�U–Ñ)Eñ Mð 	Mùò Møäô Ü�
‰
Ð8À4ˆ
ÔHØŠ	ðús-   ‚A ‘A¯AÁAÁA ÁA Á$BÂ Bc                ó>   € V ^8„  d   QhR\         \        R3,          /# )r   r   .)r  r   )r   s   "r   r   r   ?  s   € ÷ Rñ Rœœs C˜x�ñ Rr   c                 óœ   € \         \        ;QJ d"    . R \        4        4       F  NK  	  5,           # ! R \        4        4       4      ,           # )a  Every auxiliary slot the dashboard may read or assign: built-ins first (UI order), then
plugin-registered keys. The picker in ``hermes model`` (``main_provider_setup._all_aux_tasks``)
folds plugin tasks in the same way; the dashboard must not disagree with it.c              3   ó2   "  € T F  qR ,          x € K  	  R# 5i)rÄ   N© )rª   rÆ   s   & r   r­   Ú"_aux_task_slots.<locals>.<genexpr>C  s   é € Ð"QÑ=P°E¨§<¢<Ó=Pùs   ‚)rf  r  rg  rk  r   r   Ú_aux_task_slotsrm  ?  s6   € ô ŸUœUÑ"QÔ=NÔ=PÓ"QŸUÕQÐQ˜UÑ"QÔ=NÔ=PÓ"QÓQÕQÐQr   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   ©r   r   )r   s   "r   r   r   F  s   € ÷ ñ ¤H¬S¥Mñ r   c                 ó^   € ^ RI Hp  V ! 4       pV'       g   R# Vw  r#RV RV R\        4        2# )a“  Return a "restart required" message when this process runs stale code, else None.

Long-lived dashboard / Desktop-owned ``hermes serve`` processes freeze ``sys.modules``
at boot; after ``hermes update`` replaces the checkout, a first-time lazy import can
resolve a fresh consumer module against a stale cached dependency -> ImportError.
Mirrors the gateway's ``_model_switch_skew_guard``: refuse the risky call with an
actionable message. Never a false positive (non-git installs return None).

``/api/model/options`` 500 after the update added ``agent.model_metadata.is_grok_46_family`` while the
running process kept serving the pre-update module (#86207).
)Údetect_code_skewNz"This process is running code from z! but the checkout on disk is now u7   . The model picker would risk a stale-module crash â€” )Úgateway.code_skewrq  Ú_dashboard_skew_restart_hint)rq  ÚskewÚboot_revÚdisk_revs       r   Ú_dashboard_code_skew_guardrw  F  sF   € õ 3áÓ€DßÙØÑ€Hà
,¨X¨Jð 7Ø�jð !Ü1Ó3Ð4ð	6ðr   c                ó$   € V ^8„  d   QhR\         /# r   ©r   )r   s   "r   r   r   _  s   € ÷ ñ ¤cñ r   c                 óV   € \         P                  P                  R4      R8X  d    R#  R# )uâ   Restart advice matching how this process is owned â€” the same app backs the browser
dashboard and Desktop-owned ``hermes serve``; naming a systemd unit would mislead
macOS/launchd hosts and Desktop SSH backends.

See #97046.
ÚHERMES_SERVE_HEADLESSÚ1zzrestart the Desktop-owned backend to load the new code (use Restart backend in Hermes Desktop, or quit and reopen the app)z…restart this Hermes process to load the new code (hermes dashboard --port <port>, or the equivalent service restart for this install))ÚosÚenvironrÁ   rk  r   r   rs  rs  _  s0   € ô 
‡z�z‡~�~Ð-Ó.°#Ô5ðRñ	
ð
	_ñr   c                ó@   € V ^8„  d   QhR\         R\        R\        RR/# )r   rO  ré   Úprovider_entryr   Nrµ   )r   s   "r   r   r   q  s0   € ÷ |ñ |¬tð |¼sð |ÔTWð |Ð\`ñ |r   c                óŒ  €  \        \        4       P                  R4      V4      w  r4\	        V\
        4      '       g   / p\        VP                  R4      ;'       g    R4      P                  4       pV'       d   WPR&   V P                  RR4       R# \	        V\
        4      '       dŠ   VP                  R4      '       dq   \        VP                  R4      ;'       g    R4      P                  4       pVP                  R4      '       d   VP                  R4      '       d   TMVR,          V R&   R# R# R#   \         d    Rp ELi ; i)a«  Carry the provider's credential POINTER (``key_env`` / raw ``${VAR}``) onto ``model_cfg``.

``provider_entry`` comes from ``load_config()``, which expands ``${VAR}`` to plaintext;
copying that into ``model.api_key`` would write the SECRET into config.yaml (and recreate
it on every re-apply). Prefer the raw template; fall back to the expanded value only when
the raw yaml itself stores the key as a literal (no new exposure).
rç   NÚkey_envr    r9  z${Ú})r   r   rÁ   r&   r©   r)   r   rÐ   rX  r,  Úendswith)rO  ré   r€  Ú_storedÚ	raw_entryr‚  Úraw_keys   &&&    r   Ú_resolve_assignment_credentialsrˆ  q  s
  € ðÜ0´Ó1B×1FÑ1FÀ{Ó1SÐU]Ó^Ñˆô �i¤×&Ò&Øˆ	Ü�)—-‘- 	Ó*×0Ð0¨bÓ1×7Ñ7Ó9€GßØ&�)Ñà�‰�i Ö&Ü	�N¤D×	)Ò	)¨n×.@Ñ.@À×.KÒ.KÜ�i—m‘m IÓ.×4Ð4°"Ó5×;Ñ;Ó=ˆØ*1×*<Ñ*<¸T×*BÒ*BÀw×GWÑGWÐX[×G\ÒG\™wÐbpÐqzÕb{ˆ	�)Óñ /LÑ	)øô ô Ø‹	ðús   ‚%D2 Ä2EÅEc                ó0   € V ^8„  d   QhR\         R\        /# rû   )r)   r   )r   s   "r   r   r   ‰  s   € ÷ ñ ¤dð ¬tñ r   c                ó¬   €  ^ RI Hp ^ RIHp V! V RRR7      p\	        V! WRR7      4      #   \
         d    \        P                  RRR	7       . u # i ; i)
uÿ   Mirror the CLI's post-model-selection behaviour when switching main to Nous: route
*unconfigured* tools through the Nous Tool Gateway. Purely additive â€” tools with a direct
key or explicit backend are skipped. Failures never block saving the assignment.)Úapply_nous_managed_defaults)Ú_get_platform_toolsÚcliF)Úinclude_default_mcp_serversT)Úenabled_toolsetsÚforce_freshz#apply_nous_managed_defaults skippedr"   )Úhermes_cli.nous_subscriptionr‹  Úhermes_cli.tools_configrŒ  r1   r&   r'   r(   )r×   r‹  rŒ  Úenableds   &   r   Ú_apply_nous_gateway_defaultsr”  ‰  sT   € ðÝLÝ?á% c¨5ÈeÔTˆÜÑ1°#Ð]aÔbÓcÐcøÜô Ü�
‰
Ð8À4ˆ
ÔHØŠ	ðús   ‚), ¬$AÁAc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r×   r8  r   )r)   r   rÍ   )r   s   "r   r   r   ˜  s!   € ÷ ñ ¤4ð ´3ð ¼4ñ r   c                óè  a€ \        T;'       g    R4      P                  4       P                  R4      P                  4       oS'       g   R# R V3R llpV P	                  R4      p\        V\        4      '       d    V! VP	                  R4      4      '       d   R# R FÑ  pV P	                  V4      p\        V\        4      '       d   TM0\        V\        4      '       d   \        VP                  4       4      M. pV Fn  p\        V\        4      '       g   K  T! VP	                  R4      ;'       g+    VP	                  R	4      ;'       g    VP	                  R
4      4      '       g   Kl    R# 	  KÓ  	  R# )zùTrue when *base_url* is already an endpoint fact in *cfg*: the inline ``model.base_url``,
a ``providers.<slug>`` entry, or a ``custom_providers`` row. Comparison is trailing-slash
and case insensitive (``_save_custom_provider`` dedups the same way).r    r$  Fc                ó0   € V ^8„  d   QhR\         R\        /# r¤   rÌ   )r   s   "r   r   Ú/_endpoint_known_to_config.<locals>.__annotate__   s   € ÷ Fñ Fœð F¤ñ Fr   c                 óŠ   <€ \        T ;'       g    R 4      P                  4       P                  R4      P                  4       S8H  # )r    r$  )r   rÐ   ÚrstriprÑ   )r¥   Úwanteds   &€r   Ú_matchesÚ+_endpoint_known_to_config.<locals>._matches   s6   ø€ Ü�5—;�;˜BÓ×%Ñ%Ó'×.Ñ.¨sÓ3×9Ñ9Ó;¸vÑEÐEr   r?   r8  TrR  rW  )rç   rD  )	r   rÐ   rš  rÑ   rÁ   r©   r)   r   Úvalues)	r×   r8  rœ  rO  Úsection_keyrñ   ÚentriesrÆ   r›  s	   &&      @r   Ú_endpoint_known_to_configr¡  ˜  s  ø€ ô �—�˜RÓ ×&Ñ&Ó(×/Ñ/°Ó4×:Ñ:Ó<€FßÙ÷Fð Fð —‘˜Ó €IÜ�)œT×"Ò"¡x°	·±¸jÓ0I×'JÒ'JÙÛ8ˆØ—'‘'˜+Ó&ˆÜ",¨W´d×";Ò";‘wÜ&0°¼$×&?Ò&?ŒD�—‘Ó!Ô"ÀRð 	ãˆEÜ˜%¤×&Ô&©8°E·I±I¸jÓ4I×4qÐ4qÈUÏYÉYÐW\ÓM]×4qÐ4qÐaf×ajÑajÐkpÓaq×+rÔ+rÛó ñ	 9ñ r   c                ó@   € V ^8„  d   QhR\         R\         R\         RR/# )r   r8  r9  r?   r   Nry  )r   s   "r   r   r   °  s.   € ÷ Kñ K¬ð K´cð KÄ#ð KÈ$ñ Kr   c                óŠ   €  ^ RI HpHp V! WW#! V 4      R7       R#   \         d    \        P                  RRR7        R# i ; i)a�  Register a named ``custom_providers`` entry for a custom/local endpoint (mirrors the
``hermes model`` custom flow) so the picker gets a proper ready row instead of a "needs
setup" dead-end. Dedups by base_url; never blocks the already-persisted assignment.

SKIPPED when the endpoint is already a fact in the config (#76324): the CLI gateway setup
writes ``provider: custom`` with an inline ``base_url`` + ``api_mode``, and re-registering
that same endpoint as a named ``custom:<slug>`` row on every dashboard re-save is what let
the picker rewrite the CLI's shape into ``custom:<slug>`` + ``base_url: ''``. Only a
GENUINELY new endpoint gets a named row.
)Ú_auto_provider_nameÚ_save_custom_provider)rÝ   z%custom_providers registration skippedTr"   N)Úhermes_cli.main_provider_setupr¤  r¥  r&   r'   r(   )r8  r9  r?   r¤  r¥  s   &&&  r   Ú_register_custom_endpointr§  °  s@   € ðKß]á˜h°Ð=PÐQYÓ=Z×[øÜô KÜ�
‰
Ð:ÀTˆ
×JðKús   ‚ œ"AÁAc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r×   Únew_providerr   )r)   r   r   )r   s   "r   r   r   Ã  s!   € ÷ ñ œð ¬Sð ´Tñ r   c                óŒ  € . pV P                  R/ 4      p\        V\        4      '       g   V# \        4        EF  pVP                  V4      p\        V\        4      '       g   K-  \	        VP                  RR4      ;'       g    R4      P                  4       pV'       g   Kj  VP                  4       R9  g   K�  VP                  4       V8w  g   K˜  \        \	        VP                  RR4      ;'       g    R4      4      '       d   KÎ  TP                  RTRTR\	        VP                  RR4      ;'       g    R4      /4       EK  	  V# )uk  Aux slots still pinned to a *different* provider than the new main one.

Switching main never touches aux pins (independent, sticky per-task overrides) â€” a user
leaving a now-unpaid provider keeps paying 402s on background calls until they reset
them. We never auto-clear (pinning aux is legitimate) but report them so the UI can
offer a "reset to main" nudge.
Ú	auxiliaryré   r    r8  Útaskr?   >   r    rT   Úmain)	rÁ   r©   r)   rm  r   rÐ   rÑ   r
   rà   )r×   r©  Ú	stale_auxÚaux_cfgÚslotÚslot_cfgÚslot_providers   &&     r   Ú_stale_aux_pinsr³  Ã  s  € ð €IØ�g‰g�k 2Ó&€GÜ�gœt×$Ò$ØÐÜ×!ˆØ—;‘;˜tÓ$ˆÜ˜(¤D×)Ò)ÙÜ˜HŸL™L¨°RÓ8×>Ð>¸BÓ?×EÑEÓGˆ÷ ‰=˜]×0Ñ0Ó2Ð:NÖNÐS`×SfÑSfÓShÐlxÖSxô !¤ X§\¡\°*¸bÓ%A×%GÐ%GÀRÓ!H×IÒIÙØ×ÑØ˜˜j¨-¸Ä#ÀhÇlÁlÐSZÐ\^ÓF_×FeÐFeÐceÓBfð÷ ñ "ð Ðr   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r×   ré   r   rµ   )r   s   "r   r   r   á  s&   € ÷ Tñ Tœð T¬ð T´ñ Tr   c                 óv   € V P                  R 4      p\        V\        4      '       d   VP                  V4      # R# )rç   N©rÁ   r©   r)   )r×   ré   Úproviders_cfgs   && r   Ú_provider_entryr¸  á  s2   € Ø—G‘G˜KÓ(€MÜ*4°]ÄD×*IÒ*Iˆ=×Ñ˜XÓ&ÐSÈtÐSr   c                óX   € V ^8„  d   QhR\         R\        R\        R\        R\        RR/# )r   r×   ré   r?   r8  r9  r   ztuple[str, ModelSwitchResult]r:  )r   s   "r   r   r   æ  sD   € ÷ 
^ñ 
^¤$ð 
^´#ð 
^¼cð 
^ÌSð 
^Ô[^ð 
^ð  dCñ 
^r   c                óX  € V'       d	   V'       g   \        RRR7      h\        W4      w  r\        W4      pV'       g`   \        V\        4      '       dJ   VP                  R4      '       d3   \        VP                  R4      ;'       g    R4      P                  4       pV\        WW#V4      3# )zÙValidation half of a main-slot assignment: ``(effective base_url, switch result)``.
``switch_model`` fetches catalogs / probes endpoints, so callers run this BEFORE taking
``_CONFIG_MUTATION_LOCK``; it writes nothing.rE  z$provider and model required for mainrF  r8  r    )	r   r6  r¸  r©   r)   rÁ   r   rÐ   rS  )r×   ré   r?   r8  r9  r€  s   &&&&& r   Ú_prepare_main_assignmentr»  æ  s‰   € ÷ Ÿ5Ü¨Ð4ZÔ[Ð[Ü6°xÓG�O€HÜ$ SÓ3€Nßœ
 >´4×8Ò8¸^×=OÑ=OÐPZ×=[Ò=[Ü�~×)Ñ)¨*Ó5×;Ð;¸Ó<×BÑBÓDˆØÔ4°SÀEÐU\Ó]Ð]Ð]r   c                ód   € V ^8„  d   QhR\         R\        R\        R\        R\        RRR\         /# )	r   r×   ré   r?   r8  r9  Úpreparedú'Optional[tuple[str, ModelSwitchResult]]r   r:  )r   s   "r   r   r   ó  sA   € ÷ $ñ $¤Tð $´Sð $Äð $ÔPSð $Ô^að $Ø*Sð$Ü_cñ$r   c                 óÜ  € ^ RI Hp ^ RIHp T;'       g    \	        WW#V4      w  r8VP
                  VP                  r!\        W4      p	VP                  4       P                  4       p
V
R9   ;'       d    \        V4      ;'       d    \        W4      p\        V P                  R/ 4      W„4      p\        WÁV	4       WÀR&   VP                  4       P                  4       pVR8X  d   \        V 4      M. pV! V 4       VR9   d   V'       d   V'       g   \!        W4V4       V! 4        RRRRR	VRVR
VP                  R
R4      RVR\#        W4      /\%        VRR4      '       d   RVP&                  /C# / C# )é    ©Úsave_config)Úreconcile_recordr?   rž   ÚokTÚscoper­  ré   r8  r    Úgateway_toolsr®  Úusage_noticeÚnotice>   rF   rq   )r  rÂ  Úhermes_cli.free_tier_bootstraprÃ  r»  rN  Ú	new_modelr¸  rÐ   rÑ   rÍ   r¡  rY  rÁ   rˆ  r”  r§  r³  rî   rÇ  )r×   ré   r?   r8  r9  r½  rÂ  rÃ  rQ  r€  Úprovider_lcÚendpoint_already_knownrO  r©  rÆ  s   &&&&&&         r   Ú_apply_main_assignment_syncrÍ  ó  sk  € å-Ý?Ø×dÐdÔ#;¸CÈ5Ð\cÓ#dÑ€HØ×,Ñ,¨f×.>Ñ.>ˆeÜ$ SÓ3€Nð
 —.‘.Ó"×(Ñ(Ó*€KàÐ*Ñ*×jÐj¬t°H«~×jÐjÔB[Ð\_ÓBjð ä,¨S¯W©W°W¸bÓ-AÀ6ÓS€IÜ# I¸ÔHØˆ�Là—>‘>Ó#×)Ñ)Ó+€LØ9EÈÔ9OÔ0°Ô5ÐUW€MÙ�ÔØÐ*Ô*¯x×@VÜ! (°UÔ;áÔð 	ˆdØ�Ø�HØ�Ø�I—M‘M *¨bÓ1Ø˜Ø”_ SÓ7ð
ô /6°f¸nÈb×.QÒ.QˆH�f×)Ñ)Ð*ð
ð 
ð XZð
ð 
r   c                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# r¤   ro  )r   s   "r   r   r     s&   € ÷ Jñ J¬8´C­=ð J¼XÄc½]ñ Jr   c                ó¼   € V f   R# ^ RI Hp V! V 4      pVf&   ^ RI Hp \        RRRP	                  V4       2R7      hVP                  R4      R	J d   R
# VR,          # )z¡``auxiliary.<task>.reasoning_effort`` value for an assignment: None clears (inherit), else the
canonical level (``none`` for a disable), 400 on an unknown level.N)Úparse_reasoning_effort)ÚVALID_REASONING_EFFORTSrE  z'reasoning_effort must be one of: none, z, rF  r“  FÚnoneÚeffort)Úhermes_constantsrÐ  rÑ  r   ÚjoinrÁ   )r¥   rÐ  ÚparsedrÑ  s   &   r   Ú_normalize_aux_reasoning_effortr×    sg   € ð ‚}ÙÝ7Ù# EÓ*€FØ‚~Ý<Ü¨Ø%LÈTÏYÉYÐWnÓMoÐLpÐ#qôsð 	sà—Z‘Z 	Ó*¨eÓ3ˆ6ÐI¸ÀÕ9IÐIr   c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r°  r   ry  )r   s   "r   r   r   ,  s   € ÷ Wñ Wœcð W¤cñ Wr   c                 óÜ   € ^ RI Hp VP                  ! R4      ;'       g    / P                  V 4      p\        V\        4      '       d%   \        VP                  R4      ;'       g    R4      # R# )rÀ  )r   r«  Úreasoning_effortr    )Úhermes_cli.config_defaultsr   rÁ   r©   r)   r   )r°  r   rö   s   &  r   Ú_aux_default_effortrÝ  ,  sW   € Ý9Ø×Ò Ó,×2Ð2°×7Ñ7¸Ó=€EÜ7AÀ%Ì×7NÒ7NŒ3ˆu�y‰yÐ+Ó,×2Ð2°Ó3ÐVÐTVÐVr   c                óŽ   € V ^8„  d   QhR\         R\        R\        R\        R\        R\        R\        \        ,          R\         /# )	r   r×   ré   r?   r¬  r8  r9  rÛ  r   )r)   r   r   )r   s   "r   r   r   2  sV   € ÷ Fñ F¤Dð F´Cð FÄð FÌ3ð FÔZ]ð FÔhkð FÜ19¼#µðFÜLPñFr   c           
      ó`  a€ ^ RI Hp V P                  R4      o\        S\        4      '       g   / oR V3R llpV\
        Jd   \        V4      M\
        p	\        4       p
VR8X  de   V
 FI  pV! V4      pRVR&   RVR	&   VP                  R
R4       VP                  RR4       \        V4       VSV&   KK  	  SV R&   V! V 4       RRRRRR/# V'       g   \        RRR7      hV'       d   V.M
\        V
4      pVP                  4       P                  4       pV Fí  pWº9  d   \        RRV 2R7      hV! V4      p\        VP                  R4      ;'       g    R4      P                  4       P                  4       pWR&   W,R	&   V'       d   WLR&   V'       d   W\R&   M*Wï8w  d%   VR8w  d   VP                  RR4       \        V4       V	f+   \        V4      '       d   RVR
&   M!VP                  R
R4       MV	\
        Jd   WœR
&   VSV&   Kï  	  SV R&   V! V 4       RRRRRVRVR	V/pV	\
        Jd   V	VR
&   V# )rÀ  rÁ  r«  c                ó0   € V ^8„  d   QhR\         R\        /# rÙ  )r   r)   )r   s   "r   r   Ú0_apply_aux_assignment_sync.<locals>.__annotate__9  s   € ÷ >ñ >”Cð >œDñ >r   c                 óZ   <€ SP                  V 4      p\        V\        4      '       d   V# / # r¨   r¶  )r°  r±  Úauxs   & €r   Ú_slotÚ)_apply_aux_assignment_sync.<locals>._slot9  s'   ø€ Ø—7‘7˜4“=ˆÜ% h´×5Ò5ˆxÐ=¸2Ð=r   Ú	__reset__rT   ré   r    r?   rÛ  Nr8  rÄ  TrÅ  ÚresetrE  zprovider required for auxiliaryrF  zunknown auxiliary task: r9  rq   Útasks)r  rÂ  rÁ   r©   r)   Ú_UNSETr×  rm  rX  r   r   r   rÐ   rÑ   r   rÝ  )r×   ré   r?   r¬  r8  r9  rÛ  rÂ  rä  rÓ  Úslotsr°  r±  Útargetsr©  Úprev_providerrQ  rã  s   &&&&&&&          @r   Ú_apply_aux_assignment_syncrí  2  sD  ø€ å-Ø
�'‰'�+Ó
€CÜ�cœ4× Ò Øˆ÷>ð >ð CSÔZ`ÓB`Ô,Ð-=Ô>Ôfl€FÜÓ€Eàˆ{ÔãˆDÙ˜T“{ˆHØ#)ˆH�ZÑ Ø "ˆH�WÑØ�L‰LÐ+¨TÔ2Ø�L‰L˜ TÔ*Ü,¨XÔ6Ø ˆC�‹Iñ ð ˆˆKÑÙ�CÔØ�d˜G [°'¸4Ð@Ð@çÜ¨Ð4UÔVÐVçˆt‰f¤$ u£+€GØ—>‘>Ó#×)Ñ)Ó+€LÛˆØÔÜ¨CÐ:RÐSWÐRXÐ8YÔZÐZÙ˜“;ˆÜ˜HŸL™L¨Ó4×:Ð:¸Ó;×AÑAÓC×IÑIÓKˆØ'�ÑØ!�Ñßð $,�ZÑ ßØ&-˜Ñ#øØÔ*¨|¸xÔ/GØ�L‰L˜ TÔ*Ü,¨XÔ6ØŠ>ô # 4×(Ò(Ø/1�Ð+Ò,à—‘Ð/°Õ6Øœ6Ó!Ø+1Ð'Ñ(ØˆˆD‹	ñ= ð@ €CˆÑÙ�ÔØ�D˜' ;°¸À*ÈhÐX_ÐafÐg€FØ”VÓØ%+ˆÐ!Ñ"Ø€Mr   c                ó†   € V ^8„  d   QhR\         R\         R\         R\         R\         R\         R\        \         ,          RR	/# )
r   rÅ  ré   r?   r¬  r8  r9  rÛ  r½  r¾  )r   r   )r   s   "r   r   r   {  sZ   € ÷ gñ gÜðgÜðgÜ&)ðgÜ14ðgÜ@CðgÜNQðgäœs•mðgà8añgr   c           	     ó`   € ^ RI Hp V! 4       p	V R8X  d   \        W‘W$WW4      # \        W‘W#WEV4      # )a  Synchronous body of POST /api/model/set.

Runs inside ``_profile_scope`` (worker thread) so every load_config/save_config lands in
the requested profile. Raises HTTPException for validation errors. ``prepared`` is a
``_prepare_main_assignment`` result computed outside the config lock.
r  r­  )r  r  rÍ  rí  )
rÅ  ré   r?   r¬  r8  r9  rÛ  r½  r  r×   s
   &&&&&&&&  r   Ú_apply_model_assignment_syncrð  {  s6   € õ .Ù
‹-€CØ�„Ü*¨3¸%È7Ó]Ð]Ü% c°UÀ(ÐUeÓfÐfr   c                ó^   € V ^8„  d   QhR\         R\         R\        \         \         3,          /# )r   r_  rì  r   r  )r   s   "r   r   r   Œ  s,   € ÷ #ñ #¬sð #Ä3ð #Ì5ÔQTÔVYÐQYÍ?ñ #r   c                ó˜  € T ;'       g    RP                  4       pV'       g   RV3#  ^ RIHpHpHp  T! Y!4      pT'       d   T^ ,          T^,          3# RT9   d1    ^ RIHp T! T4      T9   pT'       g   T! R4      '       d   RT3# RT3# RT3#   \
         d    RT3u # i ; i  \
         d    Rp Lyi ; i  \
         d     RT3# i ; i)u
  Infer which provider serves ``model_val`` when the flat Config-page Model field changes.

Returns ``(provider, model)``; ``provider`` is empty when no switch is warranted. Signals,
in order: curated-catalog detection (``detect_provider_for_model``), then the vendor-slug
heuristic â€” a ``vendor/model`` slug cannot belong to a non-aggregator provider (e.g.
``ollama-local``), so return the sentinel ``"openrouter"``; the caller's
``_normalize_main_model_assignment`` resolves the real aggregator (keeps the current one).
r    )r  Údetect_provider_for_modelr   Nr$  r%  r'  )rÐ   r(  r  ró  r   r&   r-  r&  )	r_  rì  rÝ   r  ró  r   Údetectedr&  Úcur_is_aggregators	   &&       r   Ú_infer_provider_on_model_changerö  Œ  sï   € ð �OˆO˜×"Ñ"Ó$€DßØ�4ˆxˆðßjÑjðÙ,¨TÓAˆ÷ Ø˜�{˜H Q�KÐ'Ð'à
ˆd„{ð		ÝIá 2°=Ó AÐEZÑ ZÐ÷ %Ñ)AÀ,×)OÒ)OØ# TÐ)Ð)ð ˆtˆ8€Oˆ2ˆtˆ8€Oøô+ ô Ø�4ˆxŠðûô
 ô ØŠðûô ô 	ØØˆtˆ8€Oð	ús@   ¨
B ³B% ÁB8 Á6B8 ÂB8 ÂB"Â!B"Â%B5Â4B5Â8C	ÃC	c                ót   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          /# r[  rµ   )r   s   "r   r   r   ²  s.   € ÷ @ñ @¬¬c´3¨h­ð @¼DÄÄcÀ½Nñ @r   c                óÐ  € ^ RI Hp \        V 4      p V P                  RR4       RV 9   pV P                  R^ 4      p\	        V\
        4      '       g    \        V4      pV P                  R4      p\	        V\        4      ;'       d    \        V4      pV'       g   V'       g   V #  V! 4       pTP                  R4      p\	        T\        4      '       Ed!   T'       dí   \        TP                  R4      ;'       g    R4      P                  4       p\        TP                  R4      ;'       g    R4      P                  4       p	YH8w  d   T	'       dw   \        YI4      w  r«T
'       db   T
P                  4       P                  4       T	P                  4       8w  d1   \        Y«4      w  rÍ\!        YlT4      p\#        Y~4      pTP$                  pYGR&   T'       d   T^ 8”  d   Y7R	&   MTP                  R	R4       YpR&   T # T'       d?   T^ 8”  d8   T'       d   TpM#\	        T\        4      '       d   T'       d   TpMRpRTR	T/T R&   T #   \        \        3 d    ^ p ELôi ; i  \         d    T u # i ; i)
uâ  Reverse ``_normalize_config_for_web`` before saving.

Reconstructs ``model`` as a dict from the on-disk config to recover subkeys (provider,
base_url, api_mode, ...) the GET response stripped. When the model name actually changed,
re-detects the serving provider and routes through the assignment chokepoints (a user
picking an OpenRouter model while on ``ollama-local`` would otherwise keep the stale
provider and 404); saving unrelated fields never overwrites an explicit provider.

``model_context_length`` is written back as ``context_length`` (0 = auto-detect, key
removed). A partial update (Settings autosave diff) that OMITS the key means "unchanged"
and must leave the on-disk override alone â€” not be treated as an explicit 0.
r  Ú_model_metaNrC   r?   ra   r    ré   r]  )r  r  r)   rX  r©   r^  Ú	TypeErrorÚ
ValueErrorrÁ   r   rÍ   r&   rÐ   rö  rÑ   r6  rS  rY  rÊ  )r³   r  Úctx_sentÚctx_overrider_  Ú	has_modelÚdisk_cfgÚ
disk_modelÚprev_defaultrì  r©  Úresolved_modelÚnorm_providerÚ
norm_modelrQ  ra   s   &               r   Ú_denormalize_config_from_webr  ²  s  € õ .Ü�&‹\€FØ
‡J�Jˆ}˜dÔ#à%¨Ñ/€HØ—:‘:Ð4°aÓ8€LÜ�l¤C×(Ò(ð	Ü˜|Ó,ˆLð —
‘
˜7Ó#€IÜ˜9¤cÓ*×>Ð>¬t°I«€IßŸØˆðÙ“=ˆð —‘˜gÓ&€JÜ�*œd×#Ó#ßÜ˜zŸ~™~¨iÓ8×>Ð>¸BÓ?×EÑEÓGˆLÜ 
§¡¨zÓ :× @Ð @¸bÓA×GÑGÓIˆMØÔ(¯]Ü/NÈyÓ/hÑ,�ß L×$6Ñ$6Ó$8×$>Ñ$>Ó$@ÀM×DWÑDWÓDYÔ$YÜ0PÐQ]Ó0nÑ-�MÜ<¸XÐV`Óa�FÜ!=¸jÓ!Q�JØ &× 0Ñ 0�IØ$-�yÑ!ßØ˜aÔØ/;Ð+Ò,à—‘Ð/°Ô6Ø$ˆw‰ð €M÷ 
�l QÔ&çØ‰GÜ˜
¤C×(Ò(¯ZØ ‰GàˆGØ$ gÐ/?ÀÐNˆˆw‰Ø€MøôU œ:Ð&ô 	Ø‹Lð	ûô ô ØŠðús$   ÁH; Â$I È;IÉIÉI%É$I%c                ó8  € V ^8„  d   Qh/ ^ \         9   d,   \        \        \        \        \        3,          3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   ^\         9   d   \        \        R3,          ;R&   ^\         9   d
   \        ;R&   # )r   rÀ   rÂ   .rf  ré  )Ú__conditional_annotations__r)   r   r   r  )r   s   "r   r   r      s�   € ÷ ñ ÷B~ò ~”4œœT¤#¤s (�^Ð+Õ,ñ ~ñC÷H ò  ””cœ3�h•ñ  ñI÷Lò ””s˜C�x•ñ ñM÷t Ò ŒÑ òur   )r    )r    r    )ÚvisionÚcompressionÚ
skills_hubÚapprovalr—   Útitle_generationÚreviewÚ
voice_chatÚtriage_specifierÚkanban_decomposerÚprofile_describerÚcuratorr¨   )Or  Ú__doc__Úloggingr}  Údataclassesr   Úfastapir   rr   r   r   r   r   r   r	   Úagent.model_metadatar
   r  r   r   r   r   r   Úhermes_cli.web_server_memoryr   rë   r   Útools.wake_wordr   rK  r   Ú	getLoggerr'   r,   r3   r:   rÀ   rÂ   rÍ   r^  Úfloatr   r)   r°   r±   r½   rÊ   r  rÓ   rù   rÿ   r  r  r6  rS  rY  ra  rf  rg  rm  rw  rs  rˆ  r”  r¡  r§  r³  r¸  r»  rÍ  r¢   ré  r×  rÝ  rí  rð  rö  r  r   )r  s   @r   Ú<module>r     sh  øð÷ó Û 	Ý Ý !ß B× BÝ 2÷õ õ IÝ 8Ý 0çÝ9ð ×ÒÐ0Ó1€õ(õ(õ]ð
~0Ø‘ØPðá	Ó	òà)-ðà9=ñð~0ð
 ‘wÐ7ÐUÑ:RÓ:TÓUð~0ð Ø�ØÐIØ�Iðð~0ð Ø�ØÐVØ�Iðð~0ð  ™Ø$Ø�˜5 '¨9Ð6Fóð!~0ð* Ø�Øð  Bðð+~0ð2 ™wØ|Ø�(˜L°Dô :ð3~0ð8 ™7Ð#7¸ÀJÓOð9~0ð: Ø�	ØðNð 	�Jðð;~0ðJ ™wØDÀeÈ[Ðcmô ðK~0ðP Ø�	ØÐbØ�Jð ðQ~0ðZ !Ø�	ØðSð 	�Jð#ð[~0ðj ™'ØiØðà%óðk~0ðr ‘GØ!Ø�˜h¨¨y¸)ÀXÈxÐYdÐfmóðs~0ðz ‘GØ! 7¨F°H¸iÈÐP\Ð^iókð{~0ð~ ‘wÐ@Ð^ÐCTÐU\ÕC]Ó^ð~0ð@ ‘gÐ2ÐOÐ5FÀvÕ5NÓOñA~0ðB ™Ð <Ð[Ð?PÐQYÕ?ZÓ[ðC~0ðD !¡'Ð*[Ð]rØ*:Ð<OÐQió#kðE~0ðH ™Ð!FÐfÐIZÐ[dÕIeÓfðI~0ðJ ‘WÐ6ÐRÐ9JÈ5Õ9QÓRðK~0ðL ™wÐ'@ÐcÐCTÐUaÕCbÓcðM~0ðN ‘GÐ.°	¸6À6È7ÓSðO~0ðP ‘wØ$ i°¸WÀfÈkÐ[aóðQ~0ðV ™gÐ&LÈiÐY_ÐafÓgðW~0ðX ™wÐ'NÐP[Ð]dÐfmÓnðY~0ðZ ‘gÐ?ÀÈ7ÐTYÓZð[~0ð\ ‘gÐ9¸9ÀhÓOð]~0ð^ ™Ð =¸uÀhÐPWÓXð_~0ð` ‘WÐ6¸ÀÈÐT[Ó\ða~0ðb ™'Ø_Ø
ˆH�f˜f fóðc~0ðj "¡7Ø2Ø
ˆI�u˜h¨°¸Àó$ðk~0ðr ,©Wð	Cð 	�ó.ðs~0ð@ !Ø�	Øðð#ñA~0ðP Ø�	Øð  {ðð $Ø�ØðCð	&ð #Ø�ØðEð%ñm~0Ð ó ~ðF #Øˆzð #àˆwð #ð ˆgð #ð ˆGð	 #ð
 ˆwð #ð �'ð #ð �7ð #ð �ð #ð �9ð #ð �ð #ð �gð #ð �gð #ð �ð #ð ˆWð #ð ˆyð #ð  �'ð! #ð" �	ð# #ð$ 
ˆ7Ø�GØ�ØˆwØˆið ˆwØˆyØ
ˆGØ�7Ø
ˆJà�ñ? #€ó  ðF �IÐ  h °%¸Ð1BÀTÈ6ÀNÐUYÐ[cÐTdÐe€	õQ÷
ð õ,ñ 3Ó4€õ>õ"5õpõ:õ&FõRD÷N ð  ÷Fð õ ñ,$€ó õõ$Rõõ2õ$|õ0õõ0Kõ&õ<Tõ

^÷$ð $ñP ‹h€Ó õJõWð BH÷Fð FðT UWØ&,Ðdh÷gñ g÷"#÷L@ñ @r   