+
    lHàj­¾  ã                   óØ  a € R� tl0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
Ht Rs] ^ k R R lt^ RIHt ^ RIHtHtHtHtHtHt ^ RIHtHtHtHtHtHtHt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,H-t- ]P\                  ! ]/4      t0]! R
RR7      t1Rs2Rs3]Ph                  ! 4       t5R t6R t7 ! R R]84      t9RR/R R llt:R R lt;R R lt<R t=R t>R R lt?R R lt@RR R!R R"R"/tAR‘R# R$ lltB]RR3R% ltC]RR3R& ltDR' R( ltER)R*0tFR+R,R-R,R.R//tGR0 R1 ltHR2 R3 ltIR4 R5 ltJR‘R6 R7 lltKR8 R9 ltLR: tM]RRRRRRRRR3
R; R< lltNR= R> ltOR? R@ ltPRARB/RC RD lltQRE RF ltR^ RGISHTtTHUtU RHRIRJRKRLRMRNRORPRMRQRJRR/R"RMRQRS]V! ]$4      RJRTRU]//RVRP.//tWRW RX ltXRY RZ ltYR’R[ R\ lltZR] R^ lt[R“R_ R` llt\Ra Rb lt]Rc Rd lt^R“Re Rf llt_RgR”/Rh Ri llt`Rj taRk Rl ltbRmRn.Ro^ RpRB/tcRq Rr ltdRMRQRJRs/teRtRMRQRS. R•ORJRv/RwRMRQRSRxRu.RJRy/RzRMRQRSR{R|.RJR}/R~RMRR€R–R�^dRJR‚/RƒRMRR€R–R�^dRJR„/R…RMRR€R–R�^dRJR†//tfRMRQRJR‡/tgRMRQRJRˆ/thRMR‰RJRŠ/tiR‹ RŒ ltj]TPÖ                  ! RIR�]W]a]R. RBRŽ]jR�7	       R# )—av  Image generation via FAL.ai (model picked in ``hermes tools``, persisted to ``image_gen.model``).

``_build_fal_payload()`` / ``_build_fal_edit_payload()`` translate unified inputs into the
``FAL_MODELS`` payload filtered to its ``supports`` whitelist so models never receive rejected
keys. Clarity upscaling is strictly per-call opt-in: default-on degraded text/CJK/faces.
N)ÚAnyÚDictÚOptionalc                ó$   € V ^8„  d   QhR\         /# ©é   Úreturn)r   )Úformats   "Ú@/home/ubuntu/.hermes/hermes-agent/tools/image_generation_tool.pyÚ__annotate__r      s   € ÷ ñ œ#ñ ó    c                 ó8   € \         f   ^ RIHp  V ! 4       s \         # )zZLazily import fal_client into the module global (idempotent; keeps a test-installed mock).©Úimport_fal_client)Ú
fal_clientÚtools.fal_commonr   r   s    r
   Ú_load_fal_clientr      s   € ô ÒÝ6Ù&Ó(ˆ
ÜÐr   )ÚDebugSession)Ú_ManagedFalSyncClientÚ_extract_http_statusÚ_managed_fal_billing_errorÚ_normalize_fal_queue_url_formatÚ(submit_managed_fal_with_rate_limit_retryÚwait_fal_queue_result)ÚDEFAULT_ASPECT_RATIOÚDEFAULT_MODELÚ
FAL_MODELSÚUPSCALER_CREATIVITYÚUPSCALER_DEFAULT_PROMPTÚUPSCALER_FACTORÚUPSCALER_GUIDANCE_SCALEÚUPSCALER_MODELÚUPSCALER_NEGATIVE_PROMPTÚUPSCALER_NUM_INFERENCE_STEPSÚUPSCALER_RESEMBLANCEÚUPSCALER_SAFETY_CHECKERÚVALID_ASPECT_RATIOS)Úresolve_managed_tool_gateway)ÚNOUS_MANAGED_PROVIDERÚfal_key_is_configuredÚmanaged_nous_tools_enabledÚ%nous_tool_gateway_unavailable_messageÚread_selectionÚselection_errorÚimage_toolsÚIMAGE_TOOLS_DEBUG)Úenv_varc                 ó  € \        R4      p V \        8X  d,   \        R4      pVf   \        \	        R\        R4      4      hV# V e)   \        4       '       d   R# \        \	        RV R4      4      h\        4       '       d   R# \        R4      # )u|  Managed gateway config for the stored `hermes tools` selection, or ``None`` for direct FAL.

``"nous"`` (or legacy ``use_gateway: true``) â†’ managed ONLY (unreachable = selection-naming
error, never a silent FAL_KEY fallback). Other stored provider â†’ direct ONLY (missing FAL_KEY
= error naming the selection). Never configured â†’ autodetect: direct if FAL_KEY, else managed.
Ú	image_genz	fal-queueNzDthe Nous Tool Gateway is not available (not entitled or unreachable)zFAL_KEY is not set)r,   r(   r'   Ú
ValueErrorr-   r)   )ÚselectedÚgateways     r
   Ú_resolve_managed_fal_gatewayr6   7   s�   € ô ˜kÓ*€HØÔ(Ô(Ü.¨{Ó;ˆØŠ?Üœ_ØÔ2ØVóXó Yð Yð ˆØÒÜ ×"Ò"ÙÜœ¨°hÐ@TÓUÓVÐVä(×*Ò*ˆ4ÐYÔ0LÈ[Ó0YÐYr   c                ó4  € V P                   P                  R4      V P                  3p\        ;_uu_ 4        \        e   \
        V8w  d-   \        \        4       V P                  V P                   R7      sVs\        uuRRR4       #   + '       g   i     R# ; i)zQReuse the managed FAL client so its internal httpx.Client is not leaked per call.Ú/N)ÚkeyÚqueue_run_origin)Úgateway_originÚrstripÚnous_user_tokenÚ_managed_fal_client_lockÚ_managed_fal_clientÚ_managed_fal_client_configr   r   )Úmanaged_gatewayÚclient_configs   & r
   Ú_get_managed_fal_clientrC   N   sv   € ð %×3Ñ3×:Ñ:¸3Ó?À×A`ÑA`Ða€Mß	!Ö	!ÜÒ&Ô*DÈÔ*Uä"7Ü Ó"¨×(GÑ(GØ!0×!?Ñ!?ô#AÐð *7Ð&Ü"÷ 
"×	!×	!Ó	!ús   ¶ABÂB	c                   ó   € ] tR t^\tRtRtR# )ÚImageGenerationInterruptedz=Raised when the user interrupts while a FAL job is in flight.© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__rF   r   r
   rE   rE   \   s   † ÝGr   rE   Úpoll_secondsg      à?c                ó$   € V ^8„  d   QhR\         /# )r   rM   )Úfloat)r	   s   "r
   r   r   `   s   € ÷ 1ñ 1¬uñ 1r   c               óJ  a aa€ ^ RI Hp . o. oVV V3R lp\        P                  ! VRRR7      pVP	                  4        VP                  4       '       d-   V! 4       '       d   \        R4      hVP                  VR7       KB  S'       d
   S^ ,          hS'       d
   S^ ,          # R# )	zòInterrupt-aware ``wait_fal_queue_result``: the wait blocks 30-60s, hiding user interrupts.

The get runs on a daemon worker; the interrupt bit is polled between join slices and on
interrupt the worker is abandoned (remote job keeps running).
)Úis_interruptedc                  ó’   <€  SP                  \        S4      4       R #   \         d   p SP                  T 4        R p ? R # R p ? ii ; i©N)Úappendr   ÚBaseException)ÚexcÚ	error_boxÚhandlerÚ
result_boxs    €€€r
   Ú_getÚ_wait_fal_result.<locals>._geti   s=   ø€ ð	"Ø×ÑÔ3°GÓ<Ö=øÜô 	"Ø×Ñ˜S×!Ò!ûð	"ús   ƒ ŸAªAÁATzfal-result-wait)ÚtargetÚdaemonÚnameuI   Image generation interrupted by user â€” abandoned the in-flight FAL job.)ÚtimeoutN)Útools.interruptrQ   Ú	threadingÚThreadÚstartÚis_aliverE   Újoin)rX   rM   rQ   rZ   ÚworkerrW   rY   s   f$   @@r
   Ú_wait_fal_resultrg   `   s‹   ú€ õ /Ø€JØ€I÷"ô
 ×Ò T°$Ð=NÔO€FØ
‡L�L„NØ
�/‰/×
Ò
Ù×ÒÜ,Ø[ó]ð ]à�‰˜LˆÖ)ßØ˜�lÐß&ˆ:�a�=Ð0¨DÐ0r   c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# )r   ÚmodelÚ	arguments©ÚstrÚdictr   )r	   s   "r
   r   r   z   s"   € ÷ ñ œsð ¬t´C¼°H­~ñ r   c           	     óê  a aa€ \        4        R\        \        P                  ! 4       4      /p\	        4       oSf   \
        P                  S SVR7      #  \        VVV 3R lRS R7      #   \         d   p\        T4      pTej   RTu;8:  d   R8  d[   M h \        TR	4      pTe   \        R
S  RT RT 24      ThRpTR9   d   R\        RRR7      ,           p\        R
S  RT RT 24      Thh Rp?ii ; i)zKSubmit a FAL request using direct credentials or the managed queue gateway.zx-idempotency-keyN©rj   Úheadersc                 ó>   <€ \        S4      P                  SSV R 7      # )ro   )rC   Úsubmit)rp   rj   rA   ri   s   &€€€r
   Ú<lambda>Ú%_submit_fal_request.<locals>.<lambda>ƒ   s#   ø€ Ô3°OÓD×KÑKØ °Gð Lô =r   zimage model)Úwhatr^   i�  iô  ri   z*Nous Subscription gateway rejected model 'z' (HTTP z): Ú z

úmanaged FAL image generationT)Úforce_freshuÓ   ). This model may not yet be enabled on the Nous Portal's FAL proxy. Either:
  â€¢ Set FAL_KEY in your environment to use FAL.ai directly, or
  â€¢ Pick a different model via `hermes tools` â†’ Image Generation.>   é‘  é’  é“  )r   rl   ÚuuidÚuuid4r6   r   rr   r   Ú	Exceptionr   r   r3   r+   )ri   rj   Úrequest_headersrV   ÚstatusÚbillingÚgateway_messagerA   s   ff     @r
   Ú_submit_fal_requestrƒ   z   s3  ú€ äÔØ*¬C´·
