+
    jHàj,7  ã            	      óN  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t
^ RIHt ^ RIHt ^ RIHtHtHt ]P&                  ! R4      t]]]]]]3,          ,          3,          tR tR R	 ltRCt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t"]! RR7       ! R R4      4       t#RDRR /R! R" lllt$R# R$ lt%R% R& lt&R' R( lt'R) R* lt(R+t)]#! R,R-R.R/R0 4      t*]#! R1R2R3R4R5 RR67      t+R7 R8 lt,R9RR:R /R; R< llt-R9RR:R /R= R> llt.R? R@ lt/RA RB lt0R# )Eu)  Per-model reasoning capabilities from OpenRouter-schema ``/v1/models`` catalogs.

Split out of ``hermes_cli.models``. OpenRouter and
Nous Portal share one implementation parametrized by :class:`_CapsSource`; the per-source module
globals (``_openrouter_reasoning_caps_cache``, ``_nous_caps_disk_checked``, ...) stay defined on
``hermes_cli.models`` â€” tests reset them there â€” and are read/written by attribute name.

Tri-state contract for callers deciding whether to emit reasoning controls: a dict with
``supports_reasoning: True`` (+ ``supported_efforts``, ``mandatory``) â€” the route advertises
reasoning controls; ``supports_reasoning: False`` â€” the catalog knows the model and it does NOT
accept them (definitive negative); ``None`` â€” unknown (catalog not loaded, model not listed,
malformed).
)ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚCallableÚOptionalzhermes_cli.modelsc                 ó   € ^ RI Hp  V # )é    ©Úmodels)Ú
hermes_clir   r
   s    ÚE/home/ubuntu/.hermes/hermes-agent/hermes_cli/models_reasoning_caps.pyÚ_originr   "   s
   € Ý!Ø€Mó    c               ó    € V ^8„  d   QhRRRR/# )é   Úitemr   ÚreturnúOptional[dict[str, Any]]© )Úformats   "r   Ú__annotate__r   '   s   € ÷ wñ w°#ð wÐ:Rñ wr   c                óº  € \        V \        4      '       g   R# V P                  R4      p\        V\        4      '       g   R# RV9  d   RR/# V P                  R4      p\        V\        4      '       g   / pVP                  R4      pRp\        V\        4      '       d&   \        \        P	                  R V 4       4      4      pRRRVR	VP                  R	4      RJ /# )
ab  Normalize one OpenRouter catalog entry's reasoning metadata.

``supported_parameters`` contains ``"reasoning"`` when the route accepts reasoning controls at
all; a top-level ``reasoning`` object may add ``mandatory`` / ``supported_efforts``. A missing
or malformed ``supported_parameters`` is "unknown" (None), like ``_openrouter_model_supports_tools``.
NÚsupported_parametersÚ	reasoningÚsupports_reasoningFÚsupported_effortsc              3  ó²   "  € T FM  p\        V4      P                  4       '       g   K$  \        V4      P                  4       P                  4       x € KO  	  R # 5i©N)ÚstrÚstripÚlower)Ú.0Úes   & r   Ú	<genexpr>Ú:parse_openrouter_reasoning_capabilities.<locals>.<genexpr>;   s;   é € Ð$cÁ[ÀÔTWÐXYÓTZ×T`ÑT`×TbÔ%;¤S¨£V§\¡\£^×%9Ñ%9×%;Ð%;Ã[ùs
   ‚!A¨/ATÚ	mandatory)Ú