²
³Ó,=Ð>€OÜ2Ó4€OØÒÜ× Ñ  °)À_Ð ÓUÐUðÜ7ö=à Uô,ð 	,øô ô ô & cÓ*ˆØÒ #¨Ö"5°#Ö"5ð 	ô 1°°gÓ>ˆGØÒ"Ü Ø@ÀÀÀxÐPVÈxÐWZÐ[bÐZcÐdófØknðoà ˆOØ˜Ô(Ø"(Ô+PØ2Àô,Fõ #F�äØ<¸U¸GÀ8ÈFÈ8ð TXð #Ð#ð	%ó&ð
 ,/ð/ð 	ûð'ús   ÁA) Á)C2Á4A9C-Ã-C2c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   r9   r   )rl   r   )r	   s   "r
   r   r   �   s   € ÷ ñ œSð ¤X¬c¥]ñ r   c                óœ  €  ^ RI Hp V! 4       p\        V\        4      '       d   VP	                  R4      MRp\        V\        4      '       d   VP	                  V 4      MRp\        V\
        4      '       d'   VP                  4       '       d   VP                  4       # R#   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i)zIReturn the stripped ``image_gen.<key>`` string from config.yaml, or None.)Úload_configr2   NzCould not read image_gen.%s: %s)
Úhermes_cli.configr†   Ú
isinstancerm   Úgetrl   Ústripr~   ÚloggerÚdebug)r9   r†   ÚcfgÚsectionÚvaluerV   s   &     r
   Ú_read_image_gen_keyr�   �   s›   € ðBÝ1Ù‹mˆÜ*4°S¼$×*?Ò*?�#—'‘'˜+Ô&ÀTˆÜ$.¨w¼×$=Ò$=�—‘˜CÔ À4ˆÜ�eœS×!Ò! e§k¡k§m¢mØ—;‘;“=Ð ñ øô ô BÜ�‰Ð6¸×AÐAÙûðBús   ‚B
B ÂB ÂCÂ*CÃCc                 ó   € \        R4      # )z.``image_gen.model`` from config.yaml, or None.ri   ©r�   rF   r   r
   Ú_read_configured_image_modelr“   «   s   € ä˜wÓ'Ð'r   c                 ó   € \        R4      # )ua  ``image_gen.provider`` from config.yaml, or None (unset keeps the in-tree FAL fallback even
when other providers are registered; ``"fal"`` routes via ``plugins/image_gen/fal/``).

We only consult the plugin registry when this is explicitly set â€” an unset value keeps users on the
in-tree FAL fallback even when other providers happen to be registered (e.g. a user has OPENAI_API_KEY
set for other features but never asked for OpenAI image gen). ``"fal"`` explicitly routes through
``plugins/image_gen/fal/`` (which delegates back into this module's pipeline via call-time indirection â€”
see issue #26241).
Úproviderr’   rF   r   r
   Ú_read_configured_image_providerr–   °   s   € ô ˜zÓ*Ð*r   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   ©r   rl   )r	   s   "r
   r   r   ½   s   € ÷ ñ œx¬�}ñ r   c                 óH   € \        4       p V '       d   V R\        39   d   R# V # )zVConfigured provider that must go through the plugin registry; None for unset/fal/nous.ÚfalN)r–   r(   )Ú
configureds    r
   Ú_plugin_provider_namerœ   ½   s#   € ä0Ó2€Jß˜¨Ô/DÐ'EÔEÙØÐr   c                ó$   € V ^8„  d   QhR\         /# r   ©Útuple)r	   s   "r
   r   r   Å   s   € ÷ *ñ *œEñ *r   c                 ó  € \        R4      ;'       g&    \        P                  ! RR4      P                  4       p V '       d)   V \        9  d   \
        P                  RV \        4       Rp T ;'       g    \        p V \        V ,          3# )znReturn ``(model_id, meta)`` for the configured FAL model, falling back to DEFAULT_MODEL (warned) when unknown.ri   ÚFAL_IMAGE_MODELrv   z4Unknown FAL model '%s' in config; falling back to %sN)r�   ÚosÚgetenvrŠ   r   r‹   Úwarningr   )Úmodel_ids    r
   Ú_resolve_fal_modelr¦   Å   si   € ô # 7Ó+×WÐW¬r¯yªyÐ9JÈBÓ/O×/UÑ/UÓ/W€Hß�H¤JÔ.Ü�‰ÐMÈxÔYfÔgØˆØ×(Ð(œ=€HØ”Z Õ)Ð)Ð)r   Úimage_size_presetÚ
image_sizeÚgpt_literalÚaspect_ratioc                óF   € V ^8„  d   QhR\         \        \        3,          /# r   ©rm   rl   r   )r	   s   "r
   r   r   Ô   s#   € ÷ Pñ PÔX\Ô]`ÔbeÐ]eÕXfñ Pr   c                ó.  € \         V ,          pVRJpV'       d$   VP                  R4      ;'       g    \        4       MVR,          pVR,          p	T;'       g    \        P	                  4       P                  4       p
W©9  d   \        p
\        VP                  R/ 4      4      pT;'       g    RP                  4       VR&   R0pV'       dU   VP                  R4      ;'       g    R	pVR	8w  d   \        \        V4      4      M
\        V4      W½&   VP                  V4       \        P                  VR
,          4      pVf   V'       g   \        RVR
,          : 24      hVe   V'       d   Wè9   d   Wš,          W¾&   \        V\        4      '       d   W;R&   TP                  T;'       g    / P!                  4        UUu/ uF  w  ppVf   K  VVbK  	  upp4       VP!                  4        UUu/ uF  w  ppWø9   g	   Wü9   g   K  VVbK  	  upp# u uppi u uppi )a�  Text-to-image / edit payload (``image_urls`` selects edit mode): defaults + native size
spec + overrides, filtered to the model whitelist.

Edit endpoints mostly auto-infer size, so the size key is sent only when ``edit_supports``
lists it. ``prompt`` (and the source-image key on edits) survive a whitelist gap: every FAL
endpoint requires them, so a catalog mistake can't send a broken request.
NÚedit_supportsÚsupportsÚsizesÚdefaultsrv   ÚpromptÚedit_image_paramÚ
image_urlsÚ
size_stylezUnknown size_style: Úseed)r   r‰   Úsetr   ÚlowerrŠ   rm   ÚnextÚiterÚlistÚaddÚ_SIZE_KEY_BY_STYLEr3   rˆ   ÚintÚupdateÚitems)r¥   r²   rª   r¶   Ú	overridesr´   ÚmetaÚeditr¯   r°   ÚaspectÚpayloadÚrequiredÚimage_paramÚsize_keyÚkÚvs   &&&&&&           r
   Ú_build_payloadrË   Ô   sº  € ô �hÕ€DØ˜TÐ!€Dß7;�—‘˜Ó)×2Ð2¬S«UøÀÀjÕAQ€HØ��M€EØ×2Ð2Ô2×9Ñ9Ó;×AÑAÓC€FØÔÜ%ˆÜ" 4§8¡8¨J¸Ó#;Ó<€GØŸ˜ 2×,Ñ,Ó.€GˆHÑØˆz€HßØ—h‘hÐ1Ó2×BÐB°lˆØ9DÈÔ9Tœt¤D¨Ó$4Ô5ÔZ^Ð_iÓZjˆÑØ�‰�[Ô!Ü!×%Ñ% d¨<Õ&8Ó9€HØÒ§ÜÐ/°°\Õ0BÑ/EÐFÓGÐGØÒ§T¨XÔ-AØ!�MˆÑÜ�$œ×ÒØ�‰Ø‡N�N i§o o°2×%<Ñ%<Ô%>ÔPÑ%>™T˜Q À!”D�A�q’DÑ%>ÒPÔQØ$Ÿ]™]œ_ÔO™_‘T�Q˜°´ÀÁŒDˆAˆqŠD™_ÒOÐOùó QùÛOs   Æ:	H
ÇH
Ç*HÈ Hc                ó   € \        WW#V4      # )z?FAL text-to-image payload for ``model_id`` from unified inputs.©rË   )r¥   r²   rª   r¶   rÁ   s   &&&&&r
   Ú_build_fal_payloadrÎ   õ   s   € ä˜(¨LÀ	ÓJÐJr   c           	     ó   € \        WW4WRR7      # )z\FAL *edit* (image-to-image) payload: ``image_urls`` + prompt, filtered to ``edit_supports``.)r´   rÍ   )r¥   r²   r´   rª   r¶   rÁ   s   &&&&&&r
   Ú_build_fal_edit_payloadrÐ   ú   s   € ô ˜(¨LÀ	ÔaÐar   c          	      ót   € V ^8„  d   QhR\         R\         R\        \        \         \        3,          ,          /# )r   Ú	image_urlÚoriginal_promptr   )rl   r   rm   r   )r	   s   "r
   r   r     s.   € ÷ ñ œcð ´Cð ¼HÄTÌ#ÌsÈ(Å^Õ<Tñ r   c                ó†  €  \         P                  R4       \        \        RV R\         RV 2R\
        R\        R\        R\        R	\        R
\        R\        /	R7      p\        V4      pV'       d   RV9   dx   VR,          p\         P                  RVP                  RR4      VP                  RR4      4       RVR,          RVP                  R^ 4      RVP                  R^ 4      RRR\
        /# \         P                  R4       R#   \         d    h \          d$   p\         P                  RTRR7        Rp?R# Rp?ii ; i)zPUpscale via FAL's Clarity Upscaler; None on failure (caller keeps the original).z(Upscaling image with Clarity Upscaler...rÒ   r²   z, Úupscale_factorÚnegative_promptÚ
creativityÚresemblanceÚguidance_scaleÚnum_inference_stepsÚenable_safety_checker©rj   Úimagez$Image upscaled successfully to %sx%sÚwidthÚunknownÚheightÚurlÚupscaledTz"Upscaler returned invalid responseNzError upscaling image: %s©Úexc_info)r‹   Úinforƒ   r!   r   r   r"   r   r$   r    r#   r%   rg   r‰   ÚerrorrE   r~   )rÒ   rÓ   rX   ÚresultÚupÚes   &&    r
   Ú_upscale_imagerê     s3  € ðÜ�‰Ð>Ô?Ü%¤nØ˜ HÔ1HÐ0IÈÈOÐK\Ð.]ØœoÐ/@ÔBZØÔ-¨}Ô>RØÔ5Ø!Ô#?Ø#Ô%<ðA>ô ?ˆô " 'Ó*ˆß�g Ô'Ø˜•ˆBÜ�K‰KÐ>ØŸ™˜w¨	Ó2°B·F±F¸8ÀYÓ4OôQð �r˜%•y '¨2¯6©6°'¸1Ó+=¸xÈÏÉÐPXÐZ[ÓI\Ø˜DÐ"2´OðEð Eô 	�‰Ð9Ô:ÙøÜ%ô àÜô Ü�‰Ð0°!¸dˆÔCÝûðús$   ‚C-D Ã0D ÄE ÄE ÄD;Ä;E ÚDockerEnvironmentÚModalEnvironmentÚdockerú/root/.hermesÚmodalÚsshz	~/.hermesc                ó0   € V ^8„  d   QhR\         R\        /# )r   r�   r   ©rl   Úbool)r	   s   "r
   r   r   %  s   € ÷ eñ e¬#ð e´$ñ er   c                 óF  € V '       d<   \        V \        4      '       d&   V P                  4       P                  R4      '       d   R# \        P
                  P                  V 4      ;'       g7    \        V 4      ^8¬  ;'       d!    V ^,          R8H  ;'       d    V ^,          R9   # )úhttp://FÚ:)rõ   zhttps://zdata:>   r8   Ú\)rˆ   rl   r¸   Ú
startswithr¢   ÚpathÚisabsÚlen)r�   s   &r
   Ú_looks_like_absolute_file_pathrü   %  sq   € ßœ
 5¬#×.Ò.°%·+±+³-×2JÑ2JÐKk×2lÒ2lÙÜ�7‰7�=‰=˜Ó×dÐd¤C¨£J°!¡O×$cÐ$c¸¸a½ÀC¹×$cÐ$cÈEÐRSÍHÐXcÑLcÐdr   c                ó2   € V ^8„  d   QhR\         R,          /# )r   Útask_idN©rl   )r	   s   "r
   r   r   +  s   € ÷ ñ ¤#¨¥*ñ r   c                 ó’   €  ^ RI Hp T! T ;'       g    R4      #   \         d"   p\        P	                  RT4        Rp?R# Rp?ii ; i)é    )Úget_active_envÚdefaultz1Could not inspect active terminal environment: %sN)Útools.terminal_tool_lifecycler  r~   r‹   rŒ   )rþ   r  rV   s   &  r
   Ú_active_terminal_envr  +  s?   € ðÝ@Ù˜g×2Ð2¨Ó3Ð3øÜô Ü�‰ÐHÈ#ÔNÝûðús   ‚ “ šA¥AÁAc                ó>   € V ^8„  d   QhR\         R\        R,          /# )r   Úenvr   N)r   rl   )r	   s   "r
   r   r   4  s   € ÷ /ñ /¤3ð /¬3°­:ñ /r   c                 ó0  € V e�   \        V RR 4      p\        V4      '       d,    V! 4       pV'       d   \        V4      P                  R4      #  \        V RR 4      pV'       d   \        V4      P                  R4       R2# V P                  P                  \        9   d   R# ^ RI
Hp V! R4      ;'       g    R	P                  4       P                  4       p\        P                  V4      #   \         d!   p\
        P                  RT4        R p?LÂR p?ii ; i)
NÚagent_visible_cache_baser8   z.active env agent_visible_cache_base failed: %sÚ_remote_homez/.hermesrî   ©Úterminal_envÚTERMINAL_ENVÚlocal)ÚgetattrÚcallablerl   r<   r~   r‹   rŒ   Ú	__class__rG   Ú_CONTAINER_HOME_ENVSÚtools.terminal_scoper  rŠ   r¸   Ú_CACHE_BASE_BY_BACKENDr‰   )r  Úexplicitr�   rV   Úremote_homer  Úbackends   &      r
   Ú_agent_cache_base_for_envr  4  sð   € Ø
‚ä˜3Ð :¸DÓAˆÜ�H×ÒðTÙ ›
�ßÜ˜u›:×,Ñ,¨SÓ1Ð1ð ô ˜c >°4Ó8ˆßÜ˜+Ó&×-Ñ-¨cÓ2Ð3°8Ð<Ð<Ø�=‰=×!Ñ!Ô%9Ô9Ù"Ý1Ù˜NÓ+×6Ð6¨w×=Ñ=Ó?×EÑEÓG€GÜ!×%Ñ% gÓ.Ð.øô ô TÜ—‘ÐMÈs×SÑSûðTús   ¤C* ³C* Ã*DÃ5DÄDc                óJ   € V ^8„  d   QhR\         R\         R,          R\         /# )r   Úrawrþ   Nr   rÿ   )r	   s   "r
   r   r   I  s&   € ÷  3ñ  3¬Cð  3¼#À½*ð  3ÔPSñ  3r   c                óT  €  \        V \        4      '       d   \        P                  ! V 4      MT p\        T\
        4      '       d   TP                  R4      '       g   T # TP                  R4      p\        T\        4      '       d   \        T4      '       g   T # \        T4      p\        T4      pT'       g   T #  ^ RI
Hp T! Y5R7      pT'       d   Ys8X  d   T # \        TRR4      p	T	e    T	P                  RR	7       TP#                  RT4       TP#                  RT4       \        P$                  ! TRR7      #   \         d    T u # i ; i  \         d#   p\        P                  RT4       T u Rp?# Rp?ii ; i  \         d!   p\        P!                  R
T4        Rp?L¥Rp?ii ; i)z§Annotate successful local results: ``image`` stays the host/gateway-deliverable path;
``agent_visible_image`` is the same file as seen by a non-local terminal backend.ÚsuccessrÝ   )Úmap_cache_path_to_container)Úcontainer_basez4Could not translate image cache path for backend: %sNÚ_sync_managerT©Úforcez1Could not force-sync generated image artifact: %sÚ
host_imageÚagent_visible_imageF)Úensure_ascii)rˆ   rl   ÚjsonÚloadsr~   rm   r‰   rü   r  r  Útools.credential_filesr  r‹   rŒ   r  Úsyncr¤   Ú
setdefaultÚdumps)
r  rþ   rÅ   rÝ   r  Ú
cache_baser  Ú
agent_pathrV   Úsync_managers
   &&        r
   Ú"_postprocess_image_generate_resultr.  I  sl  € ðÜ%/°´S×%9Ò%9”$—*’*˜S”/¸sˆô �gœt×$Ò$¨G¯K©K¸	×,BÒ,BØˆ