isinstanceÚdictÚgetÚlistÚfromkeys)r   Úparamsr   Úraw_effortsÚeffortss   &    r   Ú'parse_openrouter_reasoning_capabilitiesr/   '   sÇ   € ô �dœD×!Ò!ÙØ�X‰XÐ,Ó-€FÜ�fœd×#Ò#ÙØ˜&Ô Ø$ eÐ,Ð,Ø—‘˜Ó%€IÜ�i¤×&Ò&Øˆ	Ø—-‘-Ð 3Ó4€KØ#'€GÜ�+œt×$Ò$Ü”t—}‘}Ñ$cÁ[Ó$cÓcÓdˆØ  $Ð(;¸WÀkÐS\×S`ÑS`ÐalÓSmÐquÐSuÐvÐvr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   I   s   € ÷ ?ñ ? 4ñ ?r   c                 ó8   € ^ RI Hp  V ! 4       R,          R,          # )r	   ©Úget_hermes_homeÚcachezreasoning_caps.json)Úhermes_constantsr3   r2   s    r   Ú_reasoning_caps_disk_pathr6   I   s   € Ý0ÙÓ˜wÕ&Ð)>Õ>Ð>r   c               ó   € V ^8„  d   QhRR/# )r   r   zdict[str, Any]r   )r   s   "r   r   r   N   s   € ÷ ?ñ ? >ñ ?r   c                 óB   € ^ RI Hp  V ! \        4       4      ;'       g    / # )r	   ©Ú_read_json_cache)Úhermes_cli.modelsr:   r6   r9   s    r   Ú_read_reasoning_caps_diskr<   N   s   € Ý2ÙÔ5Ó7Ó8×>Ð>¸BÐ>r   c               ó    € V ^8„  d   QhRRRR/# )r   Úurlr   r   ztuple[Optional[Caps], float]r   )r   s   "r   r   r   S   s   € ÷ 
Kñ 
K 3ð 
KÐ+Gñ 
Kr   c           	     ó  € \        4       P                  V 4      p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d	   V'       g   R#  \	        R\
        P
                  ! 4       \        VP                  R4      ;'       g    ^ 4      ,
          4      pVP                  4        UUu/ uF  w  rE\        V4      VbK  	  uppV3#   \        \        3 d    \        \        4      p LRi ; iu uppi )z=Return ``(caps, age_seconds)`` for *url*, or ``(None, 0.0)``.ÚcapsNç        Úts)NrA   )r<   r)   r'   r(   ÚmaxÚtimeÚfloatÚ	TypeErrorÚ
ValueErrorÚ _REASONING_CAPS_DISK_TTL_SECONDSÚitemsr   )r>   Úentryr@   ÚageÚmidÚ
model_capss   &     r   Ú_load_reasoning_caps_diskrN   S   sÇ   € ä%Ó'×+Ñ+¨CÓ0€EÜ *¨5´$× 7Ò 7ˆ5�9‰9�VÔ¸T€DÜ�dœD×!Ò!¯ØÐð6Ü�#”t—y’y“{¤U¨5¯9©9°T«?×+?Ð+?¸aÓ%@Õ@ÓAˆð 9=¿
¹
¼ÔE¹¡_ SŒC�‹H�jÒ ¹ÒEÀsÐJÐJøô ”zÐ"ô 6ÜÔ4Ó5Šð6üãEs   Á$6C ÂC Â?DÃ C?Ã>C?c               ó$   € V ^8„  d   QhRRRRRR/# )r   r>   r   r@   ÚCapsr   ÚNoner   )r   s   "r   r   r   `   s&   € ÷ Jñ J 3ð J¨dð J°tñ Jr   c                óä   € ^ RI Hp  \        4       pR\        P                  ! 4       RV/W0&   V! \	        4       V^ RR7       R#   \
         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z>Merge *url*'s catalog into the shared disk mirror, atomically.)Ú_write_json_cacherB   r@   )ÚindentÚ
separatorsz,Failed to save reasoning-caps disk cache: %sN)Ú,Ú:)r;   rS   r<   rD   r6   Ú	ExceptionÚloggerÚdebug)r>   r@   rS   ÚdataÚexcs   &&   r   Ú_save_reasoning_caps_diskr]   `   s`   € å3ðJÜ(Ó*ˆØœ4Ÿ9š9›;¨°Ð5ˆ‰	ÙÔ3Ó5°tÀAÐR\×]øÜô JÜ�‰ÐCÀS×IÒIûðJús   ˆ9A ÁA/ÁA*Á*A/c               ó   € V ^8„  d   QhRR/# ©r   r   rQ   r   )r   s   "r   r   r   k   s   € ÷ ~ñ ~¨4ñ ~r   c                óà   € \         P                  P                  R4      '       d   R# \        P                  ! \
        P                  ! 4       P                  V 3RRR7      P                  4        R# )zýRun *refresh* in a daemon thread (fire-and-forget) so a cold/stale cache is warm for the
next call or, via the disk mirror, the next process without this turn blocking on HTTP.
Callers own the once-per-process guard; the fetch keeps its own failure TTL.ÚPYTEST_CURRENT_TESTNzreasoning-caps-warmT)ÚtargetÚargsÚnameÚdaemon)	ÚosÚenvironr)   Ú	threadingÚThreadÚcontextvarsÚcopy_contextÚrunÚstart)Úrefreshs   &r   Ú_warm_reasoning_caps_asyncro   k   sK   € ô 
‡z�z‡~�~Ð+×,Ò,Ùä×ÒœK×4Ò4Ó6×:Ñ:À'ÀÐRgÐptÔu×{Ñ{Ö}r   c               ó    € V ^8„  d   QhRRRR/# )r   r>   r   r   úOptional[Caps]r   )r   s   "r   r   r   u   s   € ÷ ñ ¨3ð ¸Nñ r   c                óT   € \        V 4      w  r#Ve   V\        8¼  d   \        V4       V# )u±   The disk copy of *url*'s catalog, queueing *refresh* when it's stale. A copy past its TTL is
still returned â€” a stale verdict beats no verdict, and capabilities change rarely.)rN   rH   ro   )r>   rn   r@   rK   s   &&  r   Ú!_hydrate_reasoning_caps_from_diskrs   u   s+   € ô *¨#Ó.�I€DØÒ˜CÔ#CÔCÜ" 7Ô+Ø€Kr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r>   r   rI   r   r   rq   r   )r   s   "r   r   r   ~   s!   € ÷ ñ ˜cð ¨#ð °.ñ r   c                ó8  € \        V\        4      '       g   R# / pV Fd  p\        V\        4      '       d3   \        VP	                  R4      ;'       g    R4      P                  4       MRpV'       g   KW  \        V4      W$&   Kf  	  V'       g   R# \        W4       V# )u/  Parse a ``/v1/models`` ``data`` array and mirror it for *url*.

Takes the payload rather than fetching it, so picker and pricing fetches (same document) leave
the mirror warm at no network cost. None when the array has no usable entries â€” callers
remember that as a failure rather than caching empty.
NÚidÚ )r'   r*   r(   r   r)   r    r/   r]   )r>   rI   Ú
caps_by_idr   rL   s   &&   r   Ú_seed_reasoning_capsry   ~   s{   € ô �eœT×"Ò"ÙØ€JÛˆÜ3=¸dÄD×3IÒ3IŒc�$—(‘(˜4“.×&Ð& BÓ'×-Ñ-Ô/Èrˆß‰3ÜEÀdÓKˆJ‹Oñ ÷ ÙÜ˜cÔ.ØÐr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r>   r   ÚtimeoutrE   r   rq   r   )r   s   "r   r   r   ’   s!   € ÷ 
:ñ 
: sð 
:°Uð 
:¸~ñ 
:r   c                ó   € \        4       p \        P                  P                  V RRRVP                  /R7      pVP                  W1R7      ;_uu_ 4       p\        P                  ! VP                  4       P                  4       4      pRRR4       \        T XP                  R4      4      #   + '       g   i     L+; i  \         d     R# i ; i)u»   Fetch one OpenRouter-shaped ``/v1/models`` catalog â†’ per-model caps; None when unreachable or
empty so callers remember the failure. Sends a User-Agent: the Portal 403s anonymous reads.ÚAcceptzapplication/jsonz
User-Agent)Úheaders©r{   Nr[   )r   ÚurllibÚrequestÚRequestÚ_HERMES_USER_AGENTÚ_urlopen_model_catalog_requestÚjsonÚloadsÚreadÚdecoderX   ry   r)   )r>   r{   ÚmÚreqÚrespÚpayloads   &&    r   Ú_fetch_reasoning_caps_catalogr�   ’   s§   € ô 	‹	€AðÜ�n‰n×$Ñ$ S°8Ð=OÐQ]Ð_`×_sÑ_sÐ2tÐ$ÓuˆØ×-Ñ-¨cÐ-×CÔCÀtÜ—j’j §¡£×!3Ñ!3Ó!5Ó6ˆG÷ Dô    W§[¡[°Ó%8Ó9Ð9÷	 D×Cûäô Úðús0   ŒA	B> Á3B+ÂB> Â+B;	Â6B> Â;B> Â>CÃCT)Úfrozenc                  ót   € ] tR t^¡t$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R	tR
]R&   R R ltR R ltRt	R# )Ú_CapsSourceu½  One catalog's cache slots on ``hermes_cli.models`` plus how to name its URL.