Ø�K‰K˜Ó €EÜ�eœS×!Ò!Ô)GÈ×)NÒ)NØˆ
Ü
˜wÓ
'€CÜ*¨3Ó/€JßØˆ
ðÝFÙ0°ÔRˆ
÷ ˜Ô,Øˆ
Ü˜3 °Ó6€LØÒð	UØ×Ñ DÐÔ)ð ×Ñ�| UÔ+Ø×ÑÐ,¨jÔ9Ü�:Š:�g¨EÔ2Ð2øô7 ô ØŠ
ðûô ô Ü�‰ÐKÈSÔQØ�
ûðûô ô 	UÜ�N‰NÐNÐPS×TÑTûð	UúsG   ‚.D9 Â:E Ã+E< Ä9E	ÅE	ÅE9ÅE4Å.E9Å4E9Å<F'ÆF"Æ"F'c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r   ÚimagesÚshould_upscaler²   r   )r»   ró   rl   )r	   s   "r
   r   r   m  s(   € ÷ ñ œ4ð ´ð ¼sð Ätñ r   c                óŒ  € . pV  F»  p\        V\        4      '       d   RV9   g   K"  V'       dR   \        VR,          VP                  4       4      pV'       d   VP	                  V4       Kf  \
        P                  R4       VP	                  RVR,          RVP                  R^ 4      RVP                  R^ 4      RR/4       K½  	  V# )zfNormalize FAL result images, optionally chaining the upscaler (falls back to the original on failure).rá   z1Using original image as fallback (upscale failed)rÞ   rà   râ   F)rˆ   rm   rê   rŠ   rT   r‹   r¤   r‰   )r0  r1  r²   Ú	formattedÚimgrâ   s   &&&   r
   Ú_format_imagesr5  m  s©   € à€IÛˆÜ˜3¤×%Ò%¨%°3¬,ÙßÜ% c¨%¥j°&·,±,³.ÓAˆHßØ× Ñ  Ô*ÙÜ�N‰NÐNÔOØ×ÑØ�3�u•:˜w¨¯©°¸Ó(;¸XÀsÇwÁwÈxÐYZÓG[Ø˜ðö 	 ñ ð Ðr   c           	     óR  € \        V\        4      '       d   VP                  4       '       g   \        R4      h\	        4       '       g$   \        4       '       g   \        \        4       4      hVP                  R4      VP                  RV 4      r‡V'       d   V'       g   \        RV RV  R24      hT;'       g    \        P                  4       P                  4       p	V	\        9  d"   \        P                  RV\        4       \        p	V'       dl   \        VP                  R4      ;'       g    ^4      p
V
^ 8”  d   VR	V
 MTp\        WW¹WER
7      p\        P                  RW‡\!        V4      VR,          4       W|3# \#        WW”VR
7      p\        P                  RW€VR,          4       W3# )zeValidate inputs and return ``(endpoint, arguments)``; raises ValueError with the user-facing message.z1Prompt is required and must be a non-empty stringÚedit_endpointÚdisplayzModel 'z' (u¦   ) is not capable of image-to-image / editing. Provide a text-only prompt (omit image_url), or switch to an edit-capable model via `hermes tools` â†’ Image Generation.z-Invalid aspect_ratio '%s', defaulting to '%s'Úmax_reference_imagesN)r¶   rÁ   u=   Editing image with %s (%s) â€” %d source image(s), prompt: %s:NéP   Nu,   Generating image with %s (%s) â€” prompt: %s)rˆ   rl   rŠ   r3   r)   r6   Ú_build_no_backend_setup_messager‰   r   r¸   r&   r‹   r¤   r¾   rÐ   rå   rû   rÎ   )r¥   rÂ   r²   rª   r¶   rÁ   Úsource_imagesr7  r8  Ú	aspect_lcÚmax_refsÚclamped_sourcesrj   s   &&&&&&&      r
   Ú_prepare_fal_requestr@    sl  € ä�fœc×"Ò"¨&¯,©,¯.ª.ÜÐLÓMÐMô "×#Ò#Ô'C×'EÒ'EÜÔ8Ó:Ó;Ð;Ø!ŸX™X oÓ6¸¿¹ÀÈHÓ8U�7çŸ]ÜØ�g�Y˜c ( ð ,7ð 8ó9ð 	9ð ×5Ð5Ô!5×<Ñ<Ó>×DÑDÓF€IØÔ+Ô+Ü�‰ÐFÈÔVjÔkÜ(ˆ	ßä�t—x‘xÐ 6Ó7×<Ð<¸1Ó=ˆØ6>À´l˜-¨	¨Ñ2ÈˆÜ+Ø˜o¸tôZˆ	ä�‰ÐSØ¬C°Ó,@À&ÈÅ+ô	OàÐ'Ð'Ü" 8°YÐU^Ô_€IÜ
‡K�KÐ>ÀÐSYÐZ]ÕS^Ô_ØÐÐr   c                ón  € V ^8„  d   QhR\         R\         R\        \        ,          R\        \        ,          R\        \        ,          R\        \         ,          R\        \        ,          R\        \         ,          R	\        \        ,          R
\        \
        ,          R\        \         ,          R\         /# )r   r²   rª   rÚ   rÙ   Ú
num_imagesÚoutput_formatr¶   rÒ   Úreference_image_urlsÚupscaleÚ	fal_modelr   )rl   r   r¾   rO   r»   ró   )r	   s   "r
   r   r      s½   € ÷ Hjñ HjÜðHjÜ"ðHjä!¤#�ðHjä?GÌ½ðHjô œ•ðHjô 6>¼cµ]ðHjô ”3�-ð	Hjô ,4´C­=ð	Hjô
 #¤4�.ðHjô
 ;CÄ4½.ðHjô œ�}ðHjô ),ñHjr   c                óè  a!€ V
\         9   d   T
\         V
,          rËM\        4       w  r¼\        V\        \        34      '       d   TM. pV.VO Uu. uFC  p\        V\
        4      '       g   K  VP                  4       '       g   K3  VP                  4       NKE  	  pp\        V4      ;'       d    \        VP                  R4      4      pV'       d   RMRpRVRVRVRV/pRVR	R
V RV/VCRVRVR\        V4      /CRRRRR^ R^ /o!\        P                  P                  4       pR V!3R llp \        Y¼YTVP                  4        UUu/ uF  w  ppVf   K  VVbK  	  uppV4      w  pp\        \        VVR7      4      p\        P                  P                  4       V,
          P!                  4       pV'       d   RV9  d   \#        R4      hVP                  R. 4      pV'       g   \#        R4      hV	e   \        V	4      pM*\        VP                  RR4      4      ;'       d    V'       * p\%        VVV 4      pV'       g   \#        R4      h\'        R V 4       4      p\(        P+                  R\        V4      VVVV4       RS!R&   \        V4      S!R&   V! VRRRV^ ,          R ,          RVR!\        V^ ,          P                  R!4      4      /4      # u upi u uppi   \,         dŽ   pR"T: 2p \(        P/                  R#T RR$7       T S!R&   \        P                  P                  4       T,
          P!                  4       pT! TRRRRR\        T4      R%\1        T4      P2                  /4      u Rp?# Rp?ii ; i)&a+  Generate (or, with source images + an ``edit_endpoint`` model, edit) an image via FAL.