``cache``: model id â†’ parsed caps from one full-catalog fetch, kept for the process lifetime.
``failed_at``: monotonic timestamp of the last FAILED fetch; suppresses re-fetch storms from
per-turn callers for 60s (mirrors the LM Studio/Ollama probe caching). ``disk_checked`` /
``warm_started``: once-per-process guards for the disk hydrate and the background warm.
r   r4   Ú	failed_atÚdisk_checkedÚwarm_startedzCallable[[], str]r>   FÚboolÚper_profilec               ó   € V ^8„  d   QhRR/# )r   Úslotr   r   )r   s   "r   r   Ú_CapsSource.__annotate__´   s   € ÷ }ñ }˜ñ }r   c                	ó¼   € V P                   '       g   \        \        4       \        W4      4      # ^ RIHp T! \        4       \        W4      VR9   d   R4      # R4      # )r	   )Úprofile_slot_getFN)r’   r“   )r•   Úgetattrr   Úhermes_cli.models_profile_cacherš   )Úselfr—   rš   s   && r   r)   Ú_CapsSource.get´   sL   € Ø××ÐÜœ7›9¤g¨dÓ&9Ó:Ð:ÝDÙ¤£	¬7°4Ó+>ÈÐQqÔIqÀÓ|Ð|Ðw{Ó|Ð|r   c               ó    € V ^8„  d   QhRRRR/# )r   r—   r   r   rQ   r   )r   s   "r   r   r˜   º   s   € ÷ @ñ @˜ð @ tñ @r   c                	ó¬   € V P                   '       g!   \        \        4       \        W4      V4       R # ^ RIHp V! \        4       \        W4      V4       R # )N)Úprofile_slot_set)r•   Úsetattrr   r›   rœ   r¡   )r�   r—   Úvaluer¡   s   &&& r   ÚsetÚ_CapsSource.setº   s:   € Ø××ÐÜ”G“Iœw tÓ2°EÔ:ÙÝDÙœ›¤G¨DÓ$7¸Ö?r   r   N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r•   r)   r¤   Ú__static_attributes__r   r   r   r�   r�   ¡   sC   ‡ ñð ƒJØƒNØÓØÓØ	Óð €K�Óõ}÷@ñ @r   r�   ç      @ÚforceFc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úsrcr�   r{   rE   r®   r”   r   rq   r   )r   s   "r   r   r   Â   s)   € ÷ ñ �[ð ¨5ð À$ð ÐSañ r   c               ób  € V P                  R4      pVe   V'       g   V# V P                  R4      pVe$   \        P                  ! 4       V,
          ^<8  d   R# \        V P	                  4       V4      pVf(   V P                  R\        P                  ! 4       4       R# V P                  RV4       V# )z�Fetch + cache the source's per-model caps. None (without poisoning the cache) when