Extra kwargs are overrides filtered per-model via ``supports`` / ``edit_supports`` (dropped
silently so callers survive model switches). Returns JSON ``{"success", "image", "modality",
"error", "error_type"}``.
r7  rÝ   ÚtextrÚ   rÙ   rB  rC  ri   Ú
parametersr²   rª   r¶   Úmodalityr<  ræ   Nr  FÚimages_generatedÚgeneration_timec                ó^   € V ^8„  d   QhR\         R\        \        \        3,          R\        /# )r   rL  Úresponser   )rO   rm   rl   r   )r	   s   "r
   r   Ú)image_generate_tool.<locals>.__annotate__¿  s.   € ÷ Bñ B¤ð B´´c¼3°hµð BÄCñ Br   c                 ó”   <€ V SR &   \         P                  RS4       \         P                  4        \        P                  ! V^RR7      # )rL  Úimage_generate_toolF)Úindentr$  )Ú_debugÚlog_callÚsaver%  r*  )rL  rN  Údebug_call_datas   &&€r
   ÚfinishÚ#image_generate_tool.<locals>.finish¿  s9   ø€ Ø-<ˆÐ)Ñ*Ü�‰Ð-¨Ô?Ü�‰ŒÜ�zŠz˜(¨1¸5ÔAÐAr   rÜ   r0  u7   Invalid response from FAL.ai API â€” no images returnedzNo images were generatedrE  z%No valid image URLs returned from APIc              3   óV   "  € T F  qP                  R 4      '       g   K  ^x € K!  	  R# 5i)râ   N)r‰   )Ú.0r4  s   & r
   Ú	<genexpr>Ú&image_generate_tool.<locals>.<genexpr>Ø  s   é € ÐRÑ*: 3¿g¹gÀj×>QŸQšQÓ*:ùs   ‚)Ÿ
)z8Generated %s image(s) in %.1fs (%s upscaled) via %s [%s]Trá   râ   zError generating image: z%srã   Ú
error_type)r   r¦   rˆ   r»   rŸ   rl   rŠ   ró   r‰   rû   ÚdatetimeÚnowr@  rÀ   rg   rƒ   Útotal_secondsr3   r5  Úsumr‹   rå   r~   ræ   ÚtyperG   )"r²   rª   rÚ   rÙ   rB  rC  r¶   rÒ   rD  rE  rF  r¥   rÂ   ÚrefsÚcr<  Úuse_editrJ  rÁ   Ú
start_timerW  rÉ   rÊ   Úendpointrj   rç   rL  r0  r1  Úformatted_imagesÚupscaled_countré   Ú	error_msgrV  s"   &&&&&&&&&&&                      @r
   rQ  rQ     sq  ø€ ð ”JÔØ"¤J¨yÕ$9‘$ä+Ó-‰ˆÜ#-Ð.BÄTÌ5ÀM×#RÒ#RÑÐXZ€DØ)2Ð(:°TÑ(:Ó_Ñ(: 1¼jÈÌC×>P”YÐUV×U\ÑU\×U^”Y�Q—W‘W–YÑ(:€MÐ_Ü�MÓ"×FÐF¤t¨D¯H©H°_Ó,EÓ'F€Hß"‰w¨€HàÐ2Ð4DÀnØ�j /°=ð!B€Ið 	�Ø�x ¨¸ð RÈð RÐTZÐ\`Ø! 8¨_¼cÀ-Ó>PñRà��y %Ð);¸QÐ@QÐSTð	V€Oô
 ×"Ñ"×&Ñ&Ó(€J÷Bð Bð
$jÜ2Ø˜F°$Ø'Ÿo™oÔ/ÔAÑ/‘d�a˜°1ŒTˆQ�ŠTÑ/ÒAÀ=óRÑˆ�)ô "Ô"5°hÈ)Ô"TÓUˆÜ#×,Ñ,×0Ñ0Ó2°ZÕ?×NÑNÓPˆß˜¨Ô/ÜÐVÓWÐWØ—‘˜H bÓ)ˆßÜÐ7Ó8Ð8ð ÒÜ! '›]‰Nä! $§(¡(¨9°eÓ"<Ó=×NÐNÀhÄ,ˆNÜ)¨&°.À&ÓIÐßÜÐDÓEÐEÜÑRÑ*:ÓRÓRˆÜ�‰ÐNÜÐ(Ó)¨?¸NÈHÐV^ô	`à%)ˆ˜	Ñ"Ü.1Ð2BÓ.CˆÐ*Ñ+Ù�oØ�tØÐ% aÕ(¨Õ/Ø˜ØœÐ-¨aÕ0×4Ñ4°ZÓ@ÓAð	(Có Dð 	DùòW `ùó* Bøô6 ô jØ.¨q©eÐ4ˆ	Ü�‰�T˜9¨tˆÔ4Ø#,ˆ˜Ñ Ü#×,Ñ,×0Ñ0Ó2°ZÕ?×NÑNÓPˆÙ�oØ  %¨°$¸ÄÀQÃÈÔW[Ð\]ÓW^×WgÑWgÐhójõ 	jûðjúsW   ÁKÁ,KÂKÄ*K Å	KÅKÅBK Ç#<K È B-K ËK ËM1Ë$BM,Í&M1Í,M1c                ó$   € V ^8„  d   QhR\         /# r   ©ró   )r	   s   "r
   r   r   ë  s   € ÷ 
4ñ 
4œ4ñ 
4r   c                 óv   €  \        4       p \        T 4      ;'       g    \        4       #   \         d     R# i ; i)zæTrue if the selected FAL backend (never configured: any FAL backend) is available.

A stored-but-broken selection reports False here (registry gating); the naming error
surfaces at call time from ``_resolve_managed_fal_gateway``.
F)r6   r3   ró   r)   )r5   s    r
   Úcheck_fal_api_keyrn  ë  s;   € ðÜ.Ó0ˆô �‹=×3Ð3Ô1Ó3Ð3øô ô Úðús   ‚
) ©8·8c                ó$   € V ^8„  d   QhR\         /# r   rÿ   )r	   s   "r
   r   r   ø  s   € ÷ ñ ¬ñ r   c                 óN  € \        4       p . ROpV '       d   VP                  R4       M8VP                  R4       \        R4      ;p'       d   VP                  RV 24       V. R	O,          pV '       d   VP                  R4       VP                  R4       RP                  V4      # )
zXActionable no-backend error: FAL_KEY signup, managed-gateway status, plugin alternative.zA  - FAL_KEY is not set and the managed FAL gateway is unreachablez+  - FAL_KEY environment variable is not setrw   z  - zX  2. Sign in to a Nous account that has the managed FAL gateway enabled (`hermes setup`)u‹     3. Configure a different image_gen provider via `hermes tools` â†’ Image Generation (run `hermes plugins list` to see installed backends)Ú
)z4Image generation is unavailable in this environment.rv   zMissing requirements:)rv   z&To enable image generation, do one of:z_  1. Get a free API key at https://fal.ai and set FAL_KEY=<your-key> (then restart the session))r*   rT   r+   re   )ÚmanagedÚlinesr‚   s      r
   r;  r;  ø  s˜   € ä(Ó*€GÚa€EßØ�‰ÐXÕYà�‰ÐBÔCÜCÐDbÓcÐcˆ?ÖcØ�L‰L˜4 Ð0Ð1Ô2Ø	ò ,õ ,€E÷ Ø�‰ð (ô 	)à	‡L�Lð Iô Jà�9‰9�UÓÐr   r!  Fc                ó0   € V ^8„  d   QhR\         R\        /# )r   r^   r!  rò   )r	   s   "r
   r   r     s   € ÷ ñ œsð ¬dñ r   c               ó\   € ^ RI Hp ^ RIHp V'       d   V! RR7       MV! 4        V! V 4      # )zpDiscover plugins (local import: importing this module must not trigger discovery) and return the named provider.)Úget_provider)Ú_ensure_plugins_discoveredTr   )Úagent.image_gen_registryrv  Úhermes_cli.pluginsrw  )r^   r!  rv  rw  s   &$  r
   Ú_get_plugin_providerrz    s$   € å5Ý=ßÙ"¨Ö.á"Ô$Ù˜ÓÐr   c                ó$   € V ^8„  d   QhR\         /# r   rl  )r	   s   "r
   r   r     s   € ÷ 6ñ 6¬Tñ 6r   c                 óÜ   €  \        4       '       d   \        4        R#  \        4       p V f   R# \	        V 4      p\        T;'       d    VP                  4       4      #   \         d     LKi ; i)zDTrue if FAL or the explicitly configured image backend is available.TF)rn  r   ÚImportErrorrœ   rz  ró   Úis_available)r›   r•   s     r
   Ú#check_image_generation_requirementsr    sk   € ðÜ×ÒäÔÙð ô 'Ó(€JØÒÙä# JÓ/€HÜ�×4Ð4˜X×2Ñ2Ó4Ó5Ð5øô ô Ùðús   ‚A ÁA+Á*A+)ÚregistryÚ
tool_errorr^   Úimage_generateÚdescriptionzoGenerate images from text prompts. The active model's edit/reference capabilities are rendered at serving time.rI  rb  ÚobjectÚ
propertiesr²   Ústringz€The text prompt describing the desired image (text-to-image) or the edit to apply (image-to-image). Be detailed and descriptive.ÚenumzlThe aspect ratio of the generated image. 'landscape' is 16:9 wide, 'portrait' is 16:9 tall, 'square' is 1:1.r  rÆ   c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   ræ   r]  r   rÿ   )r	   s   "r
   r   r   P  s&   € ÷ cñ cœ3ð c¬Cð c´Cñ cr   c           
     ó>   € \         P                  ! RRRRRV RV/4      # )zCJSON error envelope shared by every provider-dispatch failure path.r  FrÝ   Nræ   r]  )r%  r*  )ræ   r]  s   &&r
   Ú_provider_errorrŠ  P  s#   € ä�:Š:�y %¨°$¸ÀÈÐV`ÐaÓbÐbr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úcontract_errorr   rÿ   )r	   s   "r
   r   r   U  s   € ÷ ñ ¬Sð ´Sñ r   c                ór   € \        V \        4      '       g   \        VR4      # \        P                  ! V 4      # )zLJSON-encode a provider's dict result; anything else is a contract violation.Úprovider_contract)rˆ   rm   rŠ  r%  r*  )rç   rŒ  s   &&r
   Ú_provider_resultr�  U  s,   € ä�fœd×#Ò#Ü˜~Ð/BÓCÐCÜ�:Š:�fÓÐr   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r   r¬   )r	   s   "r
   r   r   \  s    € ÷ ñ ÔimÔnqÔsvÐnvÕiwñ r   c                ó.  € V'       d   W@R&   V'       d   V P                  V4       \        V\        4      '       d*   VP                  4       '       d   VP                  4       V R&   Ve   ^ RIHp V! V4      pV'       d   WpR&   Ve   \        V4      V R&   V # )z^Add the optional ``provider.generate(**kwargs)`` args in place (edit args only when supplied).ri   rÒ   )Únormalize_reference_imagesrD  rE  )r¿   rˆ   rl   rŠ   Úagent.image_gen_providerr’  ró   )ÚkwargsrÒ   rD  rE  ri   Úcontrolsr’  Ú	norm_refss   &&&&&&  r
   Ú_add_provider_kwargsr—  \  s~   € çØˆw‰ßØ�‰�hÔÜ�)œS×!Ò! i§o¡o×&7Ò&7Ø'Ÿo™oÓ/ˆˆ{ÑØÒ'ÝGÙ.Ð/CÓDˆ	ßØ-6Ð)Ñ*ØÒÜ  ›MˆˆyÑØ€Mr   c                ó    € V ^8„  d   QhR\         \        \        \        3,          ,          R\         \        \        \        3,          ,          /# )r   r•  r   )r   rm   rl   r   )r	   s   "r
   r   r   n  s=   € ÷ Yñ Y¬8´D¼¼c¸µNÕ+Cð YÌÔQUÔVYÔ[^ÐV^ÕQ_ÕH`ñ Yr   c                ó  € V'       g   R#  V P                  4       ;'       g    / P                  R4      ;'       g    RpTP                  4        UUu/ uF  w  r4Y29   g   K  Y4bK  	  upp;'       g    R#   \         d     R# i ; iu uppi )a  The subset of ``controls`` that ``provider`` declares in ``creative_controls``.

A model can still send a control the current schema no longer offers (it copies earlier turns
after the backend changed), and a third-party ``generate()`` without ``**kwargs`` would raise.NÚcreative_controlsrF   )Úcapabilitiesr‰   r~   rÀ   )r•   r•  Údeclaredr^   r�   s   &&   r
   Ú_declared_controlsr�  n  sƒ   € ÷
 ÙðØ×)Ñ)Ó+×1Ð1¨r×6Ñ6Ð7JÓK×QÐQÈrˆð ,4¯>©>Ô+;ÔPÑ+;™K˜D¸tÑ?OŒKˆDŠKÑ+;ÒP×XÐXÐTXÐXøô ô ÚðüãPs'   ŒA5 £A5 ¼A5 Á
BÁ!BÁ5BÂBc                óÚ   € V ^8„  d   QhR\         R\         R\        \         ,          R\        \        ,          R\        \        ,          R\        \        \         \
        3,          ,          /# )r   r²   rª   rÒ   rD  rE  r•  ©rl   r   r»   ró   rm   r   )r	   s   "r
   r   r   |  s_   € ÷ .Kñ .KÜð.KÜ"ð.KÜ/7¼­}ð.Kä"¤4�.ð.Kä:BÄ4½.ð.Kô ”tœC¤˜H•~Õ&ñ.Kr   c                ó  € \        4       pVf   R#  \        V4      pTf    \        TRR7      pTf   \        RT R2R4      # \        TR	R
4      p	RT RT/p
 \        Y¢Y4\        4       \        Yu4      R7       TP                  ! R/ T
B p\        TR4      #   \         d"   p\        P	                  RT4        Rp?R# Rp?ii ; i  \         d!   p\        P	                  RT4        Rp?L»Rp?ii ; i  \         d�   p\        T\        4      pT'       d:   RT
9   g   RT
9   d,   \        P                  RY˜4       \        RT	 R2R4      u Rp?# \        P                  RT	T'       d   RMRT4       \        RT	 RT 2R4      u Rp?# Rp?ii ; i)z¾JSON result from the selected plugin provider, or ``None`` to fall through to in-tree FAL
(provider unset / ``"fal"`` / ``"nous"``). Providers without ``upscale`` ignore it via ``**kwargs``.Nz%image_gen plugin dispatch skipped: %sTr   z*image_gen plugin force-refresh skipped: %szimage_gen.provider='zk' is set but no plugin registered that name. Run `hermes plugins list` to see available image gen backends.Úprovider_not_registeredr^   Ú?r²   rª   )ri   r•  rÒ   rD  zQimage_gen provider '%s' rejected image-to-image kwargs (signature too narrow): %sz
Provider 'uè   ' does not support image-to-image / editing (its generate() signature is out of date with the image_generate schema). Omit image_url for text-to-image, or pick a backend that supports editing via `hermes tools` â†’ Image Generation.Úmodality_unsupportedz$Image gen provider '%s' raised%s: %sz
 TypeErrorrv   z	' error: Úprovider_exceptionz#Provider returned a non-dict resultrF   )rœ   rz  r~   r‹   rŒ   rŠ  r  r—  r“   r�  Úgeneraterˆ   Ú	TypeErrorr¤   r�  )r²   rª   rÒ   rD  rE  r•  r›   r•   rV   Úpnamer”  rç   Úis_type_errors   &&&&&&       r
   Ú_dispatch_to_plugin_providerr©  |  s½  € ô 'Ó(€JØÒÙðÜ'¨
Ó3ˆð Òð	LÜ+¨J¸dÔCˆHð ÒÜØ" : ,ð /Mð NØOhójð 	jô �H˜f cÓ*€EØ&¨°ÀÐM€FðYÜ˜VÐ0DÜ#?Ó#AÔL^Ð_gÓLrõ	tà×"Ò"Ñ, VÑ,ˆô  ˜FÐ$IÓJÐJøôG ô Ü�‰Ð<¸cÔBÝûðûô ô 	LÜ�L‰LÐEÀs×KÑKûð	Lûô ô Yô # 3¬	Ó2ˆß˜k¨VÔ3Ð7MÐQWÔ7WÜ�N‰Nð 8Ø9>ôEä"Ø˜U˜Gð $$ð %ð '=ó	>õ >ô
 	�‰Ð=¸uß'4‘|¸"¸cô	Cä ¨E¨7°)¸C¸5ÐAÐCWÓXÕXûðYús_   ’B ¢C Á2C2 ÂCÂ B<Â<CÃC/ÃC*Ã*C/Ã2FÃ=AFÅFÅFÅ'FÆFÆFc                ó\   € V ^8„  d   QhR\         \        ,          R\         \        ,          /# )r   r¥   r   r˜   )r	   s   "r
   r   r   ­  s"   € ÷ >ñ >¤H¬S¥Mð >´h¼sµmñ >r   c                ór   € ^ RI Hp \        V \        4      '       d   V P	                  4       MRpW!9   d   V# R# )zQReturn ``model_id`` when it is one of the Krea plugin's model ids, else ``None``.)ÚKREA_MODEL_IDSN)Úplugins.image_gen.krear¬  rˆ   rl   rŠ   )r¥   r¬  Ú	candidates   &  r
   Ú_normalize_krea_modelr¯  ­  s/   € å5ä$.¨x¼×$=Ò$=�—‘Ô À4€IØ!Ô3ˆ9Ð=¸Ð=r   c                ó:   € V ^8„  d   QhR\         \        ,          /# r   )r   rŸ   )r	   s   "r
   r   r   µ  s   € ÷ Dñ Dœx¬�ñ Dr   c                 óz   € ^ RI Hp HpHp \	        4       pV RV3VRV3/P                  V! \        4       V4      4      # )z¸``(plugin_name, model_id)`` when the stored selection routes to the Krea or Portal gateway
(rule: :func:`tools.image_generation_managed.managed_route`), else ``None`` for the FAL path.)ÚKREAÚPORTALÚmanaged_routeÚkreaÚnous)Útools.image_generation_managedr²  r³  r´  r“   r‰   r–   )r²  r³  r´  r¥   s       r
   Ú_managed_model_pluginr¸  µ  sI   € ÷ KÑJä+Ó-€HØ�6˜8Ð$ f¨v°xÐ.@ÐA×EÑEÙÔ5Ó7¸ÓBóDð Dr   c                óü   € V ^8„  d   QhR\         R\         R\        \         ,          R\        \        ,          R\        \        ,          R\        \        \         \
        3,          ,          R\        \         ,          /# )r   r²   rª   rÒ   rD  rE  r•  r   rŸ  )r	   s   "r
   r   r   ¿  sn   € ÷ %dñ %dÜð%dÜ"ð%dÜ/7¼­}ð%dä"¤4�.ð%dä:BÄ4½.ð%dô ”tœC¤˜H•~Õ&ð%dô 3;¼3µ-ñ%dr   c           
     ó4  € \        4       pVf   R# Vw  rx VR8X  d   ^ RIHp	 V	! 4       f   R# \        V4      p
V
f   VR8X  d   R# \        RV R2R4      # RV R	VR
V/p \        WÂW4\        W¥4      R7       V
P                  ! R/ VB p\        YÚP                   R24      #   \         d#   p\
        P                  RY{4       Rp
 Rp?L�Rp?ii ; i  \         d=   p\
        P                  RY{4       \        RT
P                   RT 2R4      u Rp?# Rp?ii ; i)u!  JSON result from the Krea or Portal gateway the stored model belongs to, or ``None`` to fall
through to FAL.

A Krea model with no reachable Krea gateway falls through (direct/BYO users keep their
pipeline); a Portal model never does â€” falling through would silently bill a FAL default.
Nrµ  )Ú_resolve_managed_krea_gatewayz"Managed %s routing unavailable: %szimage_gen.model='uƒ   ' is a Nous Portal model but the Portal image backend is not available. Pick another model via `hermes tools` â†’ Image Generation.r¡  r²   rª   ri   )r•  zManaged %s routing failed: %szManaged z generation error: r¤  z$ provider returned a non-dict resultrF   )r¸  r­  r»  rz  r~   r‹   rŒ   rŠ  r—  r�  r¥  r¤   Údisplay_namer�  )r²   rª   rÒ   rD  rE  r•  r\   Úplugin_namer¥   r»  r•   rV   r”  rç   s   &&&&&&        r
   Ú_maybe_route_managed_modelr¾  ¿  sG  € ô #Ó$€FØ‚~ÙØ"Ñ€KðØ˜&Ô ÝLÙ,Ó.Ò6ÙÜ'¨Ó4ˆð ÒØ˜&Ô ÙÜØ ˜zð *Uð VØWpórð 	rð '¨°ÀÈgÐW_Ð`€FðqÜ˜VÐ0DÜ&8¸Ó&Lõ	Nà×"Ò"Ñ, VÑ,ˆô ˜F×'<Ñ'<Ð&=Ð=aÐ$bÓcÐcøô# ô Ü�‰Ð9¸;ÔLØ�ûðûô ô qÜ�‰Ð6¸ÔIÜ ¨(×*?Ñ*?Ð)@Ð@SÐTWÐSXÐYÐ[oÓpÕpûðqús:   –B  ®B  Á)C Â CÂ+CÃCÃDÃ1DÄDÄDÚ	permittedc                ó$   € V ^8„  d   QhR\         /# )r   r¿  rž   )r	   s   "r
   r   r   ç  s   € ÷ 1ñ 1ÔSXñ 1r   c          	     ó4  aaa	a
€ ^ RI Hp V! R4      ;'       g    RP                  4       P                  4       R	9   d   WR3# ^ RIHo	 ^ RIHpHo
 V	VV
V3R lp \        V \        4      '       d   V P                  4       '       d	   V! V 4      p \        V\        \        34      '       d0   V Uu. uF#  p\        V\        4      '       d	   V! V4      MTNK%  	  ppYR3# u upi   T d/   pY\        RT 2\        T4      P                  4      3u Rp?# Rp?ii ; i)
ab  Resolve path-like sources to ``data:`` URLs under a non-local terminal backend.

Routes through ``tools.image_source`` (in-sandbox exec-read, media-cache host reads,
credential guard) so generation obeys the same confinement as vision. URLs/data: pass
through; local backend is a no-op. Returns ``(image_url, reference_image_urls, error_json_or_None)``.
r  r  r  N)Ú
_run_async)ÚImageResolutionErrorÚ resolve_local_source_to_data_urlc                 ó&   <€ S! S! V SSR 7      4      # ))r¿  rF   )ÚrefrÂ  r¿  rÄ  rþ   s   &€€€€r
   ÚresolveÚ'_confine_source_images.<locals>.resolveô  s   ø€ ÙÑ:¸3ÀÐS\Ô]Ó^Ð^r   zCould not read source image: )rv   r  )r  r  rŠ   r¸   Úmodel_toolsrÂ  Útools.image_sourcerÃ  rÄ  rˆ   rl   r»   rŸ   rŠ  rb  rG   )rÒ   rD  rþ   r¿  r  rÃ  rÇ  ÚrrV   rÂ  rÄ  s   &&fd     @@r
   Ú_confine_source_imagesrÌ  ç  s  û€ õ 2Ù�^Ó$×/Ð/¨×6Ñ6Ó8×>Ñ>Ó@ÀMÔQØ°Ð4Ð4Ý&ßY÷_ð _ðGÜ�i¤×%Ò%¨)¯/©/×*;Ò*;Ù 	Ó*ˆIÜÐ*¬T´5¨M×:Ò:ÙUiÓ#jÑUiÐPQ´*¸QÄ×2DÒ2D¡G¨A¤JÈ!Ò$KÑUiÐ Ð#jð ¨DÐ0Ð0ùò	 $køØô GØ´Ø+¨C¨5Ð1´4¸³9×3EÑ3Eó1Gð Gõ 	GûðGús6   Á+C" Â(C" Â.)CÃC" ÃC" Ã"DÃ)#DÄDÄDc                 ó€  € V P                  R R4      pV'       g   \        R4      # V P                  R\        4      pV P                  R4      pVP                  R4      p\        V P                  R4      V P                  R4      V4      w  rgpVe   V# \	        Yg\        V\        4      '       d   TMRR	7      p	\         U