unreachable, so callers retry later and fall back meanwhile.r4   Nr‘   )r)   rD   Ú	monotonicr�   r>   r¤   )r°   r{   r®   Úcachedr‘   rx   s   &&$   r   Ú_fetch_capsr´   Â   s�   € ð �W‰W�WÓ€FØÒ§%ØˆØ—‘˜Ó$€IØÒ¤$§.¢.Ó"2°YÕ">À"Ô!DÙÜ.¨s¯w©w«y¸'ÓB€JØÒØ�‰�œTŸ^š^Ó-Ô.ÙØ‡G�GˆG�ZÔ ØÐr   c               ó    € V ^8„  d   QhRRRR/# )r   r°   r�   r   rq   r   )r   s   "r   r   r   Ó   s   € ÷ 	ñ 	�kð 	 nñ 	r   c                óú   a € S P                  R4      fX   S P                  R4      '       gA   S P                  RR4       S P                  R\        S P                  4       V 3R l4      4       S P                  R4      # )uù   Cache-only caps: memory, else the disk mirror. Never HTTP.

One disk attempt per process: for the Portal, naming the catalog means resolving credentials,
which can itself reach the network to refresh a token â€” too expensive for a per-turn caller.
r4   r’   Tc                 ó   <€ \        S R R7      # ©T)r®   ©r´   ©r°   s   €r   Ú<lambda>Ú_caps_cached.<locals>.<lambda>Û   s   ø€ ÌkÐZ]ÐeiÕNjr   )r)   r¤   rs   r>   rº   s   fr   Ú_caps_cachedr½   Ó   s\   ø€ ð ‡w�wˆwÓÒ¨¯©°×(?Ò(?Ø�‰� Ô%Ø�‰�Ô:¸3¿7¹7»9ÔFjÓkÔlØ�7‰7�7ÓÐr   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r°   r�   Úmodel_idúOptional[str]r{   rE   Úallow_fetchr”   r   r   r   )r   s   "r   r   r   ß   s8   € ÷ Eñ E�[ð E¨Mð EÀuð EÐ[_ð EÐd|ñ Er   c               óÐ   € \        T;'       g    R 4      P                  4       pV'       g   R# \        V 4      pVf   V'       d   \        WR7      pVe   VP	                  V4      # R# )rw   Nr   )r   r    r½   r´   r)   )r°   r¿   r{   rÁ   Úmodelrx   s   &&$$  r   Ú_model_capsrÄ   ß   sV   € Ü�—�˜BÓ×%Ñ%Ó'€EßÙÜ˜cÓ"€JØÒŸkÜ  Ô6ˆ
Ø$.Ò$:ˆ:�>‰>˜%Ó ÐDÀÐDr   c               ó    € V ^8„  d   QhRRRR/# )r   r°   r�   r   rQ   r   )r   s   "r   r   r   é   s   € ÷ Eñ E˜+ð E¨$ñ Er   c                ó–   a € S P                  R 4      '       g   \        S 4      e   R# S P                  R R4       \        V 3R l4       R# )r“   NTc                 ó   <€ \        S R R7      # r¸   r¹   rº   s   €r   r»   Ú"_warm_caps_async.<locals>.<lambda>í   s   ø€ ¤{°3¸dÕ'Cr   )r)   r½   r¤   ro   rº   s   fr   Ú_warm_caps_asyncrÉ   é   s6   ø€ Ø
‡w�wˆ~×Ò¤,¨sÓ"3Ò"?ÙØ‡G�GˆN˜DÔ!ÜÔCÖDr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚproviderrÀ   r   rQ   r   )r   s   "r   r   r   ð   s   € ÷ Iñ I¨=ð I¸Tñ Ir   c                óâ   a€ R\         R\         R\         R\        /P                  \        T ;'       g    R4      P	                  4       P                  4       4      oSe   \        V3R l4       R# R# )a©  Force a background re-fetch of *provider*'s reasoning-capability catalog.

The in-memory cache is otherwise held for the process lifetime, so a route that flips to
reasoning-mandatory mid-process (GLM-5.3-flash, Sep 2026) keeps being sent disables it now
rejects. Called from the conversation loop's reasoning_mandatory recovery so the profile guard
is right again on the next request; no-op for providers without a catalog.
Únousznous-portalÚnousresearchÚ
openrouterrw   Nc                 ó   <€ \        S R R7      # r¸   r¹   rº   s   €r   r»   Ú.refresh_reasoning_caps_async.<locals>.<lambda>û   s   ø€ ¬;°sÀ$Õ+Gr   )Ú
_NOUS_CAPSÚ_OPENROUTER_CAPSr)   r   r    r!   ro   )rË   r°   s   &@r   Úrefresh_reasoning_caps_asyncrÔ   ð   s\   ø€ ð ”:˜}¬j¸.Ì*ØÔ)ð+ß+.©3¬s°8·>°>¸rÓ/B×/HÑ/HÓ/J×/PÑ/PÓ/RÓ+Sð à
‚Ü"Ô#GÖHñ r   z#https://openrouter.ai/api/v1/modelsÚ _openrouter_reasoning_caps_cacheÚ$_openrouter_reasoning_caps_failed_atÚ_openrouter_caps_disk_checkedÚ_openrouter_caps_warm_startedc                 ó   € \         # r   )Ú_OPENROUTER_CATALOG_URLr   r   r   r»   r»     s   € Õ#r   Ú_nous_reasoning_caps_cacheÚ_nous_reasoning_caps_failed_atÚ_nous_caps_disk_checkedÚ_nous_caps_warm_startedc                 ó   € \        4       # r   )Únous_catalog_urlr   r   r   r»   r»   
  s   € ÔÔr   )r•   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r     s   € ÷ Añ A˜#ñ Ar   c                 ó0   € ^ RI Hp  V ! 4       ^,           R2# )uº   The Portal ``/v1/models`` URL for the endpoint we actually talk to (``NOUS_INFERENCE_BASE_URL``
â†’ resolved credential base â†’ prod), so a staging profile reads staging's capabilities.©Ú!_resolve_nous_pricing_credentialsz
/v1/models)Úhermes_cli.models_pricingrä   rã   s    r   rà   rà     s   € õ LÙ/Ó1°!Õ4Ð5°ZÐ@Ð@r   r{   rÁ   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r   r¿   rÀ   r{   rE   rÁ   r”   r   r   r   )r   s   "r   r   r     s2   € ÷ ]ñ ]Øð]Ø).ð]ØCGð]àñ]r   c               ó&   € \        \        WVR7      # )u¨   Live-catalog reasoning capabilities for an OpenRouter model (tri-state, see module doc).
CACHE-ONLY by default â€” safe on per-request hot paths (never blocks on HTTP).©r{   rÁ   )rÄ   rÓ   ©r¿   r{   rÁ   s   &$$r   Ú'openrouter_model_reasoning_capabilitiesrë     s   € ô
 Ô'¨ÐP[Ô\Ð\r   c               ó(   € V ^8„  d   QhRRRRRRRR/# rç   r   )r   s   "r   r   r   #  s2   € ÷ Wñ WØðWØ).ðWØCGðWàñWr   c               ó&   € \        \        WVR7      # )z–Nous Portal counterpart of :func:`openrouter_model_reasoning_capabilities`; warm the cache
with :func:`warm_nous_reasoning_caps_async` from hot paths.ré   )rÄ   rÒ   rê   s   &$$r   Ú!nous_model_reasoning_capabilitiesrî   #  s   € ô
 ”z 8È+ÔVÐVr   c               ó   € V ^8„  d   QhRR/# r_   r   )r   s   "r   r   r   +  s   € ÷ 'ñ '¨dñ 'r   c                 ó$   € \        \        4       R# )zAWarm the OpenRouter reasoning-capability cache in the background.N)rÉ   rÓ   r   r   r   Ú$warm_openrouter_reasoning_caps_asyncrñ   +  s   € äÔ%Ö&r   c               ó   € V ^8„  d   QhRR/# r_   r   )r   s   "r   r   r   0  s   € ÷ !ñ !¨ñ !r   c                 ó$   € \        \        4       R# )zHNous Portal counterpart of :func:`warm_openrouter_reasoning_caps_async`.N)rÉ   rÒ   r   r   r   Úwarm_nous_reasoning_caps_asyncrô   0  s
   € ä”ZÖ r   i€Q )r­   )1rª   Ú
__future__r   rj   r…   Úloggingrf   rh   rD   Úurllib.requestr€   Údataclassesr   Úpathlibr   Útypingr   r   r   Ú	getLoggerrY   r(   r   rP   r   r/   rH   r6   r<   rN   r]   ro   rs   ry   r�   r�   r´   r½   rÄ   rÉ   rÔ   rÚ   rÓ   rÒ   rà   rë   rî   rñ   rô   r   r   r   Ú<module>rü      sg  ðñõ #ã Û Û Û 	Û Û Û Ý !Ý ß *Ñ *ð 
×	Ò	Ð.Ó	/€àˆC�˜$˜s C˜x�.Õ)Ð)Õ*€òõ
wð> $-Ð  õ?õ
?õ

KõJõ~õõõ(
:ñ �$Ô÷@ð @ó ð@ñ@È÷ ð õ"	õEõEõIð @Ð áØ&Ð(NØ#Ð%DÙ#óÐ ñ Ø Ð"BØÐ8Ù¨Dô€
õAð]Ø14ð]ØJO÷]ðWØ14ðWØJO÷Wõ'÷
!r   