u/ uF  qªV 9   g   K  W V
,          bK  	  pp
\        W#3R
T;'       g    R/V	B pVf)   \        W#3R
T;'       g    R/V	B pVe   \        WÂW94      pVf   \        W#3/ V	B p\        WÅR7      # u up
i )r²   rv   z'prompt is required for image generationrª   rE  rþ   rÒ   rD  N)rÒ   rD  rE  r•  )rþ   )r‰   r�  r   rÌ  rm   rˆ   ró   Ú_CREATIVE_CONTROL_PARAMSr©  r¾  Ú_fall_back_to_falrQ  r.  )ÚargsÚkwr²   rª   rE  rþ   rÒ   rD  Úconfine_errorÚsourcesr^   r•  r  s   &,           r
   Ú_handle_image_generaterÔ    s@  € Ø�X‰X�h Ó#€FßÜÐCÓDÐDØ—8‘8˜NÔ,@ÓA€LØ�h‰h�yÓ!€GØ�f‰f�YÓ€Gä5KØ�‰�Ó˜tŸx™xÐ(>Ó?Àó6JÑ2€I ]àÒ ØÐô ˜YÜ&0°¼$×&?Ò&?™7ÀTôK€Gå-EÓVÑ-E TÐQUÉÔ �˜4•jÒ Ñ-E€HÐVÜ
& vÑ
bÀh×FVÐFVÐRVÐ
bÐZaÑ
b€CØ
‚{Ü(¨ÑdÈ×HXÐHXÐTXÐdÐ\cÑdˆØŠ?Ü# C°ÓGˆCØ
‚{Ü! &ÑB¸'ÑBˆÜ-¨cÔCÐCùò Ws   Â?D;ÃD;c          
      óv   € V ^8„  d   QhR\         R\         R\         R\        \         \        3,          R\         /# )r   r  r²   rª   rÓ  r   rk   )r	   s   "r
   r   r     s9   € ÷ "ñ "œ3ð "¬ð "¼3ð "ÌÌcÔSVÈhÍð "Ô\_ñ "r   c           	     óD  €  \         P                  ! V 4      p\        T\        4      '       d/   TP                  R4      '       g   TP                  R4      '       g   T # TP                  R4      '       g   TP                  R4      '       d   T # ^ RIHp T! 4       '       g   T # \        P                  RTP                  R4      4       \         P                  ! \        YTP                  R4      \        R	7      4      pTP                  R4      '       d   R
\         R2M	R\         R2pTP                  R4      '       d   TR\         R2,          pTP                  R\        RTP                  R4      TR7       \         P                  ! T4      #   \         d    T u # i ; i)a‡  Rerun a managed Krea request on FAL's default model when Krea refused it before creating a job.

Only the Krea plugin marks a failure ``fallback_eligible``, and only when the submit provably never
created a job: a job that exists has already been authorized for billing and may still complete.
Source images never fall back; FAL would route them to an edit endpoint with different semantics.r  Úfallback_eligiblerÒ   rD  )Úfallback_to_fal_enabledzOManaged Krea refused the request before starting a job; falling back to FAL: %sræ   rE  )rE  rF  z:Krea was unavailable, so this image was generated on FAL (z
) instead.z.Krea was unavailable and the fallback to FAL (z) also failed.râ   z The upscale ran on FAL's z, not Krea Enhance.rš   rµ  )r•   ri   Úfallback_fromÚfallback_reasonÚnote)r%  r&  r3   rˆ   rm   r‰   r­  rØ  r‹   r¤   rQ  r   r!   r¿   r*  )r  r²   rª   rÓ  rç   rØ  Ú
fal_resultrÛ  s   &&&&    r
   rÏ  rÏ    sa  € ðÜ—’˜C“ˆô �fœd×#Ò# v§z¡z°)×'<Ò'<ÀFÇJÁJÐOb×DcÒDcØˆ
Ø‡{�{�;×Ò 7§;¡;Ð/E×#FÒ#FØˆ
Ý>Ù"×$Ò$Øˆ
Ü
‡N�NÐdÐfl×fpÑfpÐqxÓfyÔzÜ—’Ô/°ÈgÏkÉkÐZcÓNdÔp}Ô~Ó€Jà�~‰~˜i×(Ò(ð IÌÈÐWaÑbà<¼]¸OÈ>ÐZð 	ð ‡~�~�j×!Ò!ØÐ,¬^Ð,<Ð<OÐPÕPˆØ×ÑØœm¸6ÐSY×S]ÑS]Ð^eÓSfÐmqð ô sä�:Š:�jÓ!Ð!øô% ô ØŠ
ðús   ‚F ÆFÆFÚ
modalitiesrH  r9  Úsupports_upscalec                óF   € V ^8„  d   QhR\         \        \        3,          /# r   r¬   )r	   s   "r
   r   r   ?  s   € ÷ 0ñ 0¤D¬¬c¨¥Nñ 0r   c                 óN  € \        \        4      p \        4       p\        4       pVe   V^ ,          pMV'       d   VR8w  d   TpMRpV'       Ed*    \	        V4      pVEe    VP                  4       ;'       g    / pVP                  V R&   \        4       ;'       g    VP                  4       ;'       g    RV R&   VP                  R4      '       d   \        VR,          4      V R&   VP                  R4      '       d   \        VR,          4      V R&   \        VP                  R4      4      V R&   VP                  R	4      '       d   \        VR	,          4      V R	&   VP                  R
4      R8X  d   RV R
&   V #  \        4       w  rg\        VP                  R4      4      pRV R&   VP                  RV4      V R&   V'       d   RR.MR.V R&   V'       d%   \        VP                  R4      ;'       g    ^4      M^ V R&   RV R&   V #   \         d    / p EL—i ; i  \         d     L«i ; i)a+  Best-effort capabilities of the active backend/model; never raises.

Mirrors runtime dispatch: a Krea or Portal model id under the managed selection asks that
plugin, a set ``image_gen.provider`` asks that plugin, else the FAL catalog.
Fail-closed: an undeclared capability is advertised as absent.
Nrš   r•   rv   ri   rÝ  r9  rÞ  rš  Úsource_image_roleÚstyler7  zFAL.air8  rH  rÝ   T)rm   Ú_NO_CAPABILITIESr–   r¸  rz  r›  r~   r¼  r“   Údefault_modelr‰   r»   r¾   ró   r¦   )	rå   Úconfigured_providerrr  r½  r•   Úcapsr¥   rÂ   Úcan_edits	            r
   Ú_active_image_capabilitiesrè  ?  s  € ô  Ô 0Ó1€DÜ9Ó;ÐÜ#Ó%€GØÒØ˜a•j‰ß	Ð!4¸Ô!=Ø)‰àˆß€{ð	Ü+¨KÓ8ˆHØÓ#ðØ#×0Ñ0Ó2×8Ð8°b�Dð $,×#8Ñ#8��ZÑ Ü <Ó >× bÐ bÀ8×CYÑCYÓC[×CaÐCaÐ_a��W‘Ø—8‘8˜L×)Ò)Ü)-¨d°<Õ.@Ó)A�D˜Ñ&Ø—8‘8Ð2×3Ò3Ü36°tÐ<RÕ7SÓ3T�DÐ/Ñ0ä+/°·±Ð9KÓ0LÓ+M�Ð'Ñ(Ø—8‘8Ð/×0Ò0Ü04°TÐ:MÕ5NÓ0O�DÐ,Ñ-Ø—8‘8Ð/Ó0°GÔ;Ø07�DÐ,Ñ-Ø�ð# $ô* (Ó)�N€HÜ�D—H‘H˜_Ó-Ó.€HØ€DˆÑØ—H‘H˜Y¨Ó1€Dˆ�Mß.6˜& 'Ñ*¸V¸H€DˆÑßQY¤3 t§x¡xÐ0FÓ'G×'LÐ'LÈ1Ô#MÐ_`€DÐ	Ñ à#€DÐ	ÑØ€Køô5 !ô Ø“Dðûô ô 	Ùð	úsU   ÁH Á!H Á8H Á;H ÂH Â3H Ã+H Ã<A:H ÈHÈH ÈHÈH ÈH$È#H$z‹Source image to edit/transform (image-to-image). A public URL or an absolute local file path from the conversation. Omit for text-to-image.r×   Úhighz2Prompt expansion: raw (none), low, medium or high.ÚthinkingÚfastz`How much the model plans before generating: fast (default) or high for complex multi-step edits.Ú
resolutionÚ1KÚ2KzGOutput size: 1K (default) or 2K when small text or fine detail matters.Ú	intensityÚintegerÚminimumÚmaximumz>Style intensity, -100 muted to 100 highly stylized. 0 neutral.Ú
complexityz:Composition density, -100 minimal to 100 dense. 0 neutral.Úmovementz;Motion in the scene, -100 static to 100 dynamic. 0 neutral.zfThe subject and scene to generate. Be detailed and descriptive; reference images supply only the look.z­Style reference: its look is copied, the image itself is not edited. A public URL or an absolute local file path. Describe the subject in the prompt. Omit for text-to-image.ÚbooleanuÎ   Post-generation high-resolution pass (~2x, extra cost/latency), off by default. A creative enhancer that can alter fine detail (rendered text, faces) â€” use only when resolution matters more than fidelity.c                óF   € V ^8„  d   QhR\         \        \        3,          /# r   r¬   )r	   s   "r
   r   r   µ  s   € ÷ -`ñ -`¤T¬#¬s¨(¥^ñ -`r   c            	     óÊ  € Rp \        4       p\        VP                  R4      ;'       g    ^ 4      pR\        VP                  R4      ;'       g    R.4      9   p\        R,          R,          pRVR,          R	VR	,          /pVP                  R
4      R8H  pV'       dL   V'       d   Rp\
        VR&   \        VR&   RV R2pMRp\        VR&   RV R2pV^8”  d   RRRRR/RVRV/VR&   MRpVP                  R4      '       d
   \        VR&   VP                  R4      ;'       g    .  F  p	V	\        9   g   K  \        V	,          WY&   K!  	  RV P                  VR7      RRRRVRR.//# ) zŸRender description AND params from the active model's capabilities; args it cannot
honor are NOT advertised (the handler still accepts them for replay compat).uÝ   Generate high-quality images from text prompts{edit_clause}. Returns the result in the `image` field â€” a URL or an absolute file path; reference it in your response using the current platform's file-delivery convention.r9  rÝ   rÝ  rH  rI  r…  r²   rª   rá  râ  z:, or copy the look of reference images passed in image_urlrÒ   zUp to z5 more style references. URLs or absolute local paths.z<, or edit / transform an existing image by passing image_urlzn additional reference images (style, character, or composition) guiding an edit. URLs or absolute local paths.rb  ÚarrayrÀ   r†  ÚmaxItemsrƒ  rD  uF    (text-to-image only â€” the active model cannot edit existing images)rÞ  rE  rš  )Úedit_clauser„  rÆ   )rè  r¾   r‰   r·   ÚIMAGE_GENERATE_SCHEMAÚ_STYLE_PROMPT_PARAMÚ_STYLE_IMAGE_URL_PARAMÚ_IMAGE_URL_PARAMÚ_UPSCALE_PARAMrÎ  r	   )
Ú	base_descrå   r>  rç  Ústatic_propsr…  Ú
style_refsrú  Ú	refs_descr^   s
             r
   Ú_build_dynamic_image_schemar  µ  s£  € ð	/ð ô &Ó'€DÜ�4—8‘8Ð2Ó3×8Ð8°qÓ9€HØœ#˜dŸh™h |Ó4×@Ð@¸¸ÓAÑA€HÜ(¨Õ6°|ÕD€Là�,˜xÕ(¨.¸,À~Õ:Vð"X€Jà—‘Ð-Ó.°'Ñ9€JßßØVˆKÜ#6ˆJ�xÑ Ü&<ˆJ�{Ñ#Ø   
Ð*_Ð`‰IàXˆKÜ&6ˆJ�{Ñ#à˜˜
ð #(ð (ð ð
 �aŒ<à˜Ø˜& (Ð+Ø˜HØ˜yð	2ˆJÐ-Ñ.øð _ˆØ‡x�xÐ"×#Ò#Ü .ˆ
�9ÑØ—‘Ð,Ó-×3Ð3°Ò3ˆØÔ+Ö+Ü7¸Õ=ˆJÓñ 4ð ˜9×+Ñ+¸Ð+ÓDØ˜6 8¨\¸:ÀzÐT\ÐS]Ð^ð`ð `r   r2   u   ðŸŽ¨)	r^   ÚtoolsetÚschemarX   Úcheck_fnÚrequires_envÚis_asyncÚemojiÚdynamic_schema_overridesc                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r   r   )Ú__conditional_annotations__r   )r	   s   "r
   r   r      s   € ÷ ñ ÷" Ò ŒCÑ ò#r   rS   )NN)NNNN)rÝ   )r  ÚlowÚmediumré  iœÿÿÿ)mr  rK   r%  Úloggingr¢   r^  ra   r|   Útypingr   r   r   r   r   Útools.debug_helpersr   r   r   r   r   r   r   r   Útools.image_generation_catalogr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   Útools.managed_tool_gatewayr'   Útools.tool_backend_helpersr(   r)   r*   r+   r,   r-   Ú	getLoggerrG   r‹   rS  r?   r@   ÚLockr>   r6   rC   r~   rE   rg   rƒ   r�   r“   r–   rœ   r¦   r½   rË   rÎ   rÐ   rê   r  r  rü   r  r  r.  r5  r@  rQ  rn  r;  rz  r  Útools.registryr€  r�  r»   rû  rŠ  r�  r—  r�  r©  r¯  r¸  r¾  rÌ  rÔ  rÏ  rã  rè  rþ  rÎ  rü  rý  rÿ  r  Úregisterr   )r  s   @r
   Ú<module>r     sØ  øðöó Û Û 	Û Û Û ß &Ñ &ð €
Ó õõ -÷÷ ÷÷ ÷ õ õ
 D÷L÷ Lð 
×	Ò	˜8Ó	$€á	�mÐ-@Ô	A€ØÐ Ø!Ð Ø$Ÿ>š>Ó+Ð òZò.#ôH ô Hð1°s÷ 1õ4õFò(ò

+õõ*ð *¨<¸ÈØ$ nð6Ð ÷PðB 7KÐQUÐaeô Kð
 H\Ø!%°ôbõð< ,Ð-?Ð@Ð ð # O°W¸oÈuÐVaÐbÐ õeõõ/÷* 3õHò$ðD &:Ø)-ÐQUØ $ÀTØ¸4Ø+/È4Ø#÷HjõV
4õð*°U÷ õ6÷$ 0ð Ðð
 ð	5ð Ø�ØØØ˜Øð'ðð Ø˜Ø™Ð0Ó1Øð   NØÐ/ð	ð
ð$ 	�X�Jð)ð Ð õHcõ
÷õ$Y÷.Kõb>õD÷%dðP1Ð[e÷ 1ò4Dõ6"ð@ ! 6 (Ð,BÀAÐGYÐ[`ÐaÐ õ0ðj ˆHØð	ðÐ ð Ø�˜&Ò"BØÐKðð Ø�˜& 6¨6Ð"2ØÐyðð Ø�˜& 4¨ ,ØÐ`ðð Ø�	˜9 d¨I°sØÐWðð Ø�	˜9 d¨I°sØÐSðð Ø�	˜9 d¨I°sØÐTðð+Ð ð8 ˆHØð	1ðÐ ð ˆHØð	.ðÐ ð ˆIØð	ð€õ-`ð` 	× Ò Ø	 ;Ð7LØ"Ð-PÐ_aØØ
Ð+F÷	r   