§
    øžyjTf ã                   óœ  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	ddl
Z
ddlZddlZddlmZ ddlmZmZ ddlmZmZmZmZmZ  ej        e¦  «        Zdedefd„Zd[d
ededefd„Zdej        ddfd„ZdZ de!de!ddfd„Z"ddœde!fd„Z#d\d„Z$d]d„Z%d]d„Z&	 ddl'm(a(m)a)m*a*m+a+m,a, 	 ddl'm-a- n# e.$ r da-Y nw xY wddl/m0a0m1a1m2a2m3a4m5a5m6a6 ddl7m8a8m9a9 ddl:m;a; da<n8# e.$ r0 d a<ea(ea)ea*ea+ea,da-ea0ea1ea2ea4ea;da6da8da9 G d!„ d"¦  «        Z=e=a5Y nw xY wddl>Z>dd#l?m@ZA e>jB         C                    d e eAeD¦  «         E                    ¦   «         jF        d$         ¦  «        ¦  «         dd%lGmHZH dd&lImJZJmKZK dd'lLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\ dd(l]m^Z^ dd)l_m`Z`maZambZb dd*lcmdZdmeZemfZf h d+£Zgd,d-d-d.d/d0œZhd1d2d2d3d4d5œZid6edeej         fd7„Zkd8edeej         fd9„Zldemfd:„Zndemfd;„Zo e
jp        d<¦  «        Zqd=edefd>„Zrd=edefd?„Zs e
jp        d@¦  «        Ztd=edefdA„ZuddBlvmwZxmyZymzZ{  e
jp        dCe
j|        ¦  «        Z}d=edefdD„Z~dEZdFZ€dGZ�dHZ‚dEZƒdIZ„dHZ…dHZ† edJd¬K¦  «        Z‡eeej                  eˆdL<    G dM„ dNe‰¦  «        ZŠ G dO„ dPeM¦  «        Z‹defdQ„ZŒdR„ Z�demfdS„ZŽddd dTœdU„Z�d]dV„Z�dWe‘dXe‘de‘dz  fdY„Z’d]dZ„Z“dS )^z¡
Telegram platform adapter.

Uses python-telegram-bot library for:
- Receiving messages from users/groups
- Sending responses back
- Handling media and commands
é    N)Ú
ContextVar)ÚdatetimeÚtimezone)ÚDictÚListÚOptionalÚSetÚAnyÚerrorÚreturnc                 óz   — | €dnt          | ¦  «        }|s|S 	 ddlm}  ||d¬¦  «        S # t          $ r Y dS w xY w)zORedact secrets from Telegram transport errors before logging or returning them.NÚ r   )Úredact_sensitive_textT©Úforcez<telegram error redacted>)ÚstrÚagent.redactr   Ú	Exception)r   Útextr   s      úH/home/ragecks/.hermes/hermes-agent/plugins/platforms/telegram/adapter.pyÚ_redact_telegram_error_textr      ss   € à�ˆ2ˆ2¥C¨¡J¤J€DØð Øˆð+Ø6Ð6Ð6Ð6Ð6Ð6à$Ð$ T°Ð6Ñ6Ô6Ð6øÝð +ð +ð +Ø*Ð*Ð*ð+øøøs   ™, ¬
:¹:r   ÚnameÚdefaultc                 ó˜   — 	 ddl m}  || |¦  «        S # t          $ r+ t          j        | ¦  «        p|                     ¦   «         cY S w xY w)uÂ  Read a TELEGRAM_*/GATEWAY_* authorization gate env var per-profile.

    Under gateway.multiplex_profiles the process env is first-writer-wins
    (the YAMLâ†’env bridge in ``_apply_yaml_config``), so a raw ``os.getenv``
    can return ANOTHER profile's allowlist (issue #72348, Telegram mirror).
    Reads the active profile's secret scope when installed; falls back to
    ``os.getenv`` outside multiplex â€” identical single-profile behavior.
    r   )Ú_platform_gate_env)Úgateway.authz_mixinr   r   ÚosÚgetenvÚstrip)r   r   r   s      r   Ú_scoped_gate_envr    )   sl   € ð4Ø:Ð:Ð:Ð:Ð:Ð:à!Ð! $¨Ñ0Ô0Ð0øÝð 4ð 4ð 4Ý”	˜$‘”Ð* 7×1Ò1Ñ3Ô3Ð3Ð3Ð3ð4øøøs   ‚ ”2A	ÁA	Útaskc                 ó¬   — 	 |                       ¦   «          dS # t          j        $ r Y dS t          $ r  t                               dd¬¦  «         Y dS w xY w)zFObserve a detached task's terminal exception to avoid noisy loop logs.z1Abandoned Telegram init task failed after timeoutT©Úexc_infoN)Ú	exceptionÚasyncioÚCancelledErrorr   ÚloggerÚdebug)r!   s    r   Ú_consume_abandoned_taskr*   :   sz   € ðYØ�ŠÑÔÐÐÐøÝÔ!ð ð ð ØˆˆÝð Yð Yð YÝ�ŠÐHÐSWˆÑXÔXÐXÐXÐXÐXðYøøøs   ‚ ˜Aª%AÁAç      @ÚtimeoutÚgracec                 óÄ   — t                                d| |¦  «         	 t          j        d¬¦  «         dS # t          $ r  t                                dd¬¦  «         Y dS w xY w)u/  Emit diagnostics from the deadline timer thread when the loop is stuck.

    Runs OFF the event loop, so it works precisely when the loop cannot. The
    faulthandler dump names the frame the loop thread is blocked in â€” the one
    piece of information #63309-class hangs otherwise never surface.
    u  [Telegram] init deadline (%.0fs) expired but the event loop has not processed the expiry after a further %.0fs â€” the loop thread appears BLOCKED in a synchronous call, which is why no timeout fires (#63309). Dumping all thread stacks to stderr to identify the blocking frame.T)Úall_threadsz"faulthandler traceback dump failedr#   N)r(   ÚwarningÚfaulthandlerÚdump_tracebackr   r)   )r,   r-   s     r   Ú_dump_loop_blocked_diagnosticsr3   L   s‡   € õ ‡N‚Nð	Nð 	Øñô ð ðJÝÔ#°Ð5Ñ5Ô5Ð5Ð5Ð5øÝð Jð Jð JÝ�ŠÐ9ÀDˆÑIÔIÐIÐIÐIÐIðJøøøs   ž5 µ&AÁA)Ú
on_abandonc             ƒ   ó–  ‡‡‡‡‡K  — t          j        | ¦  «        }t          j        ¦   «         Š‰                     ¦   «         Št	          j        ¦   «         Šd	ˆˆfd„Šd	ˆˆfd„}d	ˆˆfd„}t	          j        t          ‰d¦  «        |¦  «        }d|_        | 	                    ¦   «          t	          j        t          ‰d¦  «        t          z   |¦  «        }d|_        | 	                    ¦   «          	 t          j        |‰ht           j        ¬¦  «        ƒ d{V —†\  }}	||v rm‰                     ¦   «         s‰                     ¦   «          |ƒ d{V —†	 |                     ¦   «          |                     ¦   «          ‰                     ¦   «          S |                     ¦   «          |                     t"          ¦  «         |�;t          j        t%          |¦  «        ¦  «        }
|
                     t"          ¦  «         t          j        ¦   «         ‚# |                     ¦   «          |                     ¦   «          ‰                     ¦   «          w xY w)
a*  Await with a wall-clock deadline that does not depend on loop timers.

    ``asyncio.wait_for`` schedules its timeout on the event loop and then waits
    for cancellation to propagate.  PTB/httpcore initialization can sit inside
    cancellation-shielded anyio scopes, so a timed-out initialize() may never
    hand control back to the retry ladder under some supervisors.  This helper
    lets a daemon ``threading.Timer`` wake the loop and, on timeout, abandons
    the shielded task instead of awaiting cancellation completion.

    ``on_abandon`` (optional) is a zero-arg callable returning an awaitable that
    is scheduled as a detached best-effort cleanup when the task is abandoned on
    timeout.  The abandoned initialize() may leave a half-built httpx client /
    connection pool open (it never completed and we do not await its
    cancellation), so the caller uses this to shut that state down and avoid
    leaking a pool per retry attempt.  Cleanup runs detached and its own errors
    are swallowed, so it can never re-block the retry ladder.
    r   Nc                  ó†   •— ‰                      ¦   «          ‰                      ¦   «         s‰                      d ¦  «         d S d S ©N)ÚsetÚdoneÚ
set_result)ÚdeadlineÚloop_processed_expirys   €€r   Ú_mark_expiredz2_await_with_thread_deadline.<locals>._mark_expired{   sI   ø€ Ø×!Ò!Ñ#Ô#Ð#Ø�}Š}‰Œð 	&Ø×Ò Ñ%Ô%Ð%Ð%Ð%ð	&ð 	&ó    c                  ó2   •— ‰                      ‰ ¦  «         d S r7   )Úcall_soon_threadsafe)r=   Úloops   €€r   Ú_expire_from_threadz8_await_with_thread_deadline.<locals>._expire_from_thread€   s   ø€ Ø×!Ò! -Ñ0Ô0Ð0Ð0Ð0r>   c                  ó^   •— ‰                       ¦   «         st          ‰t          ¦  «         d S d S r7   )Úis_setr3   Ú_LOOP_BLOCKED_DUMP_GRACE)r<   r,   s   €€r   Ú_watchdog_checkz4_await_with_thread_deadline.<locals>._watchdog_checkƒ   s=   ø€ ð %×+Ò+Ñ-Ô-ð 	NÝ*¨7Õ4LÑMÔMÐMÐMÐMð	Nð 	Nr>   ç        T©Úreturn_when©r   N)r&   Úensure_futureÚget_running_loopÚcreate_futureÚ	threadingÚEventÚTimerÚmaxÚdaemonÚstartrE   ÚwaitÚFIRST_COMPLETEDr9   Úcancelr8   Úadd_done_callbackr*   Ú_run_abandon_cleanupÚTimeoutError)Ú	awaitabler,   r4   r!   rB   rF   ÚtimerÚwatchdogr9   Ú_Úcleanupr=   r;   rA   r<   s    `         @@@@r   Ú_await_with_thread_deadliner_   a   sŒ  øøøøøè è € õ$ Ô  Ñ+Ô+€DÝÔ#Ñ%Ô%€DØ×!Ò!Ñ#Ô#€Hõ &œOÑ-Ô-Ðð&ð &ð &ð &ð &ð &ð &ð
1ð 1ð 1ð 1ð 1ð 1ð 1ðNð Nð Nð Nð Nð Nð Nõ ŒO�C ¨Ñ-Ô-Ð/BÑCÔC€EØ€E„LØ	‡K‚K�M„M€MÝŒÝˆG�SÑÔÕ4Ñ4°oñô €Hð €H„OØ‡N‚NÑÔÐð$ÝœØ�8ÐÝÔ/ð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
‰ˆˆað �4ˆ<ˆ<Ø—=’=‘?”?ð "Ø—’Ñ!Ô!Ð!Ø�:�:�:�:�:�:Ðð 	�Š‰ŒˆØ�ŠÑÔÐð 	×!Ò!Ñ#Ô#Ð#Ð#ð! 	�Š‰ŒˆØ×ÒÕ6Ñ7Ô7Ð7ØÐ!õ
 Ô+Õ,@ÀÑ,LÔ,LÑMÔMˆGØ×%Ò%Õ&=Ñ>Ô>Ð>ÝÔ"Ñ$Ô$Ð$øà�Š‰ŒˆØ�ŠÑÔÐð 	×!Ò!Ñ#Ô#Ð#Ð#øøøs   Ã0AH
 ÆA>H
 È
>IÚfuturesúasyncio.Futurec               ‡   óp   K  — t          j        t          | ¦  «        t           j        ¬¦  «        ƒ d{V —† dS )uö   Return when the first of ``futures`` completes.

    Used by the strict cold-start readiness gate to wait on "progress OR
    polling error", whichever fires first (#67498). Does not cancel the
    losers â€” the caller owns their lifecycle.
    rH   N)r&   rT   r8   rU   )r`   s    r   Ú_first_completedrc   ¯   s>   è è € õ Œ,•s˜7‘|”|µÔ1HÐ
IÑ
IÔ
IÐIÐIÐIÐIÐIÐIÐIÐIÐIr>   c              ƒ   óÞ   K  — 	  | ¦   «         }t          j        |¦  «        st          j        |¦  «        r
|ƒ d{V —† dS dS # t          $ r  t                               dd¬¦  «         Y dS w xY w)uÚ   Run the abandonment cleanup coroutine, swallowing any failure.

    Wrapped so a cleanup that itself hangs or raises cannot surface as an
    unhandled task error or block anything â€” it is fully fire-and-forget.
    Nz&Abandoned Telegram init cleanup failedTr#   )r&   ÚiscoroutineÚisfuturer   r(   r)   )r4   Úresults     r   rX   rX   ¹   sš   è è € ðNØ�‘”ˆÝÔ˜vÑ&Ô&ð 	­'Ô*:¸6Ñ*BÔ*Bð 	ØˆLˆLˆLˆLˆLˆLˆLˆLˆLð	ð 	øåð Nð Nð NÝ�ŠÐ=ÈˆÑMÔMÐMÐMÐMÐMðNøøøs   „:A Á&A,Á+A,c              ƒ   óö  K  — | €dS 	 |                       ¦   «         ƒ d{V —† n,# t          $ r t                               dd¬¦  «         Y nw xY wt	          | dd¦  «        }|�t	          |dd¦  «        nd}|sdS |D ]}}t	          |dd¦  «        }|€Œ	  |¦   «         }t          j        |¦  «        st          j        |¦  «        r|ƒ d{V —† ŒR# t          $ r t                               dd¬¦  «         Y Œzw xY wdS )	uî  Release a half-built PTB app's httpx transports after init was abandoned.

    ``Application.shutdown()`` / ``Bot.shutdown()`` are gated on the app's
    ``_initialized`` / ``_requests_initialized`` flags, which a wedged
    ``initialize()`` (the case this whole path exists for) may never have set â€”
    so calling only ``app.shutdown()`` no-ops and leaks the connection pool it
    was meant to close.  ``HTTPXRequest`` builds its ``httpx.AsyncClient``
    eagerly in its constructor and its ``shutdown()`` gates only on
    ``client.is_closed``, so closing the request transports directly releases
    the pool regardless of PTB init state.  We try the clean path first, then
    fall back to the transports.  All best-effort and swallowed.
    Nz(Abandoned Telegram app.shutdown() failedTr#   ÚbotÚ_requestÚshutdownz*Abandoned Telegram request shutdown failed)rk   r   r(   r)   Úgetattrr&   re   rf   )Úappri   ÚrequestsÚrequestrk   rg   s         r   Ú_shutdown_abandoned_apprp   Ç   sm  è è € ð €{ØˆðPØ�lŠl‰nŒnÐÐÐÐÐÐÐÐøÝð Pð Pð PÝ�ŠÐ?È$ˆÑOÔOÐOÐOÐOðPøøøõ
 �#�u˜dÑ
#Ô
#€CØ14°�w�s˜J¨Ñ-Ô-Ð-Àd€HØð ØˆØð 	Vð 	VˆÝ˜7 J°Ñ5Ô5ˆØÐØð	VØ�X‘Z”ZˆFÝÔ" 6Ñ*Ô*ð ­gÔ.>¸vÑ.FÔ.Fð Ø�������øøÝð 	Vð 	Vð 	VÝ�LŠLÐEÐPTˆLÑUÔUÐUÐUÐUð	Vøøøð	Vð 	Vs!   ˆ# £&AÁAÂ:CÃ&C6Ã5C6)ÚUpdateÚBotÚMessageÚInlineKeyboardButtonÚInlineKeyboardMarkup©ÚLinkPreviewOptions©ÚApplicationÚCommandHandlerÚCallbackQueryHandlerÚMessageHandlerÚContextTypesÚfilters©Ú	ParseModeÚChatType©ÚHTTPXRequestTFc                   ó   — e Zd ZeZdS )Ú_MockContextTypesN)Ú__name__Ú
__module__Ú__qualname__r
   ÚDEFAULT_TYPE© r>   r   r…   r…     s   € € € € € Øˆˆˆr>   r…   )ÚPathé   )Ú_coerce_allow_set)ÚPlatformÚPlatformConfig)ÚBasePlatformAdapterÚMessageEventÚMessageTypeÚProcessingOutcomeÚ
SendResultÚclassify_send_errorÚcache_image_from_bytesÚcache_audio_from_bytesÚcache_video_from_bytesÚcache_document_from_bytesÚresolve_proxy_urlÚSUPPORTED_VIDEO_TYPESÚSUPPORTED_DOCUMENT_TYPESÚSUPPORTED_IMAGE_DOCUMENT_TYPESÚ_TEXT_INJECT_EXTENSIONSÚ	utf16_len)Únormalize_telegram_chat_id)ÚTelegramFallbackTransportÚdiscover_fallback_ipsÚparse_fallback_ip_env)Úatomic_replaceÚ	env_floatÚenv_int>   ú.gifú.jpgú.pngú.jpegú.webpr©   r¨   r«   r§   )ú	image/pngú
image/jpegz	image/jpgú
image/webpú	image/gifr¬   r­   r®   r¯   )r©   r¨   rª   r«   r§   Úvaluec                 óœ   — 	 t          t          t          | ¦  «        ¦  «        ¦  «        }n# t          t          f$ r Y dS w xY w|dk    r|ndS )zBRound a raw length to whole positive seconds, or None if unusable.Nr   )ÚintÚroundÚfloatÚ	TypeErrorÚ
ValueError)r°   Úsecss     r   Ú_coerce_duration_secondsr¸   F  s]   € ðÝ•5�˜u™œÑ&Ô&Ñ'Ô'ˆˆøÝ•zÐ"ð ð ð Øˆtˆtðøøøà˜!’8�8ˆ4ˆ4 Ð%s   ‚), ¬AÁ AÚpathc           
      óx  — t           j                             | ¦  «        d                              ¦   «         }|dk    r�	 ddl}|                     | d¦  «        5 }|                     ¦   «         pd}|rAt          |                     ¦   «         t          |¦  «        z  ¦  «        }|�|cddd¦  «         S ddd¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY w	 ddl}|                     | ¦  «        }t          t          t          |dd¦  «        dd¦  «        ¦  «        }|�|S n# t          $ r Y nw xY w	 ddl}ddl}	|                     d¦  «        rT|	                     dd	d
dddd| gddddd¬¦  «        }
|
j        dk    r&t          |
j                             ¦   «         ¦  «        S n# t          $ r Y nw xY wdS )u%  Best-effort audio length in whole seconds for outgoing voice/audio.

    Telegram only auto-derives a clip's duration from container metadata for
    short recordings; longer ones (roughly 5 min+) are sent with duration 0
    and render as ``0:00`` in the player. We read the length locally and pass
    it explicitly so the bubble shows the real time.

    Mirrors ``gateway.run._probe_audio_duration``: stdlib ``wave`` for WAV,
    then mutagen for OGG/Opus/MP3/M4A metadata, then an ``ffprobe`` fallback.
    All three are optional â€” when none can read the file we return ``None``
    and the caller omits ``duration``, falling back to Telegram's own
    (possibly absent) metadata, i.e. the prior behavior. Blocking (mutagen
    read + ffprobe subprocess), so call it via ``asyncio.to_thread``.
    é   z.wavr   NÚrbÚinfoÚlengthÚffprobez-vr   z-show_entrieszformat=durationz-ofz"default=noprint_wrappers=1:nokey=1Túutf-8Úreplaceé   )Úcapture_outputr   ÚencodingÚerrorsr,   )r   r¹   ÚsplitextÚlowerÚwaveÚopenÚgetframerater¸   Ú
getnframesr´   r   ÚmutagenÚFilerl   ÚshutilÚ
subprocessÚwhichÚrunÚ
returncodeÚstdoutr   )r¹   ÚextrÈ   ÚwfÚrater·   rÌ   ÚaudiorÎ   rÏ   Úprocs              r   Ú_probe_voice_duration_secondsrÙ   O  sr  € õ Œ'×
Ò
˜4Ñ
 Ô
  Ô
#×
)Ò
)Ñ
+Ô
+€Cà
ˆf‚}€}ð
	ØˆKˆKˆKà—’˜4 Ñ&Ô&ð $¨"Ø—’Ñ(Ô(Ð-¨A�Øð $Ý3°B·M²M±O´OÅeÈDÁkÄkÑ4QÑRÔR�DØÐ'Ø#ð$ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøõ ð 	ð 	ð 	ØˆDð	øøøð
Øˆˆˆà—’˜TÑ"Ô"ˆÝ'Ý•G˜E 6¨4Ñ0Ô0°(¸DÑAÔAñ
ô 
ˆð ÐØˆKð øåð ð ð ØˆðøøøðØˆˆˆØÐÐÐà�<Š<˜	Ñ"Ô"ð 	EØ—>’>Ø˜D '¨?Ð<MØÐ<¸dðDà#¨$¸ÈÐ\]ð "ñ ô ˆDð
 Œ !Ò#Ð#Ý/°´×0AÒ0AÑ0CÔ0CÑDÔDÐDøøÝð ð ð Øˆðøøøð ˆ4sb   ¿C ÁAB?Â&C Â3C Â?CÃC ÃCÃC Ã
CÃCÃA	D' Ä'
D4Ä3D4Ä8A0F* Æ*
F7Æ6F7c                  ó   — t           S )ud  PASSIVE probe: is python-telegram-bot importable right now?

    Registry ``check_fn`` â€” called from status displays and config loading,
    so it must never install anything.  The ACTIVE lazy-installer
    (``check_telegram_requirements``) is registered as ``ensure_deps_fn``
    and runs from ``create_adapter()`` when this returns False (#79812).
    )ÚTELEGRAM_AVAILABLErŠ   r>   r   Útelegram_deps_presentrÜ   ‹  s
   € õ Ðr>   c                  ó^  — t           rdS 	 ddlm}   | dd¬¦  «         n# t          $ r Y dS w xY w	 ddlm}m}m} ddlm}m	} 	 dd	lm
} n# t          $ r d
}Y nw xY wddlm}m}m}	m}
m}m} ddlm}m} ddlm} n# t          $ r Y dS w xY w|a|a|a|a|a	|a
|a|a|	a|
a|a|a|a|a|ada dS )aF  Check if Telegram dependencies are available.

    If python-telegram-bot is missing, attempts to lazy-install it via
    ``tools.lazy_deps.ensure("platform.telegram")``. After a successful
    install, re-imports the SDK and flips ``TELEGRAM_AVAILABLE`` to True
    so the adapter's class-level type aliases get rebound.
    Tr   )Úensurezplatform.telegramF)Úprompt)rq   rr   rs   )rt   ru   rv   Nrx   r   r‚   )rÛ   Útools.lazy_depsrÞ   r   Útelegramrq   rr   rs   rt   ru   rw   ÚImportErrorÚtelegram.extry   rz   r{   r|   r}   r~   Útelegram.constantsr€   r�   Útelegram.requestrƒ   ÚTelegramMessageHandler)Ú_lazy_ensureÚ_UpdateÚ_BotÚ_MessageÚ_IKBÚ_IKMÚ_LPOÚ_AppÚ_CHÚ_CQHÚ_MHÚ_CTÚ_filtersÚ_PMÚ_CtTÚ_HRs                   r   Úcheck_telegram_requirementsr÷   –  sÙ  € õ ð ØˆtðØ:Ð:Ð:Ð:Ð:Ð:ØˆÐ(°Ð7Ñ7Ô7Ð7Ð7øÝð ð ð ØˆuˆuðøøøðØPÐPÐPÐPÐPÐPÐPÐPÐPÐPØWÐWÐWÐWÐWÐWÐWÐWð	Ø;Ð;Ð;Ð;Ð;Ð;Ð;øÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	JÐIÐIÐIÐIÐIÐIÐIØ8Ð8Ð8Ð8Ð8Ð8Ð8øÝð ð ð Øˆuˆuðøøøà€FØ
€CØ€GØÐØÐØÐØ€KØ€NØÐØ ÐØ€LØ€GØ€IØ€HØ€LØÐØˆ4sA   ‹ Ÿ
-¬-±A< ÁA Á
A< ÁAÁA< ÁAÁ!A< Á<
B
Â	B
z([_*\[\]()~`>#\+\-=|{}.!\\])r   c                 ó8   — t                                d| ¦  «        S )zIEscape Telegram MarkdownV2 special characters with a preceding backslash.z\\\1)Ú_MDV2_ESCAPE_REÚsub©r   s    r   Ú_escape_mdv2rü   Ò  s   € å×Ò˜w¨Ñ-Ô-Ð-r>   c                 ó  — t          j        dd| ¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }t          j        dd|¦  «        }|S )zÎStrip MarkdownV2 escape backslashes to produce clean plain text.

    Also removes MarkdownV2 formatting markers so the fallback
    doesn't show stray syntax characters from format_message conversion.
    z\\([_*\[\]()~`>#\+\-=|{}.!\\])ú\1z\*\*([^*]+)\*\*z\*([^*]+)\*z(?<!\w)_([^_]+)_(?!\w)z	~([^~]+)~z\|\|([^|]+)\|\|©Úrerú   )r   Úcleaneds     r   Ú_strip_mdv2r  ×  s�   € õ ŒfÐ6¸¸tÑDÔD€GåŒfÐ'¨°Ñ8Ô8€GåŒf�^ U¨GÑ4Ô4€Gõ ŒfÐ.°°wÑ?Ô?€GåŒf�\ 5¨'Ñ2Ô2€GåŒfÐ'¨°Ñ8Ô8€GØ€Nr>   z2(?m)^``` (?P<indicator>(?:\\)?\(\d+/\d+(?:\\)?\))$c                 ó8   — t                                d| ¦  «        S )aÙ  Move ``(N/M)`` chunk markers off Telegram code-fence lines.

    ``truncate_message()`` appends chunk indicators to the end of a chunk. When
    the chunk had to close an in-progress fenced code block, that creates a
    line like ````` \(1/2\)`` after MarkdownV2 escaping. Telegram does not
    treat that as a clean closing fence, so it can reject MarkdownV2 and fall
    back to plain text. Put the indicator on its own line immediately after the
    closing fence.
    z```\n\g<indicator>)Ú_CHUNK_INDICATOR_ON_FENCE_RErú   rû   s    r   Ú$_separate_chunk_indicator_from_fencer  ò  s   € õ (×+Ò+Ð,AÀ4ÑHÔHÐHr>   )ÚTABLE_SEPARATOR_REÚcompile_mention_patternsÚconvert_table_to_bulletsz‚(?:```[^\n]*\n[\s\S]*?```)|(?:^[^\n]*\|[^\n]*\n[ \t]*\|?[ \t]*:?-+:?[ \t]*(?:\|[ \t]*:?-+:?[ \t]*)+\|?[ \t]*(?:\n[^\n]*\|[^\n]*)*)c                 óæ  — | rd| vr| S g }d}t                                | ¦  «        D ]ƒ}| ||                     ¦   «         …         }|                     t	          j        dd|¦  «        ¦  «         |                     |                     d¦  «        ¦  «         |                     ¦   «         }Œ„| |d…         }|                     t	          j        dd|¦  «        ¦  «         d                     |¦  «        S )u�  Convert single ``\n`` to Markdown hard breaks for the rich-message path.

    Standard Markdown treats a lone ``\n`` as whitespace (soft break), so
    Bot API 10.1 ``sendRichMessage`` collapses multi-line content â€” e.g.
    slash-command lists joined with ``"\n".join(lines)`` â€” into a single
    paragraph.  Adding two trailing spaces before each single newline
    forces a hard line break (``<br>``) in the rendered output.

    Paragraph breaks (``\n\n``), fenced code blocks, and GFM pipe-table
    blocks are left untouched: tables render natively in the rich path and a
    hard break injected into a row separator would corrupt the table.
    Ú
r   z(?<!\n)\n(?!\n)z  
Nr   )	Ú_RICH_PROTECTED_REGION_REÚfinditerrS   Úappendr   rú   ÚgroupÚendÚjoin)r   ÚoutÚposÚmÚproseÚtails         r   Ú_rich_normalize_linebreaksr     sä   € ð ð �4˜tÐ#Ð#Øˆà€Cð €CÝ&×/Ò/°Ñ5Ô5ð ð ˆØ�S˜Ÿš™œ�]Ô#ˆØ�
Š
•2”6Ð,¨f°eÑ<Ô<Ñ=Ô=Ð=Ø�
Š
�1—7’7˜1‘:”:ÑÔÐØ�eŠe‰gŒgˆˆØ���Œ:€DØ‡J‚J�rŒvÐ(¨&°$Ñ7Ô7Ñ8Ô8Ð8Ø�7Š7�3‰<Œ<Ðr>   ç      .@ç       @ç      >@ç      N@ç     Àr@Útelegram_polling_generation)r   Ú_POLLING_GENERATION_CONTEXTc                   ó   — e Zd ZdZdS )Ú_PollingLifecycleAbortz=Internal control flow for polling startup fenced by teardown.N)r†   r‡   rˆ   Ú__doc__rŠ   r>   r   r  r  u  s   € € € € € ØGÐGÐGÐGr>   r  c                   óÆ  ‡ — e Zd ZU dZdZdZdZdZeZdZ	dZ
dZdZeed<   dZeed	<   dZeed
<   dZdZdZdZedddœdededee         dee         def
d„¦   «         Zed„ ¦   «         Zdefˆ fd„Z�dvˆ fd„Z�dvˆ fd„Zdedededdfˆ fd„Z defd „Z!d!ee"ee#f                  de"ee#f         fd"„Z$ddddd#œd$ed%ee         d&ee         d'ee         d(ee         defd)„Z%de&fd*„Z'defd+„Z(defd,„Z)de&defd-„Z*e+d!ee"ee#f                  dee         fd.„¦   «         Z,e+d!ee"ee#f                  dee         fd/„¦   «         Z-e+d!ee"ee#f                  dee.         fd0„¦   «         Z/e+d%ed'ee         d!ee"ee#f                  defd1„¦   «         Z0edefd2„¦   «         Z1e+	 	 �dwd3ee         d!ee"ee#f                  d4ee         dee.         fd5„¦   «         Z2e+	 	 	 �dxd%ed'ee         d!ee"ee#f                  d6ee.         d4ee         de"ee#f         fd7„¦   «         Z3e+d'ee         dee.         fd8„¦   «         Z4e+d'ee         dee.         fd9„¦   «         Z5ed:e6defd;„¦   «         Z7d%e#d'e#ddfd<„Z8ed:e6defd=„¦   «         Z9e+d:e6d!ee"ee#f                  d6ee.         defd>„¦   «         Z:	 �dyd?e#d@e"ee#f         d!ee"ee#f                  d6ee.         dAedBee#         de#fdC„Z;de<e         fdD„Z=ed:e6defdE„¦   «         Z>ed:e6defdF„¦   «         Z?ed:e6defdG„¦   «         Z@ed:e6defdH„¦   «         ZA�dzdJededefdK„ZBdddœdJededee         dee         def
dL„ZCde"ee#f         fdM„ZDdNedefdO„ZEdefdP„ZF eGjH        dQeGjI        eGjJ        z  ¦  «        ZK eGjH        dReGjI        eGjJ        z  ¦  «        ZL eGjH        dS¦  «        ZMdNedefdT„ZNdNedefdU„ZOdNedefdV„ZPdefdW„ZQdNedefdX„ZR	 �dydNed!ee"ee#f                  defdY„ZS	 �dydNed!ee"ee#f                  defdZ„ZTdee.         fd[„ZUdId\œdNed]ede"ee#f         fd^„ZVd_e6defd`„ZWd_e6defda„ZXd%ed3ee         d!ee"ee#f                  d'ee         deeY         f
db„ZZd%edNed3ee         d!ee"ee#f                  dee[         f
dc„Z\	 �dyd%eddedNed!ee"ee#f                  dee[         f
de„Z]dNedefdf„Z^d%edge.dNed!ee"ee#f                  def
dh„Z_�dvdi„Z`deYe.eajb        f         fdj„Zcdke.ddfdl„Zddm„ Zedn„ ZfdIddoœdpedqedredeYe.eajb        f         fds„Zgdke.dteajb        ddfdu„Zhdeaji        fdv„Zj�dvdw„Zkd:e6dxeddfdy„ZldIdzœd{edefd|„ZmdId}œdped~edefd„Znd:e6ddfd€„Zo�dvd�„Zpd‚eddfdƒ„Zq	 	 �dwdkee.         dteeajb                 ddfd„„Zr�dvd…„Zsd:e6ddfd†„Zt�dvd‡„Zu	 	 �dwd%e.dedˆee.         d‰ee         dee.         f
dŠ„Zvd‹ededee         fdŒ„Zw�dzd%ed�edŽedee         fd�„Zxd%e.d'e.deddfd�„Zy	 �dzd%e.d�ed'e.d‘eddf
d’„Zz�dvd“„Z{�dvd”„Z|�dvd•„Z}�dvd–„Z~dId—œd˜edefd™„Zdšeddfd›„Z€�dvdœ„Z�d�edžedefdŸ„Z‚�dvd „Zƒd3ee         d¡e.defd¢„Z„	 	 �dwd%edNed3ee         d!ee"ee#f                  de[f
d£„Z…dd¤œd%ed¥edNed!ee"ee#f                  de[f
d¦„Z†dIdd§œd%eddedNed¨ed!ee"ee#f                  de[fd©„Z‡dNedefdª„Zˆdd¤œd%eddedNed¨ed!ee"ee#f                  de[fd«„Z‰d%eddedefd¬„ZŠ	 	 �dwd&ee         d!ee"ee#f                  defd­„Z‹	 �dyd%edge.dNed!ee"ee#f                  de[f
d®„ZŒd¯„ Z�	 	 	 �d{d%ed±eded²ed!ee"ee#f                  de[fd³„ZŽd´Z�dµZ�d¶Z‘d·Z’d¸Z“d¹edefdº„Z”	 	 	 	 	 �d|d%ed¼ed²ed½ed!ee"ee#f                  d¾ed¿edÀede[fdÁ„Z•	 �dyd%edÂeded²edÃed!ee"ee#f                  de[fdÄ„Z–	 �dyd%edÅedÆee<         dÇed²ed!ee"ee#f                  de[fdÈ„Z—	 �dyd%edÉe<dÊedËed²ed!ee"ee#f                  de[fdÌ„Z˜dÍZ™	 �dyd%edÂedÆe<d²ed!ee"ee#f                  de[fdÎ„ZšdÏed%eddfdÐ„Z›dÑZœ�d}dÉe<dÓe.deYfdÔ„Z�dÕe<dÓe.deYfdÖ„ZždÏed%eddfd×„ZŸdØeddfdÙ„Z 	 	 	 	 	 	 �d~dÞ„Z¡dßg dàdIfdág dâdIfdãg dädIfdåg dædIfdçdègdédfdçdêgdëdfdìdègdídfdìdêgdîdfdïdègdðdfdïdêgdñdfdòœ
Z¢dÏeddfdó„Z£dôedõedefdö„Z¤dôed÷e#døe.defdù„Z¥dúe#dôedeYeee         f         fdû„Z¦	 	 	 �dxd%edüedýee         d3ee         d!ee"ee#f                  de[fˆ fdþ„Z§	 	 �dd%e�d e¨eY         d!ee"ee#f                  �deddf
ˆ f�d„Z©	 	 	 �dxd%e�dedýee         d3ee         d!ee"ee#f                  de[fˆ f�d„Zª	 	 	 	 �d€d%e�dedýee         �dee         d3ee         d!ee"ee#f                  de[fˆ f�d„Z«	 	 	 �dxd%e�dedýee         d3ee         d!ee"ee#f                  de[fˆ f�d	„Z¬	 	 	 �dxd%e�d
edýee         d3ee         d!ee"ee#f                  de[fˆ f�d„Z­	 	 	 �dxd%e�dedýee         d3ee         d!ee"ee#f                  de[f�d„Z®ed_e6def�d„¦   «         Z¯d%ed_e6ddf�d„Z°d%edef�d„Z±�dyd%ed!ee"ee#f                  ddf�d„Z²d%ede"ee#f         f�d„Z³dNedef�d„Z´def�d„Zµdef�d„Z¶def�d„Z·def�d„Z¸de¹e         f�d„Zºde¹e         f�d„Z»de&def�d„Z¼de¹e         f�d„Z½de¹e         f�d„Z¾de¹e         f�d„Z¿de¹e         f�d„ZÀde¹e.         f�d„ZÁde¨eGjÂ                 f�d „ZÃde&def�d!„ZÄe+de&dee         f�d"„¦   «         ZÅ eGjH        �d#eGjI        ¦  «        ZÆ�d$ZÇdef�d%„ZÈ�d&ee         ddf�d'„ZÉde&ddf�d(„ZÊdef�d)„ZËdI�d*œ�d+eddf�d,„ZÌ�d-ZÍde&def�d.„ZÎe+�d�de&�d/ede¹e         f�d0„¦   «         ZÏe�d1e�d2e.�d3e.def�d4„¦   «         ZÐde&def�d5„ZÑ�dv�d6„ZÒde&def�d7„ZÓde&def�d8„ZÔde&def�d9„ZÕd¹ee         dee         f�d:„ZÖde&def�d;„Z×�d<„ ZØ�d=eÙdef�d>„ZÚdef�d?„ZÛ�d=eÙdeÙf�d@„ZÜ�dAe&deÝf�dB„ZÞ�dAe&�d=eÙddf�dC„Zß�dAe#�d=eÙddf�dD„Zà�dAe&f�dE„Záe�dFee         �dGedef�dH„¦   «         Zâ	 �dy�dAe&�d=eÙ�dIed_e6�dJee         ddf�dK„Zã	 	 �dwde&�dLeÝ�dMee.         �d=eeÙ         ddf
�dN„Zäde&def�dO„ZådI�dPœde&�dQedef�dR„Zæ�dv�dS„ZçdÚeèdee&         f�dT„ZédÚeèdÜeêjë        ddf�dU„ZìdÚeèdÜeêjë        ddf�dV„ZídÚeèdÜeêjë        ddf�dW„Zî�d=eÙdef�dX„Zï�d=eÙddf�dY„ZðdJeddf�dZ„Zñ�d=eÙ�dAe&def�d[„Zò�d\eddf�d]„Zó�d\e�d=eÙddf�d^„ZôdÚeèdÜeêjë        ddf�d_„Zõ�d`e�d=eÙddf�da„Zö�d`eddf�db„Z÷�dAe&�d=�dcddf�dd„Zø�dv�de„Zùd%ed'ee         dee"ee#f                  f�df„Zúd%ed'ed�eddf�dg„Zûe+�dhe#def�di„¦   «         Züe+�dje#def�dk„¦   «         Zýe+�dle#dee         f�dm„¦   «         Zþ	 �dyde&�dLeÝ�dMee.         deÙf�dn„Zÿdef�do„�Z d%edde�dpedef�dq„�Zd%eddedef�dr„�Z�d=eÙddf�ds„�Z�d=eÙ�dt�eddf�du„�Zˆ x�ZS (‚  ÚTelegramAdapterzÇ
    Telegram bot adapter.

    Handles:
    - Receiving messages from users and groups
    - Sending responses with Telegram markdown
    - Forum topics (thread_id support)
    - Media messages
    é   Ti €  i   çš™™™™™é?Ú1ÚREQUIRES_EDIT_FINALIZEÚFALLBACK_ON_FINAL_EDIT_FLOODÚ%RESEND_FINAL_ON_EMPTY_STREAM_FALLBACKi@  g
×£p=
Ç?é   g¸…ëQ¸Î?N©Ú	min_valueÚ	max_valuer   r   r+  r,  r   c                óV  — ddl }t          j        | ¦  «        }	 |�t          |¦  «        nt          |¦  «        }n&# t          t
          f$ r t          |¦  «        }Y nw xY w|                     |¦  «        st          |¦  «        }|�t          ||¦  «        }|�t          ||¦  «        }|S )zÞRead a float env var, reject non-finite values, and clamp to bounds.

        Guarantees the returned value is a finite number usable directly in
        ``asyncio.sleep()`` and similar APIs that reject NaN / Inf.
        r   N)	Úmathr   r   r´   rµ   r¶   ÚisfiniterQ   Úmin)r   r   r+  r,  r.  Úrawr°   s          r   Ú_env_float_clampedz"TelegramAdapter._env_float_clamped®  s·   € ð 	ˆˆˆåŒi˜‰oŒoˆð	#Ø"% /•E˜#‘J”J�Jµu¸W±~´~ˆEˆEøÝ�:Ð&ð 	#ð 	#ð 	#Ý˜'‘N”NˆEˆEˆEð	#øøøà�}Š}˜UÑ#Ô#ð 	#Ý˜'‘N”NˆEØÐ Ý˜˜yÑ)Ô)ˆEØÐ Ý˜˜yÑ)Ô)ˆEØˆs   š ; » AÁAc                 ó   — t           S )z6Telegram measures message length in UTF-16 code units.)rŸ   ©Úselfs    r   Úmessage_len_fnzTelegramAdapter.message_len_fnÊ  s
   € õ Ðr>   Úconfigc                 ó  •— t          ¦   «                              |t          j        ¦  «         d | _        d | _        d| _        |                      ¦   «         | _        t          |dd¦  «        pd| _
        |                      dd¦  «        | _        |                      dd¦  «        | _        |                      dd¦  «        | _        d| _        d| _        i | _        |                      ddd	d
¬¦  «        | _        t)          dd¦  «        | _        i | _        i | _        i | _        i | _        |                      dddd¬¦  «        | _        |                      dd	| j        d¬¦  «        | _        i | _        i | _        d| _        d | _         d| _!        d | _"        d| _#        d| _$        tK          j&        ¦   «         | _'        d| _(        d | _)        d| _*        d | _+        d | _,        d | _-        d | _.        d | _/        d| _0        d| _1        d| _2        tK          j3        ¦   «         | _4        i | _5        tm          ¦   «         | _7        tK          j3        ¦   «         | _8        ts          | j:        j;         <                    dd¦  «        ¦  «        | _=        t}          | j:        j;         <                    dd¦  «        ¦  «        | _?        t}          | j:        j;         <                    dd¦  «        ¦  «        | _@        | j:        j;         <                    dg ¦  «        | _A        d„ | jA        D ¦   «         | _B        | j:        j;         <                    d¦  «        rdnd| _C        i | _D        i | _E        i | _F        i | _G        i | _H        d| _I        i | _J        i | _K        d | _L        d S ) NFÚreply_to_modeÚfirstÚdisable_link_previewsÚrich_messagesÚrich_draftsÚtyping_cooldown_secondsr  ç      ð?r  r*  Ú)HERMES_TELEGRAM_MEDIA_BATCH_DELAY_SECONDSr$  Ú(HERMES_TELEGRAM_TEXT_BATCH_DELAY_SECONDSg333333Ó?g{®Gáz´?r  Ú.HERMES_TELEGRAM_TEXT_BATCH_SPLIT_DELAY_SECONDSg      @r   Ústatus_indicatorÚstatus_onlineÚOnlineÚstatus_offlineÚOfflineÚ	dm_topicsc                 ó@   — h | ]}d |v ¯t          |d          ¦  «        ’ŒS ©Úchat_id©r   )Ú.0Úes     r   ú	<setcomp>z+TelegramAdapter.__init__.<locals>.<setcomp>\  s0   € ð -
ð -
ð -
Ø"#ÀÈaÀÀ�C��)”ÑÔÀÀÀr>   Úbase_urll        é  @Ú	important)MÚsuperÚ__init__rŽ   ÚTELEGRAMÚ_appÚ_botÚ_webhook_modeÚ_compile_mention_patternsÚ_mention_patternsrl   Ú_reply_to_modeÚ_coerce_bool_extraÚ_disable_link_previewsÚ_rich_messages_enabledÚ_rich_drafts_enabledÚ_rich_send_disabledÚ_rich_draft_disabledÚ_telegram_typing_cooldown_untilÚ_coerce_float_extraÚ!_telegram_typing_cooldown_secondsr¥   Ú_media_batch_delay_secondsÚ_pending_photo_batchesÚ_pending_photo_batch_tasksÚ_media_group_eventsÚ_media_group_tasksr2  Ú_text_batch_delay_secondsÚ_text_batch_split_delay_secondsÚ_pending_text_batchesÚ_pending_text_batch_tasksÚ_drop_delayed_deliveriesÚ_polling_error_taskÚ_polling_conflict_countÚ%_polling_conflict_recovery_generationÚ_polling_network_error_countÚ_polling_generationr&   rO   Ú_polling_progress_eventÚ_polling_progress_acceptingÚ_polling_progress_verifier_taskÚ_polling_teardown_startedÚ_polling_error_callback_refÚ_polling_heartbeat_taskÚ_bot_username_observedÚ_bot_identity_checked_atÚ_bot_identity_refresh_taskÚ_polling_pending_stuck_countÚ_polling_not_running_countÚ_send_path_degradedÚLockÚ_general_request_drain_lockÚ
_dm_topicsr8   Ú_forum_command_registeredÚ_forum_lockÚboolr7  ÚextraÚgetÚ_status_indicator_enabledr   Ú_status_online_textÚ_status_offline_textÚ_dm_topics_configÚ_dm_topic_chat_idsÚ_max_doc_bytesÚ_model_picker_stateÚ_choice_picker_stateÚ_approval_stateÚ_slash_confirm_stateÚ_clarify_stateÚ_notifications_modeÚ_status_message_idsÚ_last_overflow_previewÚ_post_connect_task)r5  r7  Ú	__class__s     €r   rT  zTelegramAdapter.__init__Ï  sÃ  ø€ Ý‰Œ×Ò˜¥Ô!2Ñ3Ô3Ð3Ø+/ˆŒ	Ø#'ˆŒ	Ø#(ˆÔØ!%×!?Ò!?Ñ!AÔ!AˆÔÝ#*¨6°?ÀGÑ#LÔ#LÐ#WÐPWˆÔØ,0×,CÒ,CÐD[Ð]bÑ,cÔ,cˆÔ#ð -1×,CÒ,CÀOÐUZÑ,[Ô,[ˆÔ#ð +/×*AÒ*AÀ-ÐQVÑ*WÔ*WˆÔ!ð */ˆÔ Ø*/ˆÔ!ð
 BDˆÔ,Ø8<×8PÒ8PØ%ØØØð	 9Qñ 9
ô 9
ˆÔ.õ +4Ð4_ÐadÑ*eÔ*eˆÔ'Ø?AˆÔ#ØCEˆÔ'Ø<>ˆÔ Ø;=ˆÔð *.×)@Ò)@Ø6ØØØð	 *Añ *
ô *
ˆÔ&ð 04×/FÒ/FØ<ØØÔ4Øð	 0Gñ 0
ô 0
ˆÔ,ð ?AˆÔ"ØBDˆÔ&Ø(-ˆÔ%Ø;?ˆÔ Ø,-ˆÔ$ØDHˆÔ2Ø12ˆÔ)Ø()ˆÔ Ý'.¤}¡¤ˆÔ$Ø16ˆÔ(ØGKˆÔ,Ø/4ˆÔ&Ø+/ˆÔ(Ø?CˆÔ$ð 6:ˆÔ#ð :>ˆÔ%ØBFˆÔ'ð 23ˆÔ)ð 01ˆÔ'ð */ˆÔ Ý+2¬<©>¬>ˆÔ(à*,ˆŒå36±5´5ˆÔ&å"œ<™>œ>ˆÔõ 04ØŒKÔ×!Ò!Ð"4°eÑ<Ô<ñ0
ô 0
ˆÔ&õ ),ØŒKÔ×!Ò! /°8Ñ<Ô<ñ)
ô )
ˆÔ õ *-ØŒKÔ×!Ò!Ð"2°IÑ>Ô>ñ*
ô *
ˆÔ!ð 8<´{Ô7H×7LÒ7LÈ[ÐZ\Ñ7]Ô7]ˆÔð-
ð -
Ø'+Ô'=ð-
ñ -
ô -
ˆÔð Œ{Ô ×$Ò$ ZÑ0Ô0ð"Ð"Ð"à!ð 	Ôð 57ˆÔ Ø57ˆÔ!à/1ˆÔð 57ˆÔ!ð /1ˆÔð )4ˆÔ ð 68ˆÔ ð 9;ˆÔ#ð
 ;?ˆÔÐÐr>   c                 óV   •— d| _         t          ¦   «                              ¦   «          d S )NF)rn  rS  Ú_mark_connected©r5  r—  s    €r   r™  zTelegramAdapter._mark_connected�  s'   ø€ Ø(-ˆÔ%Ý‰Œ×ÒÑ!Ô!Ð!Ð!Ð!r>   c                 óV   •— d| _         t          ¦   «                              ¦   «          d S )NT)rn  rS  Ú_mark_disconnectedrš  s    €r   rœ  z"TelegramAdapter._mark_disconnected‘  s'   ø€ Ø(,ˆÔ%Ý‰Œ×"Ò"Ñ$Ô$Ð$Ð$Ð$r>   ÚcodeÚmessageÚ	retryablec                ó^   •— d| _         t          ¦   «                              |||¬¦  «         d S )NT©rŸ  )rn  rS  Ú_set_fatal_error)r5  r�  rž  rŸ  r—  s       €r   r¢  z TelegramAdapter._set_fatal_error•  s0   ø€ Ø(,ˆÔ%Ý‰Œ× Ò   w¸)Ð ÑDÔDÐDÐDÐDr>   c                 ó>   — t          t          | dd¦  «        ¦  «        S )u*  True once teardown/fatal-error started â€” delayed flushes must drop.

        Buffered text/photo/media-group flushes sit behind an asyncio.sleep().
        If disconnect wins the race, dispatching them spawns an agent on a
        torn-down session, producing stale/duplicate deliveries.
        rn  F©r…  rl   r4  s    r   Ú_should_drop_delayed_deliveryz-TelegramAdapter._should_drop_delayed_delivery™  s   € õ •G˜DÐ"<¸eÑDÔDÑEÔEÐEr>   Úmetadatac                 ój   — t          | dd¦  «        dk    ri S |pi                      d¦  «        ri S ddiS )a!  Return disable_notification kwargs when the adapter is in silent mode.

        In "important" mode, all message sends are silently delivered
        (disable_notification=True) unless the caller explicitly requests a
        notification by setting ``metadata["notify"] = True``.
        r“  rR  ÚnotifyÚdisable_notificationT)rl   r‡  )r5  r¦  s     r   Ú_notification_kwargsz$TelegramAdapter._notification_kwargs¢  sK   € õ �4Ð.°Ñ<Ô<ÀÒKÐKØˆIØˆN˜×Ò Ñ)Ô)ð 	ØˆIØ&¨Ð-Ð-r>   ©rK  Ú	chat_typeÚ	thread_idÚ	user_nameÚuser_idrK  r¬  r­  r®  c          
      ó–  — t          |pd¦  «                             ¦   «         }|sdS t          t          | dd¦  «        dd¦  «        }t          |dd¦  «        }t          |¦  «        rö	 ddlm}	 t          |pd	¦  «                             ¦   «                              ¦   «         pd	}
|
d
k    rd	}
n|
dk    r|�dnd}
 |	t          j        t          |p|¦  «        |
||r!t          |¦  «                             ¦   «         nd|�t          |¦  «        nd¬¦  «        }t           ||¦  «        ¦  «        S # t          $ r  t                               d|d¬¦  «         Y nw xY wt          d¦  «                             ¦   «         }|s#t          d¦  «                             ¦   «         dv S d„ |                     d¦  «        D ¦   «         }d|v p||v S )zIReturn whether a Telegram inline-button caller may perform gated actions.r   FÚ_message_handlerNÚ__self__Ú_is_user_authorizedr   ©ÚSessionSourceÚdmÚprivateÚ
supergroupÚforumr  ©ÚplatformrK  r¬  r¯  r®  r­  z=[Telegram] Falling back to env-only callback auth for user %sTr#   ÚTELEGRAM_ALLOWED_USERSÚGATEWAY_ALLOW_ALL_USERS>   r%  ÚyesÚtruec                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   ©r   ©rM  Úuids     r   rO  z?TelegramAdapter._is_callback_user_authorized.<locals>.<setcomp>â  s-   € ÐTÐTÐT sÈÏ	Ê	ÉÌÐT�s—y’y‘{”{ÐTÐTÐTr>   Ú,Ú*)r   r   rl   ÚcallableÚgateway.sessionrµ  rÇ   rŽ   rU  r…  r   r(   r)   r    Úsplit)r5  r¯  rK  r¬  r­  r®  Únormalized_user_idÚrunnerÚauth_fnrµ  Únormalized_chat_typeÚsourceÚallowed_csvÚallowed_idss                 r   Ú_is_callback_user_authorizedz,TelegramAdapter._is_callback_user_authorized±  s*  € õ !  ¨BÑ/Ô/×5Ò5Ñ7Ô7ÐØ!ð 	Ø�5å� Ð'9¸4Ñ@Ô@À*ÈdÑSÔSˆÝ˜&Ð"7¸Ñ>Ô>ˆÝ�GÑÔð 	ðØ9Ð9Ð9Ð9Ð9Ð9å'*¨9Ð+<¸Ñ'=Ô'=×'CÒ'CÑ'EÔ'E×'KÒ'KÑ'MÔ'MÐ'UÐQUÐ$Ø'¨9Ò4Ð4Ø+/Ð(Ð(Ø)¨\Ò9Ð9Ø6?Ð6K¨7¨7ÐQXÐ(à&˜Ý%Ô.Ý Ð =Ð+=Ñ>Ô>Ø2Ø.Ø8AÐK�c )™nœn×2Ò2Ñ4Ô4Ð4ÀtØ09Ð0E�c )™nœn˜nÈ4ðñ ô �õ ˜G˜G F™OœOÑ,Ô,Ð,øÝð ð ð Ý—’ØSØ&Ø!ð ñ ô ð ð ð ðøøøõ 'Ð'?Ñ@Ô@×FÒFÑHÔHˆØð 	_õ
 $Ð$=Ñ>Ô>×DÒDÑFÔFÐJ^Ð^Ð^ØTÐT¨k×.?Ò.?ÀÑ.DÔ.DÐTÑTÔTˆØ�kÐ!ÐFÐ%7¸;Ð%FÐFs   Á)CD1 Ä1'EÅEc                 ó  — ddl m} t          |dd¦  «        }t          |dd¦  «        }t          t          |dd¦  «        ¦  «                             ¦   «         pd}t          t          |dd¦  «        pt          |d	d¦  «        pd¦  «                             ¦   «         pd}|s{t          |d
d¦  «        }|�ht          t          |dd¦  «        ¦  «                             ¦   «         pd}|s4t          t          |dd¦  «        pd¦  «                             ¦   «         pd}t          t          |dd¦  «        ¦  «                             ¦   «         p|}t          t          |dd¦  «        ¦  «                             ¦   «                              ¦   «         pd}	|	dk    rd}	nR|	dk    rLt          |dd¦  «        }
t          t          |dd¦  «        ¦  «        }t          |dd¦  «        du }|
�|s|rdnd}	d}t          |dd¦  «        }
|
�bt          t          |dd¦  «        ¦  «        }t          |dd¦  «        du }|	dk    r|s|rt          |
¦  «        }n|	dk    r|rt          |
¦  «        } |t          j        |pd|	|||¬¦  «        S )a`  Build the same Telegram source shape the gateway auth path expects.

        Resolves the identity to authorize from ``from_user`` for normal
        messages, falling back to ``sender_chat`` for channel posts (which
        carry no ``from_user``) so a removed/unauthorized channel cannot
        inject content via the broadcast path either.
        r   r´  Ú	from_userNÚchatÚidr   ÚusernameÚ	full_nameÚsender_chatÚtitleÚtyper¶  r·  r¸  Úmessage_thread_idÚis_topic_messageFÚis_forumTr¹  r  rº  )	rÇ  rµ  rl   r   r   rÇ   r…  rŽ   rU  )r5  rž  rµ  ÚuserrÓ  r¯  r®  r×  rK  r¬  Úthread_id_rawrÛ  Úis_forum_groupr­  s                 r   Ú_source_from_message_for_authz-TelegramAdapter._source_from_message_for_authå  sØ  € ð 	2Ð1Ð1Ð1Ð1Ð1å�w ¨TÑ2Ô2ˆÝ�w ¨Ñ-Ô-ˆÝ•g˜d D¨"Ñ-Ô-Ñ.Ô.×4Ò4Ñ6Ô6Ð>¸$ˆå•˜˜j¨"Ñ-Ô-ÐUµ¸¸{ÈBÑ1OÔ1OÐUÐSUÑVÔV×\Ò\Ñ^Ô^ð Øð 	ð
 ð 	Ý! '¨=¸$Ñ?Ô?ˆKØÐ&Ý�g k°4¸Ñ<Ô<Ñ=Ô=×CÒCÑEÔEÐMÈ�Ø ð å�G K°¸"Ñ=Ô=ÐCÀÑDÔD×JÒJÑLÔLÐTÐPTð õ •g˜d D¨"Ñ-Ô-Ñ.Ô.×4Ò4Ñ6Ô6ÐA¸'ˆÝ�  f¨dÑ3Ô3Ñ4Ô4×:Ò:Ñ<Ô<×BÒBÑDÔDÐLÈˆ	Ø˜	Ò!Ð!ØˆIˆIØ˜,Ò&Ð&Ý# GÐ-@À$ÑGÔGˆMÝ#¥G¨GÐ5GÈÑ$OÔ$OÑPÔPÐÝ$ T¨:°uÑ=Ô=ÀÐEˆNð !Ð,Ð2BÐ,ÀnÐ,ð �àð ð ˆ	Ý Ð)<¸dÑCÔCˆØÐ$Ý#¥G¨GÐ5GÈÑ$OÔ$OÑPÔPÐÝ$ T¨:°uÑ=Ô=ÀÐEˆNØ˜GÒ#Ð#Ð)9Ð#¸^Ð#Ý Ñ.Ô.�	�	Ø˜dÒ"Ð"Ð'7Ð"Ý Ñ.Ô.�	àˆ}ÝÔ&Ø�M˜rØØØØð
ñ 
ô 
ð 	
r>   c                 ó8   — d}t          d„ |D ¦   «         ¦  «        S )zDReturn True when Telegram auth env vars make an early decision safe.)r¼  ÚTELEGRAM_GROUP_ALLOWED_USERSÚTELEGRAM_GROUP_ALLOWED_CHATSÚTELEGRAM_ALLOW_ALL_USERSÚGATEWAY_ALLOWED_USERSr½  c              3   óX   K  — | ]%}t          |¦  «                             ¦   «         V — Œ&d S r7   )r    r   )rM  Úkeys     r   ú	<genexpr>z@TelegramAdapter._telegram_auth_env_configured.<locals>.<genexpr>+  s7   è è € ÐAÐA°SÕ# CÑ(Ô(×.Ò.Ñ0Ô0ÐAÐAÐAÐAÐAÐAr>   )Úany)r5  Úkeyss     r   Ú_telegram_auth_env_configuredz-TelegramAdapter._telegram_auth_env_configured!  s(   € ð
ˆõ ÐAÐA¸DÐAÑAÔAÑAÔAÐAr>   c                 ó$  — |j         dk    rdS t          t          | dd¦  «        dd¦  «        }t          |dd¦  «        }t          |¦  «        rW	  |t          j        t          |dd¦  «        ¬¦  «        d	k    S # t
          $ r t                               d
d¬¦  «         Y nw xY wt          t          | dd¦  «        dd¦  «        pi }t          | 	                    dd¦  «        ¦  «         
                    ¦   «                              ¦   «         d	k    S )u  Return True when an unauthorized DM must still reach gateway pairing.

        Early auth (#40863) rejects before event construction. That is correct
        when unauthorized DMs are ignored, but it must not short-circuit the
        gateway pairing handshake when ``unauthorized_dm_behavior`` resolves
        to ``pair`` â€” including the case where an allowlist is set and the
        operator explicitly opted back into pairing via a platform override
        (resolution rule 1 in ``_get_unauthorized_dm_behavior``).
        r¶  Fr±  Nr²  Ú_get_unauthorized_dm_behaviorÚprofile)rî  Úpairz][Telegram] Failed to resolve unauthorized DM behavior; falling back to adapter-local overrideTr#   r7  r†  Úunauthorized_dm_behaviorr   )r¬  rl   rÆ  rŽ   rU  r   r(   r)   r   r‡  r   rÇ   )r5  rÍ  rÊ  Úbehavior_fnr†  s        r   Ú(_should_pass_unauthorized_dm_for_pairingz8TelegramAdapter._should_pass_unauthorized_dm_for_pairing-  s=  € ð Ô˜tÒ#Ð#Ø�5å� Ð'9¸4Ñ@Ô@À*ÈdÑSÔSˆÝ˜fÐ&EÀtÑLÔLˆÝ�KÑ Ô ð 	ðà�KÝ Ô)Ý '¨°	¸4Ñ @Ô @ðñ ô ð ò	ðøõ ð ð ð Ý—’ð=à!ð ñ ô ð ð ð ðøøøõ �  h°Ñ5Ô5°wÀÑEÔEÐKÈˆÝ�5—9’9Ð7¸Ñ<Ô<Ñ=Ô=×CÒCÑEÔE×KÒKÑMÔMÐQWÒWÐWs   Á)A9 Á9&B"Â!B"c           	      óø  — |                       |¦  «        }|j        }|sdS d}|j        pd}|dv r | j        j                             d¦  «        }n| j        j                             d¦  «        }|�t          |¦  «        }||v pd|v }|€l| j                             d¦  «        }t          |¦  «        rC	 t           |||j
        |j        |j        |j        ¬	¦  «        ¦  «        }n# t          $ r Y nw xY w|€�t          t          | d
d¦  «        dd¦  «        }	t          |	dd¦  «        }
t          |
¦  «        r]|                      ¦   «         sdS 	 t           |
|¦  «        ¦  «        }n-# t          $ r  t                                d|d¬¦  «         Y nw xY w|€Lt%          d¦  «                             ¦   «         }|sdS d„ |                     d¦  «        D ¦   «         }d|v p||v }|rdS |                      |¦  «        S )a˜  Check if the sender of a Telegram message is authorized.

        Intake prefilter that runs BEFORE text batching, event construction,
        and unmentioned-group observation, so a removed/unauthorized user
        cannot inject prompt content into the agent path or the observed
        transcript (fixes #40863). It only rejects when it can make the same
        context-aware decision the runner would make. Unknown DMs with no
        allowlist still pass through so the normal pairing flow can run.
        Unknown DMs with an allowlist still pass through when pairing is the
        effective unauthorized-DM behavior (explicit platform override).
        TNr   )r  r¹  ÚchannelÚgroup_allow_fromÚ
allow_fromrÅ  rÐ  r«  r±  r²  r³  z4[Telegram] Falling back to env-only auth for user %sr#   r¼  c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   rÁ  rÂ  s     r   rO  zCTelegramAdapter._is_user_authorized_from_message.<locals>.<setcomp>œ  s-   € ÐXÐXÐX¨3ÈCÏIÊIÉKÌKÐX˜3Ÿ9š9™;œ;ÐXÐXÐXr>   rÄ  )rà  r¯  r¬  r7  r†  r‡  r�   Ú__dict__rÆ  r…  rK  r­  r®  r   rl   rë  r(   r)   r    r   rÈ  rò  )r5  rž  rÍ  r¯  Ú
authorizedr¬  Úadapter_allow_fromÚallowedÚcallback_authrÊ  rË  rÎ  rÏ  s                r   Ú _is_user_authorized_from_messagez0TelegramAdapter._is_user_authorized_from_messageO  sŒ  € ð ×3Ò3°GÑ<Ô<ˆØ”.ˆð ð 	Ø�4à%)ˆ
ð Ô$Ð*¨ˆ	ØÐ5Ð5Ð5Ø!%¤Ô!2×!6Ò!6Ð7IÑ!JÔ!JÐÐà!%¤Ô!2×!6Ò!6°|Ñ!DÔ!DÐØÐ)Ý'Ð(:Ñ;Ô;ˆGØ  GÐ+Ð=¨s°g¨~ˆJð ÐØ œM×-Ò-Ð.LÑMÔMˆMÝ˜Ñ&Ô&ð ðÝ!%Ø%˜Ø#Ø$*¤NØ&,Ô&6Ø&,Ô&6Ø&,Ô&6ðñ ô ñ"ô "�J�Jøõ !ð ð ð Ø�Dðøøøð ÐÝ�W TÐ+=¸tÑDÔDÀjÐRVÑWÔWˆFÝ˜fÐ&;¸TÑBÔBˆGÝ˜Ñ Ô ð ð ×9Ò9Ñ;Ô;ð  Ø˜4ðÝ!% g g¨f¡o¤oÑ!6Ô!6�J�JøÝ ð ð ð Ý—L’LØNØØ!%ð !ñ ô ð ð ð ðøøøð ÐÝ*Ð+CÑDÔD×JÒJÑLÔLˆKØð Ø�tØXÐX°+×2CÒ2CÀCÑ2HÔ2HÐXÑXÔXˆKØ Ð+ÐE¨w¸+Ð/EˆJàð 	Ø�4à×<Ò<¸VÑDÔDÐDs$   Â41C& Ã&
C3Ã2C3ÅE( Å('FÆFc                 ó„   — |sd S |                      d¦  «        p|                      d¦  «        }|�t          |¦  «        nd S )Nr­  rÚ  ©r‡  r   )Úclsr¦  r­  s      r   Ú_metadata_thread_idz#TelegramAdapter._metadata_thread_id¤  sG   € àð 	Ø�4Ø—L’L Ñ-Ô-ÐR°·²Ð>QÑ1RÔ1Rˆ	Ø!*Ð!6�s�9‰~Œ~ˆ~¸DÐ@r>   c                 ó„   — |sd S |                      d¦  «        p|                      d¦  «        }|�t          |¦  «        nd S )NÚdirect_messages_topic_idÚ!telegram_direct_messages_topic_idrÿ  )r   r¦  Útopic_ids      r   Ú"_metadata_direct_messages_topic_idz2TelegramAdapter._metadata_direct_messages_topic_id«  sH   € àð 	Ø�4Ø—<’<Ð :Ñ;Ô;Ðp¸x¿|º|ÐLoÑ?pÔ?pˆØ (Ð 4�s�8‰}Œ}ˆ}¸$Ð>r>   c                 óZ   — |sd S |                      d¦  «        }|�t          |¦  «        nd S )NÚtelegram_reply_to_message_id)r‡  r²   )r   r¦  Úreply_tos      r   Ú_metadata_reply_to_message_idz-TelegramAdapter._metadata_reply_to_message_id²  s6   € àð 	Ø�4Ø—<’<Ð >Ñ?Ô?ˆØ (Ð 4�s�8‰}Œ}ˆ}¸$Ð>r>   c                 ó   — |                       |¦  «        �;t          |o+|                     d¦  «        o|                      |¦  «        d u¦  «        S |r|                     d¦  «        rdS t          |o|o|                     d¦  «        ¦  «        S )NÚ telegram_dm_topic_reply_fallbackÚ"telegram_dm_topic_created_for_sendF)r  r…  r‡  r
  )r   rK  r­  r¦  s       r   Ú_is_private_dm_topic_sendz)TelegramAdapter._is_private_dm_topic_send¹  s¶   € ð ×1Ò1°(Ñ;Ô;ÐGÝØð LØ—L’LÐ!CÑDÔDðLà×5Ò5°hÑ?Ô?ÀtÐKñô ð ð
 ð 	˜ŸšÐ%IÑJÔJð 	Ø�5ÝØð AØðAà—’Ð?Ñ@Ô@ñ
ô 
ð 	
r>   c                  ó   — dS )Nz`Telegram DM topic delivery requires a reply anchor; refusing to send outside the requested topicrŠ   rŠ   r>   r   Ú_dm_topic_missing_anchor_errorz.TelegramAdapter._dm_topic_missing_anchor_errorÎ  s   € àqÐqr>   r	  r9  c                 ó�   — |rt          |¦  «        S |r2|                     d¦  «        r|dk    rd S |                      |¦  «        S d S )Nr  Úoff)r²   r‡  r
  )r   r	  r¦  r9  s       r   Ú_reply_to_message_id_for_sendz-TelegramAdapter._reply_to_message_id_for_sendÒ  s]   € ð ð 	!Ý�x‘=”=Ð Øð 	?˜ŸšÐ%GÑHÔHð 	?Ø Ò%Ð%Ø�tØ×4Ò4°XÑ>Ô>Ð>Øˆtr>   Úreply_to_message_idc                 ó   — |r�|                      d¦  «        rx|dk    rd|                      |¦  «        iS |€|                      |¦  «        }|€+|                      |¦  «        }|�dt	          |¦  «        dœS i S d|                      |¦  «        iS |                      |¦  «        }|�dt	          |¦  «        dœS d|                      |¦  «        iS )aA  Return Telegram send kwargs for forum and direct-message topic routing.

        Supergroup/forum topics use ``message_thread_id``. True Bot API Direct
        Messages topics can opt in with explicit ``direct_messages_topic_id``
        metadata. Hermes-created private-chat topic lanes are marked with
        ``telegram_dm_topic_reply_fallback``. Live replies send the private
        topic thread id together with a reply anchor; synthetic/resumed sends
        without an anchor use ``direct_messages_topic_id`` when metadata has it.
        ``message_thread_id`` alone can render outside the visible lane.

        When ``reply_to_mode`` is ``"off"``, the reply anchor is suppressed for
        DM topic fallback sends while preserving the ``message_thread_id`` so
        the message still lands in the correct topic.
        r  r  rÚ  N)rÚ  r  )r‡  Ú_message_thread_id_for_sendr
  r  r²   )r   rK  r­  r¦  r  r9  Údirect_topic_ids          r   Ú_thread_kwargs_for_sendz'TelegramAdapter._thread_kwargs_for_sendá  s  € ð. ð 	U˜ŸšÐ%GÑHÔHð 	UØ Ò%Ð%Ø+¨S×-LÒ-LÈYÑ-WÔ-WÐXÐXØ"Ð*Ø&)×&GÒ&GÈÑ&QÔ&QÐ#Ø"Ð*Ø"%×"HÒ"HÈÑ"RÔ"R�Ø"Ð.à-1Ý47¸Ñ4HÔ4Hðð ð ð �	Ø'¨×)HÒ)HÈÑ)SÔ)SÐTÐTØ×@Ò@ÀÑJÔJˆØÐ&à%)Ý,/°Ñ,@Ô,@ðð ð ð $ S×%DÒ%DÀYÑ%OÔ%OÐPÐPr>   c                 óX   — |rt          |¦  «        | j        k    rd S t          |¦  «        S r7   )r   Ú_GENERAL_TOPIC_THREAD_IDr²   ©r   r­  s     r   r  z+TelegramAdapter._message_thread_id_for_send  s.   € àð 	�C 	™NœN¨cÔ.JÒJÐJØ�4Ý�9‰~Œ~Ðr>   c                 ó(   — |sd S t          |¦  «        S r7   )r²   r  s     r   Ú_message_thread_id_for_typingz-TelegramAdapter._message_thread_id_for_typing  s   € ð ð 	Ø�4Ý�9‰~Œ~Ðr>   r   c                 óH   — dt          | ¦  «                             ¦   «         v S )Núthread not found)r   rÇ   )r   s    r   Ú_is_thread_not_found_errorz*TelegramAdapter._is_thread_not_found_error!  s   € à!¥S¨¡Z¤Z×%5Ò%5Ñ%7Ô%7Ð7Ð7r>   c                 ó¢  — |�|€dS t          | dd¦  «        }|€dS t          |dd¦  «        }|�t          |d¦  «        sdS 	 |                     t          |¦  «        t          |¦  «        ¬¦  «        }n5# t          $ r( t
                               d| j        ||d¬¦  «         Y dS w xY w|r$t
                               d	| j        ||¦  «         dS dS )
uN  Drop the stale ``telegram_dm_topic_bindings`` row for a
        topic Telegram has confirmed deleted.

        Without this prune the recovery logic in
        ``gateway.run._recover_telegram_topic_thread_id`` keeps
        steering future inbound messages to the dead thread (the
        bug behind #31501 â€” tool progress, approvals, replies all
        end up in the wrong place even though the user has moved
        on to a fresh topic).  Best-effort: we never raise from a
        send-fallback path â€” a failed cleanup must not turn into a
        failed user-facing send.
        NÚ_session_storeÚ_dbÚdelete_telegram_topic_binding)rK  r­  uR   [%s] delete_telegram_topic_binding failed for chat=%s thread=%s â€” skipping pruneTr#   zY[%s] Pruned stale Telegram DM topic binding chat=%s thread=%s (Bot API: thread not found))	rl   Úhasattrr$  r   r   r(   r)   r   r½   )r5  rK  r­  ÚstoreÚdbÚremoveds         r   Ú_prune_stale_dm_topic_bindingz-TelegramAdapter._prune_stale_dm_topic_binding%  s  € ð ˆ?˜iÐ/ØˆFÝ˜Ð.°Ñ5Ô5ˆØˆ=ØˆFÝ�U˜E 4Ñ(Ô(ˆØˆ:�W RÐ)HÑIÔIˆ:ØˆFð
	Ø×6Ò6Ý˜G™œµ°I±´ð 7ñ ô ˆGˆGøõ ð 	ð 	ð 	Ý�LŠLð7à”	˜7 I¸ð ñ ô ð ð
 ˆFˆFð	øøøð ð 	Ý�KŠKð@à”	˜7 Iñô ð ð ð ð	ð 	s   Á1A4 Á4.B&Â%B&c                 óÈ   — | j         j                             ¦   «         }|dk    s|                     d¦  «        rdS 	 ddlm} t          | |¦  «        S # t          $ r Y dS w xY w)NÚ
badrequestTr   ©Ú
BadRequestF)r—  r†   rÇ   ÚendswithÚtelegram.errorr-  Ú
isinstancerâ   )r   r   r-  s      r   Ú_is_bad_request_errorz%TelegramAdapter._is_bad_request_errorN  s‚   € àŒÔ'×-Ò-Ñ/Ô/ˆØ�<ÒÐ 4§=¢=°Ñ#>Ô#>ÐØ�4ð	Ø1Ð1Ð1Ð1Ð1Ð1Ý˜e ZÑ0Ô0Ð0øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ½A Á
A!Á A!c                 ó"  ‡— |r|                      d¦  «        sdS |                      |¦  «        sdS t          |¦  «                             ¦   «         Š|�d‰v rdS |                      d¦  «        rd}t	          ˆfd„|D ¦   «         ¦  «        rdS dS )	u“  True when a DM-topic send should be retried with routing stripped.

        Two cases trigger the retry:

        1. The original anchor-stale case â€” the reply target was deleted, so
           Bot API returns "message to be replied not found". The retry drops
           the reply anchor and the topic id together.

        2. The synthetic-event case (added when #27937 introduced
           ``direct_messages_topic_id`` fallback for sends without an anchor):
           if Bot API rejects the topic id itself with any BadRequest that
           mentions topic/thread routing, we retry without routing rather
           than dropping the message.
        r  FNúmessage to be replied not foundTr  )Údirect_messages_topiczmessage thread not foundr  Útopic_closedÚtopic_deletedztopic not foundc              3   ó    •K  — | ]}|‰v V — Œ	d S r7   rŠ   )rM  ÚmarkerÚ	err_lowers     €r   rè  zNTelegramAdapter._should_retry_without_dm_topic_reply_anchor.<locals>.<genexpr>�  s(   øè è € ÐCÐC¨6�6˜YÐ&ÐCÐCÐCÐCÐCÐCr>   )r‡  r1  r   rÇ   ré  )r   r   r¦  r  Útopic_markersr9  s        @r   Ú+_should_retry_without_dm_topic_reply_anchorz;TelegramAdapter._should_retry_without_dm_topic_reply_anchorY  s¾   ø€ ð* ð 	˜XŸ\š\Ð*LÑMÔMð 	Ø�5Ø×(Ò(¨Ñ/Ô/ð 	Ø�5Ý˜‘J”J×$Ò$Ñ&Ô&ˆ	ØÐ*Ð/PÐT]Ð/]Ð/]Ø�4ð �<Š<Ð2Ñ3Ô3ð 
	ðˆMõ ÐCÐCÐCÐC°]ÐCÑCÔCÑCÔCð Ø�tØˆur>   Úsend_fnÚsend_kwargsÚmedia_labelÚreset_mediac           	   ƒ   ó”  K  — 	  |di |¤Žƒ d{V —†S # t           $ r«}|                      |||¦  «        s‚ t                               d| j        |t          |¦  «        ¦  «         |�
 |¦   «          t          |¦  «        }d|d<   |                     dd¦  «         |                     dd¦  «          |di |¤Žƒ d{V —†cY d}~S d}~ww xY w)zFRetry stale private-topic media replies once without the topic anchor.NzR[%s] Reply target deleted for Telegram %s, retrying without reply/topic anchor: %sr  rÚ  r  rŠ   )r   r;  r(   r0   r   r   ÚdictÚpop)	r5  r<  r=  r¦  r  r>  r?  Úsend_errÚretry_kwargss	            r   Ú&_send_with_dm_topic_reply_anchor_retryz6TelegramAdapter._send_with_dm_topic_reply_anchor_retry…  s6  è è € ð	1Ø ˜Ð/Ð/ ;Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øÝð 	1ð 	1ð 	1Ø×CÒCØØØ#ñô ð ð
 Ý�NŠNð:à”	ØÝ+¨HÑ5Ô5ñô ð ð Ð&Ø�‘”�Ý Ñ,Ô,ˆLØ26ˆLÐ.Ñ/Ø×ÒÐ0°$Ñ7Ô7Ð7Ø×ÒÐ7¸Ñ>Ô>Ð>Ø ˜Ð0Ð0 <Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð)	1øøøs   „ ’
CœB CÂ<CÃCc                 ó&  — t          | j        dd¦  «        r | j        j                             dg ¦  «        ng }t	          |t
          ¦  «        r|                     d¦  «        }t          |rd                     d„ |D ¦   «         ¦  «        nd¦  «        S )zNReturn validated fallback IPs from config (populated by _apply_env_overrides).r†  NÚfallback_ipsrÄ  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  ©rM  Úvs     r   rè  z0TelegramAdapter._fallback_ips.<locals>.<genexpr>¬  s(   è è € Ð-IÐ-I¸­c°!©f¬fÐ-IÐ-IÐ-IÐ-IÐ-IÐ-Ir>   )	rl   r7  r†  r‡  r0  r   rÈ  r£   r  ©r5  Ú
configureds     r   Ú_fallback_ipszTelegramAdapter._fallback_ips§  s�   € åBIÈ$Ì+ÐW^Ð`dÑBeÔBeÐm�T”[Ô&×*Ò*¨>¸2Ñ>Ô>Ð>Ðkmˆ
Ý�j¥#Ñ&Ô&ð 	/Ø#×)Ò)¨#Ñ.Ô.ˆJÝ$ÈZÐ%a S§X¢XÐ-IÐ-I¸jÐ-IÑ-IÔ-IÑ%IÔ%IÐ%IÐ]aÑbÔbÐbr>   c                 ó˜   — t          | ¦  «                             ¦   «         }| j        j                             ¦   «         dk    pd|v pd|v S )NÚconflictz&terminated by other getupdates requestzanother bot instance is running)r   rÇ   r—  r†   )r   r   s     r   Ú_looks_like_polling_conflictz,TelegramAdapter._looks_like_polling_conflict®  sQ   € å�5‰zŒz×ÒÑ!Ô!ˆàŒOÔ$×*Ò*Ñ,Ô,°
Ò:ð 9Ø7¸4Ð?ð9à0°DÐ8ð	
r>   c                 ó  — | j         j                             ¦   «         }|dv rdS |dv rdS 	 ddlm}m}m}m}m}m	} t          | ||||f¦  «        rdS t          | ||f¦  «        rdS n# t          $ r Y nw xY wt          | t          ¦  «        S )zDReturn True for transient transport failures that warrant reconnect.>   Ú	forbiddenr+  Ú
retryafterÚinvalidtokenF>   ÚtimedoutÚnetworkerrorÚconnectionerrorTr   )r-  Ú	ForbiddenÚInvalidTokenÚNetworkErrorÚ
RetryAfterÚTimedOut)r—  r†   rÇ   r/  r-  rX  rY  rZ  r[  r\  r0  râ   ÚOSError)r   r   r-  rX  rY  rZ  r[  r\  s           r   Ú_looks_like_network_errorz)TelegramAdapter._looks_like_network_error·  s  € ð ŒÔ'×-Ò-Ñ/Ô/ˆØÐLÐLÐLØ�5ØÐBÐBÐBØ�4ð	ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð õ ˜% *¨l¸IÀzÐ!RÑSÔSð Ø�uÝ˜% ,°Ð!9Ñ:Ô:ð Ø�tðøåð 	ð 	ð 	ØˆDð	øøøå˜%¥Ñ)Ô)Ð)s   ¬$A' ÁA' Á'
A4Á3A4c                 óä  — t          ¦   «         }| g}|rÜ|                     ¦   «         }t          |¦  «        }||v rŒ*|                     |¦  «         |j        j                             ¦   «         }t          |¦  «                             ¦   «         }d|v sd|v sd|v rdS t          |dd¦  «        }t          |dd¦  «        }|�| 	                    |¦  «         |�| 	                    |¦  «         |°ÜdS )	a*  Return True when a Telegram TimedOut wraps a connect-timeout.

        A plain Telegram TimedOut may mean the request reached Telegram and
        should not be re-sent. A ConnectTimeout means the TCP connection was
        never established, so retrying is safe and prevents silent drops.
        Úconnecttimeoutzconnect timeoutzconnect timed outTÚ	__cause__NÚ__context__F©
r8   rB  rÔ  Úaddr—  r†   rÇ   r   rl   r  ©	r   ÚseenÚstackÚcurÚidentr   r   ÚcauseÚcontexts	            r   Ú_looks_like_connect_timeoutz+TelegramAdapter._looks_like_connect_timeoutÐ  s  € õ ™œˆØ&+ WˆØð 	&Ø—)’)‘+”+ˆCÝ�s‘G”GˆEØ˜ˆ}ˆ}ØØ�HŠH�U‰OŒOˆOØ”=Ô)×/Ò/Ñ1Ô1ˆDÝ�s‘8”8—>’>Ñ#Ô#ˆDØ 4Ð'Ð'Ð+<ÀÐ+DÐ+DÐH[Ð_cÐHcÐHcØ�tÝ˜C ¨dÑ3Ô3ˆEÝ˜c =°$Ñ7Ô7ˆGØÐ Ø—’˜UÑ#Ô#Ð#ØÐ"Ø—’˜WÑ%Ô%Ð%ð ð 	&ð  ˆur>   c                 óì  — t          ¦   «         }| g}|rà|                     ¦   «         }t          |¦  «        }||v rŒ*|                     |¦  «         |j        j                             ¦   «         }t          |¦  «                             ¦   «         }d|v sd|v sd|v rd|v rdS t          |dd¦  «        }t          |dd¦  «        }|�| 	                    |¦  «         |�| 	                    |¦  «         |°àd	S )
až  Return True when a Telegram TimedOut wraps an httpx pool timeout.

        PTB converts ``httpx.PoolTimeout`` into ``telegram.error.TimedOut`` with
        a message that explicitly states the request was *not* sent
        (``"Pool timeout: All connections in the connection pool are occupied.
        Request was *not* sent to Telegram."``). Because the request never left
        the process, re-sending is safe and cannot duplicate -- the opposite of
        a generic TimedOut, which may have reached Telegram. We match the
        wrapped ``httpx.PoolTimeout`` class as well as the message string so the
        check survives PTB message-wording changes.
        Úpooltimeoutzpool timeoutzconnection poolÚoccupiedTra  Nrb  Frc  re  s	            r   Ú_looks_like_pool_timeoutz(TelegramAdapter._looks_like_pool_timeoutì  s  € õ ™œˆØ&+ WˆØð 	&Ø—)’)‘+”+ˆCÝ�s‘G”GˆEØ˜ˆ}ˆ}ØØ�HŠH�U‰OŒOˆOØ”=Ô)×/Ò/Ñ1Ô1ˆDÝ�s‘8”8—>’>Ñ#Ô#ˆDØ Ð$Ð$¨¸$Ð(>Ð(>Ø! TÐ)Ð)¨j¸DÐ.@Ð.@à�tÝ˜C ¨dÑ3Ô3ˆEÝ˜c =°$Ñ7Ô7ˆGØÐ Ø—’˜UÑ#Ô#Ð#ØÐ"Ø—’˜WÑ%Ô%Ð%ð# ð 	&ð$ ˆur>   Frç  c                 ó(  — t          | j        dd ¦  «        r| j        j                             |¦  «        nd }|€|S t	          |t
          ¦  «        r4|                     ¦   «                              ¦   «         }|dv rdS |dv rdS |S t          |¦  «        S )Nr†  >   r%  Úonr¾  r¿  T>   Ú0Únor  ÚfalseF)	rl   r7  r†  r‡  r0  r   r   rÇ   r…  )r5  rç  r   r°   Úlowereds        r   r\  z"TelegramAdapter._coerce_bool_extra  s›   € Ý.5°d´kÀ7ÈDÑ.QÔ.QÐ[�”Ô!×%Ò% cÑ*Ô*Ð*ÐW[ˆØˆ=ØˆNÝ�e�SÑ!Ô!ð 	Ø—k’k‘m”m×)Ò)Ñ+Ô+ˆGØÐ4Ð4Ð4Ø�tØÐ5Ð5Ð5Ø�uØˆNÝ�E‰{Œ{Ðr>   c                ó  — t          | j        dd ¦  «        r| j        j                             |¦  «        nd }|€|S 	 t	          |¦  «        }n# t
          t          f$ r |cY S w xY w|�t          ||¦  «        }|�t          ||¦  «        }|S )Nr†  )	rl   r7  r†  r‡  r´   rµ   r¶   rQ   r0  )r5  rç  r   r+  r,  r°   Úparseds          r   rc  z#TelegramAdapter._coerce_float_extra  s©   € õ /6°d´kÀ7ÈDÑ.QÔ.QÐ[�”Ô!×%Ò% cÑ*Ô*Ð*ÐW[ˆØˆ=ØˆNð	Ý˜5‘\”\ˆFˆFøÝ�:Ð&ð 	ð 	ð 	ØˆNˆNˆNð	øøøàÐ Ý˜ Ñ+Ô+ˆFØÐ Ý˜ Ñ+Ô+ˆFØˆs   ½A ÁA#Á"A#c                 ób   — t          | dd¦  «        si S t          �dt          d¬¦  «        iS ddiS )Nr]  FÚlink_preview_optionsT)Úis_disabledÚdisable_web_page_preview)rl   rw   r4  s    r   Ú_link_preview_kwargsz$TelegramAdapter._link_preview_kwargs1  sD   € Ý�tÐ5°uÑ=Ô=ð 	ØˆIÝÐ)Ø*Õ,>È4Ð,PÑ,PÔ,PÐQÐQØ*¨DÐ1Ð1r>   Úcontentc                 ó2   — t          |¦  «        | j        k    S )a¯  Cheap pre-check for the one hard rich limit we can count locally.

        Only the 32,768 UTF-8 character text cap is enforced here. Other Bot API
        rich limits (500 blocks, 16 nesting levels, 20 table columns, ...) are
        not pre-counted; if exceeded Telegram returns a BadRequest, which
        :meth:`_is_rich_fallback_error` classifies as permanent so the send
        degrades to the legacy chunking path.
        )ÚlenÚRICH_MESSAGE_MAX_CHARS©r5  r~  s     r   Ú_content_fits_rich_limitsz)TelegramAdapter._content_fits_rich_limitsC  s   € õ �7‰|Œ|˜tÔ:Ò:Ð:r>   c                 óR   — t          j        t          | j        dd¦  «        ¦  «        S )u  True when the bound bot can issue raw ``sendRichMessage`` calls.

        Gates on ``do_api_request`` being an *async* callable. The real
        ``telegram.Bot.do_api_request`` is a coroutine function; test doubles
        that opt into rich set it to an ``AsyncMock`` (also a coroutine
        function). Plain ``MagicMock`` bots expose a *sync* auto-child and
        ``SimpleNamespace`` bots lack the attribute entirely â€” both resolve to
        ``False`` here, so the legacy path is used unchanged.
        Údo_api_requestN)ÚinspectÚiscoroutinefunctionrl   rW  r4  s    r   Ú_bot_supports_richz"TelegramAdapter._bot_supports_richN  s%   € õ Ô*­7°4´9Ð>NÐPTÑ+UÔ+UÑVÔVÐVr>   z<details\b[^>]*>.*?</details>z¥(\$\$.*?\$\$|\\\[.*?\\\]|\\\(.*?\\\)|\\(?:sum|frac|alpha|beta|gamma|delta|theta|lambda|mu|pi|sigma|int|prod|sqrt|lim|infty|begin\{(?:equation|align|matrix|cases)\}))u.   [ã�€-ãƒ¿ã�€-ä¶¿ä¸€-é¿¿ê°€-íž¯ï¤€-ï«¿ð €€-ð²Ž¯]c                 ó‚   — |sdS | j                              |¦  «        D ]}| j                             |¦  «        r dS Œ dS )a²  Return True for rich-message details+math content that crashes TDesktop.

        Telegram Desktop 6.9.1 can crash while rendering Bot API 10.1 rich
        messages containing math inside a collapsible details block
        (telegramdesktop/tdesktop#30808). The Bot API accepts the payload, so
        Hermes must skip rich delivery up front and use the legacy MarkdownV2
        path until affected Desktop clients age out.
        FT)Ú_RICH_DETAILS_REÚfindallÚ_RICH_MATH_IN_DETAILS_REÚsearch)r5  r~  Údetails_blocks      r   Ú._has_telegram_desktop_details_math_crash_shapez>TelegramAdapter._has_telegram_desktop_details_math_crash_shapen  s[   € ð ð 	Ø�5Ø!Ô2×:Ò:¸7ÑCÔCð 	ð 	ˆMØÔ,×3Ò3°MÑBÔBð Ø�t�tðàˆur>   c                 óT   — t          |o| j                             |¦  «        ¦  «        S )as  Return True for CJK content that current TDesktop rich drafts garble.

        Telegram Mac/Desktop Bot API 10.1 rich-message rendering currently
        leaves overlapping draft/overlay glyph artifacts for CJK text (#47653).
        The legacy MarkdownV2 path renders the same text cleanly, so skip rich
        delivery up front until affected clients age out.
        )r…  Ú_RICH_CJK_REr�  r‚  s     r   Ú+_has_telegram_desktop_cjk_rich_garble_shapez;TelegramAdapter._has_telegram_desktop_cjk_rich_garble_shape~  s(   € õ �GÐA Ô 1× 8Ò 8¸Ñ AÔ AÑBÔBÐBr>   c                 óÐ   — |sdS t          d„ |                     ¦   «         D ¦   «         ¦  «        rdS t          j        d|¦  «        rdS t          j        d|¦  «        rdS d|v rdS dS )a  Return True for markdown constructs that the legacy path degrades.

        Keep ordinary replies on the pre-rich MarkdownV2 path so Telegram
        clients render a consistent font weight/spacing. The rich endpoint is
        reserved for constructs where raw markdown materially improves output:
        pipe tables (MarkdownV2 has no table syntax and rewrites them into
        bullet lists), GFM task lists, collapsible ``<details>`` blocks, and
        block math.  Adapted from #45995 (@YonganZhang).
        Fc              3   ó>   K  — | ]}t          j        |¦  «        V — Œd S r7   )Ú_TABLE_SEPARATOR_REÚmatch©rM  Úlines     r   rè  z8TelegramAdapter._needs_rich_rendering.<locals>.<genexpr>”  s.   è è € ÐPÐP°4Õ"Ô(¨Ñ.Ô.ÐPÐPÐPÐPÐPÐPr>   Tz(?m)^\s*[-*]\s+\[[ xX]\]\s+z3(?m)^<details\b|^</details>|^<summary\b|^</summary>z$$)ré  Ú
splitlinesr   r�  r‚  s     r   Ú_needs_rich_renderingz%TelegramAdapter._needs_rich_renderingˆ  sˆ   € ð ð 	Ø�5ÝÐPÐP¸7×;MÒ;MÑ;OÔ;OÐPÑPÔPÑPÔPð 	Ø�4ÝŒ9Ð3°WÑ=Ô=ð 	Ø�4ÝŒ9ÐKÈWÑUÔUð 	Ø�4Ø�7ˆ?ˆ?Ø�4Øˆur>   c                 ó>   — t          t          | dd¦  «        ¦  «        S )z<Whether rich delivery is allowed (``rich_messages`` opt-in).r^  Tr¤  r4  s    r   Ú_rich_delivery_enabledz&TelegramAdapter._rich_delivery_enabledž  s   € å•G˜DÐ":¸DÑAÔAÑBÔBÐBr>   c                 óh  — t          |                      ¦   «         o‘t          | dd¦  «         o|o}|                     ¦   «         oi|                      |¦  «        oT|                      |¦  «         o>|                      |¦  «         o(|                      |¦  «        o|                      ¦   «         ¦  «        S )aÃ  Capability/content eligibility for rich, ignoring ``expect_edits``.

        Shared core of :meth:`_should_attempt_rich` minus the per-call
        ``expect_edits`` metadata gate.  The rich EDIT-finalize path
        (:meth:`_try_edit_rich`) needs this: a streamed preview is sent with
        ``expect_edits=True`` to stay on the editable path mid-stream, but the
        FINAL edit should still upgrade to rich when the content warrants it.
        r`  F)	r…  rœ  rl   r   rš  r�  r’  rƒ  rˆ  r‚  s     r   Ú_rich_eligiblezTelegramAdapter._rich_eligible¢  sÓ   € õ Ø×'Ò'Ñ)Ô)ð *Ý˜DÐ"7¸Ñ?Ô?Ð?ð*àð*ð —’‘”ð*ð ×*Ò*¨7Ñ3Ô3ð	*ð
 ×GÒGÈÑPÔPÐPð*ð ×DÒDÀWÑMÔMÐMð*ð ×.Ò.¨wÑ7Ô7ð*ð ×'Ò'Ñ)Ô)ñ

ô 

ð 
	
r>   c                 óv   — t          |pi                      d¦  «         o|                      |¦  «        ¦  «        S )NÚexpect_edits)r…  r‡  rž  ©r5  r~  r¦  s      r   Ú_should_attempt_richz$TelegramAdapter._should_attempt_rich·  sD   € õ Ø�˜R×$Ò$ ^Ñ4Ô4Ð4ð -Ø×#Ò# GÑ,Ô,ñ
ô 
ð 	
r>   c                 ó   — dS )uU  Whether to replace a streamed preview with a fresh rich final.

        Disabled for Telegram. The fresh-final path briefly shows two copies of
        the final answer, then deletes the streaming preview after the rich send
        succeeds â€” it looks like duplicate delivery at the end of every streamed
        turn (the reason #46206 reverted it).  Rich finalize is instead handled
        by editing the existing preview in place via Bot API 10.1's
        ``editMessageText`` ``rich_message`` parameter (see
        :meth:`_try_edit_rich`), so no fresh re-send / delete is needed.
        FrŠ   r¡  s      r   Úprefers_fresh_final_streamingz-TelegramAdapter.prefers_fresh_final_streaming¿  s	   € ð ˆur>   c                 ó€   — t          | dd¦  «        r,t          | dd¦  «        s|                      ¦   «         r| j        S dS )uD  Allow the stream consumer to accumulate up to the rich-message cap
        before splitting, so a reply that fits one ``sendRichMessage`` /
        ``sendRichMessageDraft`` isn't fragmented at the 4,096 MarkdownV2 limit.

        Gated on the same rich capability as the send path (minus the
        content-length check â€” raising that cap is the whole point): rich not
        latched off and the bot exposes an async ``do_api_request``.  Returns
        ``None`` (â†’ legacy 4,096 limit) when rich isn't available, so non-rich
        streams split exactly as before.
        r^  Tr`  FN)rl   rˆ  r�  r4  s    r   Ústreaming_overflow_limitz(TelegramAdapter.streaming_overflow_limitÎ  sT   € õ �DÐ2°DÑ9Ô9ð	/å˜DÐ"7¸Ñ?Ô?ð	/ð ×'Ò'Ñ)Ô)ð	/ð
 Ô.Ð.Øˆtr>   )Úskip_entity_detectionr§  c                ó6   — dt          |¦  «        i}|rd|d<   |S )u­  Build the ``InputRichMessage`` object from RAW markdown.

        Never pass ``format_message(content)`` here â€” that converts to
        MarkdownV2 and would escape/destroy rich syntax like table pipes.

        Single newlines are normalized to Markdown hard breaks so that
        multi-line content (slash-command lists, etc.) renders correctly
        in the rich-message path.  See ``_rich_normalize_linebreaks``.
        ÚmarkdownTr§  )r  )r5  r~  r§  Úpayloads       r   Ú_rich_message_payloadz%TelegramAdapter._rich_message_payloadá  s/   € ð $.Õ/IÈ'Ñ/RÔ/RÐ"SˆØ ð 	4Ø/3ˆGÐ+Ñ,Øˆr>   Úexcc                 ó.  — |j         j                             ¦   «         }|dv rdS t          |t          t
          t          f¦  «        rdS t          |dd¦  «        dk    rdS t          |¦  «                             ¦   «         }d|v sd|v r
d|v sd	|v rdS d
|v S )uf  True â‡’ the rich endpoint itself is unavailable (old PTB/server).

        These latch rich off for the rest of the adapter's life â€” retrying is
        pointless and would cost a failed roundtrip on every send. Per-message
        rejections (BadRequest from a parser/limit issue) are NOT capability
        errors: the next message may be fine.
        >   rT  ÚendpointnotfoundTÚ
error_codeNi”  ÚmethodÚendpointz	not foundzdoes not existzno such method)	r—  r†   rÇ   r0  ÚAttributeErrorrµ   ÚNotImplementedErrorrl   r   )r5  r¬  r   Úss       r   Ú_is_rich_capability_errorz)TelegramAdapter._is_rich_capability_errorò  s²   € ð Œ}Ô%×+Ò+Ñ-Ô-ˆØÐ7Ð7Ð7Ø�4Ý�c�N­IÕ7JÐKÑLÔLð 	Ø�4Ý�3˜ dÑ+Ô+¨sÒ2Ð2Ø�4Ý�‰HŒH�NŠNÑÔˆØ˜ˆMˆM˜Z¨1˜_˜_Ø˜1ÐÐÐ 0°AÐ 5Ð 5à�4Ø 1Ð$Ð$r>   c                 ó°   — |                       |¦  «        rdS |                      |¦  «        rdS t          |¦  «                             ¦   «         }d|v pd|v S )uy  True â‡’ permanent/capability error â‡’ safe to fall back to legacy.

        Conservative on purpose: only clearly-permanent failures (BadRequest,
        capability errors, unknown/unsupported endpoint) qualify. Everything
        else is treated as transient â€” the rich request may have reached
        Telegram, so we must NOT legacy-resend and risk a duplicate.
        TÚunsupportedznot implemented)r1  rµ  r   rÇ   )r5  r¬  r´  s      r   Ú_is_rich_fallback_errorz'TelegramAdapter._is_rich_fallback_error  se   € ð ×%Ò% cÑ*Ô*ð 	Ø�4Ø×)Ò)¨#Ñ.Ô.ð 	Ø�4Ý�‰HŒH�NŠNÑÔˆØ Ð!Ð;Ð%6¸!Ð%;Ð;r>   c                 óä  — |                       |¦  «        }|                      |||¦  «        }|o.| j        dk    o#t          |o|                     d¦  «        ¦  «        }|p|r|�t          |¦  «        nd}|r|duo
| j        dk    }	n|                      |d¦  «        }	|	r|rt          |¦  «        nd}
|                      ||||
| j        ¬¦  «        }|r|
€|s|                     d¦  «        sdS |
|fS )u;  Routing for a single (rich) send â€” mirrors send()'s index-0 block.

        Returns ``(reply_to_id, thread_kwargs)``, or ``None`` to signal "skip
        rich, let the legacy path handle it" â€” used for the DM-topic fail-loud
        case so the legacy path stays the single source of the refuse result.
        r  r  Nr   ©r  r9  r  )	r
  r  r[  r…  r‡  r   Ú_should_thread_replyr²   r  )r5  rK  r	  r¦  r­  Úmetadata_reply_toÚprivate_dm_topic_sendÚdm_topic_reply_to_offÚreply_to_sourceÚshould_threadÚreply_to_idÚthread_kwargss               r   Ú_compute_single_send_routingz,TelegramAdapter._compute_single_send_routing  s_  € ð !×>Ò>¸xÑHÔHÐØ $× >Ò >¸wÈ	ÐS[Ñ \Ô \Ðà!ð TØÔ# uÒ,ðTå�XÐR (§,¢,Ð/QÑ"RÔ"RÑSÔSð 	ð
 #ð 
à$ðØ):Ð)Fõ Ð!Ñ"Ô"Ð"àð 	ð
 !ð 	JØ+°4Ð7ÐX¸DÔ<OÐSXÒ<XˆMˆMà ×5Ò5°oÀqÑIÔIˆMØ.;ÐYÀÐY•c˜/Ñ*Ô*Ð*ÐUYˆØ×4Ò4ØØØØ +ØÔ-ð 5ñ 
ô 
ˆð !ð 	 [Ð%8ÐAVÐ%8ð
 !×$Ò$Ð%?Ñ@Ô@ð Ø�tØ˜MÐ)Ð)r>   c              ƒ   ó¶  K  — |                       |¦  «        }|                      ||||¦  «        }|€dS |\  }}t          |¦  «        |                      |¦  «        dœ}	|	                     d„ |                     ¦   «         D ¦   «         ¦  «         |	                     |                      |¦  «        ¦  «         t          | dd¦  «        rddi|	d<   |�d	|i|	d
<   	 | j         	                    d|	¬¦  «        ƒ d{V —†}
�n‡# t          $ �ry}|                      |¦  «        rP|                      |¦  «        rd| _        t                               d| j        t#          |¦  «        ¦  «         Y d}~dS t%          |¦  «                             ¦   «         }	 ddlm} n# t,          t.          f$ r d}Y nw xY w|rt1          ||¦  «        pd|v }|                      |¦  «        }t          |dd¦  «        }|€Dddl}|                     d||j        ¦  «        }|r"t;          |                     d¦  «        ¦  «        }t#          |¦  «        }t                               d| j        |¦  «         tA          d||p| |¬¦  «        cY d}~S d}~ww xY wd}t1          |
tB          ¦  «        rB|
 "                    d	¦  «        }|€*|
 "                    d¦  «        pi  "                    d	¦  «        }nt          |
d	d¦  «        }|�I	 ddl#m$} | %                    t%          |¦  «        t%          |¦  «        |¦  «         n# t          $ r Y nw xY wtA          d|�t%          |¦  «        nd¬¦  «        S )a#  Attempt a single ``sendRichMessage`` send.

        Returns a :class:`SendResult` (success, or a transient failure that the
        caller must NOT legacy-resend), or ``None`` to signal "fall back to the
        legacy MarkdownV2 path" (permanent/capability error or DM-topic skip).
        N)rK  Úrich_messagec                 ó   — i | ]
\  }}|®||“ŒS r7   rŠ   ©rM  ÚkrJ  s      r   ú
<dictcomp>z2TelegramAdapter._try_send_rich.<locals>.<dictcomp>_  ó   € ÐPÐPÐP¡  AÀ!À-˜˜1À-À-À-r>   r]  Fr{  Trz  Ú
message_idÚreply_parametersÚsendRichMessage©Ú
api_kwargsuA   [%s] sendRichMessage rejected (%s) â€” falling back to MarkdownV2r   ©r\  ú	timed outÚretry_afterzretry\s+(?:in\s+)?(\d+)r»   z=[%s] sendRichMessage transient failure (no legacy resend): %s)Úsuccessr   rŸ  rÒ  rg   ©Úrich_sent_store©rÓ  rË  )&r  rÃ  r    r«  ÚupdateÚitemsrª  rl   rW  r…  r   r¸  rµ  r`  r(   r)   r   r   r   rÇ   r/  r\  râ   r²  r0  rl  r   r�  Ú
IGNORECASEr´   r  r0   r”   rA  r‡  ÚgatewayrÕ  Úrecord)r5  rK  r~  r	  r¦  r­  ÚroutingrÁ  rÂ  rª  Úmsgr¬  Úerr_strÚ	_TimedOutÚ
is_timeoutÚis_connect_timeoutÚ_retry_afterÚ_reÚ_mÚ
safe_errorrË  rÕ  s                         r   Ú_try_send_richzTelegramAdapter._try_send_richE  s*  è è € ð ×,Ò,¨XÑ6Ô6ˆ	Ø×3Ò3°G¸XÀxÐQZÑ[Ô[ˆØˆ?Ø�4Ø%,Ñ"ˆ�]õ 2°'Ñ:Ô:Ø ×6Ò6°wÑ?Ô?ð#
ð #
ˆð 	�ŠÐPÐP¨×)<Ò)<Ñ)>Ô)>ÐPÑPÔPÑQÔQÐQØ�Š�t×0Ò0°Ñ:Ô:Ñ;Ô;Ð;Ý�4Ð1°5Ñ9Ô9ð 	DØ/<¸dÐ.CˆGÐ*Ñ+ØÐ"ð
 ,8¸Ð*EˆGÐ&Ñ'ð0	ð
 œ	×0Ò0Ø!¨gð 1ñ ô ð ð ð ð ð ð ˆC‰Cøõ ð (	ñ (	ð (	Ø×+Ò+¨CÑ0Ô0ð 	Ø×1Ò1°#Ñ6Ô6ð 4ð 04�DÔ,Ý—’ØWØ”IÕ:¸3Ñ?Ô?ñô ð ð �t�t�t�t�tõ ˜#‘h”h—n’nÑ&Ô&ˆGð!Ø@Ð@Ð@Ð@Ð@Ð@Ð@øÝ¥Ð0ð !ð !ð !Ø �	�	�	ð!øøøà#ÐB­
°3¸	Ñ(BÔ(BÐ]À{ÐV]ÐG]ˆJØ!%×!AÒ!AÀ#Ñ!FÔ!FÐõ # 3¨°tÑ<Ô<ˆLØÐ#Ø Ð Ð Ð Ø—Z’ZÐ :¸GÀSÄ^ÑTÔT�Øð 6Ý#(¨¯ª°!©¬Ñ#5Ô#5�LÝ4°SÑ9Ô9ˆJÝ�NŠNØOØ”	˜:ñô ð õ ØØ Ø-Ð?°Z°Ø(ð	ñ ô ð ð ð ð ð ð øøøøðG(	øøøðT ˆ
Ý�c�4Ñ Ô ð 	:ØŸš Ñ.Ô.ˆJØÐ!Ø!Ÿgšg hÑ/Ô/Ð5°2×:Ò:¸<ÑHÔH�
øå   l°DÑ9Ô9ˆJØÐ!ðØ3Ð3Ð3Ð3Ð3Ð3Ø×&Ò&¥s¨7¡|¤|µS¸±_´_ÀgÑNÔNÐNÐNøÝð ð ð Ø�ðøøøåØØ*4Ð*@•s˜:‘”�Àdð
ñ 
ô 
ð 	
s\   Ã"C= Ã=JÄAI<Å-!I<ÆFÆI<ÆF,Æ)I<Æ+F,Æ,C
I<É6JÉ<JË17L) Ì)
L6Ì5L6rË  c              ƒ   ó¦  K  — t          |¦  «        t          |¦  «        |                      |¦  «        dœ}|                      |¦  «        }|                      |||d| j        ¬¦  «        }|                     d„ |                     ¦   «         D ¦   «         ¦  «         t          | dd¦  «        rddi|d	<   	 | j	         
                    d
|¬¦  «        ƒ d{V —† �n¡# t          $ �r“}|                      |¦  «        r‰|                      |¦  «        rd| _        dt          |¦  «                             ¦   «         v rt#          d|¬¦  «        cY d}~S t$                               d| j        t+          |¦  «        ¦  «         Y d}~dS dt          |¦  «                             ¦   «         v rt#          d|¬¦  «        cY d}~S t          |¦  «                             ¦   «         }		 ddlm}
 n# t0          t2          f$ r d}
Y nw xY w|
rt5          ||
¦  «        pd|	v }|                      |¦  «        }t+          |¦  «        }t$                               d| j        |¦  «         t#          d||p| ¬¦  «        cY d}~S d}~ww xY w	 ddlm} |                     t          |¦  «        t          |¦  «        |¦  «         n# t          $ r Y nw xY wt#          d|¬¦  «        S )uÏ  Edit an existing message in place as a rich message (Bot API 10.1).

        Uses ``editMessageText`` with the ``rich_message`` parameter so a
        streamed preview can finalize as rich (tables/task lists/details/math)
        WITHOUT a fresh send + delete â€” no duplicate preview.  Mirrors
        :meth:`_try_send_rich`'s error contract:

        - success â†’ ``SendResult(success=True, message_id=...)``
        - permanent / capability error â†’ ``None`` (caller falls back to the
          legacy MarkdownV2 edit; capability errors latch rich off)
        - transient / unknown â†’ ``SendResult(success=False)`` with retry
          semantics (the message may already be edited; do NOT legacy-resend)
        )rK  rË  rÅ  Nrº  c                 ó   — i | ]
\  }}|®||“ŒS r7   rŠ   rÇ  s      r   rÉ  z2TelegramAdapter._try_edit_rich.<locals>.<dictcomp>Ñ  rÊ  r>   r]  Fr{  Trz  ÚeditMessageTextrÎ  únot modifiedrÖ  uK   [%s] rich editMessageText rejected (%s) â€” falling back to MarkdownV2 editr   rÐ  rÑ  zB[%s] rich editMessageText transient failure (no legacy resend): %s©rÓ  r   rŸ  rÔ  ) r    r²   r«  r  r  r[  r×  rØ  rl   rW  r…  r   r¸  rµ  r`  r   rÇ   r”   r(   r)   r   r   r/  r\  râ   r²  r0  rl  r0   rÚ  rÕ  rÛ  )r5  rK  rË  r~  r¦  rª  r­  rÂ  r¬  rÞ  rß  rà  rá  rå  rÕ  s                  r   Ú_try_edit_richzTelegramAdapter._try_edit_rich°  sz  è è € õ* 2°'Ñ:Ô:Ý˜j™/œ/Ø ×6Ò6°wÑ?Ô?ð#
ð #
ˆð
 ×,Ò,¨XÑ6Ô6ˆ	Ø×4Ò4ØØØØ $ØÔ-ð 5ñ 
ô 
ˆð 	�ŠÐPÐP¨×)<Ò)<Ñ)>Ô)>ÐPÑPÔPÑQÔQÐQÝ�4Ð1°5Ñ9Ô9ð 	DØ/<¸dÐ.CˆGÐ*Ñ+ð%	ð ”)×*Ò*Ð+<ÈÐ*ÑQÔQÐQÐQÐQÐQÐQÐQÐQÑQøÝð  	ñ  	ð  	Ø×+Ò+¨CÑ0Ô0ð Ø×1Ò1°#Ñ6Ô6ð 4Ø/3�DÔ,ð "¥S¨¡X¤X§^¢^Ñ%5Ô%5Ð5Ð5Ý%¨d¸zÐJÑJÔJÐJÐJÐJÐJÐJÐJÝ—’ØaØ”IÕ:¸3Ñ?Ô?ñô ð ð �t�t�t�t�tØ¥ S¡¤§¢Ñ!1Ô!1Ð1Ð1Ý!¨$¸:ÐFÑFÔFÐFÐFÐFÐFÐFÐFÝ˜#‘h”h—n’nÑ&Ô&ˆGð!Ø@Ð@Ð@Ð@Ð@Ð@Ð@øÝ¥Ð0ð !ð !ð !Ø �	�	�	ð!øøøà#ÐB­
°3¸	Ñ(BÔ(BÐ]À{ÐV]ÐG]ˆJØ!%×!AÒ!AÀ#Ñ!FÔ!FÐÝ4°SÑ9Ô9ˆJÝ�NŠNØTØ”	˜:ñô ð õ ØØ Ø-Ð?°Z°ðñ ô ð ð ð ð ð ð øøøøð9 	øøøðJ	Ø/Ð/Ð/Ð/Ð/Ð/Ø×"Ò"¥3 w¡<¤<µ°Z±´À'ÑJÔJÐJÐJøÝð 	ð 	ð 	ØˆDð	øøøå $°:Ð>Ñ>Ô>Ð>st   Â4"C ÃI6Ã#A$I1ÅI6Å.I1Æ3I1Æ4I6Æ:!I1ÇG#Ç"I1Ç#G9Ç6I1Ç8G9Ç9A2I1É+I6É1I6É:7J2 Ê2
J?Ê>J?c                 ó~  — t          t          | dd¦  «        oŸt          | dd¦  «        oŽt          | dd¦  «         o|t          | dd¦  «         oj|oh|                     ¦   «         oT|                      |¦  «         o>|                      |¦  «         o(|                      |¦  «        o|                      ¦   «         ¦  «        S )Nr^  Tr_  Fr`  ra  )r…  rl   r   r�  r’  rƒ  rˆ  r‚  s     r   Ú_should_attempt_rich_draftz*TelegramAdapter._should_attempt_rich_draft  së   € ÝÝ�DÐ2°DÑ9Ô9ð 	*Ý˜Ð4°eÑ<Ô<ð	*å˜DÐ"7¸Ñ?Ô?Ð?ð	*õ ˜DÐ"8¸%Ñ@Ô@Ð@ð	*ð ð		*ð
 —’‘”ð	*ð ×GÒGÈÑPÔPÐPð	*ð ×DÒDÀWÑMÔMÐMð	*ð ×.Ò.¨wÑ7Ô7ð	*ð ×'Ò'Ñ)Ô)ñ
ô 
ð 	
r>   Údraft_idc              ƒ   óD  K  — t          |¦  «        t          |¦  «        |                      |¦  «        dœ}|                      |¦  «        }|�t          |¦  «        |d<   	 | j                             d|¬¦  «        ƒ d{V —†}t          |¦  «        S # t          $ r„}|                      |¦  «        r6d| _	        t                               d| j        t          |¦  «        ¦  «         n.t                               d| j        t          |¦  «        ¦  «         Y d}~d	S d}~ww xY w)
uÌ  Emit one ``sendRichMessageDraft`` preview frame; True on success.

        Draft frames are ephemeral and overwritten by the next frame / the
        final ``sendRichMessage``, so a duplicate or lost rich draft is
        harmless â€” any failure simply returns False and the caller renders the
        legacy plain-text draft. A permanent/capability failure additionally
        latches ``_rich_draft_disabled`` so later frames skip the rich attempt.
        )rK  rï  rÅ  NrÚ  ÚsendRichMessageDraftrÎ  TuB   [%s] sendRichMessageDraft unsupported (%s) â€” using legacy draftsuL   [%s] sendRichMessageDraft transient failure (%s) â€” legacy draft this frameF)r    r²   r«  r  rW  r…  r…  r   rµ  ra  r(   r)   r   r   )	r5  rK  rï  r~  r¦  rª  r­  Úokr¬  s	            r   Ú_try_send_rich_draftz$TelegramAdapter._try_send_rich_draft  sH  è è € õ  2°'Ñ:Ô:Ý˜H™œØ ×6Ò6°wÑ?Ô?ð#
ð #
ˆð
 ×,Ò,¨XÑ6Ô6ˆ	ØÐ Ý+.¨y©>¬>ˆGÐ'Ñ(ð	Ø”y×/Ò/Ð0FÐSZÐ/Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[ˆBÝ˜‘8”8ˆOøÝð 	ð 	ð 	Ø×-Ò-¨cÑ2Ô2ð 
Ø,0�Ô)Ý—’ØXØ”IÕ:¸3Ñ?Ô?ñô ð ð õ
 —’ØbØ”IÕ:¸3Ñ?Ô?ñô ð ð �5�5�5�5�5øøøøð	øøøs   Á 0B Â
DÂA9DÄDc              ƒ   ód  K  — | j         r| j         j        sdS 	 | j         j        j        d         }n# t          $ r Y dS w xY w	 t	          j        |                     ¦   «         t          ¬¦  «        ƒ d{V —† n2# t          $ r% t           	                    d| j
        d¬¦  «         Y nw xY w	 t	          j        |                     ¦   «         t          ¬¦  «        ƒ d{V —† t           	                    d| j
        ¦  «         dS # t          $ r& t           	                    d| j
        d¬¦  «         Y dS w xY w)	ur  Reset the httpx connection pool used for getUpdates polling.

        Network errors (especially through proxies like sing-box) can leave
        httpx connections in a half-closed state that still occupy pool slots.
        After enough reconnect cycles the pool fills up entirely, causing
        ``Pool timeout: All connections in the connection pool are occupied.``

        We reset ONLY ``_request[0]`` (the getUpdates request) â€” the general
        request (``_request[1]``) is left untouched so concurrent
        ``send_message`` / ``edit_message`` calls are never interrupted.

        Implementation note: accesses ``Bot._request[0]`` which is the
        get-updates ``BaseRequest`` in the PTB 22.x internal tuple
        ``(get_updates_request, general_request)``.  There is no public
        accessor for the polling request; review if upgrading to PTB 23+.
        Nr   ©r,   z:[%s] Polling request shutdown failed/timed out (non-fatal)Tr#   z2[%s] Polling request pool drained before reconnectz?[%s] Polling request re-initialize failed/timed out (non-fatal))rV  ri   rj   r   r&   Úwait_forrk   Ú_DRAIN_TIMEOUTr(   r)   r   Ú
initialize)r5  Úpolling_reqs     r   Ú_drain_polling_connectionsz*TelegramAdapter._drain_polling_connections;  s—  è è € ð" ”	ð 	˜dœiœmð 	ØˆFð	ð œ)œ-Ô0°Ô3ˆKˆKøÝð 	ð 	ð 	ØˆFˆFð	øøøð	õ Ô" ;×#7Ò#7Ñ#9Ô#9Å>ÐRÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRøÝð 	ð 	ð 	Ý�LŠLØLØ”	 Dð ñ ô ð ð ð ð	øøøð
		ÝÔ" ;×#9Ò#9Ñ#;Ô#;Å^ÐTÑTÔTÐTÐTÐTÐTÐTÐTÐTÝ�LŠLØDÀdÄiñô ð ð ð øõ ð 	ð 	ð 	Ý�LŠLØQØ”	 Dð ñ ô ð ð ð ð ð	øøøs1   ™1 ±
?¾?Á3A7 Á7,B&Â%B&Â*AC? Ã?,D/Ä.D/c                 óÞ  — t          | dd¦  «        rNd| _        d| _        t          | dd¦  «        }|€t          j        ¦   «         }|| _        t          | dd¦  «        |fS t          | dd¦  «        }|�(|                     ¦   «         s|                     ¦   «          d| _        t          | dd¦  «        d	z   | _	        t          j        ¦   «         | _        d| _        d| _        | j	        | j        fS )
zAStart accepting progress for a new getUpdates polling generation.rw  FTrt  Nrs  r   rv  r»   )
rl   ru  r  r&   rO   rt  r9   rV   rv  rs  )r5  ÚprogressÚverifiers      r   Ú_begin_polling_generationz)TelegramAdapter._begin_polling_generationh  sñ   € å�4Ð4°eÑ<Ô<ð 	EØ/4ˆDÔ,Ø'+ˆDÔ$Ý˜tÐ%>ÀÑEÔEˆHØÐÝ"œ=™?œ?�Ø/7�Ô,Ý˜4Ð!6¸Ñ:Ô:¸HÐDÐDå˜4Ð!BÀDÑIÔIˆØÐ¨¯ª©¬ÐØ�OŠOÑÔÐØ/3ˆÔ,Ý#*¨4Ð1FÈÑ#JÔ#JÈQÑ#NˆÔ Ý'.¤}¡¤ˆÔ$Ø+/ˆÔ(Ø#'ˆÔ ØÔ'¨Ô)EÐEÐEr>   Ú
generationc                 óÚ   — t          | dd¦  «        rdS | j        sdS || j        k    rdS | j                             ¦   «          d| _        || j        k    rd| _        nd| _        d| _        dS )zARecord successful getUpdates I/O for the current generation only.rw  FNr   )	rl   ru  rs  rt  r8   rr  rq  rp  r  )r5  rÿ  s     r   Ú_record_polling_progressz(TelegramAdapter._record_polling_progress}  s‹   € å�4Ð4°eÑ<Ô<ð 	ØˆFØÔ/ð 	ØˆFØ˜Ô1Ò1Ð1ØˆFØÔ$×(Ò(Ñ*Ô*Ð*Ø,-ˆÔ)Ø˜ÔCÒCÐCØ9=ˆDÔ6Ð6à+,ˆDÔ(Ø#(ˆÔ Ð Ð r>   c                 ó  — |\  }}|�d|cxk    rdk     sn dS 	 |                      |¦  «        }n# t          $ r Y dS w xY wt          |t          ¦  «        r2|                     d¦  «        du rd|v r|                      |¦  «         dS dS dS dS )a  Record getUpdates progress from an observed do_request result.

        Purely observational: PTB still parses the untouched payload and owns
        any resulting exception. Kept as its own method so the observation
        logic is shared and independently testable.
        NéÈ   i,  rò  Trg   )Úparse_json_payloadr   r0  rA  r‡  r  )r5  ro   rÿ  rg   Ústatus_coderª  Úenvelopes          r   Ú_observe_polling_request_resultz/TelegramAdapter._observe_polling_request_result�  sÛ   € ð  &Ñˆ�WØÐ c¨[Ð&>Ð&>Ò&>Ð&>¸3Ò&>Ð&>Ð&>Ð&>ØˆFð	ð ×1Ò1°'Ñ:Ô:ˆHˆHøÝð 	ð 	ð 	ØˆFˆFð	øøøõ �x¥Ñ&Ô&ð	6à—’˜TÑ"Ô" dÐ*Ð*Ø˜HÐ$Ð$à×)Ò)¨*Ñ5Ô5Ð5Ð5Ð5ð	6ð 	6à*Ð*Ø$Ð$s   š0 °
>½>c                 óX   ‡— | Št          |¦  «        } G ˆfd„d|¦  «        }||_        |S )aû  Instrument one dedicated PTB getUpdates request with progress tracking.

        PTB's request classes (``BaseRequest`` / ``HTTPXRequest``) use
        ``__slots__``. On Python 3.13 their instances no longer carry a
        ``__dict__`` (the ``AbstractAsyncContextManager`` MRO stopped yielding
        one), so ``request.do_request = wrapper`` raises
        ``AttributeError: 'HTTPXRequest' object attribute 'do_request' is
        read-only`` and the whole Telegram connect fails (#64482). It only
        appeared to work on Python 3.12, where those instances still had a
        ``__dict__``.

        Instead of monkey-patching the instance, re-tag it to a thin subclass
        that overrides ``do_request``. This is portable across Python versions
        and works for both the real request and the test doubles. The subclass
        declares ``__slots__ = ()`` so its instance layout stays identical to
        the base, which is what makes the ``__class__`` swap legal on a slotted
        instance.
        c                   ó&   •‡ — e Zd ZdZˆ ˆfd„Zˆ xZS )úPTelegramAdapter._instrument_polling_request.<locals>._InstrumentedPollingRequestrŠ   c              Ÿ   óª   •K  — t                                ¦   «         } t          ¦   «         j        |i |¤Žƒ d {V —†}‰                     | ||¦  «         |S r7   )r  r‡  rS  Ú
do_requestr  )r5  ÚargsÚkwargsrÿ  rg   r—  Úadapters        €€r   r  z[TelegramAdapter._instrument_polling_request.<locals>._InstrumentedPollingRequest.do_request¾  sb   øè è € Ý8×<Ò<Ñ>Ô>�
Ø1�u™wœwÔ1°4ÐB¸6ÐBÐBÐBÐBÐBÐBÐBÐB�Ø×7Ò7¸¸jÈ&ÑQÔQÐQØ�r>   )r†   r‡   rˆ   Ú	__slots__r  Ú__classcell__)r—  r  s   @€r   Ú_InstrumentedPollingRequestr
  »  sC   øø€ € € € € ØˆIðð ð ð ð ð ð ð ð ð r>   r  )rÙ  r—  )r5  ro   Úbase_clsr  r  s       @r   Ú_instrument_polling_requestz+TelegramAdapter._instrument_polling_request¥  sX   ø€ ð& ˆÝ˜‘=”=ˆð	ð 	ð 	ð 	ð 	ð 	ð 	¨(ñ 	ô 	ð 	ð 8ˆÔØˆr>   )Úabandon_app_on_timeoutÚschedule_verifierÚdrop_pending_updatesr  r  c             ƒ   ó˜  ‡ ‡‡	K  — t          ‰ dd¦  «        rt          d¦  «        ‚‰                      ¦   «         \  Š	}‰ j        st          d¦  «        ‚dt          ddfˆˆ	ˆ fd„}t
                               ‰	¦  «        }	 t          |j         	                    t          j        ||¬¦  «        t          |r|fd	„nd¬
¦  «        ƒ d{V —† t
                               |¦  «         n# t
                               |¦  «         w xY wt          ‰ dd¦  «        rd‰ _        d‰ _        t          d¦  «        ‚|r‰                      ‰	|¦  «         ‰	|fS )u·  Start one generation and verify real getUpdates progress.

        Returns the ``(generation, progress_event)`` pair created for this
        polling generation so callers that must gate on readiness (strict
        cold start, #67498) can bind to exactly this generation instead of
        re-reading ``self._polling_progress_event`` â€” which a concurrent
        recovery task may have replaced with a newer generation's event.
        rw  Fz!Telegram polling teardown startedr   r   Nc                 ó  •— t          ‰dd¦  «        rd S ‰‰j        k    rd S ‰�at                               d ¦  «        }	  ‰| ¦  «         t                               |¦  «         d S # t                               |¦  «         w xY wd S )Nrw  F)rl   rs  r  r8   Úreset)r   Úcallback_context_tokenÚerror_callbackrÿ  r5  s     €€€r   Ú_generation_error_callbackzGTelegramAdapter._start_polling_once.<locals>._generation_error_callbackÞ  sŸ   ø€ Ý�tÐ8¸%Ñ@Ô@ð Ø�Ø˜TÔ5Ò5Ð5Ø�ØÐ)Ý)D×)HÒ)HÈÑ)NÔ)NÐ&ðNØ"�N 5Ñ)Ô)Ð)å/×5Ò5Ð6LÑMÔMÐMÐMÐMøÕ/×5Ò5Ð6LÑMÔMÐMÐMøøøð *Ð)s   ¿A& Á&B)Úallowed_updatesr  r  c                 ó    — t          | ¦  «        S r7   ©rp   ©rm   s    r   ú<lambda>z5TelegramAdapter._start_polling_once.<locals>.<lambda>ø  s   € Õ%<¸SÑ%AÔ%A€ r>   ©r,   r4   T)rl   r  rþ  ru  r   r  r8   r_   ÚupdaterÚstart_pollingrq   Ú	ALL_TYPESÚ_UPDATER_START_TIMEOUTr  r  Ú#_schedule_polling_progress_verifier)
r5  rm   r  r  r  r  rü  r  Úcontext_tokenrÿ  s
   `  `     @r   Ú_start_polling_oncez#TelegramAdapter._start_polling_onceÇ  sË  øøøè è € õ" �4Ð4°eÑ<Ô<ð 	NÝ(Ð)LÑMÔMÐMØ#×=Ò=Ñ?Ô?Ñˆ
�HØÔ/ð 	NÝ(Ð)LÑMÔMÐMð
	N­ið 
	N¸Dð 
	Nð 
	Nð 
	Nð 
	Nð 
	Nð 
	Nð 
	Nð 
	Nõ 4×7Ò7¸
ÑCÔCˆð	=õ
 .Ø”×)Ò)Ý$*Ô$4Ø)=Ø#=ð *ñ ô õ
 /ð .ð ÐAÐAÐAÐAàðñ ô ð ð ð ð ð ð ð õ (×-Ò-¨mÑ<Ô<Ð<Ð<øÕ'×-Ò-¨mÑ<Ô<Ð<Ð<øøøÝ�4Ð4°eÑ<Ô<ð 	NØ/4ˆDÔ,Ø'+ˆDÔ$Ý(Ð)LÑMÔMÐMØð 	KØ×4Ò4°ZÀÑJÔJÐJØ˜8Ð#Ð#s   Á?A	C# Ã#C?rü  c                 óÈ  ‡ — t          ‰ dd¦  «        rd‰ _        d‰ _        dS t          ‰ dd¦  «        }|�(|                     ¦   «         s|                     ¦   «          t          j        ¦   «                              ‰                      ||¦  «        ¦  «        }|‰ _	        ‰ j
                             |¦  «         dt
          j        ddfˆ fd„}|                     |¦  «         dS )	z<Own exactly one tracked verifier for the current generation.rw  FTNrv  Úfinishedr   c                 ó`   •— ‰j                              | ¦  «         ‰j        | u r	d ‰_        d S d S r7   )Ú_background_tasksÚdiscardrv  )r,  r5  s    €r   Ú_clear_finished_verifierzUTelegramAdapter._schedule_polling_progress_verifier.<locals>._clear_finished_verifier	  s?   ø€ ØÔ"×*Ò*¨8Ñ4Ô4Ð4ØÔ3°xÐ?Ð?Ø7;�Ô4Ð4Ð4ð @Ð?r>   )rl   ru  r  r9   rV   r&   rL   Úcreate_taskÚ_verify_polling_after_reconnectrv  r.  rd  ÚTaskrW   )r5  rÿ  rü  Úpreviousr!   r0  s   `     r   r(  z3TelegramAdapter._schedule_polling_progress_verifier	  s  ø€ õ �4Ð4°eÑ<Ô<ð 	Ø/4ˆDÔ,Ø'+ˆDÔ$ØˆFÝ˜4Ð!BÀDÑIÔIˆØÐ¨¯ª©¬ÐØ�OŠOÑÔÐåÔ'Ñ)Ô)×5Ò5Ø×0Ò0°¸XÑFÔFñ
ô 
ˆð 04ˆÔ,ØÔ×"Ò" 4Ñ(Ô(Ð(ð	<­w¬|ð 	<Àð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð
 	×ÒÐ7Ñ8Ô8Ð8Ð8Ð8r>   c                 ó`   — t          | dd ¦  «        }|€t          j        ¦   «         }|| _        |S )Nr�  )rl   r&   r€  r�  )r5  Úlocks     r   Ú_get_general_request_drain_lockz/TelegramAdapter._get_general_request_drain_lock 	  s1   € Ý�tÐ:¸DÑAÔAˆØˆ<Ý”<‘>”>ˆDØ/3ˆDÔ,Øˆr>   c              ƒ   ó®  K  — t          t          | dd¦  «        dd¦  «        }|€t          | dd¦  «        }|€dS 	 |j        d         }n# t          $ r Y dS w xY w|                      ¦   «         4 ƒd{V —† 	 |                     ¦   «         ƒ d{V —† n2# t          $ r% t
                               d| j        d¬¦  «         Y nw xY w	 |                     ¦   «         ƒ d{V —† t
           	                    d	| j        ¦  «         n2# t          $ r% t
                               d
| j        d¬¦  «         Y nw xY wddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )a4  Reset the Bot API request pool after a confirmed send pool timeout.

        ``send_message`` uses PTB's general request pool (``_request[1]``).
        When httpx reports that this pool is exhausted, PTB says the request
        was not sent, so it is safe to reset the wedged pool before retrying.
        rV  Nri   rW  r»   zC[%s] General request shutdown failed after pool timeout (non-fatal)Tr#   z=[%s] General request pool drained after Telegram pool timeoutzH[%s] General request re-initialize failed after pool timeout (non-fatal))
rl   rj   r   r7  rk   r(   r)   r   rø  r0   )r5  ri   Úgeneral_reqs      r   Ú-_drain_general_connections_after_pool_timeoutz=TelegramAdapter._drain_general_connections_after_pool_timeout'	  sW  è è € õ •g˜d F¨DÑ1Ô1°5¸$Ñ?Ô?ˆØˆ;Ý˜$ ¨Ñ-Ô-ˆCØˆ;ØˆFð	àœ, qœ/ˆKˆKøÝð 	ð 	ð 	ØˆFˆFð	øøøà×7Ò7Ñ9Ô9ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðØ!×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð ð ð Ý—’ØYØ”I¨ð ñ ô ð ð ð ðøøøð

Ø!×,Ò,Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ý—’ØSØ”Iñô ð ð øõ ð ð ð Ý—’Ø^Ø”I¨ð ñ ô ð ð ð ðøøøð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	sk   »A	 Á	
AÁAÁ4EÁ6BÂEÂ,C Â=EÂ?C Ã EÃ:C?Ã>EÃ?,D.Ä+EÄ-D.Ä.EÅ
EÅEÚreasonc                óR  — t          | dd¦  «        rdS | j        rdS | j        rJ| j                             ¦   «         s1t                               d| j        |t          |¦  «        ¦  «         dS d| _        t           	                    d| j        |t          |¦  «        ¦  «         t          j        ¦   «         }|                     |                      |¦  «        ¦  «        | _        | j                             | j        ¦  «         | j                             | j        j        ¦  «         dS )ay  Schedule polling recovery without failing gateway startup.

        A Telegram bootstrap failure (deleteWebhook / initial start_polling)
        caused by a transient network error should degrade only the Telegram
        adapter: the gateway process stays alive and the existing reconnect
        ladder (``_handle_polling_network_error``) recovers in the background.
        rw  FNzA[%s] Telegram polling recovery already scheduled; ignoring %s: %sTzR[%s] Telegram polling degraded (%s); gateway stays alive and will retry. Error: %s)rl   Úhas_fatal_errorro  r9   r(   r)   r   r   r  r0   r&   rL   r1  Ú_handle_polling_network_errorr.  rd  rW   r/  )r5  r   r;  rA   s       r   Ú_schedule_polling_recoveryz*TelegramAdapter._schedule_polling_recoveryL	  s&  € õ �4Ð4°eÑ<Ô<ð 	ØˆFØÔð 	ØˆFØÔ#ð 	¨DÔ,D×,IÒ,IÑ,KÔ,Kð 	Ý�LŠLØSØ”	˜6Õ#>¸uÑ#EÔ#Eñô ð ð ˆFØ#'ˆÔ Ý�ŠØ`ØŒI�vÕ:¸5ÑAÔAñ	
ô 	
ð 	
õ Ô'Ñ)Ô)ˆØ#'×#3Ò#3°D×4VÒ4VÐW\Ñ4]Ô4]Ñ#^Ô#^ˆÔ ØÔ×"Ò" 4Ô#;Ñ<Ô<Ð<ØÔ ×2Ò2°4Ô3IÔ3QÑRÔRÐRÐRÐRr>   ©Úrequire_successrA  c             ƒ   ó¢  K  — | j         sdS t          | j         dd¦  «        }t          |¦  «        sdS 	 t           |d¬¦  «        t          ¬¦  «        ƒ d{V —† dS # t
          $ rh}|                      |¦  «        rM|rt          d¦  «        |‚t           	                    d| j
        t          |¦  «        ¦  «         d| _        Y d}~dS ‚ d}~ww xY w)	a>  Clear stale webhook, optionally failing closed on initial connect.

        Reconnect can recover a transient error in background. Cold startup uses
        ``require_success`` so GatewayRunner disposes the partial adapter and
        retries with a fresh PTB Application instead of publishing degraded state.
        FÚdelete_webhookNT)r  rõ  z>Telegram deleteWebhook did not complete during initial connectzu[%s] deleteWebhook failed with a recoverable network error; continuing to polling so getUpdates/retry can recover: %s)rW  rl   rÆ  r_   r'  r   r^  r]  r(   r0   r   r   r  )r5  rA  rC  Úerrs       r   Ú_delete_webhook_best_effortz+TelegramAdapter._delete_webhook_best_efforth	  s3  è è € ð Œyð 	Ø�5Ý  ¤Ð,<¸dÑCÔCˆÝ˜Ñ'Ô'ð 	Ø�4ð	õ .Ø�°EÐ:Ñ:Ô:Ý.ðñ ô ð ð ð ð ð ð ð ð �4øÝð 	ð 	ð 	Ø×-Ò-¨cÑ2Ô2ð Ø"ð Ý!ØXñô àðõ —’ðPà”IÕ:¸3Ñ?Ô?ñô ð ð
 ,0�Ô(Ø�u�u�u�u�uØøøøøð	øøøs   ´&A Á
CÁ&AC	ÃC	Ã	C)Úrequire_progressrF  c             ƒ   ó:  ‡‡‡‡‡K  — t          | dd¦  «        rdS | j        r| j        j        st          d¦  «        ‚g Št	          j        ¦   «         ŠdŠ‰}|r(t	          j        ¦   «         Šdt          ddfˆˆˆˆˆfd„}|}	 |                      | j        |||| ¬	¦  «        ƒ d{V —†\  }}|�r¶t	          j	        | 
                    ¦   «         ¦  «        }t	          j	        ‰ 
                    ¦   «         ¦  «        }		 t          t          ||	¦  «        t          ¬
¦  «        ƒ d{V —† n1# t          j        $ r}
t          dt          d›d�¦  «        |
‚d}
~
ww xY w	 ||	fD ]*}|                     ¦   «         s|                     ¦   «          Œ+t	          j        ||	d¬¦  «        ƒ d{V —† nQ# ||	fD ]*}|                     ¦   «         s|                     ¦   «          Œ+t	          j        ||	d¬¦  «        ƒ d{V —† w xY w‰r@|                     ¦   «         s,t          dt)          ‰d         ¦  «        › �¦  «        ‰d         ‚|                     ¦   «         st          d¦  «        ‚dŠ‰| _        dS # t,          $ r Y dS t          $ �r}t          | dd¦  «        rY d}~dS |r‚ |                      |¦  «        r·t0                               d| j        t)          |¦  «        ¦  «         t	          j        ¦   «         Š‰                     |                      |¦  «        ¦  «        | _        | j                             | j        ¦  «         | j                              | j        j!        ¦  «         Y d}~dS |  "                    |¦  «        r|  #                    |d¬¦  «         Y d}~dS ‚ d}~ww xY w)ag  Start PTB polling and optionally require real getUpdates readiness.

        Reconnects may recover in background. Initial connect sets
        ``require_progress`` so a bootstrap failure or missing first successful
        getUpdates response raises; GatewayRunner then disposes this partial
        adapter and retries with a fresh PTB Application.
        rw  Fz,Telegram application/updater not initializedTr   r   Nc                 óŒ   •— ‰s‰� ‰| ¦  «         d S ‰s‰                      | ¦  «         ‰                     ‰j        ¦  «         d S r7   )r  r@   r8   )r   r  rA   Ústrict_errorÚstrict_error_eventÚstrict_gate_opens    €€€€€r   Ú_strict_error_callbackzHTelegramAdapter._start_polling_resilient.<locals>._strict_error_callback°	  sd   ø€ ð
 (ð Ø%Ð1Ø&˜ uÑ-Ô-Ð-Ø�FØ#ð /Ø ×'Ò'¨Ñ.Ô.Ð.ð ×)Ò)Ð*<Ô*@ÑAÔAÐAÐAÐAr>   )r  r  r  r  rõ  z,Telegram getUpdates made no progress within ú.0fua   s during initial connect â€” failing startup so the gateway retries with a fresh adapter (#67498)©Úreturn_exceptionszQTelegram polling errored before first getUpdates success during initial connect: r   z?Telegram getUpdates did not become ready during initial connectz[[%s] Telegram polling bootstrap conflict; gateway stays alive while conflict retry runs: %szpolling bootstrap©r;  )$rl   rV  r$  ÚRuntimeErrorr&   rO   rL   r   r*  rK   rT   r_   rc   Ú!_INITIAL_POLLING_PROGRESS_TIMEOUTrY   r]  r9   rV   ÚgatherrD   r   rx  r  rP  r(   r0   r   r1  Ú_handle_polling_conflictro  r.  rd  rW   r/  r^  r?  )r5  r  r  rF  Úeffective_callbackrL  rÿ  rü  Úprogress_waitÚ
error_waitr¬  ÚfutrD  rA   rI  rJ  rK  s     `          @@@@r   Ú_start_polling_resilientz(TelegramAdapter._start_polling_resilient�	  s  øøøøøè è € õ �4Ð4°eÑ<Ô<ð 	Ø�5Ø”	ð 	O˜dœiÔ/ð 	OÝÐMÑNÔNÐNð -/ˆÝ$œ]™_œ_ÐØÐØ+ÐØð 	8ÝÔ+Ñ-Ô-ˆDðB­ið B¸Dð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð "8ÐðN	ð *.×)AÒ)AØ”	Ø%9Ø1Ø'7ð '7Ð"6ð *Bñ *ô *ð $ð $ð $ð $ð $ð $Ñ ˆJ˜ð  ñ 'Bõ !(Ô 5°h·m²m±o´oÑ FÔ F�Ý$Ô2Ð3E×3JÒ3JÑ3LÔ3LÑMÔM�
ðÝ5Ý(¨¸
ÑCÔCÝ Aðñ ô ð ð ð ð ð ð ð ð øõ Ô+ð ð ð Ý!ð1Ý<ÐSð1ð 1ð 1ñô ð
 ðøøøøðøøøð	ð !.¨zÐ:ð )ð )˜Ø"Ÿxšx™zœzð )ØŸJšJ™LœL˜LøÝ!œ.Ø% zÀTðñ ô ð ð ð ð ð ð ð ð øð !.¨zÐ:ð )ð )˜Ø"Ÿxšx™zœzð )ØŸJšJ™LœL˜LøÝ!œ.Ø% zÀTðñ ô ð ð ð ð ð ð ð ð øøøð  ð +¨¯ªÑ(9Ô(9ð +Ý!ðJå6°|ÀA´ÑGÔGðJð Jñô ð (¨œ?ð	+ð
  —’Ñ(Ô(ð Ý!ØYñô ð ð $)Ð Ø3A�Ô0Ø�4øÝ%ð 	ð 	ð 	Ø�5�5Ýð 	ñ 	ð 	Ý�tÐ8¸%Ñ@Ô@ð Ø�u�u�u�u�uØð ØØ×0Ò0°Ñ5Ô5ð 
Ý—’ð4à”IÕ:¸3Ñ?Ô?ñô ð õ
 Ô/Ñ1Ô1�Ø+/×+;Ò+;¸D×<YÒ<YÐZ]Ñ<^Ô<^Ñ+_Ô+_�Ô(ØÔ&×*Ò*¨4Ô+CÑDÔDÐDØÔ(×:Ò:¸4Ô;QÔ;YÑZÔZÐZØ�u�u�u�u�uØ×-Ò-¨cÑ2Ô2ð Ø×/Ò/°Ð<OÐ/ÑPÔPÐPØ�u�u�u�u�uØøøøøð'	øøøsk   ÂA8I% Ã:*D% Ä$F$ Ä%EÄ4EÅEÅF$ ÅAI% Æ$AG2Ç2A1I% É%
NÉ2
NÉ<NÊC	NÍ",NÎNÎNc              ƒ   óª  K  — t          | dd¦  «        rdS | j        rdS d}d}d}| xj        dz  c_        d| _        | j        }||k    rhd	|z  }t                               d
| j        |t          |¦  «        ¦  «         |                      d|d¬¦  «         |  	                    ¦   «         ƒ d{V —† dS t          |d|dz
  z  z  |¦  «        }t          |¦  «        }t                               d| j        ||||¦  «         t          j        |¦  «        ƒ d{V —† t          | dd¦  «        rdS | j        }		 |	r‚|	j        r{|	j        j        ro	 t          j        |	j                             ¦   «         t&          ¬¦  «        ƒ d{V —† n5# t          j        $ r# t                               d| j        ¦  «         Y nw xY wn# t*          $ r Y nw xY wt          | dd¦  «        rdS |                      ¦   «         ƒ d{V —† t          | dd¦  «        rdS 	 |	st/          d¦  «        ‚|                      |	d| j        ¬¦  «        ƒ d{V —† t                               d| j        |¦  «         dS # t6          $ r Y dS t*          $ rÝ}
t          | dd¦  «        rY d}
~
dS t          |
¦  «        }t                               d| j        |¦  «         | j        s~t          | dd¦  «        sst          j        |                      |
¦  «        ¦  «        }| j                             |¦  «         |                      | j        j!        ¦  «         || _"        Y d}
~
dS Y d}
~
dS Y d}
~
dS d}
~
ww xY w)aK  Reconnect polling after a transient network interruption.

        Triggered by NetworkError/TimedOut in the polling error callback, which
        happen when the host loses connectivity (Mac sleep, WiFi switch, VPN
        reconnect, etc.).  The gateway process stays alive but the long-poll
        connection silently dies; without this handler the bot never recovers.

        Strategy: exponential back-off (5s, 10s, 20s, 40s, 60s cap) up to
        MAX_NETWORK_RETRIES attempts, then mark the adapter retryable-fatal so
        the supervisor restarts the gateway process.
        rw  FNé
   rÂ   é<   r»   TzdTelegram polling could not reconnect after %d network error retries. Escalating to gateway recovery.z[%s] %s Last error: %sÚtelegram_network_errorr¡  é   zK[%s] Telegram network error (attempt %d/%d), reconnecting in %ds. Error: %srõ  z…[%s] updater.stop() timed out during network-error reconnect (likely CLOSE-WAIT socket); forcing drain and restart without clean stopz3Telegram application was torn down during reconnect©r  r  zd[%s] Telegram polling restarted after network error (attempt %d); health pending getUpdates progressz*[%s] Telegram polling reconnect failed: %s)#rl   r=  rr  r  r(   r   r   r   r¢  Ú_handoff_polling_fatal_errorr0  r0   r&   ÚsleeprV  r$  Úrunningrö  ÚstopÚ_UPDATER_STOP_TIMEOUTrY   r   rú  rQ  r*  rx  r½   r  rK   r>  r.  rd  rW   r/  ro  )r5  r   ÚMAX_NETWORK_RETRIESÚ
BASE_DELAYÚ	MAX_DELAYÚattemptrž  Údelayrå  rm   Ú	retry_errÚsafe_retry_errorr!   s                r   r>  z-TelegramAdapter._handle_polling_network_error
  s›  è è € õ �4Ð4°eÑ<Ô<ð 	ØˆFØÔð 	ØˆFà ÐØˆ
Øˆ	àÐ)Ô)¨QÑ.Ð)Ô)Ø#'ˆÔ ØÔ3ˆàÐ(Ò(Ð(ð2Ø4GñHð õ �LŠLÐ1°4´9¸gÕGbÐchÑGiÔGiÑjÔjÐjØ×!Ò!Ð":¸GÈtÐ!ÑTÔTÐTØ×3Ò3Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ØˆFå�J !¨°!©Ñ"4Ñ5°yÑAÔAˆÝ0°Ñ7Ô7ˆ
Ý�ŠØYØŒI�wÐ 3°U¸Jñ	
ô 	
ð 	
õ Œm˜EÑ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"å�4Ð4°eÑ<Ô<ð 	ØˆFð Œiˆð	Øð �s”{ð  s¤{Ô':ð ðõ "Ô*¨3¬;×+;Ò+;Ñ+=Ô+=ÕG\Ð]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]øÝÔ+ð ð ð Ý—N’Nð9ð œ	ñ	ô ð ð ð ðøøøøøõ ð 	ð 	ð 	ØˆDð	øøøõ �4Ð4°eÑ<Ô<ð 	ØˆFØ×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/å�4Ð4°eÑ<Ô<ð 	ØˆFð$	0Øð ZÝ"Ð#XÑYÔYÐYØ×*Ò*ØØ%*Ø#Ô?ð +ñ ô ð ð ð ð ð ð ð õ
 �KŠKð5à”	˜7ñô ð ð ð øõ
 &ð 	ð 	ð 	ØˆFˆFÝð 	0ð 	0ð 	0Ý�tÐ8¸%Ñ@Ô@ð Ø�����Ý:¸9ÑEÔEÐÝ�NŠNÐGÈÌÐTdÑeÔeÐeð Ô(ð0å Ð&AÀ5ÑIÔIð0õ Ô,Ø×6Ò6°yÑAÔAñô �ð Ô&×*Ò*¨4Ñ0Ô0Ð0Ø×&Ò& tÔ'=Ô'EÑFÔFÐFð ,0�Ô(Ð(Ð(Ð(Ð(Ð(Ð(ð0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0ð 0øøøøð	0øøøs\   Ä2F7 Å8F Æ F7 Æ/F3Æ0F7 Æ2F3Æ3F7 Æ7
GÇGÈAI É
MÉ,	MÉ5MÊB/MÍMc              ƒ   óÀ  K  — d}d}d}d}	 	 t          j        |¦  «        ƒ d{V —† t          | dd¦  «        rdS | j        rdS | j        }|�Â|                     ¦   «         s®t          j        ¦   «         }||ur|}|}n”||z
  t          k    rƒ||z
  }t           
                    d| j        |¦  «         	 |                     ¦   «          n# t          $ r Y nw xY w|                      d	d
|z  d¬¦  «         |                      ¦   «         ƒ d{V —† dS nd}| j        r| j        j        nd}|€�Œt%          t          |dd¦  «        ¦  «        sdS t          j        |                     ¦   «         |¦  «        ƒ d{V —† t          j        ¦   «         | _        |                      t          |dd¦  «        ¦  «         |                      ||¦  «        ƒ d{V —† n�# t           j        $ r Y dS t           j        t4          f$ r!}	|                      |	d¬¦  «         Y d}	~	nLd}	~	wt          $ r<}	|                      |	¦  «        r|                      |	d¬¦  «         Y d}	~	�ŒFY d}	~	nd}	~	ww xY w�ŒT)uÏ  Detect dead Telegram TCP sockets (CLOSE-WAIT) by periodic probing.

        PTB's long-poll task blocks on epoll waiting for Telegram to push an
        update.  When the underlying TCP connection enters CLOSE-WAIT (the remote
        sent a FIN but the httpx pool has not yet noticed), epoll still reports
        the socket as readable and no exception is raised â€” so PTB's
        ``error_callback`` never fires and the gateway silently stops receiving
        messages.

        This loop probes ``get_me()`` every ``HEARTBEAT_INTERVAL`` seconds on the
        *general* request path (not the getUpdates pool), so a healthy long-poll
        waiting for the 30-second Telegram window is never interrupted.  On any
        connect-level failure the loop hands off to
        ``_handle_polling_network_error`` â€” the same path triggered by PTB's own
        ``error_callback`` â€” which drains the dead pool and restarts polling.

        Unlike the generation verifier (a one-shot progress deadline after
        every polling start), this loop runs for the full lifetime of the
        polling connection, so it catches a socket that wedges later during
        steady-state operation without any prior error event.
        éZ   é   NrG   Trw  Fzš[%s] Telegram reconnect task wedged for %.0fs with no ladder progress; forcing retryable-fatal so the gateway reconnects instead of staying silently deaf.r]  zDTelegram reconnect task wedged for %.0fs; forcing gateway reconnect.r¡  Úget_merÕ  zheartbeat proberP  )r&   ra  rl   r=  ro  r9   ÚtimeÚ	monotonicÚ!_POLLING_ERROR_TASK_STUCK_TIMEOUTr(   r   r   rV   r   r¢  r`  rV  ri   rÆ  rö  ro  r{  Ú_note_bot_usernameÚ_probe_pending_updatesr'   rY   r]  r?  r^  )
r5  ÚHEARTBEAT_INTERVALÚPROBE_TIMEOUTÚstuck_task_refÚstuck_task_sinceÚrecovery_taskÚnowÚ	stuck_forri   Ú	probe_errs
             r   Ú_polling_heartbeat_loopz'TelegramAdapter._polling_heartbeat_loop‰
  sC  è è € ð,  ÐØˆð 26ˆØÐðM	ðLÝ”mÐ$6Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ý˜4Ð!<¸eÑDÔDð Ø�FØÔ'ð Ø�Fð !%Ô 8�Ø Ð,°]×5GÒ5GÑ5IÔ5IÐ,Ýœ.Ñ*Ô*�CØ$¨NÐ:Ð:Ø)6˜Ø+.Ð(Ð(ØÐ/Ñ/Õ2SÒSÐSØ$'Ð*:Ñ$:˜	ÝŸšðKð !œI yñ	ô ð ð!Ø)×0Ò0Ñ2Ô2Ð2Ð2øÝ(ð !ð !ð !Ø ˜Dð!øøøà×-Ò-Ø4ð1Ø3<ñ=à&*ð	 .ñ ô ð ð #×?Ò?ÑAÔAÐAÐAÐAÐAÐAÐAÐAØ˜ð' Tð* &*�Nà'+¤yÐ:�d”i”m�m°d�Ø�;Ùõ  ¥¨¨X°tÑ <Ô <Ñ=Ô=ð Ø�FÝÔ& s§z¢z¡|¤|°]ÑCÔCÐCÐCÐCÐCÐCÐCÐCõ 15´Ñ0@Ô0@�Ô-Ø×'Ò'­°°ZÀÑ(FÔ(FÑGÔGÐGð ×1Ò1°#°}ÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEøÝÔ)ð ð ð Ø��ÝÔ(­'Ð2ð Uð Uð UØ×/Ò/°	ÐBSÐ/ÑTÔTÐTÐTÐTÐTÐTÐTøøøøÝð ð ð Ø×1Ò1°)Ñ<Ô<ð Ø×3Ò3°IÐFWÐ3ÑXÔXÐXØ�H�H�H‘Hð ����øøøøðøøøñOM	sl   �+G ºG ÁA-G Â1C ÃG Ã
CÃG ÃCÃ8G ÄG Ä)G Å	BG ÇIÇ!IÇ6HÈIÈ,IÉIÚprobe_timeoutc              ƒ   óv  K  — t          | dd¦  «        rdS | j        rdS | j        r"| j                             ¦   «         s	d| _        dS | j        rt          | j        dd¦  «        nd}|€	d| _        dS t          |dd¦  «        sÑd| _        | xj        dz  c_        t                               d| j	        | j        ¦  «         | j        d	k    r‡d| _        t          | dd¦  «        rdS t                               d
| j	        ¦  «         t          j        ¦   «         }|                     |                      t          d¦  «        ¦  «        ¦  «        | _        dS d| _        t          |dd¦  «        }t          |¦  «        sdS 	 t          j         |¦   «         |¦  «        ƒ d{V —†}n# t          j        t$          f$ r Y dS w xY wt'          t          |dd¦  «        pd¦  «        }|dk    r	d| _        dS | xj        dz  c_        t                               d| j	        || j        ¦  «         | j        d	k    r‰d| _        t          | dd¦  «        rdS t                               d| j	        ¦  «         t          j        ¦   «         }|                     |                      t          d¦  «        ¦  «        ¦  «        | _        dS dS )u  Detect a wedged getUpdates consumer via pending_update_count.

        PTB can report ``updater.running == True`` while its long-poll task is
        silently stuck (e.g. a socket that epoll keeps reporting readable on
        WSL2). ``get_me()`` stays healthy because it uses the general request
        path, so the CLOSE-WAIT heartbeat never fires â€” yet DMs queue in the
        Bot API and never reach handlers (#42909).

        ``get_webhook_info().pending_update_count`` is the one signal that
        exposes this: a growing/stuck queue while we believe we're polling means
        the consumer is dead. We only escalate after two consecutive stuck
        probes so a single update that's simply in-flight between probes does
        not trip a needless recovery. Recovery reuses
        ``_handle_polling_network_error`` â€” the same ladder PTB's own
        ``error_callback`` feeds â€” so no new restart machinery is introduced.

        This also covers the harsher case where the updater has stopped
        entirely (``running=False``) with no reconnect in flight: the long-poll
        task is gone rather than wedged, so even ``get_webhook_info`` can't
        report a queue against a live consumer. We detect the stopped updater
        directly and feed the same ladder (#55769).
        rw  FNr   r$  rb  r»   zY[%s] Telegram polling heartbeat: updater stopped while in polling mode (stuck probe %d/2)r^  zV[%s] Telegram updater is not running (long-poll task gone); triggering polling restartz.Telegram updater stopped while in polling modeÚget_webhook_infoÚpending_update_countzX[%s] Telegram polling heartbeat: %d update(s) queued but not consumed (stuck probe %d/2)zX[%s] getUpdates consumer appears wedged (queue not draining); triggering polling restartz8getUpdates consumer wedged: pending updates not draining)rl   rX  ro  r9   r~  rV  r}  r(   r0   r   r&   rL   r1  r>  rQ  rÆ  rö  rY   r]  r²   )r5  ri   r~  r$  rA   r€  r½   Úpendings           r   rt  z&TelegramAdapter._probe_pending_updatesû
  s7  è è € õ. �4Ð4°eÑ<Ô<ð 	ØˆFð Ôð 	ØˆFð Ô#ð 	¨DÔ,D×,IÒ,IÑ,KÔ,Kð 	Ø./ˆDÔ+ØˆFØ9=¼ÐL•'˜$œ) Y°Ñ5Ô5Ð5ÈˆØˆ?Ø01ˆDÔ-ØˆFÝ�w 	¨5Ñ1Ô1ð  	ð 12ˆDÔ-ØÐ+Ô+¨qÑ0Ð+Ô+Ý�NŠNð2à”	˜4Ô:ñô ð ð
 Ô.°!Ò3Ð3Ø23�Ô/Ý˜4Ð!<¸eÑDÔDð Ø�FÝ—’ð8à”Iñô ð õ
 Ô/Ñ1Ô1�Ø+/×+;Ò+;Ø×6Ò6Ý$Ð%UÑVÔVñô ñ,ô ,�Ô(ð
 ˆFØ*+ˆÔ'Ý" 3Ð(:¸DÑAÔAÐÝÐ(Ñ)Ô)ð 	ØˆFð	Ý Ô)Ð*:Ð*:Ñ*<Ô*<¸mÑLÔLÐLÐLÐLÐLÐLÐLˆDˆDøÝÔ$¥gÐ.ð 	ð 	ð 	ð ˆFˆFð	øøøõ •g˜dÐ$:¸AÑ>Ô>ÐCÀ!ÑDÔDˆØ�aŠ<ˆ<Ø01ˆDÔ-ØˆFØÐ)Ô)¨QÑ.Ð)Ô)Ý�Šð*àŒI�w Ô Añ	
ô 	
ð 	
ð
 Ô,°Ò1Ð1Ø01ˆDÔ-Ý�tÐ8¸%Ñ@Ô@ð Ø�Ý�NŠNð-à”	ñô ð õ
 Ô+Ñ-Ô-ˆDØ'+×'7Ò'7Ø×2Ò2Ý Ð![Ñ\Ô\ñô ñ(ô (ˆDÔ$Ð$Ð$ð 2Ð1s   Å>#F" Æ"F<Æ;F<c              ƒ   ó¬  K  — d}t          | dd¦  «        rdS |€| j        }|€| j        }	 t          j        |                     ¦   «         t          ¬¦  «        ƒ d{V —† n# t          j        $ r Y nw xY wt          | dd¦  «        rdS |                     ¦   «         s| j	        rdS | j
        sdS || j        k    rdS || j        urdS | j        }|r|j        r|j        j        sFt                               d| j        ¦  «         |                      t%          d¦  «        d¬	¦  «         dS 	 t          j        |j                             ¦   «         |¦  «        ƒ d{V —† �n# t*          $ rø}t          | dd¦  «        rY d}~dS | j	        s| j
        sY d}~dS || j        k    rY d}~dS || j        us|                     ¦   «         rY d}~dS |                      |¦  «        s4t                               d
| j        t/          |¦  «        ¦  «         Y d}~dS t                               d| j        t/          |¦  «        ¦  «         |                      |d¬	¦  «         Y d}~dS d}~ww xY wt          | dd¦  «        rdS | j	        s| j
        sdS || j        k    rdS || j        us|                     ¦   «         rdS |                      t%          d¦  «        d¬	¦  «         dS )a‡  Require getUpdates progress, using getMe only to classify failure.

        The generation-bound event is set only by a successful response on the
        dedicated getUpdates request. A general-path getMe success can classify
        connectivity, but cannot heal polling health. Connectivity failures
        enter the guarded recovery ladder; auth/validation errors do not churn.
        r[  rw  FNrõ  z;[%s] Updater made no getUpdates progress and is not runningz3Updater not running after polling progress deadlinez.polling progress verifier: updater not runningrP  zN[%s] Polling progress verifier hit a non-connectivity error (not retrying): %sz<[%s] Polling progress verifier connectivity probe failed: %sz.polling progress verifier connectivity failurez4getUpdates made no progress before verifier deadlinezFpolling progress verifier: general path healthy but getUpdates stalled)rl   rs  rt  r&   rö  rT   Ú_POLLING_PROGRESS_TIMEOUTrY   rD   r=  ru  rV  r$  rb  r(   r0   r   r?  rQ  ri   ro  r   r^  r   )r5  rÿ  rü  rv  rm   r|  s         r   r2  z/TelegramAdapter._verify_polling_after_reconnectg  sÑ  è è € ð ˆÝ�4Ð4°eÑ<Ô<ð 	ØˆFØÐØÔ1ˆJØÐØÔ3ˆHð	ÝÔ"Ø—’‘”Õ)Bðñ ô ð ð ð ð ð ð ð ð øõ Ô#ð 	ð 	ð 	ØˆDð	øøøõ �4Ð4°eÑ<Ô<ð 	ØˆFØ�?Š?ÑÔð 	 Ô 4ð 	ØˆFØÔ/ð 	ØˆFØ˜Ô1Ò1Ð1ØˆFØ˜4Ô7Ð7Ð7ØˆFàŒiˆØð 		˜œð 		¨¬Ô(;ð 		Ý�NŠNØMØ”	ñô ð ð ×+Ò+ÝÐRÑSÔSØGð ,ñ ô ð ð ˆFð	ÝÔ" 3¤7§>¢>Ñ#3Ô#3°]ÑCÔCÐCÐCÐCÐCÐCÐCÐCÑCøÝð 	ð 	ð 	Ý�tÐ8¸%Ñ@Ô@ð Ø�����ØÔ#ð ¨4Ô+Kð Ø�����Ø˜TÔ5Ò5Ð5Ø�����Ø˜tÔ;Ð;Ð;¸x¿ºÑ?PÔ?PÐ;Ø�����Ø×1Ò1°)Ñ<Ô<ð Ý—’ð*à”IÕ:¸9ÑEÔEñô ð ð
 �����Ý�NŠNØNØ”	Õ6°yÑAÔAñô ð ð ×+Ò+ØØGð ,ñ ô ð ð ˆFˆFˆFˆFˆFøøøøð1	øøøõ4 �4Ð4°eÑ<Ô<ð 	ØˆFØÔð 	 tÔ'Gð 	ØˆFØ˜Ô1Ò1Ð1ØˆFØ˜4Ô7Ð7Ð7¸8¿?º?Ñ;LÔ;LÐ7ØˆFØ×'Ò'ÝÐOÑPÔPØ[ð 	(ñ 	
ô 	
ð 	
ð 	
ð 	
sI   «3A ÁA1Á0A1Ä(2E Å
IÅ&IÅ=IÆIÆ"IÇAIÈAIÉIc                 ó„  — | j         rt          | j         dd¦  «        nd}|€dS dD ]y}t          ||d¦  «        }t          |t          j        ¦  «        rL|                     ¦   «         s5|                     ¦   «          t                               d| j	        |¦  «          dS Œzt                               d| j	        ¦  «         dS )uè  Synchronously stop PTB's internal polling retry loop.

        PTB wraps ``getUpdates`` in ``network_retry_loop`` with
        ``max_retries=-1`` (retry forever).  When a ``TelegramError`` (including
        a 409 ``Conflict``) fires, that loop calls our ``error_callback``
        *synchronously*, then sleeps and re-checks ``while is_running()`` before
        polling again.  Our ``error_callback`` only schedules an async recovery
        task (``loop.create_task(...)``) and returns immediately, so PTB's loop
        keeps polling while our handler concurrently runs
        ``stop -> sleep -> start_polling``.  The two polling sessions overlap and
        Telegram returns a fresh 409 â€” a self-inflicted conflict loop on a
        ~31s cadence.

        The loop is wired with ``is_running=lambda: updater.running`` and a
        private ``stop_event`` (``do_action`` races that event and returns the
        moment it is set).  Setting that event *synchronously inside the
        callback* â€” before it returns â€” makes PTB's loop exit on its own next
        tick instead of racing our recovery.  Our async handler then performs
        the real ``await updater.stop()`` (idempotent) followed by
        drain + ``start_polling()``, which builds a fresh ``stop_event`` so the
        restart is not poisoned.

        Best-effort and defensive: PTB names the attribute differently across
        versions (``_Updater__polling_task_stop_event`` via name-mangling), so
        we probe for both spellings.  If neither is found we do nothing and
        fall back to the prior behaviour (async ``updater.stop()`` racing PTB) â€”
        i.e. we never make things worse than before.

        We deliberately do NOT fall back to flipping ``updater._running``:
        ``stop()`` raises ``RuntimeError`` when ``running`` is already False and
        our recovery handler guards its ``stop()`` call on ``running``, so
        clearing the flag here would skip the real teardown and leave PTB's
        stop_event uncleared â€” poisoning the subsequent ``start_polling()``.
        The stop_event lever leaves ``_running`` True, so the handler's
        ``await updater.stop()`` still runs, drains the polling task, and clears
        the event for a clean restart.
        r$  N)Ú!_Updater__polling_task_stop_eventÚ_polling_task_stop_eventz+[%s] Disarmed PTB polling retry loop via %szu[%s] Could not disarm PTB polling retry loop (stop_event not found on this PTB version); falling back to async stop())
rV  rl   r0  r&   rO   rD   r8   r(   r)   r   )r5  r$  ÚattrÚ
stop_events       r   Ú_disarm_ptb_retry_loopz&TelegramAdapter._disarm_ptb_retry_loopÂ  sæ   € ðL :>¼ÐL•'˜$œ) Y°Ñ5Ô5Ð5ÈˆØˆ?ØˆFð
ð 	ð 	ˆDõ ! ¨$°Ñ5Ô5ˆJÝ˜*¥g¤mÑ4Ô4ð Ø!×(Ò(Ñ*Ô*ð Ø—N’NÑ$Ô$Ð$Ý—L’LØEØœ	 4ñô ð ð ��ðõ 	�Šð+ð ŒIñ		
ô 	
ð 	
ð 	
ð 	
r>   c           
   ƒ   ó�	  K  — t          | dd¦  «        rd S | j        r| j        dk    rd S | xj        dz  c_        d}d| j        dz  z   }| j        |k    �rüt                               d| j        | j        ||t          |¦  «        ¦  «         	 | j        r‘| j        j	        r…| j        j	        j
        rt	 t          j        | j        j	                             ¦   «         t          ¬¦  «        ƒ d {V —† n5# t          j        $ r# t                               d	| j        ¦  «         Y nw xY wn# t           $ r Y nw xY wt          j        |¦  «        ƒ d {V —† t          | dd¦  «        rd S |                      ¦   «         ƒ d {V —† t          | dd¦  «        rd S | j        }| j        dz   }|st)          d
¦  «        ‚|| _        	 |                      |d| j        ¬¦  «        ƒ d {V —† t                               d| j        | j        |¦  «         	 | j        |k    r	d | _        d S d S # t2          $ r Y | j        |k    r	d | _        d S d S t           $ rà}t          | dd¦  «        rY d }~| j        |k    r	d | _        d S d S t                               d| j        | j        |t          |¦  «        ¦  «         | j        |k     rkt          | dd¦  «        sZt          j        ¦   «         }|                     |                      |¦  «        ¦  «        | _        Y d }~| j        |k    r	d | _        d S d S Y d }~nd }~ww xY w| j        |k    rd | _        n# | j        |k    rd | _        w xY wt          | dd¦  «        rd S d|t=          d„ t?          d|dz   ¦  «        D ¦   «         ¦  «        fz  }t                                d| j        |t          |¦  «        ¦  «         | j        o
| j        dk    }	|  !                    d|d¬¦  «         	 | j        rI| j        j	        r=t          j        | j        j	                             ¦   «         t          ¬¦  «        ƒ d {V —† nj# t          j        $ r# t                               d| j        ¦  «         Y n9t           $ r-}
t                               d| j        |
d¬¦  «         Y d }
~
nd }
~
ww xY w|	s|  "                    ¦   «         ƒ d {V —† d S d S )Nrw  FÚtelegram_polling_conflictr»   rÂ   r[  uŠ   [%s] Telegram polling conflict (%d/%d) â€” previous session still held open on Telegram's servers. Waiting %ds for it to expire. Error: %srõ  zZ[%s] updater.stop() timed out during conflict retry (likely CLOSE-WAIT socket); continuingz<Telegram application was torn down during conflict reconnectTr_  z^[%s] Telegram polling restarted after conflict retry %d/%d; health pending getUpdates progresszF[%s] Telegram polling retry %d/%d failed: %s. Scheduling next attempt.aH  Telegram polling could not recover after %d retries (%ds total wait). The previous gateway session is still held open on Telegram's servers, or another process is using the same bot token. To recover: ensure no other Hermes or OpenClaw instance is running with this token, then restart the gateway with 'hermes gateway restart'.c              3   ó&   K  — | ]}d |d z  z   V — ŒdS )r[  NrŠ   )rM  Úis     r   rè  z;TelegramAdapter._handle_polling_conflict.<locals>.<genexpr>�  s*   è è € Ð(aÐ(a¸¨¨a°"©f©Ð(aÐ(aÐ(aÐ(aÐ(aÐ(ar>   z[%s] %s Original error: %sr¡  zv[%s] updater.stop() timed out after exhausting conflict retries (likely CLOSE-WAIT socket); proceeding to fatal notifyzK[%s] Failed stopping Telegram updater after exhausting conflict retries: %sr#   )#rl   r=  Úfatal_error_coderp  r(   r0   r   r   rV  r$  rb  r&   rö  rc  rd  rY   r   ra  rú  rs  rQ  rq  r*  rx  r½   r  rL   r1  rT  ro  ÚsumÚranger   r¢  r`  )r5  r   ÚMAX_CONFLICT_RETRIESÚRETRY_DELAYrm   Úexpected_generationrj  rA   rž  Ú_already_fatalÚ
stop_errors              r   rT  z(TelegramAdapter._handle_polling_conflict  s›  è è € Ý�4Ð4°eÑ<Ô<ð 	ØˆFØÔð 	 DÔ$9Ð=XÒ$XÐ$XØˆFð$ 	Ð$Ô$¨Ñ)Ð$Ô$à Ðð
 ˜DÔ8¸2Ñ=Ñ>ˆàÔ'Ð+?Ò?Ñ?Ý�NŠNðð ”	˜4Ô7Ð9MØÕ8¸Ñ?Ô?ñô ð ðØ”9ð  ¤Ô!2ð °t´yÔ7HÔ7Pð ðÝ%Ô.¨t¬yÔ/@×/EÒ/EÑ/GÔ/GÕQfÐgÑgÔgÐgÐgÐgÐgÐgÐgÐgÐgøÝ"Ô/ð ð ð ÝŸšðKà œIñô ð ð ð ðøøøøøõ ð ð ð Ø�ðøøøõ ”- Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ý�tÐ8¸%Ñ@Ô@ð Ø�Ø×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ý�tÐ8¸%Ñ@Ô@ð Ø�ð ”)ˆCØ"&Ô":¸QÑ">ÐØð cÝ"Ð#aÑbÔbÐbð :MˆDÔ6ð.FØ×.Ò.ØØ)-Ø#'Ô#Cð /ñ ô ð ð ð ð ð ð ð õ
 —’ð9à”I˜tÔ;Ð=Qñô ð ð
 ðD Ô=ÐATÒTÐTØAE�DÔ>Ð>Ð>ð UÐTøõC *ð ð ð Øð@ Ô=ÐATÒTÐTØAE�DÔ>Ð>Ð>ð UÐTõ? ð ð ð Ý˜4Ð!<¸eÑDÔDð Ø�F�F�Fð: Ô=ÐATÒTÐTØAE�DÔ>Ð>Ð>ð UÐTõ9 —’ð/à”I˜tÔ;Ð=QÝ/°	Ñ:Ô:ñ	ô ð ð Ô0Ð3GÒGÐGÝ# DÐ*EÀuÑMÔMð Hõ #Ô3Ñ5Ô5�DØ/3×/?Ò/?Ø×5Ò5°iÑ@Ô@ñ0ô 0�DÔ,ð �F�F�Fð Ô=ÐATÒTÐTØAE�DÔ>Ð>Ð>ð UÐTøøøøøøøøøð?øøøð> Ô=ÐATÒTÐTØAE�DÔ>øøð Ô=ÐATÒTÐTØAE�DÔ>ÐEÐEÐEÐEå�4Ð4°eÑ<Ô<ð 	ØˆFð
Wð
 $¥SÐ(aÐ(a½eÀAÐG[Ð^_ÑG_Ñ>`Ô>`Ð(aÑ(aÔ(aÑ%aÔ%aÐbñcð 	õ 	�ŠØ(ØŒI�wÕ ;¸EÑ BÔ Bñ	
ô 	
ð 	
ð Ô ð EØÔ%Ð)DÒDð 	ð 	×ÒÐ9¸7ÈeÐÑTÔTÐTð	ØŒyð `˜TœYÔ.ð `ÝÔ& t¤yÔ'8×'=Ò'=Ñ'?Ô'?ÕI^Ð_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_øøÝÔ#ð 	ð 	ð 	Ý�NŠNðQà”	ñô ð ð ð õ
 ð 	ð 	ð 	Ý�NŠNØ]Ø”	˜:°ð ñ ô ð ð ð ð ð ð øøøøð	øøøð
 ð 	6Ø×3Ò3Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ð	6ð 	6sŸ   Â$D% Â1=C/ Ã.D% Ã//D!ÄD% Ä D!Ä!D% Ä%
D2Ä1D2Æ9A
H È
L$È$L: È;	L$ÉLÉL: É/BLÌ L: ÌL: ÌL$Ì$L: Ì:MÏ-AP> Ð>/R%Ñ/	R%Ñ8#R Ò R%c              ƒ   ó¸   K  — t          j        ¦   «         }| j        |u rd| _        t          | dd¦  «        |u rd| _        |                      ¦   «         ƒ d{V —† dS )a  Notify the runner without letting child teardown cancel this owner.

        The runner bounds adapter cleanup in a child task.  ``disconnect()``
        cancels the tracked polling-recovery task and the heartbeat task, so
        retaining the current notifier in either field would cancel the fatal
        callback before the runner can finish its reconnect or shutdown
        decision.  Release only the current owner from whichever field tracks
        it; unrelated tasks remain under teardown control.
        Nry  )r&   Úcurrent_taskro  rl   ry  Ú_notify_fatal_error)r5  r˜  s     r   r`  z,TelegramAdapter._handoff_polling_fatal_error±  sv   è è € õ Ô+Ñ-Ô-ˆØÔ# |Ð3Ð3Ø'+ˆDÔ$Ý�4Ð2°DÑ9Ô9¸\ÐIÐIØ+/ˆDÔ(Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r>   Ú
icon_colorÚicon_custom_emoji_idc           
   ƒ   óF  K  — | j         sdS 	 ||dœ}|�||d<   |r||d<    | j         j        di |¤Žƒ d{V —†}|j        }t                               d| j        |||¦  «         |S # t          $ r²}t          |¦  «                             ¦   «         }	d|	v sd|	v r#t                               d| j        ||¦  «         n[d	|	v sd
|	v r#t           	                    d| j        ||¦  «         n0t           	                    d| j        ||t          |¦  «        ¦  «         Y d}~dS d}~ww xY w)zÇCreate a forum topic in a private (DM) chat.

        Uses Bot API 9.4's createForumTopic which now works for 1-on-1 chats.
        Returns the message_thread_id on success, None on failure.
        N)rK  r   rš  r›  z5[%s] Created DM topic '%s' in chat %s -> thread_id=%sÚtopic_name_duplicateÚalreadyzT[%s] DM topic '%s' already exists in chat %s (will be mapped from incoming messages)znot a forumÚforums_disabledzÝ[%s] Cannot create DM topic '%s' in chat %s: Topics mode is not enabled. The user must open the DM with this bot in Telegram, tap the bot name at the top, and enable 'Topics' in chat settings before topics can be created.z2[%s] Failed to create DM topic '%s' in chat %s: %srŠ   )rW  Úcreate_forum_topicrÚ  r(   r½   r   r   r   rÇ   r0   r   )
r5  rK  r   rš  r›  r  Útopicr­  rN  Ú
error_texts
             r   Ú_create_dm_topicz TelegramAdapter._create_dm_topicÂ  sŸ  è è € ð Œyð 	Ø�4ð#	Ø18À$Ð%GÐ%GˆFØÐ%Ø'1��|Ñ$Ø#ð FØ1E�Ð-Ñ.à6˜$œ)Ô6Ð@Ð@¸Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ˆEØÔ/ˆIÝ�KŠKØGØ”	˜4 ¨)ñô ð ð ÐøÝð 	ð 	ð 	Ý˜Q™œŸš™œˆJð &¨Ð3Ð3°yÀJÐ7NÐ7NÝ—’ØjØ”I˜t Wñô ð ð ð  *Ð,Ð,Ð0AÀZÐ0OÐ0OÝ—’ðeð ”I˜t Wñ	ô ð ð õ —’ØHØ”I˜t WÕ.IÈ!Ñ.LÔ.Lñô ð ð �4�4�4�4�4øøøøð+	øøøs   �AA$ Á$
D Á.B'DÄD Úparent_chat_idc              ƒ   ó¸   K  — 	 t          |¦  «        }n# t          t          f$ r Y dS w xY w|                      ||¬¦  «        ƒ d{V —†}|rt	          |¦  «        ndS )a	  Create a forum topic for a session handoff.

        Works for DM topics (Bot API 9.4+, requires user to enable Topics
        in their chat with the bot) and forum supergroups. Returns the
        ``message_thread_id`` as a string, or ``None`` on failure.
        N)r   )r²   rµ   r¶   r£  r   )r5  r¤  r   Úchat_id_intr­  s        r   Úcreate_handoff_threadz%TelegramAdapter.create_handoff_threadõ  s€   è è € ð	Ý˜nÑ-Ô-ˆKˆKøÝ�:Ð&ð 	ð 	ð 	Ø�4�4ð	øøøà×/Ò/°À$Ð/ÑGÔGÐGÐGÐGÐGÐGÐGˆ	Ø!*Ð4�s�9‰~Œ~ˆ~°Ð4s   „ ”)¨)Ú
topic_nameÚforce_createc              ƒ   ód  K  — t          |pd¦  «                             ¦   «         }|sdS 	 t          |¦  «        }n# t          t          f$ r Y dS w xY w|› d|› �}| j                             |¦  «        }|r|st          |¦  «        S d}d}	| j        D ]n}
t          |
                     d¦  «        ¦  «        t          |¦  «        k    rŒ6|
}	|
                     dg ¦  «        D ]}|                     d¦  «        |k    r|} nŒ  |rE|                     d¦  «        r0|s.t          |d         ¦  «        }|| j        |<   t          |¦  «        S |	€|g dœ}	| j                             |	¦  «         |€-d|i}|	 	                    dg ¦  «                             |¦  «         |  
                    |||                     d	¦  «        |                     d
¦  «        ¬¦  «        ƒ d{V —†}|sdS ||d<   t          |¦  «        | j        |<   |                      ||t          |¦  «        |¬¦  «         t          |¦  «        S )zJReturn a private DM topic thread id, creating and persisting it if needed.r   Nú:rK  Útopicsr   r­  ©rK  r¬  rš  r›  )r   rš  r›  )Úreplace_existing)r   r   r²   rµ   r¶   r‚  r‡  r‹  r  Ú
setdefaultr£  Ú_persist_dm_topic_thread_id)r5  rK  r¨  r©  r   r¦  Ú	cache_keyÚcachedÚ
topic_confÚ
chat_entryÚentryÚ	candidater­  s                r   Úensure_dm_topiczTelegramAdapter.ensure_dm_topic  s£  è è € å�:Ð# Ñ$Ô$×*Ò*Ñ,Ô,ˆØð 	Ø�4ð	Ý˜g™,œ,ˆKˆKøÝ�:Ð&ð 	ð 	ð 	Ø�4�4ð	øøøð #Ð+Ð+ TÐ+Ð+ˆ	Ø”×$Ò$ YÑ/Ô/ˆØð 	˜,ð 	Ý�v‘;”;Ðà/3ˆ
Ø/3ˆ
ØÔ+ð 	ð 	ˆEÝ�5—9’9˜YÑ'Ô'Ñ(Ô(­C°Ñ,<Ô,<Ò<Ð<ØØˆJØ"ŸYšY x°Ñ4Ô4ð ð �	Ø—=’= Ñ(Ô(¨DÒ0Ð0Ø!*�JØ�Eð 1ð àð 	"˜*Ÿ.š.¨Ñ5Ô5ð 	"¸lð 	"Ý˜J {Ô3Ñ4Ô4ˆIØ)2ˆDŒO˜IÑ&Ý�y‘>”>Ð!àÐØ%0¸BÐ?Ð?ˆJØÔ"×)Ò)¨*Ñ5Ô5Ð5ØÐØ  $˜ˆJØ×!Ò! (¨BÑ/Ô/×6Ò6°zÑBÔBÐBà×/Ò/ØØØ!—~’~ lÑ3Ô3Ø!+§¢Ð0FÑ!GÔ!Gð	 0ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆ	ð ð 	Ø�4à"+ˆ
�;ÑÝ%(¨¡^¤^ˆŒ˜	Ñ"Ø×(Ò(¨°d½CÀ	¹N¼NÐ]iÐ(ÑjÔjÐjÝ�9‰~Œ~Ðs   «; »AÁAc              ƒ   ó  K  — | j         sdS 	 t          |¦  «        }n# t          t          f$ r |}Y nw xY w| j                              |t          |¦  «        |¬¦  «        ƒ d{V —† t
                               d| j        |||¦  «         dS )z,Rename a forum topic in a private (DM) chat.N)rK  rÚ  r   z5[%s] Renamed DM topic in chat %s thread_id=%s -> '%s')rW  r²   rµ   r¶   Úedit_forum_topicr(   r½   r   )r5  rK  r­  r   Úchat_id_args        r   Úrename_dm_topiczTelegramAdapter.rename_dm_topic<  sÎ   è è € ð Œyð 	ØˆFð	"Ý˜g™,œ,ˆKˆKøÝ�:Ð&ð 	"ð 	"ð 	"Ø!ˆKˆKˆKð	"øøøàŒi×(Ò(ØÝ! )™nœnØð )ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ
 	�ŠØCØŒI�w 	¨4ñ	
ô 	
ð 	
ð 	
ð 	
s   � �3²3r®  c                 óî  — 	 ddl m}  |¦   «         dz  }|                     ¦   «         s#t                               d| j        |¦  «         dS ddl}t          |dd¬¦  «        5 }|                     |¦  «        pi }	ddd¦  «         n# 1 swxY w Y   |	 	                    d	i ¦  «        }
|
 	                    d
i ¦  «        }| 	                    di ¦  «        }| 	                    dg ¦  «        }d}d}|D ]ï}	 t          |                     dd¦  «        ¦  «        t          |¦  «        k    }n# t          t          f$ r d}Y nw xY w|sŒT|}| 	                    dg ¦  «        D ]T}|                     d¦  «        |k    r9|s|                     d¦  «        s |                     d¦  «        |k    r||d<   d} n/ŒU| 	                    dg ¦  «                             ||dœ¦  «         d} |€|                     |||dœgdœ¦  «         d}|r9ddlm}  |||	dd¬¦  «         t                               d| j        ||¦  «         dS dS # t$          $ r.}t                               d| j        |d¬¦  «         Y d}~dS d}~ww xY w)zTSave a newly created thread_id back into config.yaml so it persists across restarts.r   ©Úget_hermes_homezconfig.yamlz:[%s] Config file not found at %s, cannot persist thread_idNÚrrÀ   ©rÄ   Ú	platformsrá   r†  rH  FrK  r¬  r   r­  T)r   r­  r­  )Úatomic_config_write)Údefault_flow_styleÚ	sort_keysz9[%s] Persisted thread_id=%s for topic '%s' in config.yamlz.[%s] Failed to persist thread_id to config: %sr#   )Úhermes_constantsr¾  Úexistsr(   r0   r   ÚyamlrÉ   Ú	safe_loadr¯  r²   r‡  rµ   r¶   r  Úhermes_cli.configrÂ  r½   r   )r5  rK  r¨  r­  r®  r¾  Úconfig_pathÚ_yamlÚfr7  rÁ  Útelegram_configr†  rH  ÚchangedÚmatching_chat_entryr´  Úchat_matchesÚtrÂ  rN  s                        r   r°  z+TelegramAdapter._persist_dm_topic_thread_idS  s�  € ð@	jØ8Ð8Ð8Ð8Ð8Ð8Ø)˜/Ñ+Ô+¨mÑ;ˆKØ×%Ò%Ñ'Ô'ð Ý—’Ð[Ð]aÔ]fÐhsÑtÔtÐtØ�à Ð Ð Ð Ý�k 3°Ð9Ñ9Ô9ð 2¸QØŸš¨Ñ+Ô+Ð1¨r�ð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð ×)Ò)¨+°rÑ:Ô:ˆIØ'×2Ò2°:¸rÑBÔBˆOØ#×.Ò.¨w¸Ñ;Ô;ˆEØ×(Ò(¨°bÑ9Ô9ˆIàˆGØ"&ÐØ'ð ð �
ð)Ý#& z§~¢~°iÀÑ'CÔ'CÑ#DÔ#DÍÈGÉÌÒ#T�L�LøÝ!¥:Ð.ð )ð )ð )Ø#(�L�L�Lð)øøøà#ð ØØ&0Ð#Ø#×.Ò.¨x¸Ñ<Ô<ð #ð #�AØ—u’u˜V‘}”}¨
Ò2Ð2Ø+ð /°1·5²5¸Ñ3EÔ3Eð /Ø Ÿušu [Ñ1Ô1°YÒ>Ð>Ø1:  +¡Ø*. Ø˜ð 3ð ×)Ò)¨(°BÑ7Ô7×>Ò>Ø!+¸)ÐDÐDñô ð ð #�GØà"Ð*Ø× Ò Ø&Ø(2ÀÐKÐKÐLð"ð "ñ ô ð ð �àð ØAÐAÐAÐAÐAÐAà#Ð#ØØØ',Ø#ð	ñ ô ð õ —’ØOØ”I˜y¨*ñô ð ð ð ðð øõ ð 	jð 	jð 	jÝ�NŠNÐKÈTÌYÐXYÐdhˆNÑiÔiÐiÐiÐiÐiÐiÐiÐiøøøøð	jøøøsh   ‚AH< ÁH< Á"BÁ:H< ÂB
Â
H< ÂB
ÂA#H< Ã24D'Ä&H< Ä'D=Ä:H< Ä<D=Ä=C;H< È<
I4É#I/É/I4c           	   ƒ   ó  K  — | j         sdS | j         D �]ñ}|                     d¦  «        }|                     dg ¦  «        }|r|sŒ3t                               d| j        t          |¦  «        |¦  «         |D �]‹}|                     d¦  «        }|sŒ|› d|› �}|                     d¦  «        }|r:t          |¦  «        | j        |<   t                               d| j        ||¦  «         Œs|                     d	¦  «        }|                     d
¦  «        }	|                      t          |¦  «        |||	¬¦  «        ƒ d{V —†}
|
rÀ|
| j        |<   t                               d| j        ||
¦  «         |  
                    t          |¦  «        ||
¦  «         	 | j                             t          |¦  «        |
d|› �¬¦  «        ƒ d{V —† �ŒQ# t          $ r-}t                               d| j        ||¦  «         Y d}~�Œƒd}~ww xY w�Œ��ŒódS )uþ  Load or create configured DM topics for specified chats.

        Reads config.extra['dm_topics'] â€” a list of dicts:
        [
            {
                "chat_id": 123456789,
                "topics": [
                    {"name": "General", "icon_color": 7322096, "thread_id": 100},
                    {"name": "Accessibility Auditor", "icon_color": 9367192, "skill": "accessibility-auditor"}
                ]
            }
        ]

        If a topic already has a thread_id in the config (persisted from a previous
        creation), it is loaded into the cache without calling createForumTopic.
        Only topics without a thread_id are created via the API, and their thread_id
        is then saved back to config.yaml for future restarts.
        NrK  r¬  z*[%s] Setting up %d DM topic(s) for chat %sr   r«  r­  z4[%s] DM topic loaded from config: %s -> thread_id=%srš  r›  )rK  r   rš  r›  z([%s] DM topic cached: %s -> thread_id=%su   ðŸ“Œ )rK  rÚ  r   z2[%s] Could not send seed message to topic '%s': %s)r‹  r‡  r(   r½   r   r€  r²   r‚  r£  r    r°  rW  Úsend_messager   r)   )r5  r´  rK  r¬  r³  r¨  r±  Úexisting_thread_idrš  Ú
icon_emojir­  Úseed_errs               r   Ú_setup_dm_topicsz TelegramAdapter._setup_dm_topics�  sº  è è € ð& Ô%ð 	ØˆFàÔ0ð <	ñ <	ˆJØ —n’n YÑ/Ô/ˆGØ—^’^ H¨bÑ1Ô1ˆFØð  &ð Øå�KŠKØ<Ø”	�3˜v™;œ;¨ñô ð ð
 %ð 1ñ 1�
Ø'Ÿ^š^¨FÑ3Ô3�
Ø!ð Øà&Ð5Ð5¨Ð5Ð5�	ð &0§^¢^°KÑ%@Ô%@Ð"Ø%ð Ý14Ð5GÑ1HÔ1H�D”O IÑ.Ý—K’KØNØœ	 9Ð.@ñô ð ð ð (Ÿ^š^¨LÑ9Ô9�
Ø'Ÿ^š^Ð,BÑCÔC�
à"&×"7Ò"7Ý6°wÑ?Ô?Ø#Ø)Ø)3ð	 #8ñ #ô #ð ð ð ð ð ð �	ð ð Ø1:�D”O IÑ.Ý—K’KØBØœ	 9¨iñô ð ð
 ×4Ò4µS¸±\´\À:ÈyÑYÔYÐYð
Ø"œi×4Ò4Ý$>¸wÑ$GÔ$GØ.7Ø!;¨zÐ!;Ð!;ð 5ñ ô ð ð ð ð ð ð ð ñ øõ
 %ð ð ð ÝŸšØPØ œI z°8ñô ð ð ð ð ð ñ øøøøðøøøñ#ñ91ð<	ð <	s   Æ3GÇ
G?Ç"G:Ç:G?c              ƒ   óB  K  — 	 	 t          j        | j        ¦  «        ƒ d{V —† t          | dd¦  «        rdS | j        rdS |                      d¬¦  «        ƒ d{V —† nC# t           j        $ r Y dS t          $ r% t           	                    d| j
        d¬¦  «         Y nw xY wŒ�)uh  Keep the cached @username fresh when no heartbeat is running.

        Polling mode re-reads identity via the heartbeat's ``get_me()`` probe.
        Webhook mode has no such probe â€” nothing calls ``get_me()`` again after
        ``initialize()`` â€” so without this loop a BotFather rename breaks
        mention routing until the gateway restarts.
        TNrw  Fr   z4[%s] Telegram identity refresh loop iteration failedr#   )r&   ra  Ú_BOT_IDENTITY_TTL_SECONDSrl   r=  Ú_refresh_bot_identityr'   r   r(   r)   r   r4  s    r   Ú_bot_identity_refresh_loopz*TelegramAdapter._bot_identity_refresh_loopñ  sö   è è € ð	ðÝ”m DÔ$BÑCÔCÐCÐCÐCÐCÐCÐCÐCÝ˜4Ð!<¸eÑDÔDð Ø�FØÔ'ð Ø�FØ×0Ò0°tÐ0Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<øÝÔ)ð ð ð Ø��Ýð ð ð Ý—’ØJØ”I¨ð ñ ô ð ð ð ðøøøð	s"   …0A ·A Á A ÁBÁ/+BÂBc                 óš   — | j         }|r|                     ¦   «         sdS t          j        |                      ¦   «         ¦  «        | _         dS )záKick off deferred post-connect housekeeping in the background.

        Idempotent: if a previous housekeeping task is still running (e.g. a
        rapid reconnect), it is left in place rather than double-scheduled.
        N)r–  r9   r&   rK   Ú_run_post_connect_housekeeping)r5  r!   s     r   Ú _start_post_connect_housekeepingz0TelegramAdapter._start_post_connect_housekeeping	  sR   € ð Ô&ˆØð 	˜Ÿ	š	™œð 	ØˆFÝ")Ô"7Ø×/Ò/Ñ1Ô1ñ#
ô #
ˆÔÐÐr>   c           	   ƒ   ó
  ‡K  — 	 	 ddl mŠm}m}m} ddlm}m} | j        s&	 | j	        t          j        ¦   «         u r	d| _	        dS dS  |¦   «         } ||¬¦  «        \  }}ˆfd„|D ¦   «         }	|||fD ]³}
t          |
dt          |
¦  «        ¦  «        }	 | j                             |	 |
¦   «         ¬¦  «        ƒ d{V —† t                               d	| j        |t%          |	¦  «        ¦  «         Œ{# t&          $ r,}t                               d
| j        ||¦  «         Y d}~Œ¬d}~ww xY w|r0t                               d| j        t%          |¦  «        ||¦  «         nG# t&          $ r:}t                               d| j        t+          |¦  «        d¬¦  «         Y d}~nd}~ww xY w	 |                      d¬¦  «        ƒ d{V —† n# t&          $ r Y nw xY w	 |                      ¦   «         ƒ d{V —† n:# t&          $ r-}t                               d| j        |d¬¦  «         Y d}~nd}~ww xY wn# t          j        $ r ‚ w xY w| j	        t          j        ¦   «         u r	d| _	        dS dS # | j	        t          j        ¦   «         u rd| _	        w xY w)uÜ   Register the command menu, surface the status indicator, and set up
        DM topics â€” all off the connect path so a slow Bot API call cannot blow
        the gateway connect timeout (#46298). Every step is non-fatal.r   )Ú
BotCommandÚBotCommandScopeAllPrivateChatsÚBotCommandScopeAllGroupChatsÚBotCommandScopeDefault©Útelegram_menu_commandsÚtelegram_menu_max_commandsN©Úmax_commandsc                 ó.   •— g | ]\  }} ‰||¦  «        ‘ŒS rŠ   rŠ   ©rM  r   Údescrà  s      €r   ú
<listcomp>zBTelegramAdapter._run_post_connect_housekeeping.<locals>.<listcomp>/  ó)   ø€ ÐWÐWÐW¹:¸4À 
 
¨4°Ñ 6Ô 6ÐWÐWÐWr>   r†   ©Úscopez.[%s] set_my_commands OK for scope %s (%d cmds)z,[%s] set_my_commands FAILED for scope %s: %szc[%s] Telegram menu: %d commands registered, %d hidden (over %d limit). Use /commands for full list.z1[%s] Could not register Telegram command menu: %sTr#   ©Úonlinez+[%s] DM topics setup failed (non-fatal): %s)rá   rà  rá  râ  rã  Úhermes_cli.commandsrå  ræ  rW  r–  r&   r˜  rl   r   Úset_my_commandsr(   r½   r   r€  r   r0   r   Ú_set_status_indicatorr×  r'   )r5  rá  râ  rã  rå  ræ  rè  Úmenu_commandsÚhidden_countÚbot_commandsÚ	scope_clsÚ
scope_nameÚ	scope_errrN  Ú
topics_errrà  s                  @r   rÝ  z.TelegramAdapter._run_post_connect_housekeeping  sÏ  øè è € ðF	/ð+ðð ð ð ð ð ð ð ð ð ð ð ð cÐbÐbÐbÐbÐbÐbÐbØ”yð Øðp Ô&­'Ô*>Ñ*@Ô*@Ð@Ð@Ø*.�Ô'Ð'Ð'ð AÐ@ðe  :Ð9Ñ;Ô;�Ø.DÐ.DÐR^Ð._Ñ._Ô._Ñ+�˜|ØWÐWÐWÐWÈÐWÑWÔW�ð #9Ð:XÐZvÐ!wð yð y�IÝ!(¨°JÅÀIÁÄÑ!OÔ!O�JðyØ"œi×7Ò7¸ÈIÈIÉKÌKÐ7ÑXÔXÐXÐXÐXÐXÐXÐXÐXÝŸšÐ$TÐVZÔV_ÐakÕmpÐq}Ñm~Ôm~ÑÔÐÐøÝ$ð yð yð yÝŸšÐ'UÐW[ÔW`ÐblÐnwÑxÔxÐxÐxÐxÐxÐxÐxøøøøðyøøøð  ð Ý—K’KØ}Øœ	¥3 }Ñ#5Ô#5°|À\ñô ð øøõ ð ð ð Ý—’ØGØ”IÝ/°Ñ2Ô2Ø!ð	 ñ ô ð ð ð ð ð ð øøøøðøøøðØ×0Ò0¸Ð0Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=øÝð ð ð Ø�ðøøøðØ×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-øÝð ð ð Ý—’ØAØ”I˜z°Dð ñ ô ð ð ð ð ð ð øøøøðøøøøøõ
 Ô%ð 	ð 	ð 	Øð	øøøð Ô&­'Ô*>Ñ*@Ô*@Ð@Ð@Ø*.�Ô'Ð'Ð'ð AÐ@øˆtÔ&­'Ô*>Ñ*@Ô*@Ð@Ð@Ø*.�Ô'Ð.Ð.Ð.Ð.sÁ   †E ÁAE ÂAC.Ã-E Ã.
D$Ã8"DÄE ÄD$Ä$5E ÅH& Å
FÅ$0FÆH& ÆFÆH& Æ"F? Æ>H& Æ?
GÇ	H& ÇGÇH& ÇG+ Ç*H& Ç+
H"Ç5#HÈH& ÈH"È"H& È%I È&H7È7I É#J)Úis_reconnectrü  c             ƒ   óä&  ‡ ‡)‡*K  — d‰ _         d‰ _        t          s:t                               d‰ j        ¦  «         ‰                      ddd¬¦  «         dS ‰ j        j        s:t                               d‰ j        ¦  «         ‰                      ddd¬¦  «         dS 	 ‰  	                    d	‰ j        j        d
¦  «        sdS t          j        ¦   «                              ‰ j        j        ¦  «        }‰ j        j                             d¦  «        }|ri|                     |¦  «        }|                     ‰ j        j                             d|¦  «        ¦  «        }t                               d‰ j        |¦  «         ‰ j        j                             d¦  «        r5|                     d¦  «        }t                               d‰ j        ¦  «         dt$          dt&          dt&          fd„}dt$          dt(          dt(          fd„} |dd¦  «         |dd¦  «         |dd¦  «         |dd¦  «         |dd¦  «        dd œ}d!d"lm}  |¦   «         }|�-d!d#l}	|	                     |d$         |j        |j        ¬%¦  «        Š)nd#Š)dfd&t6          t8                   dt8          fˆ)fd'„}
t;          j        d(d)¦  «                             ¦   «                               ¦   «         d*v }‰  !                    ¦   «         }|sht           "                    d+‰ j        ¦  «         tG          ¦   «         ƒ d#{V —†}t                               d,‰ j        d- $                    |¦  «        ¦  «         d.g|¢}tK          d/|¬0¦  «        }|r||sz|sxt                               d1‰ j        d- $                    |¦  «        ¦  «         i }‰)�‰)|d2<   tM          dgi |¤d&d3tO          |fi |¤Žii¤Ž}tM          dgi |¤d&d3tO          |fi |¤Žii¤Ž}n¨|rTt                               d4‰ j        |¦  «         tM          dgi |¤| |
¦   «         d5œ¤Ž}tM          dgi |¤| |
¦   «         d5œ¤Ž}nR|r t                               d6‰ j        ¦  «         tM          dgi |¤d& |
¦   «         i¤Ž}tM          dgi |¤d& |
¦   «         i¤Ž}‰  (                    |¦  «        }| )                    |¦  «         *                    |¦  «        }| +                    ¦   «         ‰ _,        ‰ j,        j-        ‰ _.        ‰ j,         /                    ta          tb          j2        tb          j3         z  ‰ j4        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j3        ‰ j5        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j6        to          tb          d7tb          j6        ¦  «        z  ‰ j8        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j9        tb          j:        z  tb          j;        z  tb          j<        z  tb          j=        j>        z  tb          j?        j>        z  ‰ j@        ¦  «        ¦  «         ‰ j,         /                    tƒ          ‰ jB        ¦  «        ¦  «         d8} |d9d:¦  «        }t‡          jD        ¦   «          E                    ¦   «         ||z  z   d;z   }t�          |¦  «        D �]ƒ}d}	 t‡          jD        ¦   «          E                    ¦   «         |k    r!t�          d<|› d=|d>›d?||z  d;z   d>›d@�¦  «        ‚t           "                    dA‰ j        |dBz   |¦  «         t‘          ‰ j,         I                    ¦   «         |‰ j,        fdC„¬D¦  «        ƒ d#{V —† 	 |�rä||dBz
  k     �rÚ‰ j,        }| +                    ¦   «         ‰ _,        ‰ j,        j-        ‰ _.        ‰ j,         /                    ta          tb          j2        tb          j3         z  ‰ j4        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j3        ‰ j5        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j6        to          tb          d7tb          j6        ¦  «        z  ‰ j8        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j9        tb          j:        z  tb          j;        z  tb          j<        z  tb          j=        j>        z  tb          j?        j>        z  ‰ j@        ¦  «        ¦  «         ‰ j,         /                    tƒ          ‰ jB        ¦  «        ¦  «         	 t•          |¦  «        ƒ d#{V —† n# t–          $ r Y nw xY w �nî# t†          jL        $ r{ d}||dBz
  k     rUt›          dE|z  dF¦  «        }t           "                    dG‰ j        |dBz   |||¦  «         t‡          jN        |¦  «        ƒ d#{V —† nt�          d<|› d=|d>›dH�¦  «        ‚Y �n�tŽ          $ rl}d}||dBz
  k     rUt›          dE|z  dF¦  «        }t           "                    dI‰ j        |dBz   |||¦  «         t‡          jN        |¦  «        ƒ d#{V —† n‚ Y d#}~�nd#}~wt–          $ r�}d}‰  O                    |¦  «        s‚ ||dBz
  k     rUt›          dE|z  dF¦  «        }t           "                    dI‰ j        |dBz   |||¦  «         t‡          jN        |¦  «        ƒ d#{V —† n‚ Y d#}~n”d#}~wt           $ r„ t           "                    dJ‰ j        |dBz   |t£          t¥          jS        ¦   «         dB         t†          jT        ¦  «        rdKn*t«          t¥          jS        ¦   «         dB         ¦  «        jV        ¦  «         ‚ w xY w|�ræ||dBz
  k     �rÜ‰ j,        }| +                    ¦   «         ‰ _,        ‰ j,        j-        ‰ _.        ‰ j,         /                    ta          tb          j2        tb          j3         z  ‰ j4        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j3        ‰ j5        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j6        to          tb          d7tb          j6        ¦  «        z  ‰ j8        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j9        tb          j:        z  tb          j;        z  tb          j<        z  tb          j=        j>        z  tb          j?        j>        z  ‰ j@        ¦  «        ¦  «         ‰ j,         /                    tƒ          ‰ jB        ¦  «        ¦  «         	 t•          |¦  «        ƒ d#{V —† �Œ…# t–          $ r Y �Œ’w xY w�Œ˜# |�rä||dBz
  k     �rÛ‰ j,        }| +                    ¦   «         ‰ _,        ‰ j,        j-        ‰ _.        ‰ j,         /                    ta          tb          j2        tb          j3         z  ‰ j4        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j3        ‰ j5        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j6        to          tb          d7tb          j6        ¦  «        z  ‰ j8        ¦  «        ¦  «         ‰ j,         /                    ta          tb          j9        tb          j:        z  tb          j;        z  tb          j<        z  tb          j=        j>        z  tb          j?        j>        z  ‰ j@        ¦  «        ¦  «         ‰ j,         /                    tƒ          ‰ jB        ¦  «        ¦  «         	 t•          |¦  «        ƒ d#{V —† w # t–          $ r Y w w xY ww w xY w‰ j,         W                    ¦   «         ƒ d#{V —† t;          j        dLd)¦  «                             ¦   «         }|�rot±          dMdN¦  «        }t;          j        dOd)¦  «                             ¦   «         pAt%          ‰ j        j        pi                      dP¦  «        pd)¦  «                             ¦   «         }d!dQlYmZ}m[} 	  |dR¦  «        pd)                     ¦   «         }n2# |$ r* t;          j        dRd)¦  «                             ¦   «         }Y nw xY w|st¹          dS¦  «        ‚d!dTl]m^}   | |¦  «        j_        pdU}!‰ j,        j`         a                    |||!||tÄ          jc        | ¬V¦  «        ƒ d#{V —† d‰ _        d‰ _d        d‰ _e        t                               dW‰ j        |pdX||!¦  «         n‰‰  f                    | ¬Y¦  «        ƒ d#{V —† t‡          jD        ¦   «         Š*dZt–          dd#fˆ*ˆ fd[„}"|"‰ _g        ‰  h                    | |"| ¬\¦  «        ƒ d#{V —†}#|#s t           "                    d]‰ j        ¦  «         ‰  i                    ¦   «          ‰ j        rd^nd_}$t                               d`‰ j        |$¦  «         ‰ j        sd‰ jj        r2‰ jj         k                    ¦   «         s‰ jj         l                    ¦   «          t‡          jm        ‰  n                    ¦   «         ¦  «        ‰ _j        ‰  o                    to          ‰ j.        dad#¦  «        ¦  «         t‹          jp        ¦   «         ‰ _q        ‰ j        rfto          ‰ dbd#¦  «        }%|%r(|% k                    ¦   «         s|% l                    ¦   «          t‡          jm        ‰  r                    ¦   «         ¦  «        ‰ _s        ‰  t                    ¦   «          dS # t–          $ rl}&‰  u                    ¦   «          tí          |&¦  «        }'dc|'› �}(‰                      dd|(d¬¦  «         t                               de‰ j        |'¦  «         Y d#}&~&dS d#}&~&ww xY w)huì  Connect to Telegram via polling or webhook.

        By default, uses long polling (outbound connection to Telegram).
        If ``TELEGRAM_WEBHOOK_URL`` is set, starts an HTTP webhook server
        instead.  Webhook mode is useful for cloud deployments (Fly.io,
        Railway) where inbound HTTP can wake a suspended machine.

        ``is_reconnect`` distinguishes a cold first boot (False â€” drop any
        stale Bot API queue) from a watcher reconnect after a prolonged
        outage (True â€” preserve the updates Telegram queued while the bot
        was offline, otherwise every message sent during the outage is
        silently lost). The in-process network-error ladder and the
        409-conflict handler already pass ``drop_pending_updates=False``
        for the same reason; bootstrap follows suit on the reconnect path.

        Env vars for webhook mode::

            TELEGRAM_WEBHOOK_URL    Public HTTPS URL (e.g. https://app.fly.dev/telegram)
            TELEGRAM_WEBHOOK_PORT   Local listen port (default 8443)
            TELEGRAM_WEBHOOK_HOST   Bind host (default: unset â†’ dual-stack,
                                    all interfaces IPv4+IPv6)
            TELEGRAM_WEBHOOK_SECRET Secret token for update verification
        FzL[%s] python-telegram-bot not installed. Run: pip install python-telegram-botÚmissing_dependencyz!python-telegram-bot not installedr¡  z[%s] No bot token configuredÚmissing_credentialszNo bot token configuredztelegram-bot-tokenzTelegram bot tokenrP  Úbase_file_urlz'[%s] Using custom Telegram base_url: %sÚ
local_modeTz5[%s] Using Telegram local_mode (read files from disk)r   r   r   c                 ó”   — 	 t          t          j        | t          |¦  «        ¦  «        ¦  «        S # t          t
          f$ r |cY S w xY wr7   )r²   r   r   r   rµ   r¶   ©r   r   s     r   Ú_env_intz)TelegramAdapter.connect.<locals>._env_int«  sP   € ð#Ý�rœy¨­s°7©|¬|Ñ<Ô<Ñ=Ô=Ð=øÝ!¥:Ð.ð #ð #ð #Ø"�N�N�Nð#øøøó   ‚.1 ±AÁAc                 ó”   — 	 t          t          j        | t          |¦  «        ¦  «        ¦  «        S # t          t
          f$ r |cY S w xY wr7   )r´   r   r   r   rµ   r¶   r  s     r   Ú
_env_floatz+TelegramAdapter.connect.<locals>._env_float±  sP   € ð#Ý ¥¤¨4µ°W±´Ñ!>Ô!>Ñ?Ô?Ð?øÝ!¥:Ð.ð #ð #ð #Ø"�N�N�Nð#øøør  ÚHERMES_TELEGRAM_HTTP_POOL_SIZEi   Ú!HERMES_TELEGRAM_HTTP_POOL_TIMEOUTg       @Ú$HERMES_TELEGRAM_HTTP_CONNECT_TIMEOUTg      $@Ú!HERMES_TELEGRAM_HTTP_READ_TIMEOUTg      4@Ú"HERMES_TELEGRAM_HTTP_WRITE_TIMEOUTr  )Úconnection_pool_sizeÚpool_timeoutÚconnect_timeoutÚread_timeoutÚwrite_timeoutÚmedia_write_timeoutr   )Úplatform_httpx_limitsNr  )Úmax_connectionsÚmax_keepalive_connectionsÚkeepalive_expiryÚhttpx_kwargsc                 ó@   •— t          | pi ¦  «        }‰�	d|vr‰|d<   |S )uÃ  Merge tuned keepalive limits into httpx client kwargs.

                Used by the proxy and direct-DNS branches, where httpx honours
                the client-level ``limits`` kwarg. A caller-supplied ``limits``
                is left untouched; otherwise the CLOSE_WAIT-safe limits are
                injected. The fallback-IP branch does NOT use this helper â€” see
                the ``_transport_kwargs`` note below for why.
                NÚlimits)rA  )r  r  Ú_pool_limitss     €r   Ú_with_limitsz-TelegramAdapter.connect.<locals>._with_limitsä  s6   ø€ õ ˜lÐ0¨bÑ1Ô1�ØÐ+°ÀÐ0FÐ0FØ'3�F˜8Ñ$Ø�r>   Ú$HERMES_TELEGRAM_DISABLE_FALLBACK_IPSr   >   r%  rr  r¾  r¿  u@   [%s] Discovering Telegram API fallback IPs via DNS-over-HTTPSâ€¦z.[%s] Auto-discovered Telegram fallback IPs: %sz, zapi.telegram.orgÚTELEGRAM_PROXY)Útarget_hostsz%[%s] Telegram fallback IPs active: %sr  Ú	transportz;[%s] Proxy detected; passing explicitly to HTTPXRequest: %s)Úproxyr  z4[%s] Telegram fallback-IP transport disabled via envÚVENUEé   ÚHERMES_TELEGRAM_INIT_TIMEOUTr  g      ^@z(Telegram initialization timed out after z attempts (rM  u-   s each) â€” total connect watchdog deadline (z˜s) exceeded. Check network connectivity to api.telegram.org or set HERMES_TELEGRAM_HTTP_CONNECT_TIMEOUT / HERMES_TELEGRAM_INIT_TIMEOUT to a lower value.u.   [%s] Connecting to Telegram (attempt %d/%d)â€¦r»   c                 ó    — t          | ¦  «        S r7   r   r!  s    r   r"  z)TelegramAdapter.connect.<locals>.<lambda>t  s   € Õ9PÐQTÑ9UÔ9U€ r>   r#  r^  rn  uD   [%s] Connect attempt %d/%d timed out after %.0fs â€” retrying in %dszus each). Check network connectivity to api.telegram.org or set HERMES_TELEGRAM_HTTP_CONNECT_TIMEOUT to a lower value.u9   [%s] Connect attempt %d/%d failed: %s â€” retrying in %dsu<   [%s] Connect attempt %d/%d interrupted by %s â€” propagatingr'   ÚTELEGRAM_WEBHOOK_URLÚTELEGRAM_WEBHOOK_PORTiû   ÚTELEGRAM_WEBHOOK_HOSTÚwebhook_host)ÚUnscopedSecretErrorÚ
get_secretÚTELEGRAM_WEBHOOK_SECRETuÁ  TELEGRAM_WEBHOOK_SECRET is required when TELEGRAM_WEBHOOK_URL is set. Without it, the webhook endpoint accepts forged updates from anyone who can reach it â€” see https://github.com/NousResearch/hermes-agent/security/advisories/GHSA-3vpc-7q5r-276h.

Generate a secret and set it in your .env:
  export TELEGRAM_WEBHOOK_SECRET="$(openssl rand -hex 32)"

Then register it with Telegram when setting the webhook via setWebhook's secret_token parameter.)Úurlparsez	/telegram)ÚlistenÚportÚurl_pathÚwebhook_urlÚsecret_tokenr  r  z([%s] Webhook server listening on %s:%d%sz* (all interfaces, IPv4+IPv6)r@  r   c                 ó>  •— t          ‰dd¦  «        rd S ‰j        r‰j                             ¦   «         sd S ‰                     | ¦  «        r†‰                     ¦   «          ‰                     ‰                     | ¦  «        ¦  «        ‰_        ‰j                             ‰j        ¦  «         ‰j         	                    ‰j        j
        ¦  «         d S ‰                     | ¦  «        r“t                               d‰j        | ¦  «         ‰                     ‰                     | ¦  «        ¦  «        ‰_        ‰j                             ‰j        ¦  «         ‰j         	                    ‰j        j
        ¦  «         d S t                               d‰j        | d¬¦  «         d S )Nrw  FzR[%s] Telegram network _redact_telegram_error_text(error), scheduling reconnect: %sz<[%s] Telegram polling _redact_telegram_error_text(error): %sTr#   )rl   ro  r9   rP  rŠ  r1  rT  r.  rd  rW   r/  r^  r(   r0   r   r>  r   )r   rA   r5  s    €€r   Ú_polling_error_callbackz8TelegramAdapter.connect.<locals>._polling_error_callback/  s´  ø€ Ý˜tÐ%@À%ÑHÔHð Ø˜ØÔ/ð ¸Ô8P×8UÒ8UÑ8WÔ8Wð Ø˜Ø×8Ò8¸Ñ?Ô?ð Fð ×3Ò3Ñ5Ô5Ð5Ø37×3CÒ3CÀD×DaÒDaÐbgÑDhÔDhÑ3iÔ3i˜Ô0ØÔ.×2Ò2°4Ô3KÑLÔLÐLØÔ0×BÒBÀ4ÔCYÔCaÑbÔbÐbÐbÐbØ×7Ò7¸Ñ>Ô>ð FÝŸšÐ'{ð  ~Bô  ~Gð  INñ  Oô  Oð  OØ37×3CÒ3CÀD×DfÒDfÐglÑDmÔDmÑ3nÔ3n˜Ô0ØÔ.×2Ò2°4Ô3KÑLÔLÐLØÔ0×BÒBÀ4ÔCYÔCaÑbÔbÐbÐbÐbåŸšÐ%cÐeiÔenÐpuð  AE˜ñ  Fô  Fð  Fð  Fð  Fr>   )r  r  rF  ze[%s] Connected in degraded Telegram mode: gateway is alive, polling will be retried in the backgroundÚwebhookÚpollingz$[%s] Connected to Telegram (%s mode)rÕ  r|  zTelegram startup failed: Útelegram_connect_errorz&[%s] Failed to connect to Telegram: %sr7   rŠ   )wrw  rX  rÛ   r(   r   r   r¢  r7  ÚtokenÚ_acquire_platform_lockry   Úbuilderr†  r‡  rP  r   r½   r  r   r²   r´   Ú%gateway.platforms._http_client_limitsr  ÚhttpxÚLimitsr  r  r   rA  r   r   r   rÇ   rM  r0   r¢   r  rš   rƒ   r¡   r  ro   Úget_updates_requestÚbuildrV  ri   rW  Úadd_handlerræ   r~   ÚTEXTÚCOMMANDÚ_handle_text_messageÚ_handle_commandÚLOCATIONrl   Ú_handle_location_messageÚPHOTOÚVIDEOÚAUDIOÚVOICEÚDocumentÚALLÚStickerÚ_handle_media_messager{   Ú_handle_callback_queryr&   rL   rp  r‘  r]  r_   rø  rp   r   rY   r0  ra  r^  ÚBaseExceptionr0  Úsysr$   r'   rÙ  r†   rS   r¦   Úagent.secret_scoper)  r*  rQ  Úurllib.parser,  r¹   r$  Ústart_webhookrq   r&  ru  r  rE  rx  rY  r™  ry  r9   rV   rK   r}  rs  rq  r{  rÛ  r|  rÞ  Ú_release_platform_lockr   )+r5  rü  r9  Úcustom_base_urlr  r  Úrequest_kwargsr  Ú_base_limitsÚ_httpxr  Údisable_fallbackrG  Úproxy_targetsÚ	proxy_urlÚ_transport_kwargsro   r=  Ú_max_connectÚ_init_timeoutÚ_total_deadlineÚ_attemptÚrebuild_appÚold_apprT   Úinit_errr0  Úwebhook_portr(  r)  r*  Úwebhook_secretr,  Úwebhook_pathr3  Úpolling_startedÚmodeÚidentity_taskrN  rå  rž  r  rA   s+   `                                        @@r   ÚconnectzTelegramAdapter.connectb  s–  øøøè è € ð6 */ˆÔ&ð #ˆÔå!ð 	Ý�LŠLØ^Ø”	ñô ð ð ×!Ò!Ð"6Ð8[ÐglÐ!ÑmÔmÐmØ�5àŒ{Ô ð 	Ý�LŠLÐ7¸¼ÑCÔCÐCØ×!Ò!Ð"7Ð9RÐ^cÐ!ÑdÔdÐdØ�5ðz	Ø×.Ò.Ð/CÀTÄ[ÔEVÐXlÑmÔmð Ø�uõ "Ô)Ñ+Ô+×1Ò1°$´+Ô2CÑDÔDˆGØ"œkÔ/×3Ò3°JÑ?Ô?ˆOØð Ø!×*Ò*¨?Ñ;Ô;�Ø!×/Ò/Ø”KÔ%×)Ò)¨/¸?ÑKÔKñô �õ —’Ø=Ø”I˜ñô ð ð Œ{Ô ×$Ò$ \Ñ2Ô2ð `Ø!×,Ò,¨TÑ2Ô2�Ý—’ÐSÐUYÔU^Ñ_Ô_Ð_ð
#�sð #­Sð #µSð #ð #ð #ð #ð#¥ð #­uð #½ð #ð #ð #ð #ð )1¨Ð1QÐSVÑ(WÔ(WØ * 
Ð+NÐPSÑ TÔ TØ#- :Ð.TÐVZÑ#[Ô#[Ø * 
Ð+NÐPTÑ UÔ UØ!+ Ð,PÐRVÑ!WÔ!Wð (,ð!ð ˆNð> TÐSÐSÐSÐSÐSà0Ð0Ñ2Ô2ˆLØÐ'Ø&Ð&Ð&Ð&à%Ÿ}š}Ø$2Ð3IÔ$JØ.:Ô.TØ%1Ô%Bð  -ñ  ô  ��ð  $�ðð ­8µD¬>ð ÅTð ð ð ð ð ð õ !#¤	Ð*PÐRTÑ UÔ U× [Ò [Ñ ]Ô ]× cÒ cÑ eÔ eð  jDð  !DÐØ×-Ò-Ñ/Ô/ˆLØð Ý—’ÐaÐcgÔclÑmÔmÐmÝ%:Ñ%<Ô%<Ð<Ð<Ð<Ð<Ð<Ð<�Ý—’ØDØ”IØ—I’I˜lÑ+Ô+ñô ð ð 0Ð?°,Ð?ˆMÝ)Ð*:ÈÐWÑWÔWˆIØð 0 Ið 0Ð6Fð 0Ý—’Ø;Ø”IØ—I’I˜lÑ+Ô+ñô ð ð +-Ð!ØÐ+Ø2>Ð% hÑ/Ý&ð ð Ø$ðð ð $Õ%>Ø(ð&ð &Ø,=ð&ð &ð"ðð ð �õ '3ð 'ð 'Ø$ð'ð 'ð $Õ%>Ø(ð&ð &Ø,=ð&ð &ð"ð'ð 'ð 'Ð#Ð#ð ð Ý—’ÐYÐ[_Ô[dÐfoÑpÔpÐpÝ&ð ð Ø$ðØ,5ÀLÀLÁNÄNðð ð ð �õ '3ð 'ð 'Ø$ð'Ø,5ÀLÀLÁNÄNð'ð 'ð 'ð 'Ð#Ð#ð $ð cÝ—K’KÐ VÐX\ÔXaÑbÔbÐbÝ&ÐUÐU¨ÐUÐUÀlÀlÁnÄnÐUÐUÐU�Ý&2ð 'ð 'Ø$ð'ð 'Ø3?°<±>´>ð'ð 'ð 'Ð#ð #'×"BÒ"BÐCVÑ"WÔ"WÐØ—o’o gÑ.Ô.×BÒBÐCVÑWÔWˆGØŸš™œˆDŒIØœ	œˆDŒIð ŒI×!Ò!Õ"8Ý”¥¤Ð/Ñ/ØÔ)ñ#ô #ñ ô ð ð ŒI×!Ò!Õ"8Ý”ØÔ$ñ#ô #ñ ô ð ð ŒI×!Ò!Õ"8ÝÔ ¥7­7°G½WÔ=MÑ#NÔ#NÑNØÔ-ñ#ô #ñ ô ð ð ŒI×!Ò!Õ"8Ý”¥¤Ñ-µ´Ñ=ÅÄÑMÕPWÔP`ÔPdÑdÕgnÔgvÔgzÑzØÔ*ñ#ô #ñ ô ð ð
 ŒI×!Ò!Õ"6°tÔ7RÑ"SÔ"SÑTÔTÐTð
 ˆLØ&˜JÐ'EÀtÑLÔLˆMõ Ô(Ñ*Ô*×/Ò/Ñ1Ô1Ø ,Ñ.ñ/àñð õ
 " ,Ñ/Ô/ð x!ñ x!�Ø#�ðv!õ Ô/Ñ1Ô1×6Ò6Ñ8Ô8¸OÒKÐKÝ%ðNÀ|ð Nð NØ -ÐVðNð Nà)6¸Ñ)EÈÑ)MÐ`ðNð Nð Nñô ð õ —N’NØHØœ	 8¨a¡<°ñô ð õ 6Øœ	×,Ò,Ñ.Ô.Ø -ð /3¬iÐ#UÐ#UÐ#Uð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð ð@ #ñ ! x°,ÀÑ2BÒ'BÑ'BØ"&¤)˜Ø$+§M¢M¡O¤O˜œ	Ø$(¤I¤M˜œ	àœ	×-Ò-Õ.DÝ#œL­G¬OÐ+;Ñ;Ø Ô5ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#œOØ Ô0ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#Ô,­wµwÀÍÔIYÑ/ZÔ/ZÑZØ Ô9ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#œM­G¬MÑ9½G¼MÑIÍGÌMÑYÕ\cÔ\lÔ\pÑpÕszô  tCô  tGñ  GØ Ô6ñ/ô /ñ ô ð ð œ	×-Ò-Õ.BÀ4ÔC^Ñ._Ô._Ñ`Ô`Ð`ð!Ý"9¸'Ñ"BÔ"BÐBÐBÐBÐBÐBÐBÐBÐBøÝ(ð !ð !ð !Ø ˜Dð!øøøøùøõq Ô+ð ð ð Ø"&�KØ ,°Ñ"2Ò2Ð2Ý" 1¨¡=°"Ñ5Ô5˜ÝŸšØbØ œI x°!¡|°\À=ÐRVñô ð õ &œm¨DÑ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1å%ð]À|ð ]ð ]Ø -Ðkð]ð ]ð ]ñô ð ð 2Ñ1õ ð 
ð 
ð 
Ø"&�KØ ,°Ñ"2Ò2Ð2Ý" 1¨¡=°"Ñ5Ô5˜ÝŸšØWØ œI x°!¡|°\À8ÈTñô ð õ &œm¨DÑ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1àð 2Ð1Ð1Ð1Ñ1øøøøõ !ð ð ð Ø"&�KØ×9Ò9¸(ÑCÔCð ØØ ,°Ñ"2Ò2Ð2Ý" 1¨¡=°"Ñ5Ô5˜ÝŸšØWØ œI x°!¡|°\À8ÈTñô ð õ &œm¨DÑ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1àð 2Ð1Ð1Ð1Ð1øøøøõ %ð ð ð õ —N’NØVØœ	Ø  1™Ø$å%¥c¤l¡n¤n°QÔ&7½Ô9OÑPÔPð>Ð(Ð(å!¥#¤,¡.¤.°Ô"3Ñ4Ô4Ô=ñô ð ð ð#øøøð0 #ñ ! x°,ÀÑ2BÒ'BÑ'BØ"&¤)˜Ø$+§M¢M¡O¤O˜œ	Ø$(¤I¤M˜œ	àœ	×-Ò-Õ.DÝ#œL­G¬OÐ+;Ñ;Ø Ô5ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#œOØ Ô0ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#Ô,­wµwÀÍÔIYÑ/ZÔ/ZÑZØ Ô9ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#œM­G¬MÑ9½G¼MÑIÍGÌMÑYÕ\cÔ\lÔ\pÑpÕszô  tCô  tGñ  GØ Ô6ñ/ô /ñ ô ð ð œ	×-Ò-Õ.BÀ4ÔC^Ñ._Ô._Ñ`Ô`Ð`ð!Ý"9¸'Ñ"BÔ"BÐBÐBÐBÐBÐBÐBÐBÑBøÝ(ð !ð !ð !Ø ™Dð!øøøùøð3 #ñ ! x°,ÀÑ2BÒ'BÑ'BØ"&¤)˜Ø$+§M¢M¡O¤O˜œ	Ø$(¤I¤M˜œ	àœ	×-Ò-Õ.DÝ#œL­G¬OÐ+;Ñ;Ø Ô5ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#œOØ Ô0ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#Ô,­wµwÀÍÔIYÑ/ZÔ/ZÑZØ Ô9ñ/ô /ñ ô ð ð œ	×-Ò-Õ.DÝ#œM­G¬MÑ9½G¼MÑIÍGÌMÑYÕ\cÔ\lÔ\pÑpÕszô  tCô  tGñ  GØ Ô6ñ/ô /ñ ô ð ð œ	×-Ò-Õ.BÀ4ÔC^Ñ._Ô._Ñ`Ô`Ð`ð!Ý"9¸'Ñ"BÔ"BÐBÐBÐBÐBÐBÐBÐBÐBøÝ(ð !ð !ð !Ø ˜Dð!øøøð3!Ð'Bøøøð6 ”)—/’/Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#õ œ)Ð$:¸BÑ?Ô?×EÒEÑGÔGˆKàñ Bõ  'Ð'>ÀÑEÔE�õ ”IÐ5°rÑ:Ô:×@Ò@ÑBÔBð XÝ˜DœKÔ-Ð3°×8Ò8¸ÑHÔHÐNÈBÑOÔO×UÒUÑWÔWð ðð ð ð ð ð ð ð ð
VØ&0 jÐ1JÑ&KÔ&KÐ&QÈr×%XÒ%XÑ%ZÔ%Z�N�NøØ*ð Vð Vð VÝ%'¤YÐ/HÈ"Ñ%MÔ%M×%SÒ%SÑ%UÔ%U�N�N�NðVøøøà%ð Ý&ð	Kñô ð ð 2Ð1Ð1Ð1Ð1Ð1Ø'˜x¨Ñ4Ô4Ô9ÐH¸[�à”iÔ'×5Ò5Ø'Ø%Ø)Ø +Ø!/Ý$*Ô$4ð
 .:Ð)9ð 6ñ ô ð ð ð ð ð ð ð ð &*�Ô"Ø38�Ô0Ø+0�Ô(Ý—’Ø>Ø”IØ ÐCÐ$CØ Ø ñô ð ð ð ×6Ò6Ø(4Ð$4ð 7ñ ô ð ð ð ð ð ð ð õ Ô/Ñ1Ô1�ðFµ9ð FÀð Fð Fð Fð Fð Fð Fð Fð4 4K�Ô0à(,×(EÒ(Eð .:Ð)9Ø#:Ø)5Ð%5ð )Fñ )ô )ð #ð #ð #ð #ð #ð #�ð 'ð Ý—N’NðDàœ	ñô ð ð × Ò Ñ"Ô"Ð"Ø $Ô 2ÐA�9�9¸	ˆDÝ�KŠKÐ>ÀÄ	È4ÑPÔPÐPð
 Ô%ð ØÔ/ð :¸Ô8T×8YÒ8YÑ8[Ô8[ð :ØÔ0×7Ò7Ñ9Ô9Ð9Ý/6Ô/DØ×0Ò0Ñ2Ô2ñ0ô 0�Ô,ð ×#Ò#¥G¨D¬I°zÀ4Ñ$HÔ$HÑIÔIÐIÝ,0¬NÑ,<Ô,<ˆDÔ)ØÔ!ð Ý '¨Ð.JÈDÑ QÔ Q�Ø ð +¨×);Ò);Ñ)=Ô)=ð +Ø!×(Ò(Ñ*Ô*Ð*Ý29Ô2GØ×3Ò3Ñ5Ô5ñ3ô 3�Ô/ð ×1Ò1Ñ3Ô3Ð3à�4øåð 	ð 	ð 	Ø×'Ò'Ñ)Ô)Ð)Ý4°QÑ7Ô7ˆJØ>°*Ð>Ð>ˆGØ×!Ò!Ð":¸GÈtÐ!ÑTÔTÐTÝ�LŠLÐAÀ4Ä9ÈjÑYÔYÐYØ�5�5�5�5�5øøøøð	øøøs1  Â!AK9 Â?X
AK9 Û
B&eÝ1G AK9 ä2eåAK9 å
eåAK9 åeåAK9 åBm.ç!uç$	m.ç-A!iéuém.é!A7këuëBm.í.uí1G AK9 ô2u	õAK9 õ	
uõAK9 õuõAK9 õG}ü|4ü3}ü4
}	ü>}ý }	ý}ýCAK9 Á@A@4 Á@3AK9 Á@4,AA#ÁA AK9 ÁA"AA#ÁA#JAK9 ÁK9
AM/ÁLA!AM*ÁM*AM/rñ  c           	   ƒ   ó„  K  — t          | dd¦  «        sdS | j        }|€dS |r| j        n| j        }|dd…         }	 |                     |¬¦  «        ƒ d{V —† t
                               d| j        |¦  «         dS # t          $ r:}t
           	                    d| j        |t          |¦  «        ¦  «         Y d}~dS d}~ww xY w)u]  Set the bot's short description to the online/offline status text.

        The short description is the line shown under the bot's name in its
        profile. It is the closest Bot API surface to a presence indicator â€”
        bots have no real online/offline dot (that's a user-account feature).

        No-op unless ``extra.status_indicator`` is enabled. Best-effort: any
        failure is logged at debug and swallowed so it never blocks connect or
        disconnect. The default (no language_code) description applies to every
        user who doesn't have a language-specific one set.
        rˆ  FNéx   )Úshort_descriptionz#[%s] Set bot status indicator to %rz1[%s] Failed to set bot status indicator to %r: %s)rl   rW  r‰  rŠ  Úset_my_short_descriptionr(   r½   r   r   r)   r   )r5  rñ  ri   r   rN  s        r   rô  z%TelegramAdapter._set_status_indicator‹  s
  è è € õ �tÐ8¸%Ñ@Ô@ð 	ØˆFØŒiˆØˆ;ØˆFØ+1ÐPˆtÔ'Ð'°tÔ7Pˆà�D�S�DŒzˆð	Ø×.Ò.ÀÐ.ÑFÔFÐFÐFÐFÐFÐFÐFÐFÝ�KŠKÐ=¸t¼yÈ$ÑOÔOÐOÐOÐOøÝð 	ð 	ð 	Ý�LŠLØCØ”	˜4Õ!<¸QÑ!?Ô!?ñô ð ð ð ð ð ð ð øøøøð	øøøs   ¼=A; Á;
B?Â/B:Â:B?c              ƒ   ó<  ‡‡‡‡K  — t          j        ¦   «         Šg Šg Št          ¦   «         Šdt          t           j                 ddfˆˆˆˆfd„}t          | j                             ¦   «         ¦  «        D ]} ||¦  «         Œt          | j                             ¦   «         ¦  «        D ]} ||¦  «         Œt          | j	                             ¦   «         ¦  «        D ]} ||¦  «         Œ |t          | dd¦  «        ¦  «          |t          | dd¦  «        ¦  «         ‰D ]}|                     ¦   «          Œ‰rt          j        ‰ddiŽƒ d{V —† | j                             ¦   «          | j                             ¦   «          | j                             ¦   «          | j                             ¦   «          | j	                             ¦   «          | j                             ¦   «          t          | dd¦  «        ‰urd| _        t          | dd¦  «        ‰ur	d| _        dS dS )	a®  Cancel every delayed-delivery task family before disconnect completes.

        Covers media-group, photo-batch and text-batch flush tasks plus the
        polling-error recovery task. Each sits behind an ``asyncio.sleep()``;
        if teardown leaves them running they dispatch ``handle_message`` into a
        torn-down session. Skips the current task so the coroutine driving
        teardown does not cancel itself.
        r!   r   Nc                 ó<  •— | r|                       ¦   «         s| ‰u rd S t          | ¦  «        }|‰v rd S ‰                     |¦  «         ‰                     | ¦  «         t	          j        | ¦  «        st	          j        | ¦  «        r‰                     | ¦  «         d S d S r7   )r9   rÔ  rd  r  r&   rf   re   )r!   r8  Úawaitable_tasksr˜  Úpending_tasksrf  s     €€€€r   Úcollectz?TelegramAdapter._cancel_pending_delivery_tasks.<locals>.collect¶  s±   ø€ Øð ˜4Ÿ9š9™;œ;ð ¨$°,Ð*>Ð*>Ø�Ý˜‘X”XˆFØ˜ˆ~ˆ~Ø�Ø�HŠH�VÑÔÐØ× Ò  Ñ&Ô&Ð&ÝÔ Ñ%Ô%ð -­Ô)<¸TÑ)BÔ)Bð -Ø×&Ò& tÑ,Ô,Ð,Ð,Ð,ð-ð -r>   ro  rv  rO  T)r&   r˜  r8   r   r3  Úlistri  Úvaluesrg  rm  rl   rV   rS  Úclearrh  rf  rl  ro  rv  )r5  rs  r!   rq  r˜  rr  rf  s      @@@@r   Ú_cancel_pending_delivery_tasksz.TelegramAdapter._cancel_pending_delivery_tasks¨  se  øøøøè è € õ Ô+Ñ-Ô-ˆØ,.ˆØ.0ˆÝ™œˆð		-�(¥7¤<Ô0ð 		-°Tð 		-ð 		-ð 		-ð 		-ð 		-ð 		-ð 		-ð 		-ð 		-õ ˜Ô0×7Ò7Ñ9Ô9Ñ:Ô:ð 	ð 	ˆDØˆG�D‰MŒMˆMˆMÝ˜Ô8×?Ò?ÑAÔAÑBÔBð 	ð 	ˆDØˆG�D‰MŒMˆMˆMÝ˜Ô7×>Ò>Ñ@Ô@ÑAÔAð 	ð 	ˆDØˆG�D‰MŒMˆMˆMØˆ•˜Ð3°TÑ:Ô:Ñ;Ô;Ð;Øˆ•˜Ð?ÀÑFÔFÑGÔGÐGà!ð 	ð 	ˆDØ�KŠK‰MŒMˆMˆMØð 	KÝ”. /ÐJÀTÐJÐJÐJÐJÐJÐJÐJÐJÐJàÔ×%Ò%Ñ'Ô'Ð'ØÔ ×&Ò&Ñ(Ô(Ð(ØÔ'×-Ò-Ñ/Ô/Ð/ØÔ#×)Ò)Ñ+Ô+Ð+ØÔ&×,Ò,Ñ.Ô.Ð.ØÔ"×(Ò(Ñ*Ô*Ð*Ý�4Ð.°Ñ5Ô5¸\ÐIÐIØ'+ˆDÔ$Ý�4Ð:¸DÑAÔAÈÐUÐUØ37ˆDÔ0Ð0Ð0ð VÐUr>   r,   Ústepc              ƒ   ó.  K  — t          j        |¦  «        }	 |dk    rt          j        |h¦  «        ƒ d{V —†\  }}n t          j        |h|¬¦  «        ƒ d{V —†\  }}nB# t           j        $ r0 |                     ¦   «          |                     t          ¦  «         ‚ w xY w||v r!	 |ƒ d{V —† n# t           j        $ r Y nw xY wdS |                     ¦   «          |                     t          ¦  «         t                               d| j	        ||¦  «         dS )u¬  Await one disconnect step; detach on timeout so teardown advances.

        ``asyncio.wait_for`` cancels an overdue child but then waits for it to
        exit. Lifecycle / PTB close paths that swallow ``CancelledError`` on a
        half-dead socket can therefore wedge disconnect forever (#80598).
        Detach at the deadline and continue â€” the abandoned task is observed
        via ``_consume_abandoned_task``.
        r   Nrõ  TzD[%s] %s timed out after %.1fs during disconnect; continuing teardownF)
r&   rK   rT   r'   rV   rW   r*   r(   r0   r   )r5  rZ   r,   rx  r!   r9   Ú_pendings          r   Ú_await_disconnect_stepz&TelegramAdapter._await_disconnect_stepÚ  sY  è è € õ Ô$ YÑ/Ô/ˆð	Ø˜!Š|ˆ|Ý'.¤|°T°FÑ';Ô';Ð!;Ð!;Ð!;Ð!;Ð!;Ð!;‘��h�hå'.¤|°T°FÀGÐ'LÑ'LÔ'LÐ!LÐ!LÐ!LÐ!LÐ!LÐ!L‘��høøÝÔ%ð 	ð 	ð 	ð
 �KŠK‰MŒMˆMØ×"Ò"Õ#:Ñ;Ô;Ð;Øð	øøøð �4ˆ<ˆ<ðØ�
�
�
�
�
�
�
�
øÝÔ)ð ð ð Ø�ðøøøà�4Ø�Š‰ŒˆØ×ÒÕ6Ñ7Ô7Ð7Ý�ŠØRØŒIØØñ		
ô 	
ð 	
ð ˆus   ˜AA Á?BÂ%B. Â.C Â?C c              ƒ   ó<
  K  — |                       ¦   «          d| _        d| _        t          | dd¦  «        dz   | _        t          j        ¦   «         | _        d| _        |  	                    ¦   «          t          j
        ¦   «         }g }t          ¦   «         }t          | dd¦  «        t          | dd¦  «        fD ]—}|r|                     ¦   «         s||u rŒt          |¦  «        }||v rŒ1|                     |¦  «         |                     ¦   «          t          j        |¦  «        st          j        |¦  «        r|                     |¦  «         Œ˜|r1|                      t          j        |d	diŽt*          d
¦  «        ƒ d{V —† t          | dd¦  «        |urd| _        t          | dd¦  «        |urd| _        d| _        d| _        t          | dd¦  «        }|r^|                     ¦   «         sJ|                     ¦   «          |                      t          j        |d¬¦  «        t*          d¦  «        ƒ d{V —† d| _        t          | dd¦  «        }|rJ|                     ¦   «         s6|                     ¦   «          |                      |t*          d¦  «        ƒ d{V —† d| _        t          | dd¦  «        }|rJ|                     ¦   «         s6|                     ¦   «          |                      |t*          d¦  «        ƒ d{V —† d| _        	 |                      |                      d¬¦  «        t*          d¦  «        ƒ d{V —† n# t8          $ r Y nw xY w|                      |                      ¦   «         t*          d¦  «        ƒ d{V —† | j        �rg	 | j        j        r–| j        j        j         r…	 |                      | j        j         !                    ¦   «         tD          d¦  «        ƒ d{V —† nE# t8          $ r8}	tF           $                    d| j%        tM          |	¦  «        ¦  «         Y d}	~	nd}	~	ww xY w| j        j         r9|                      | j         !                    ¦   «         t*          d¦  «        ƒ d{V —† |                      | j         '                    ¦   «         t*          d¦  «        ƒ d{V —† nE# t8          $ r8}
tF           $                    d| j%        tM          |
¦  «        ¦  «         Y d}
~
nd}
~
ww xY wd| _        d| _(        tF           )                    d| j%        ¦  «         dS )zHStop polling/webhook, cancel pending delayed deliveries, and disconnect.TFrs  r   r»   ro  Nrv  rO  zlifecycle-task cancelr–  rN  zpost-connect cancelry  zheartbeat cancelr|  zidentity-refresh cancelrð  zstatus-indicator updatezpending-delivery cancelzupdater.stop()z0[%s] updater.stop() failed during disconnect: %sz
app.stop()zapp.shutdown()z)[%s] Error during Telegram disconnect: %sz[%s] Disconnected from Telegram)*rœ  rw  ru  rl   rs  r&   rO   rt  r  rT  r˜  r8   r9   rÔ  rd  rV   rf   re   r  r{  rS  Ú_DISCONNECT_STEP_TIMEOUTro  rv  r–  ry  r|  rô  r   rw  rV  r$  rb  rc  rd  r(   r0   r   r   rk   rW  r½   )r5  r˜  Úlifecycle_tasksÚlifecycle_seenr!   r8  Úpost_connect_taskÚpolling_heartbeat_taskri  r–  rN  s              r   Ú
disconnectzTelegramAdapter.disconnect  s¦  è è € ð
 	×ÒÑ!Ô!Ð!Ø)-ˆÔ&Ø+0ˆÔ(Ý#*¨4Ð1FÈÑ#JÔ#JÈQÑ#NˆÔ Ý'.¤}¡¤ˆÔ$Ø#'ˆÔ ð
 	×#Ò#Ñ%Ô%Ð%õ
 Ô+Ñ-Ô-ˆØ.0ˆÝ#&¡5¤5ˆå�DÐ/°Ñ6Ô6Ý�DÐ;¸TÑBÔBð
ð 	-ð 	-ˆDð ð ˜4Ÿ9š9™;œ;ð ¨$°,Ð*>Ð*>ØÝ˜‘X”XˆFØ˜Ð'Ð'ØØ×Ò˜vÑ&Ô&Ð&Ø�KŠK‰MŒMˆMÝÔ Ñ%Ô%ð -­Ô)<¸TÑ)BÔ)Bð -Ø×&Ò& tÑ,Ô,Ð,øØð 	Ø×-Ò-Ý” ÐHÀ4ÐHÐHÝ(Ø'ñô ð ð ð ð ð ð ð õ
 �4Ð.°Ñ5Ô5¸\ÐIÐIØ'+ˆDÔ$Ý�4Ð:¸DÑAÔAÈÐUÐUØ37ˆDÔ0ð ,1ˆÔ(Ø#'ˆÔ õ $ DÐ*>ÀÑEÔEÐØð 	Ð%6×%;Ò%;Ñ%=Ô%=ð 	Ø×$Ò$Ñ&Ô&Ð&Ø×-Ò-Ý”Ð0ÀDÐIÑIÔIÝ(Ø%ñô ð ð ð ð ð ð ð ð
 #'ˆÔõ ")¨Ð/HÈ$Ñ!OÔ!OÐØ!ð 	Ð*@×*EÒ*EÑ*GÔ*Gð 	Ø"×)Ò)Ñ+Ô+Ð+Ø×-Ò-Ø&Ý(Ø"ñô ð ð ð ð ð ð ð ð
 (,ˆÔ$õ   Ð&BÀDÑIÔIˆØð 	 ×!3Ò!3Ñ!5Ô!5ð 	Ø× Ò Ñ"Ô"Ð"Ø×-Ò-ØÝ(Ø)ñô ð ð ð ð ð ð ð ð
 +/ˆÔ'ð	Ø×-Ò-Ø×*Ò*°%Ð*Ñ8Ô8Ý(Ø)ñô ð ð ð ð ð ð ð ð øõ
 ð 	ð 	ð 	ØˆDð	øøøð ×)Ò)Ø×/Ò/Ñ1Ô1Ý$Ø%ñ
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð Œ9ñ %	ð$ð ”9Ô$ð ¨¬Ô):Ô)Bð ðØ"×9Ò9Ø œIÔ-×2Ò2Ñ4Ô4Ý1Ø,ñô ð ð ð ð ð ð ð ð øõ
 %ð ð ð ÝŸšØNØ œIÝ7¸
ÑCÔCñô ð ð ð ð ð ð øøøøðøøøð ”9Ô$ð Ø×5Ò5Øœ	ŸšÑ(Ô(Ý0Ø$ñô ð ð ð ð ð ð ð ð
 ×1Ò1Ø”I×&Ò&Ñ(Ô(Ý,Ø$ñô ð ð ð ð ð ð ð ð øõ
 ð ð ð Ý—’Ø?Ø”IÕ:¸1Ñ=Ô=ñô ð ð ð ð ð ð øøøøðøøøð ˆŒ	ØˆŒ	Ý�ŠÐ5°t´yÑAÔAÐAÐAÐAsU   Ì6L; Ì;
MÍMÎR) Î&>O% Ï$R) Ï%
P'Ï/.P"ÐR) Ð"P'Ð'BR) Ò)
S+Ò3.S&Ó&S+Úchunk_indexc                 óD   — |sdS | j         }|dk    rdS |dk    rdS |dk    S )a3  Determine if this message chunk should thread to the original message.

        Args:
            reply_to: The original message ID to reply to
            chunk_index: Index of this chunk (0 = first chunk)

        Returns:
            True if this chunk should be threaded to the original message
        Fr  ÚallTr   )r[  )r5  r	  rƒ  rh  s       r   r»  z$TelegramAdapter._should_thread_replyœ  s@   € ð ð 	Ø�5ØÔ"ˆØ�5Š=ˆ=Ø�5Ø�UŠ]ˆ]Ø�4à !Ò#Ð#r>   c              ƒ   óÔ  K  — | j         st          dd¬¦  «        S t          | dd¦  «        rt          ddd¬¦  «        S |r|                     ¦   «         st          dd¬	¦  «        S 	 |                      ||¬
¦  «        ro|                      ||||¦  «        ƒ d{V —†}|�O|j        rF|pi                      d¦  «        s/	 |                      ||¬
¦  «        ƒ d{V —† n# t          $ r Y nw xY w|S |  
                    |¦  «        }|                      || j        t          ¬¦  «        }t          |¦  «        dk    rd„ |D ¦   «         }g }|                      |¦  «        }	|                      |	¦  «        }
d}	 ddlm} n# t&          $ r
 t(          }Y nw xY w	 ddlm} n# t&          $ r d}Y nw xY w	 ddlm} n# t&          t.          f$ r d}Y nw xY wt1          |¦  «        D �]ù\  }}d}|                      |¦  «        }|                      ||	|¦  «        }|o.| j        dk    o#t9          |o|                     d¦  «        ¦  «        }|p|r|�t;          |¦  «        nd}|r|duo
| j        dk    }n|                      ||¦  «        }|r|rt?          |¦  «        nd}|r*|€(|s&t          d|                       ¦   «         d¬¦  «        c S |  !                    ||	||| j        ¬¦  «        }|r)|                     d¦  «        �tE          |¦  «        }d|d<   |                     d¦  «        }d}tG          d¦  «        D �]{}	 	  | j         j$        d2tK          |¦  «        |tL          j'        |dœ|¤|  (                    ¦   «         ¤|  )                    |¦  «        ¤Žƒ d{V —†}nâ# t          $ rÕ}dt;          |¦  «         *                    ¦   «         v s#dt;          |¦  «         *                    ¦   «         v r„tV           ,                    d| j-        |¦  «         t]          |¦  «        } | j         j$        d2tK          |¦  «        |d|dœ|¤|  (                    ¦   «         ¤|  )                    |¦  «        ¤Žƒ d{V —†}n‚ Y d}~nd}~ww xY w �n5# |$ �rz}|�rµt_          ||¦  «        �r¤|  0                    |¦  «        r³|�±|s|r=|                     d¦  «        r(t          dt;          |¦  «        d¬¦  «        cY d}~c c S |s)d}tV           ,                    d| j-        |¦  «         Y d}~�ŒåtV           ,                    d| j-        |¦  «         |  1                    ||¦  «         d}d}ddi}Y d}~�Œ*t;          |¦  «         *                    ¦   «         }d|v r¶|�´|r*te          |¦  «        } t          d| d¬¦  «        cY d}~c c S te          |¦  «        } tV           ,                    d | j-        | ¦  «         d}|r|                     d¦  «        ri }d}n4|  !                    ||	||| j        ¬¦  «        }|                     d¦  «        }Y d}~�Œ‚ |  3                    |¦  «        }!|r(t_          ||¦  «        r|  4                    |¦  «        s|!s‚ |!r|  5                    ¦   «         ƒ d{V —† |d!k     rUd!|z  }"te          |¦  «        } tV           ,                    d"| j-        |dz   |"| ¦  «         tm          j7        |"¦  «        ƒ d{V —† n‚ Y d}~�ŒÃd}~wt          $ rª}t          |d#d¦  «        }#|#€#d$t;          |¦  «         *                    ¦   «         v rn|d!k     rh|#�tq          |#¦  «        nd%}"te          |¦  «        } tV           ,                    d&| j-        |dz   |"| ¦  «         tm          j7        |"¦  «        ƒ d{V —† Y d}~�Œt‚ d}~ww xY w| 9                    t;          |j:        ¦  «        ¦  «         �Œû|pi                      d¦  «        s/	 |                      ||¬
¦  «        ƒ d{V —† n# t          $ r Y nw xY wt          d|r|d         nd||
|d'œ¬(¦  «        S # t          $ �r"}$te          |$¦  «        }%tV           ;                    d)| j-        |%¦  «         t;          |$¦  «         *                    ¦   «         }&ty          |$¦  «        }'d*|&v sd+|&v r7tV           =                    d,| j-        ¦  «         t          dd*d-¬.¦  «        cY d}$~$S t}          ¦   «                              d/¦  «        }(|(rt_          |$|(¦  «        pd0|&v })|  4                    |$¦  «        }*|  3                    |$¦  «        }!t          d|%|*p|!p|) |'¬1¦  «        cY d}$~$S d}$~$ww xY w)3z"Send a message to a Telegram chat.FúNot connected©rÓ  r   r  Úsend_path_degradedTrë  NrÖ  ©r¦  r¨  ©Úlen_fnr»   c           	      óT   — g | ]%}t          t          j        d d|¦  «        ¦  «        ‘Œ&S )z \((\d+)/(\d+)\)$z \\(\1/\2\\))r  r   rú   )rM  Úchunks     r   rì  z(TelegramAdapter.send.<locals>.<listcomp>ã  sF   € ð ð ð ð õ 9ÝœÐ3°_ÀeÑLÔLñô ðð ð r>   r   )rZ  r,  rÐ  r  r  rº  rÚ  rŒ   ©rK  r   Ú
parse_moder  Úparser©  z<[%s] MarkdownV2 parse failed, falling back to plain text: %sr  z;[%s] Thread %s not found, retrying once with same thread_idz<[%s] Thread %s not found, retrying without message_thread_idr3  z8[%s] Reply target deleted, retrying without reply_to: %sr^  z>[%s] Network error on send (attempt %d/3), retrying in %ds: %srÒ  úretry afterr?  zI[%s] Telegram flood control on send (attempt %d/3), retrying in %.1fs: %s)Úmessage_idsÚrequested_thread_idÚthread_fallback)rÓ  rË  Úraw_responsez([%s] Failed to send Telegram message: %sÚmessage_too_longútoo longzF[%s] send() content too long, falling back to new-message continuationÚtoo_long)rÓ  r   Ú
error_kindrß  rÑ  )rÓ  r   rŸ  rš  rŠ   )?rW  r”   rl   r   r¢  ræ  rÓ  r‡  Úsend_typingr   Úformat_messageÚtruncate_messageÚMAX_MESSAGE_LENGTHrŸ   r€  r  r  r/  rZ  râ   r]  r-  r\  r²  Ú	enumerater
  r  r[  r…  r   r»  r²   r  r  rA  r‘  rÓ  r    r€   ÚMARKDOWN_V2r}  rª  rÇ   r(   r0   r   r  r0  r   r)  r   rp  rl  r:  r&   ra  r´   r  rË  r   r•   r)   Úlocals)+r5  rK  r~  r	  r¦  Úrich_resultÚ	formattedÚchunksr“  r­  r”  Úused_thread_fallbackÚ_NetErrÚ_BadReqrß  rŽ  rŽ  Úretried_thread_not_foundr¼  r½  r¾  r¿  rÀ  rÁ  rÂ  Úeffective_thread_idrÝ  Ú_send_attemptÚmd_errorÚplain_chunkrC  r9  Úsafe_send_errorÚis_pool_timeoutrT   rÒ  rN  rå  rÞ  rš  Ú_torà  rá  s+                                              r   ÚsendzTelegramAdapter.send°  sS  è è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCõ �4Ð.°Ñ6Ô6ð 	YÝ eÐ3GÐSWÐXÑXÔXÐXð ð 	=˜gŸmšm™oœoð 	=Ý d°tÐ<Ñ<Ô<Ð<ðr	ð ×(Ò(¨¸8Ð(ÑDÔDð 'Ø$(×$7Ò$7¸ÀÈ(ÐT\Ñ$]Ô$]Ð]Ð]Ð]Ð]Ð]Ð]�ØÐ*Ø"Ô*ð %ð !) ¨B×3Ò3°HÑ=Ô=ð %ð%Ø&*×&6Ò&6°wÈÐ&6Ñ&RÔ&RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RøÝ#,ð %ð %ð %Ø $ ð%øøøà&Ð&ð ×+Ò+¨GÑ4Ô4ˆIØ×*Ò*Ø˜4Ô2½9ð +ñ ô ˆFõ �6‰{Œ{˜QŠˆðð ð "(ð	ñ ô �ð ˆKØ×0Ò0°Ñ:Ô:ˆIØ"&×"BÒ"BÀ9Ñ"MÔ"MÐØ#(Ð ð"ØBÐBÐBÐBÐBÐBÐBøÝð "ð "ð "Ý!���ð"øøøðØ@Ð@Ð@Ð@Ð@Ð@Ð@øÝð ð ð Ø���ðøøøð!Ø@Ð@Ð@Ð@Ð@Ð@Ð@øÝ¥Ð0ð !ð !ð !Ø �	�	�	ð!øøøõ & fÑ-Ô-ð @8ñ @8‘��5Ø+0Ð(Ø$(×$FÒ$FÀxÑ$PÔ$PÐ!Ø(,×(FÒ(FÀwÐPYÐ[cÑ(dÔ(dÐ%ð *ð \ØÔ+¨uÒ4ð\å˜XÐZ¨(¯,ª,Ð7YÑ*ZÔ*ZÑ[Ô[ð &ð
 #+ð #Ø.CÐoÐHYÐHe•CÐ)Ñ*Ô*Ð*Ðkoð  ð )ð Rà'¨tÐ3ð 9Ø Ô/°5Ò8ð "�Mð
 %)×$=Ò$=¸oÈqÑ$QÔ$Q�MØ6CÐaÈÐa�c /Ñ2Ô2Ð2Ð]a�Ø(ð ¨[Ð-@ÐI^Ð-@Ý%Ø %Ø"×AÒAÑCÔCØ"'ðñ ô ð ð ð ð
 !%× <Ò <ØØØØ(3Ø"&Ô"5ð !=ñ !ô !�ð (ð >¨M×,=Ò,=Ð>QÑ,RÔ,RÐ,^Ý$(¨Ñ$7Ô$7�MØ9=�MÐ"5Ñ6Ø&3×&7Ò&7Ð8KÑ&LÔ&LÐ#à�Ý%*¨1¡X¤Xð Sñ S�MðRð&Ø(>¨¬	Ô(>ð )Ý(BÀ7Ñ(KÔ(KØ%*Ý+4Ô+@Ø4?ð	)ð )ð
 #0ð)ð #'×";Ò";Ñ"=Ô"=ð)ð #'×";Ò";¸HÑ"EÔ"Eð)ð )ð #ð #ð #ð #ð #ð #˜C˜Cøõ  )ð &ð &ð &à&­#¨h©-¬-×*=Ò*=Ñ*?Ô*?Ð?Ð?À:ÕQTÐU]ÑQ^ÔQ^×QdÒQdÑQfÔQfÐCfÐCfÝ &§¢Ð/mÐosÔoxð  {Cñ  !Dô  !Dð  !DÝ.9¸%Ñ.@Ô.@ Ø,B¨D¬IÔ,Bð -"Ý,FÀwÑ,OÔ,OØ)4Ø/3Ø8Cð	-"ð -"ð
 '4ð-"ð '+×&?Ò&?Ñ&AÔ&Að-"ð '+×&?Ò&?ÀÑ&IÔ&Ið-"ð -"ð '"ð '"ð '"ð '"ð '"ð '"  ð !&ð !$    øøøøð&øøøð  ™øØ"ð e"ñ e"ð e"ð
 #ñ G"¥z°(¸GÑ'DÔ'Dñ G"Ø#×>Ò>¸xÑHÔHð $)ÐM`ÐMlØ#8ð !&¸Xð !&È(Ï,Ê,ÐW{ÑJ|ÔJ|ð !&Ý+5Ø05Ý.1°(©m¬mØ27ð,&ñ ,&ô ,&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð (@ð !-Ø?CÐ$<Ý$*§N¢NØ(eØ(,¬	Ð3Fñ%&ô %&ð %&ð %- H H H¡Hõ !'§¢Ø$bØ$(¤IÐ/Bñ!"ô !"ð !"ð !%× BÒ BØ$+Ð-@ñ!"ô !"ð !"ð 8<Ð 4Ø6:Ð 3Ø1DÀdÐ0K Ø (   ¡Ý(+¨H©¬×(;Ò(;Ñ(=Ô(=˜IØ@ÀIÐMÐMÐR]ÐRiØ#8ð !&Ý6QÐRZÑ6[Ô6[ OÝ+5Ø05Ø.=Ø27ð,&ñ ,&ô ,&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð %&ð %&õ 3NÈhÑ2WÔ2W Ý &§¢Ø$^Ø$(¤I¨ñ!"ô !"ð !"ð /3 Ø#+ð !a°·²Ð=_Ñ0`Ô0`ð !aØ46 MØ:>Ð$7Ð$7à48×4PÒ4PØ(/Ø(1Ø(0Ø<GØ6:Ô6Ið 5Qñ 5&ô 5& Mð ;H×:KÒ:KÐL_Ñ:`Ô:`Ð$7Ø (   ¡à!ð +/×*GÒ*GÈÑ*QÔ*Q˜à%ð"å *¨8°YÑ ?Ô ?ð"ð %)×$DÒ$DÀXÑ$NÔ$Nð"ð %4ð	"ð "Ø*ð WØ"&×"TÒ"TÑ"VÔ"VÐVÐVÐVÐVÐVÐVÐVØ(¨1Ò,Ð,Ø#$¨Ñ#5˜DÝ.IÈ(Ñ.SÔ.S˜OÝ"ŸNšNÐ+kØ+/¬9°mÀaÑ6GÈÈñ`ô `ð `å")¤-°Ñ"5Ô"5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5à!ð 6Ð5Ð5Ð5Ñ5øøøøõ %ð ð ð Ý&-¨h¸ÀtÑ&LÔ&L˜Ø&Ð2°mÅsÈ8Á}Ä}×GZÒGZÑG\ÔG\Ð6\Ð6\Ø,¨qÒ0Ð0Ø=HÐ=T¥u¨[Ñ'9Ô'9Ð'9ÐZ] Ý2MÈhÑ2WÔ2W Ý &§¢Ø$oØ$(¤IØ$1°AÑ$5Ø$(Ø$3ñ!"ô !"ð !"õ '.¤m°DÑ&9Ô&9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø (   ¡Øøøøøðøøøð  ×"Ò"¥3 s¤~Ñ#6Ô#6Ñ7Ô7Ð7Ñ7ð �N ×'Ò'¨Ñ1Ô1ð ðØ×*Ò*¨7¸XÐ*ÑFÔFÐFÐFÐFÐFÐFÐFÐFÐFøÝ ð ð ð Ø�Dðøøøõ ØØ-8ÐB˜; qœ>˜>¸dà#.Ø+>Ø';ðð ðñ ô ð øõ ð 	ñ 	ð 	Ý4°QÑ7Ô7ˆJÝ�LŠLÐCÀTÄYÐPZÑ[Ô[Ð[Ý˜!‘f”f—l’l‘n”nˆGÝ,¨QÑ/Ô/ˆJð " WÐ,Ð,°
¸gÐ0EÐ0EÝ—’Ø\Ø”Iñô ð õ "¨%Ð7IÐV`ÐaÑaÔaÐaÐaÐaÐaÐaÐaõ ‘(”(—,’,˜{Ñ+Ô+ˆCØÐ4¥*¨Q°Ñ"4Ô"4ÐO¸ÈÐ9OˆJØ!%×!AÒ!AÀ!Ñ!DÔ!DÐØ"×;Ò;¸AÑ>Ô>ˆOÝØØ Ø-ÐR°ÐRÈ
ÀNØ%ð	ñ ô ð ð ð ð ð ð øøøøð-	øøøs¦  Á&A`: Â<C Ã`: Ã
C'Ã$`: Ã&C'Ã'`: Ã,B`: Å1E8 Å7`: Å8FÆ	`: ÆFÆ`: ÆF Æ`: ÆF&Æ#`: Æ%F&Æ&`: Æ*F1 Æ0`: Æ1GÇ`: ÇGÇC6`: Ê>A3`: Ì3ANÎQ6Î
Q0ÎCQ+Ñ&Q6Ñ+Q0Ñ0Q6Ñ3`: Ñ6^(Ñ<A"[1Ó^(Ó`: Ó(%[1Ô`: Ô?[1Õ`: ÕA	[1Ö!^(Ö"`: Ö+B[1Ø-`: Ø3B8[1Û+`: Û1^(Û>B^#Þ`: Þ"^#Þ#^(Þ(A`: ß,`
 à	`: à

`à`: à`à"`: à:e'áBe"ãe'ã$A8e"åe'å"e'rŠ  Ú
status_keyc             ƒ   óÜ  K  — t          |¦  «        t          |¦  «        f}| j                             |¦  «        }|�g|                      |||d|¬¦  «        ƒ d{V —†}|j        r%|j        rt          |j        ¦  «        | j        |<   |S | j                             |d¦  «         |                      |||¬¦  «        ƒ d{V —†}|j        r#|j        rt          |j        ¦  «        | j        |<   |S )aú  Send a status message, or edit the previous one with the same key.

        Issue #30045: progress/status callbacks (context-pressure, lifecycle,
        compression, etc.) used to append a fresh bubble on every call. With
        this method, the first call sends and the message id is remembered;
        subsequent calls with the same (chat_id, status_key) edit that same
        message in place. If the edit fails (message deleted, too old, etc.)
        we drop the cached id and send fresh.
        NT©Úfinalizer¦  rŠ  )r   r”  r‡  Úedit_messagerÓ  rË  rB  r°  )r5  rK  r±  r~  r¦  rç  Ú	cached_idrg   s           r   Úsend_or_update_statusz%TelegramAdapter.send_or_update_status÷  s'  è è € õ" �7‰|Œ|�S ™_œ_Ð-ˆØÔ,×0Ò0°Ñ5Ô5ˆ	ØÐ Ø×,Ò,Ø˜ G°dÀXð -ñ ô ð ð ð ð ð ð ˆFð Œ~ð ØÔ$ð KÝ47¸Ô8IÑ4JÔ4J�DÔ,¨SÑ1Ø�àÔ$×(Ò(¨¨dÑ3Ô3Ð3Ø—y’y ¨'¸H�yÑEÔEÐEÐEÐEÐEÐEÐEˆØŒ>ð 	C˜fÔ/ð 	CÝ,/°Ô0AÑ,BÔ,BˆDÔ$ SÑ)Øˆr>   r³  r´  c             ƒ   ó  ‡K  — | j         st          dd¬¦  «        S |r8|                      |¦  «        r#|                      ||||¬¦  «        ƒ d{V —†}|�|S t	          |¦  «        t	          |¦  «        f}d}|r| j                             |d¦  «         t          |¦  «        | j        k    ri|r |  	                    |||||¬¦  «        ƒ d{V —†S |  
                    |¦  «        }d}| j                             |¦  «        |k    rt          d|¬¦  «        S n|s| j                             |d¦  «         	 |sZ| j                              t          |¦  «        t          |¦  «        |¬	¦  «        ƒ d{V —† |r
|| j        |<   t          d|¬¦  «        S |                      |¦  «        }		 | j                              t          |¦  «        t          |¦  «        |	t           j        ¬
¦  «        ƒ d{V —† nÐ# t$          $ rÃ}
dt	          |
¦  «                             ¦   «         v rt          d|¬¦  «        cY d}
~
S t)          |
¦  «        }t*                               d| j        |¦  «         |rt1          |¦  «        n|}| j                              t          |¦  «        t          |¦  «        |¬	¦  «        ƒ d{V —† Y d}
~
nd}
~
ww xY wt          d|¬¦  «        S # t$          $ �r/}t	          |¦  «                             ¦   «         Šd‰v rt          d|¬¦  «        cY d}~S d‰v sd‰v �rt*                               d| j        t          |¦  «        | j        ¦  «         |r%|  	                    |||||¬¦  «        ƒ d{V —†cY d}~S |  
                    |¦  «        }| j                             |¦  «        |k    rt          d|¬¦  «        cY d}~S | j                              t          |¦  «        t          |¦  «        |¬	¦  «        ƒ d{V —† || j        |<   t          d|¬¦  «        cY d}~S t5          |dd¦  «        }|€d‰v �r|r|nd}t*                               d| j        |¦  «         |dk    r't          dd|› �t7          |¦  «        ¬¦  «        cY d}~S t9          j        |¦  «        ƒ d{V —† 	 | j                              t          |¦  «        t          |¦  «        |¬	¦  «        ƒ d{V —† t          d|¬¦  «        cY d}~S # t$          $ rP}t)          |¦  «        }t*                               d| j        |¦  «         t          d|¬¦  «        cY d}~cY d}~S d}~ww xY wd}t?          ˆfd„|D ¦   «         ¦  «        }|rHt)          |¦  «        }t*                               d| j        ||¦  «         t          d|d¬¦  «        cY d}~S t)          |¦  «        }t*                               d| j        ||¦  «         t          d|¬¦  «        cY d}~S d}~ww xY w)a"  Edit a previously sent Telegram message.

        Telegram caps single-message text at 4096 UTF-16 codeunits.  Streaming
        replies that grow past this limit must NOT be silently truncated and
        must NOT return failure (the consumer would re-send and create a
        duplicate).  Instead this method split-and-delivers: edit the
        existing message with the first chunk and send the rest as
        continuation messages, returning the final chunk's id so subsequent
        edits target the most recent visible message.
        Fr‡  rˆ  rŠ  Nr³  TrÖ  ©rK  rË  r   ©rK  rË  r   r�  rê  z;[%s] MarkdownV2 edit failed, falling back to plain text: %sr—  r˜  z6[%s] edit_message overflow (%d UTF-16 > %d), splittingrÒ  r’  r?  z*[%s] Telegram flood control, waiting %.1fsr+   zflood_control:)rÓ  r   rÒ  z+[%s] Edit retry failed after flood wait: %s)Úconnecterrorzconnect errorzconnection errorrV  znetwork errorrÑ  ÚreadtimeoutÚwritetimeoutzserver disconnectedztemporarily unavailableztemporary failurer;  c              3   ó    •K  — | ]}|‰v V — Œ	d S r7   rŠ   )rM  r  rÞ  s     €r   rè  z/TelegramAdapter.edit_message.<locals>.<genexpr>Õ  s'   øè è € ÐIÐI°  W ÐIÐIÐIÐIÐIÐIr>   z@[%s] Transient network error editing message %s (will retry): %srë  z+[%s] Failed to edit Telegram message %s: %s) rW  r”   rž  rì  r   r•  rB  rŸ   rž  Ú_edit_overflow_splitÚ!_truncate_stream_overflow_previewr‡  Úedit_message_textr    r²   rœ  r€   r   r   rÇ   r   r(   r0   r   r  r)   rl   r´   r&   ra  r   ré  )r5  rK  rË  r~  r´  r¦  r¢  Ú_preview_keyÚ_saturated_previewr£  Úfmt_errÚsafe_format_errorÚ_plainrN  Ú	truncatedrÒ  rT   rj  rk  Ú_transient_markersÚ_is_transientrå  rÞ  s                         @r   rµ  zTelegramAdapter.edit_message  sx  øè è € ð& Œyð 	DÝ e°?ÐCÑCÔCÐCð ð 	#˜×+Ò+¨GÑ4Ô4ð 	#Ø $× 3Ò 3Ø˜ W°xð !4ñ !ô !ð ð ð ð ð ð ˆKð Ð&Ø"Ð"õ ˜G™œ¥c¨*¡o¤oÐ6ˆØ"ÐØð 	@ð Ô'×+Ò+¨L¸$Ñ?Ô?Ð?Ý�WÑÔ Ô 7Ò7Ð7Øð Ø!×6Ò6Ø˜Z¨¸8Èhð 7ñ ô ð ð ð ð ð ð ð ð ×<Ò<¸WÑEÔEˆGØ!%Ðð Ô*×.Ò.¨|Ñ<Ô<ÀÒGÐGÝ!¨$¸:ÐFÑFÔFÐFð Hàð 	@ð Ô'×+Ò+¨L¸$Ñ?Ô?Ð?ðD	?Øð GØ”i×1Ò1Ý6°wÑ?Ô?Ý" :™œØ ð 2ñ ô ð ð ð ð ð ð ð ð
 &ð HØ@G�DÔ/°Ñ=Ý!¨$¸:ÐFÑFÔFÐFà×+Ò+¨GÑ4Ô4ˆIðØ”i×1Ò1Ý6°wÑ?Ô?Ý" :™œØ"Ý(Ô4ð	 2ñ ô ð ð ð ð ð ð ð ð øõ ð ð ð à!¥S¨¡\¤\×%7Ò%7Ñ%9Ô%9Ð9Ð9Ý%¨d¸zÐJÑJÔJÐJÐJÐJÐJÐJÐJå$?ÀÑ$HÔ$HÐ!Ý—’ØQØ”IØ%ñô ð ð
 29ÐE� WÑ-Ô-Ð-¸g�Ø”i×1Ò1Ý6°wÑ?Ô?Ý" :™œØð 2ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øøøøðøøøõ"  d°zÐBÑBÔBÐBøÝð _	?ñ _	?ð _	?Ý˜!‘f”f—l’l‘n”nˆGà Ð(Ð(Ý!¨$¸:ÐFÑFÔFÐFÐFÐFÐFÐFÐFð " WÐ,Ð,°
¸gÐ0EÑ0EÝ—’ØLØ”I�y¨Ñ1Ô1°4Ô3Jñô ð ð ð Ø!%×!:Ò!:Ø ¨W¸xÐRZð ";ñ "ô "ð ð ð ð ð ð ð ð ð ð ð ð ð !×BÒBÀ7ÑKÔK�	ØÔ.×2Ò2°<Ñ@Ô@ÀIÒMÐMå%¨d¸zÐJÑJÔJÐJÐJÐJÐJÐJÐJØ”i×1Ò1Ý6°wÑ?Ô?Ý" :™œØ"ð 2ñ ô ð ð ð ð ð ð ð ð
 =F�Ô+¨LÑ9Ý!¨$¸:ÐFÑFÔFÐFÐFÐFÐFÐFÐFõ " ! ]°DÑ9Ô9ˆKØÐ&¨-¸7Ð*BÑ*BØ&1Ð:�{�{°s�Ý—’Ø@Ø”I˜tñô ð ð ˜#’:�:Ý%Ø %Ø5¨tÐ5Ð5Ý$)¨$¡K¤Kðñ ô ð ð ð ð ð ð õ
 ”m DÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ðMØœ)×5Ò5Ý :¸7Ñ CÔ CÝ#& z¡?¤?Ø$ð 6ñ ô ð ð ð ð ð ð ð õ
 &¨d¸zÐJÑJÔJÐJÐJÐJÐJÐJÐJøÝ ð Mð Mð MÝ'BÀ9Ñ'MÔ'MÐ$Ý—L’LØEØœ	Ð#3ñô ð õ &¨eÐ;KÐLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLøøøøðMøøøð"Ðõ  ÐIÐIÐIÐIÐ6HÐIÑIÔIÑIÔIˆMØð SÝ8¸Ñ;Ô;�
Ý—’ØVØ”IØØñ	ô ð õ "¨%°zÈTÐRÑRÔRÐRÐRÐRÐRÐRÐRÝ4°QÑ7Ô7ˆJÝ�LŠLØ=Ø”	ØØñ	ô ð õ  e°:Ð>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð_	?øøøsé   Ä2AK ÆK Æ$AG- Ç,K Ç-
J:Ç73J5È*J:È+K È0B J5Ê0K Ê5J:Ê:K ËXË5XÌXÌAXÍ2XÍ8AXÎ;XÏAXÐXÐA&XÒXÒ
XÒ%AS8Ó2XÓ8
UÔA UÕUÕXÕXÕUÕA$XÖ6XÖ<AX×=XØXc                 óR   — |                       || j        t          ¬¦  «        d         S )až  Return a one-message preview for oversized streaming edits.

        Streaming edits must keep targeting the original message. Splitting a
        mid-stream preview creates continuation messages and moves the active
        message id, so the next accumulated-token edit repeats the overflow
        cycle (#48648). Final edits still use ``_edit_overflow_split`` to
        deliver the complete response.
        r‹  r   )r�  rž  rŸ   r‚  s     r   rÀ  z1TelegramAdapter._truncate_stream_overflow_previewè  s7   € ð ×$Ò$ØØÔ#Ýð %ñ 
ô 
ð ô	ð 	r>   c             ƒ   óÖ  K  — |                       || j        t          ¬¦  «        }t          |¦  «        dk    r|g}|d         }	 |�rt	          |                      |¦  «        ¦  «        }	 | j                             t          |¦  «        t          |¦  «        |t          j        ¬¦  «        ƒ d{V —† nï# t          $ r¥}	dt          |	¦  «                             ¦   «         vrxt                               d| j        t%          |	¦  «        ¦  «         | j                             t          |¦  «        t          |¦  «        t'          |¦  «        ¬¦  «        ƒ d{V —† Y d}	~	nEd}	~	ww xY w| j                             t          |¦  «        t          |¦  «        |¬¦  «        ƒ d{V —† n�# t          $ rƒ}
t          |
¦  «                             ¦   «         }d|v rnSt                               d	| j        t%          |
¦  «        d
¬¦  «         t+          dt%          |
¦  «        ¬¦  «        cY d}
~
S Y d}
~
nd}
~
ww xY wg }|g}|}|                      |¦  «        }|dd…         D �]3}d}|rt          |¦  «        nd}|                      ||||¬¦  «        }|rdndD �]ù}	 |r#t	          |                      |¦  «        ¦  «        }n|rt'          |¦  «        n|} | j        j        d!t          |¦  «        ||rt          j        nd|dœ|¤|                      ¦   «         ¤|                      |¦  «        ¤Žƒ d{V —†} �n[# t          $ �rM}dt          |¦  «                             ¦   «         v rç|r|                     d¦  «        ri n|                      |||d¬¦  «        }	  | j        j        d!t          |¦  «        |rt'          |¦  «        n|dœ|¤|                      ¦   «         ¤|                      |¦  «        ¤Žƒ d{V —†}Y d}~ n’# t          $ r?}t                               d| j        t%          |¦  «        ¦  «         d}Y d}~Y d}~ nNd}~ww xY w|rY d}~�Œ½t                               d| j        t%          |¦  «        ¦  «         d}Y d}~ nd}~ww xY w|€³t                               d| j        dt          |¦  «        z   t          |¦  «        ¦  «         d                     d„ |D ¦   «         ¦  «        }t+          d|dd
d
dt          |¦  «        z   t          |¦  «        ||t;          |¦  «        dœt;          |¦  «        ¬¦  «        c S t          t=          |dd¦  «        ¦  «        p|}|                     |¦  «         |                     |¦  «         |}�Œ5|r|d         n|}t                                d| j        dt          |¦  «        z   |¦  «         t+          d
|t;          |¦  «        ¬ ¦  «        S )"uü  Split an oversized edit across the existing message + continuations.

        Edit the original ``message_id`` with chunk 1 (with the platform's
        usual ``(1/N)`` suffix preserved), then send the remaining chunks as
        new messages threaded as replies to the previous chunk so the user
        sees them grouped.  Returns ``SendResult(success=True,
        message_id=<last-chunk-id>, continuation_message_ids=(...))`` so the
        stream consumer can keep editing the most recent visible message
        and the gateway has full visibility into every message id we put on
        screen.

        Falls back to ``SendResult(success=False)`` only if even the first-
        chunk edit fails â€” that's a real adapter problem, not an overflow.
        r‹  r»   r   rº  Nrê  zW[%s] Overflow split: MarkdownV2 first-chunk edit failed, falling back to plain text: %sr¹  z0[%s] Overflow split: first-chunk edit failed: %sTr#   Frˆ  ©r  ©TF©Fr�  zreply message not foundr  )rK  r   z4[%s] Overflow continuation no-reply retry failed: %sz*[%s] Overflow continuation send failed: %sz6[%s] Overflow split: stopped at %d/%d chunks deliveredr   c              3   óB   K  — | ]}t          j        d d|¦  «        V — ŒdS )z \(\d+/\d+\)$r   Nrÿ   )rM  Ú	delivereds     r   rè  z7TelegramAdapter._edit_overflow_split.<locals>.<genexpr>ž  sE   è è € ð +ð +à!õ ”FÐ+¨R°Ñ;Ô;ð+ð +ð +ð +ð +ð +r>   Úoverflow_continuation_failed)Úpartial_overflowÚdelivered_chunksÚtotal_chunksÚlast_message_idÚdelivered_prefixÚcontinuation_message_ids)rÓ  rË  r   rŸ  r–  r×  rË  éÿÿÿÿz3[%s] Overflow split delivered %d chunks; last_id=%s)rÓ  rË  r×  rŠ   )!r�  rž  rŸ   r€  r  rœ  rW  rÁ  r    r²   r€   r   r   r   rÇ   r(   r0   r   r   r  r   r”   r  r  rÓ  r}  rª  r‡  r  Útuplerl   r  r)   )r5  rK  rË  r~  r´  r¦  r¤  Úfirst_chunkr£  rÄ  rN  rÞ  Úcontinuation_idsrÓ  Úprev_idr­  rŽ  Úsent_msgrÁ  rÂ  Úuse_markdownr   rC  Úretry_thread_kwargsÚ
_retry_errrÖ  Únew_idÚlast_ids                               r   r¿  z$TelegramAdapter._edit_overflow_split÷  sÏ  è è € ð. ×&Ò&Ø�TÔ,µYð 'ñ 
ô 
ˆõ ˆv‰;Œ;˜!ÒÐð �YˆFð ˜Q”iˆð+	WØñ õ AØ×'Ò'¨Ñ4Ô4ñô �	ðØœ)×5Ò5Ý :¸7Ñ CÔ CÝ#& z¡?¤?Ø&Ý#,Ô#8ð	 6ñ ô ð ð ð ð ð ð ð ð øõ !ð ð ð Ø%­S°©\¬\×-?Ò-?Ñ-AÔ-AÐAÐAÝŸšðEà œIÕ'BÀ7Ñ'KÔ'Kñô ð ð
 #œi×9Ò9Ý$>¸wÑ$GÔ$GÝ'*¨:¡¤Ý!,¨[Ñ!9Ô!9ð :ñ ô ð ð ð ð ð ð ð øøøøøøøøøðøøøð ”i×1Ò1Ý6°wÑ?Ô?Ý" :™œØ$ð 2ñ ô ð ð ð ð ð ð ð øøõ
 ð 	Wð 	Wð 	WÝ˜!‘f”f—l’l‘n”nˆGØ Ð(Ð(ð å—’ØFØ”IÕ:¸1Ñ=Ô=Èð ñ ô ð õ "¨%Õ7RÐSTÑ7UÔ7UÐVÑVÔVÐVÐVÐVÐVÐVÐVð ����øøøøð	Wøøøð& ')ÐØ'˜=ÐØˆØ×,Ò,¨XÑ6Ô6ˆ	Ø˜A˜B˜B”Zð e	ñ e	ˆEØˆHØ*1Ð;�#˜g™,œ,˜,°tˆKØ ×8Ò8ØØØØ$/ð	 9ñ ô ˆMð 2:Ð G  ¸xð :ñ :�ð9Ø#ð 	IÝCØ ×/Ò/°Ñ6Ô6ñ ô  ˜˜ð 6>ÐH�{¨5Ñ1Ô1Ð1À5˜Ø%; T¤YÔ%;ð &Ý :¸7Ñ CÔ CØ!Ø<HÐ#R¥9Ô#8Ð#8ÈdØ,7ð	&ð &ð
 (ð&ð ×3Ò3Ñ5Ô5ð&ð ×3Ò3°HÑ=Ô=ð&ð &ð  ð  ð  ð  ð  ð  �Hð ‘EøÝ ð $ñ $ð $Ø0µC¸±M´M×4GÒ4GÑ4IÔ4IÐIÐIð  (ðØ,4¯LªLÐ9[Ñ,\Ô,\ð˜B˜Bà!%×!=Ò!=Ø '¨°HÐRVð ">ñ "ô "ð ,ð"Ø-C¨T¬YÔ-Cð .Ý(BÀ7Ñ(KÔ(KØ;CÐ%N¥[°Ñ%7Ô%7Ð%7Èð.ð .ð #6ð.ð #'×";Ò";Ñ"=Ô"=ð	.ð
 #'×";Ò";¸HÑ"EÔ"Eð.ð .ð (ð (ð (ð (ð (ð (˜Hð "˜E˜E˜E˜E˜EøÝ(ð "ð "ð "Ý"ŸNšNØ VØ $¤	Õ+FÀzÑ+RÔ+Rñô ð ð (,˜HØ!˜E˜E˜E˜E˜E˜E˜E˜E˜Eøøøøð"øøøð $ð !à ˜˜˜™Ý—N’NØDØœ	Õ#>¸xÑ#HÔ#Hñô ð ð  $�HØ�E�E�E�E�EøøøøðI$øøøðJ Ðõ —’ØLØ”I˜q¥3Ð'7Ñ#8Ô#8Ñ8½#¸f¹+¼+ñô ð ð $&§7¢7ð +ð +à%5ð+ñ +ô +ñ $ô $Ð õ "Ø!Ø&Ø8Ø"à,0Ø,-µÐ4DÑ0EÔ0EÑ,EÝ(+¨F©¬Ø+2Ø,<Ý49Ð:JÑ4KÔ4Kð"ð "õ .3Ð3CÑ-DÔ-Dðñ ô ð ð ð õ � ¨<¸Ñ<Ô<Ñ=Ô=ÐHÀˆFØ×#Ò# FÑ+Ô+Ð+Ø×#Ò# EÑ*Ô*Ð*ØˆG‰Gà*:ÐJÐ" 2Ô&Ð&À
ˆÝ�ŠØAØŒI�q�3Ð/Ñ0Ô0Ñ0°'ñ	
ô 	
ð 	
õ ØØÝ%*Ð+;Ñ%<Ô%<ð
ñ 
ô 
ð 	
s‘   Á%F# Á*AB3 Â2F# Â3
E"Â=BEÅF# ÅE"Å"A F# Æ#
H0Æ-A3H+È H0È+H0ÊBL0Ì0RÌ;ARÎA"O9Ï9
Q	Ð0P=	Ð3RÐ=Q	ÑRÑ0RÒRc           	   ƒ   ó$  K  — | j         sdS 	 | j                              t          |¦  «        t          |¦  «        ¬¦  «        ƒ d{V —† dS # t          $ r:}t
                               d| j        |t          |¦  «        ¦  «         Y d}~dS d}~ww xY w)uÒ  Delete a previously sent Telegram message.

        Used by the stream consumer's fresh-final cleanup path (ported
        from openclaw/openclaw#72038) to remove long-lived preview
        messages after sending the completed reply as a fresh message.
        Telegram's Bot API ``deleteMessage`` works for bot-posted
        messages in the last 48 hours.  Failures are non-fatal â€” the
        caller leaves the preview in place and logs at debug level.
        F)rK  rË  NTz-[%s] Failed to delete Telegram message %s: %s)	rW  Údelete_messager    r²   r   r(   r)   r   r   ©r5  rK  rË  rN  s       r   rä  zTelegramAdapter.delete_messageÁ  sÍ   è è € ð Œyð 	Ø�5ð	Ø”)×*Ò*Ý2°7Ñ;Ô;Ý˜z™?œ?ð +ñ ô ð ð ð ð ð ð ð ð �4øÝð 	ð 	ð 	Ý�LŠLØ?Ø”	˜:Õ'BÀ1Ñ'EÔ'Eñô ð ð �5�5�5�5�5øøøøð	øøøs   �<A Á
BÁ/B
Â
Bc                 ó¶   — | j         rt          | j         d¦  «        sdS t          | dd¦  «        rt          | dd¦  «        sdS |pd                     ¦   «         dv S )u/  Telegram supports sendMessageDraft for private chats only.

        Bot API 9.5 (March 2026) opened ``sendMessageDraft`` to all bots
        unconditionally for private (DM) chats.  Groups, supergroups, and
        channels still rely on the edit-based path.

        We additionally require ``self._bot`` to expose ``send_message_draft``
        (added to python-telegram-bot in 22.6); older PTB installs gracefully
        fall back to the edit path even on DMs.

        When ``rich_messages`` is enabled but ``rich_drafts`` is not, decline
        drafts even on DMs.  Final delivery then uses ``sendRichMessage`` /
        rich ``editMessageText``, while the default draft path still renders
        MarkdownV2 (tables â†’ bullet lists).  That mismatch makes the streaming
        preview look unformatted/"crooked" and the finalized reply a second
        beautiful wiki-style bubble.  Prefer edit-in-place streaming so the
        same message upgrades via rich finalize.  Operators who want animated
        rich drafts opt in with ``rich_drafts: true``.
        Úsend_message_draftFr^  r_  r   >   r¶  r·  )rW  r%  rl   rÇ   )r5  r¬  r¦  s      r   Úsupports_draft_streamingz(TelegramAdapter.supports_draft_streamingÚ  st   € ð0 Œyð 	¥¨¬	Ð3GÑ HÔ Hð 	Ø�5å�DÐ2°EÑ:Ô:ð	å˜DÐ"8¸%Ñ@Ô@ð	ð �5Ø�˜R×&Ò&Ñ(Ô(Ð,=Ð=Ð=r>   c              ƒ   óP  K  — | j         st          dd¬¦  «        S |                      |¦  «        r/|                      ||||¦  «        ƒ d{V —†rt          dd¬¦  «        S t	          | j         d¦  «        st          dd¬¦  «        S t          |¦  «        | j        k    r|n'|                      || j        t          ¬	¦  «        d
         }|  	                    |¦  «        }dD �]7}t          |¦  «        t          |¦  «        |r|                      |¦  «        n|dœ}|rt          j        |d<   |�||d<   	  | j         j        di |¤Žƒ d{V —†}	|	rt          dd¬¦  «        c S t          dd¬¦  «        c S # t           $ r™}
|rJ|                      |
¦  «        r5t$                               d| j        ||t+          |
¦  «        ¦  «         Y d}
~
Œét$                               d| j        |||
¦  «         t          dt+          |
¦  «        ¬¦  «        cY d}
~
c S d}
~
ww xY wt          dd¬¦  «        S )uÇ  Stream a partial message via Telegram's native draft API.

        Uses ``sendRichMessageDraft`` (Bot API 10.1) with the raw markdown when
        rich messages are enabled and supported, otherwise the plain-text
        ``sendMessageDraft``. The Bot API animates the preview when the same
        ``draft_id`` is reused across consecutive calls in the same chat.  When
        the response finishes, the caller sends the final text via the normal
        ``send`` path; the draft preview clears naturally on the client
        (Telegram has no Bot API to "promote" a draft to a real message â€” the
        final ``sendMessage``/``sendRichMessage`` is what the user receives in
        their history).
        FÚnot_connectedrˆ  NTrÖ  rç  Úapi_unavailabler‹  r   rÍ  )rK  rï  r   r�  rÚ  Údraft_rejectedz[[%s] sendMessageDraft MarkdownV2 rejected, retrying as plain text (chat=%s draft_id=%s): %sz6[%s] sendMessageDraft failed (chat=%s draft_id=%s): %srŠ   )rW  r”   rî  ró  r%  r€  rž  r�  rŸ   r  r    r²   rœ  r€   r   rç  r   r1  r(   r)   r   r   )r5  rK  rï  r~  r¦  r   r­  rÞ  r  rò  rN  s              r   Ú
send_draftzTelegramAdapter.send_draftû  sÔ  è è € ð& Œyð 	DÝ e°?ÐCÑCÔCÐCð ×*Ò*¨7Ñ3Ô3ð 	AØ×.Ò.¨w¸À'È8ÑTÔTÐTÐTÐTÐTÐTÐTð Aå!¨$¸4Ð@Ñ@Ô@Ð@å�t”yÐ"6Ñ7Ô7ð 	FÝ eÐ3DÐEÑEÔEÐEõ ˜g™,œ,¨$Ô*AÒAÐAˆwˆwØ×!Ò! '¨4Ô+BÍ9Ð!ÑUÔUÐVWÔXð 	ð ×,Ò,¨XÑ6Ô6ˆ	ð *ð #	Wñ #	WˆLå5°gÑ>Ô>Ý ™MœMØ5AÐK˜×+Ò+¨DÑ1Ô1Ð1Àtð&ð &ˆFð
 ð =Ý'0Ô'<��|Ñ$ØÐ$Ø.7�Ð*Ñ+ðWØ7˜4œ9Ô7ÐAÐA¸&ÐAÐAÐAÐAÐAÐAÐAÐA�Øð Eõ &¨d¸tÐDÑDÔDÐDÐDÐDÝ!¨%Ð7GÐHÑHÔHÐHÐHÐHøÝð Wð Wð Wð  ð  D×$>Ò$>¸qÑ$AÔ$Að Ý—L’LðBàœ	 7¨HÕ6QÐRSÑ6TÔ6Tñô ð ð
 �H�H�H�HÝ—’ØLØ”I˜w¨°!ñô ð õ "¨%Õ7RÐSTÑ7UÔ7UÐVÑVÔVÐVÐVÐVÐVÐVÐVÐVÐVøøøøð#Wøøøõ&  %Ð/?Ð@Ñ@Ô@Ð@s,   Ä1*E1ÅE1Å1
HÅ;AHÇA HÈHÈHc              ‹   ó$  K  — | j         st          d¦  «        ‚|                     d¦  «        }	  | j         j        di |¤Žƒ d{V —†S # t          $ r¾}|�¶|                      |¦  «        r¡|                      |¦  «        rŒt                               d| j	        |¦  «         |  
                    |                     d¦  «        |¦  «         t          |¦  «        }|                     dd¦  «          | j         j        di |¤Žƒ d{V —†cY d}~S ‚ d}~ww xY w)aÓ  Send a Telegram message, retrying once without message_thread_id
        if Telegram returns 'Message thread not found'.

        Used for control-style sends (approval prompts, model picker,
        update prompts) that can carry a stale thread_id from a DM
        reply chain.  The streaming send loop has its own equivalent
        (PR #3390) at the body of ``send``; this helper applies the
        same retry pattern to the non-streaming control paths.
        r‡  rÚ  NzP[%s] Thread %s not found for control message, retrying without message_thread_idrK  rŠ   )rW  rQ  r‡  rÓ  r   r1  r   r(   r0   r   r)  rA  rB  )r5  r  rÚ  rC  rD  s        r   Ú"_send_message_with_thread_fallbackz2TelegramAdapter._send_message_with_thread_fallbackT  sh  è è € ð Œyð 	0Ý˜Ñ/Ô/Ð/à"ŸJšJÐ':Ñ;Ô;Ðð	Ø/˜œÔ/Ð9Ð9°&Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9øÝð 	ð 	ð 	à!Ð-Ø×.Ò.¨xÑ8Ô8ð .à×3Ò3°HÑ=Ô=ð .õ —’ØfØ”IØ%ñô ð ð ×2Ò2Ø—J’J˜yÑ)Ô)Ð+<ñô ð õ  $ F™|œ|�Ø× Ò Ð!4°dÑ;Ô;Ð;Ø3˜TœYÔ3ÐCÐC°lÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCØøøøøð+	øøøs$   ¯A Á
DÁB2D
ÄDÄ	D
Ä
Dr   rß   Úsession_keyc              ƒ   ó  K  — | j         st          dd¬¦  «        S 	 |rd|› d�nd}|                      d|› |› �¦  «        }t          t	          dd	¬
¦  «        t	          dd¬
¦  «        gg¦  «        }|                      |¦  «        }	|                      d|| j        ¬¦  «        }
 | j        dt          |¦  «        |t          j        ||
dœ|                      ||	||
| j        ¬¦  «        ¤|                      ¦   «         ¤Žƒ d{V —†}t          dt          |j        ¦  «        ¬¦  «        S # t           $ rV}t"                               d| j        t)          |¦  «        ¦  «         t          dt)          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)zÐSend an inline-keyboard update prompt (Yes / No buttons).

        Used by the gateway ``/update`` watcher when ``hermes update --gateway``
        needs user input (stash restore, config migration).
        Fr‡  rˆ  z (default: ú)r   u    âš• *Update needs your input:*

u   âœ“ Yeszupdate_prompt:y©Úcallback_datau   âœ— Nozupdate_prompt:nN©r9  ©rK  r   r�  Úreply_markupr  rº  TrÖ  z"[%s] send_update_prompt failed: %srŠ   )rW  r”   rœ  ru   rt   r  r  r[  rï  r    r€   r   r  r}  r   rË  r   r(   r0   r   r   )r5  rK  rß   r   rð  r¦  Údefault_hintr   Úkeyboardr­  rÁ  rÝ  rN  s                r   Úsend_update_promptz"TelegramAdapter.send_update_prompt{  s  è è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð	SØ7>ÐFÐ3¨Ð3Ð3Ð3Ð3ÀBˆLØ×&Ò&Ð'bÈFÐ'bÐT`Ð'bÐ'bÑcÔcˆDÝ+å(¨ÐBSÐTÑTÔTÝ(¨ÐARÐSÑSÔSðð-ñ ô ˆHð ×0Ò0°Ñ:Ô:ˆIØ×<Ò<¸TÀ8Ð[_Ô[nÐ<ÑoÔoˆKØ?˜Ô?ð Ý2°7Ñ;Ô;ØÝ$Ô0Ø%Ø$/ðð ð ×.Ò.ØØØØ(3Ø"&Ô"5ð /ñ ô ðð ×+Ò+Ñ-Ô-ðð ð ð ð ð ð ð ˆCõ  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	Sð 	Sð 	SÝ�NŠNÐ?ÀÄÕLgÐhiÑLjÔLjÑkÔkÐkÝ eÕ3NÈqÑ3QÔ3QÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs   œD	D& Ä&
FÄ0AFÅ;FÆFu)   âš ï¸� <b>Command Approval Required</b>

z<pre>z</pre>

zG

<b>Smart DENY:</b> owner override applies to this one operation only.éØ  r   c                 ó*   — t          j        |¦  «        S r7   )Ú_htmlÚescape)r5  r   s     r   Ú
_ea_escapezTelegramAdapter._ea_escape­  s   € ÝŒ|˜DÑ!Ô!Ð!r>   údangerous commandÚcommandÚdescriptionÚallow_permanentÚallow_sessionÚsmart_deniedc	           	   ƒ   óú  ‡K  — | j         st          dd¬¦  «        S 	 |                      |||¦  «        }	|                      |¦  «        }
ddl}t          | d¦  «        s|                     d¦  «        | _        t          | j        ¦  «        }t          dd	|› �¬
¦  «        gŠ|sR|rP‰ 
                    t          dd|› �¬
¦  «        ¦  «         |r'‰ 
                    t          dd|› �¬
¦  «        ¦  «         ‰ 
                    t          dd|› �¬
¦  «        ¦  «         ˆfd„t          dt          ‰¦  «        d¦  «        D ¦   «         }t          |¦  «        }t          |¦  «        |	t          j        |dœ|                      ¦   «         ¥}|                      d|| j        ¬¦  «        }||d<   |                     |                      ||
||| j        ¬¦  «        ¦  «          | j        di |¤Žƒ d{V —†}|| j        |<   t          dt1          |j        ¦  «        ¬¦  «        S # t4          $ rV}t6                               d| j        t=          |¦  «        ¦  «         t          dt=          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)uá   Send an inline-keyboard approval prompt with interactive buttons.

        The buttons call ``resolve_gateway_approval()`` to unblock the waiting
        agent thread â€” same mechanism as the text ``/approve`` flow.
        Fr‡  rˆ  r   NÚ_approval_counterr»   u   âœ… Allow Oncezea:once:ró  u   âœ… Sessionzea:session:u
   âœ… Alwaysz
ea:always:u   â�Œ Denyzea:deny:c                 ó*   •— g | ]}‰||d z   …         ‘ŒS ©r^  rŠ   ©rM  rŽ  Úbuttonss     €r   rì  z6TelegramAdapter.send_exec_approval.<locals>.<listcomp>Ü  s&   ø€ ÐHÐHÐH¨�G˜A˜a !™e˜GÔ$ÐHÐHÐHr>   r^  ©rK  r   r�  r÷  rõ  r  rº  TrÖ  z"[%s] send_exec_approval failed: %srŠ   )rW  r”   Ú_format_exec_approvalr  Ú	itertoolsr%  Úcountr  Únextrt   r  r‘  r€  ru   r    r€   ÚHTMLr}  r  r[  r×  r  rï  r�  r   rË  r   r(   r0   r   r   )r5  rK  r  rð  r  r¦  r  r  r  r   r­  r  Úapproval_idÚrowsrù  r  rÁ  rÝ  rN  r  s                      @r   Úsend_exec_approvalz"TelegramAdapter.send_exec_approval°  s  øè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð:	SØ×-Ò-¨g°{ÀLÑQÔQˆDð ×0Ò0°Ñ:Ô:ˆIð
 ÐÐÐÝ˜4Ð!4Ñ5Ô5ð <Ø)2¯ª¸Ñ);Ô);�Ô&Ý˜tÔ5Ñ6Ô6ˆKõ %Ð%5ÐE]ÐP[ÐE]ÐE]Ð^Ñ^Ô^ðˆGð  ð  Mð Ø—’Ý(¨ÐFaÐT_ÐFaÐFaÐbÑbÔbñô ð ð #ð Ø—N’NÝ,¨\ÐIcÐVaÐIcÐIcÐdÑdÔdñô ð ð �NŠNÕ/°
ÐJbÐU`ÐJbÐJbÐcÑcÔcÑdÔdÐdð IÐHÐHÐH­e°Aµs¸7±|´|ÀQÑ.GÔ.GÐHÑHÔHˆDÝ+¨DÑ1Ô1ˆHõ 6°gÑ>Ô>ØÝ'œnØ (ð	&ð &ð
 ×+Ò+Ñ-Ô-ð&ˆFð ×<Ò<¸TÀ8Ð[_Ô[nÐ<ÑoÔoˆKØ,7ˆFÐ(Ñ)Ø�MŠMØ×,Ò,ØØØØ(3Ø"&Ô"5ð -ñ ô ñô ð ð @˜Ô?ÐIÐIÀ&ÐIÐIÐIÐIÐIÐIÐIÐIˆCð 1<ˆDÔ  Ñ-å dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	Sð 	Sð 	SÝ�NŠNÐ?ÀÄÕLgÐhiÑLjÔLjÑkÔkÐkÝ eÕ3NÈqÑ3QÔ3QÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs   �G<H È
I:È$AI5É/I:É5I:rØ  Ú
confirm_idc           	   ƒ   óš  K  — | j         st          dd¬¦  «        S 	 |                      |                      |d¦  «        ¦  «        }t	          t          dd|› �¬¦  «        t          dd	|› �¬¦  «        gt          d
d|› �¬¦  «        gg¦  «        }|                      |¦  «        }	t          |¦  «        |t          j	        |dœ|  
                    ¦   «         ¥}
|                      d|| j        ¬¦  «        }||
d<   |
                     |                      ||	||| j        ¬¦  «        ¦  «          | j        di |
¤Žƒ d{V —†}|| j        |<   t          dt#          |j        ¦  «        ¬¦  «        S # t&          $ rV}t(                               d| j        t/          |¦  «        ¦  «         t          dt/          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)z8Render a three-button slash-command confirmation prompt.Fr‡  rˆ  rû  u   âœ… Approve Oncezsc:once:ró  u   ðŸ”’ Always Approvez
sc:always:u
   â�Œ Cancelz
sc:cancel:r  Nrõ  r  rº  TrÖ  z"[%s] send_slash_confirm failed: %srŠ   )rW  r”   rœ  Ú_truncate_previewru   rt   r  r    r€   r   r}  r  r[  r×  r  rï  r‘  r   rË  r   r(   r0   r   r   )r5  rK  rØ  rž  rð  r  r¦  Úpreviewrù  r­  r  rÁ  rÝ  rN  s                 r   Úsend_slash_confirmz"TelegramAdapter.send_slash_confirmü  s@  è è € ð
 Œyð 	DÝ e°?ÐCÑCÔCÐCð&	SØ×)Ò)¨$×*@Ò*@ÀÈ$Ñ*OÔ*OÑPÔPˆGå+å(Ð);ÐKbÐV`ÐKbÐKbÐcÑcÔcÝ(Ð)>ÐNgÐ[eÐNgÐNgÐhÑhÔhðõ
 )¨ÐE^ÐR\ÐE^ÐE^Ð_Ñ_Ô_ðð-ñ ô ˆHð ×0Ò0°Ñ:Ô:ˆIå5°gÑ>Ô>ØÝ'Ô3Ø (ð	&ð &ð
 ×+Ò+Ñ-Ô-ð&ˆFð ×<Ò<¸TÀ8Ð[_Ô[nÐ<ÑoÔoˆKØ,7ˆFÐ(Ñ)Ø�MŠMØ×,Ò,ØØØØ(3Ø"&Ô"5ð -ñ ô ñô ð ð @˜Ô?ÐIÐIÀ&ÐIÐIÐIÐIÐIÐIÐIÐIˆCØ4?ˆDÔ% jÑ1Ý dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	Sð 	Sð 	SÝ�NŠNÐ?ÀÄÕLgÐhiÑLjÔLjÑkÔkÐkÝ eÕ3NÈqÑ3QÔ3QÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs   œEE* Å*
G
Å4AGÆ?G
ÇG
ÚquestionÚchoicesÚ
clarify_idc           
   ƒ   ód  K  — | j         st          dd¬¦  «        S 	 dt          j        |¦  «        › �}|                      |¦  «        }|r4d                     d„ t          |¦  «        D ¦   «         ¦  «        }	|d|	› �z  }t          |¦  «        |t          j	        dœ|  
                    ¦   «         ¥}
|r—g }t          t          |¦  «        ¦  «        D ]=}|                     t          t          |d	z   ¦  «        d
|› d|› �¬¦  «        g¦  «         Œ>|                     t          dd
|› d�¬¦  «        g¦  «         t!          |¦  «        |
d<   |                      d|¦  «        }||
d<   |
                     |                      ||||¬¦  «        ¦  «          | j        di |
¤Žƒ d{V —†}|| j        |<   t          dt          |j        ¦  «        ¬¦  «        S # t.          $ rV}t0                               d| j        t7          |¦  «        ¦  «         t          dt7          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)u$  Render a clarify prompt with one inline button per choice.

        Multi-choice mode (``choices`` non-empty): renders one button per
        option plus a final "âœ�ï¸� Other (type answer)" button.  Picking the
        "Other" button flips the entry into text-capture mode so the next
        message becomes the response.

        Open-ended mode (``choices`` empty): renders the question as plain
        text â€” no buttons.  The next message in the session is captured by
        the gateway's text-intercept and resolves the clarify.
        Fr‡  rˆ  õ   â�“ r
  c              3   ón   K  — | ]0\  }}|d z   › dt          j        t          |¦  «        ¦  «        › �V — Œ1dS )r»   z. N)rý  rþ  r   )rM  rŽ  Úcs      r   rè  z/TelegramAdapter.send_clarify.<locals>.<genexpr>L  s\   è è € ð )ð )á˜˜1ð ˜1‘uÐ6Ð6¥¤­S°©V¬VÑ 4Ô 4Ð6Ð6ð)ð )ð )ð )ð )ð )r>   ú

©rK  r   r�  r»   úcl:r«  ró  u   âœ�ï¸� Other (type answer)z:otherr÷  Nr  rÌ  TrÖ  z[%s] send_clarify failed: %srŠ   )rW  r”   rý  rþ  r  r  rŸ  r    r€   r  r}  r‘  r€  r  rt   r   ru   r  r×  r  rï  r’  rË  r   r(   r0   r   r   )r5  rK  r  r  r  rð  r¦  r   r­  Úoption_linesr  r  ÚidxrÁ  rÝ  rN  s                   r   Úsend_clarifyzTelegramAdapter.send_clarify,  sÚ  è è € ð( Œyð 	DÝ e°?ÐCÑCÔCÐCð9	SØ2�%œ, xÑ0Ô0Ð2Ð2ˆDØ×0Ò0°Ñ:Ô:ˆIàð 	.ð
  $Ÿyšyð )ð )å )¨'Ñ 2Ô 2ð)ñ )ô )ñ  ô  �ð Ð-˜|Ð-Ð-Ñ-�õ 6°gÑ>Ô>ØÝ'œnð&ð &ð ×+Ò+Ñ-Ô-ð	&ˆFð ð Dð �Ý ¥ W¡¤Ñ.Ô.ð ð �CØ—K’KÝ,Ý  a¡™LœLØ*B°
Ð*BÐ*B¸SÐ*BÐ*Bðñ ô ð!ñ ô ð ð ð —’Ý(Ø4Ø&>¨JÐ&>Ð&>Ð&>ðñ ô ðñ ô ð õ *>¸dÑ)CÔ)C��~Ñ&à×<Ò<¸TÀ8ÑLÔLˆKØ,7ˆFÐ(Ñ)Ø�MŠMØ×,Ò,ØØØØ(3ð	 -ñ ô ñô ð ð @˜Ô?ÐIÐIÀ&ÐIÐIÐIÐIÐIÐIÐIÐIˆCØ.9ˆDÔ 
Ñ+Ý dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	Sð 	Sð 	SÝ�NŠNÐ9¸4¼9ÕFaÐbcÑFdÔFdÑeÔeÐeÝ eÕ3NÈqÑ3QÔ3QÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs   œF2G Ç
H/ÇAH*È$H/È*H/Ú	providersÚcurrent_modelÚcurrent_providerc              ƒ   óx  K  — | j         st          dd¬¦  «        S 	 ddlm} n# t          $ r d„ }Y nw xY w	 |                      |d¦  «        \  }	}
 ||¦  «        }|                      d|pd› d	|› d
|
› �¦  «        }|r|                     d¦  «        nd}|                      d|| j	        ¬¦  «        } | j
        dt          |¦  «        |t          j        |	|dœ|                      ||||| j	        ¬¦  «        ¤|                      ¦   «         ¤Žƒ d{V —†}|j        |||||ddœ| j        t%          |¦  «        <   t          dt%          |j        ¦  «        ¬¦  «        S # t&          $ rV}t(                               d| j        t/          |¦  «        ¦  «         t          dt/          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)u¿   Send an interactive inline-keyboard model picker.

        Two-step drill-down: provider selection â†’ model selection.
        Edits the same message in-place as the user navigates.
        Fr‡  rˆ  r   ©Ú	get_labelc                 ó   — | S r7   rŠ   ©Úslugs    r   r,  z4TelegramAdapter.send_model_picker.<locals>.get_label“  ó   € Ø�r>   õ+   âš™ *Model Configuration*

Current model: `Úunknownú`
Provider: ú

Select a provider:r­  Nrõ  rö  rº  )Úmsg_idr'  rð  Úon_model_selectedr(  r)  Úprovider_pageTrÖ  z![%s] send_model_picker failed: %srŠ   )rW  r”   Úhermes_cli.providersr,  râ   Ú_build_provider_keyboardrœ  r‡  r  r[  rï  r    r€   r   r  r}  rË  rŽ  r   r   r(   r0   r   r   )r5  rK  r'  r(  r)  rð  r6  r¦  r,  rù  Úprovider_page_infoÚprovider_labelr   r­  rÁ  rÝ  rN  s                    r   Úsend_model_pickerz!TelegramAdapter.send_model_picker~  s‰  è è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð	Ø6Ð6Ð6Ð6Ð6Ð6Ð6øÝð 	ð 	ð 	ðð ð ð ð ð	øøøð.	Sà+/×+HÒ+HÈÐTUÑ+VÔ+VÑ(ˆHÐ(à&˜YÐ'7Ñ8Ô8ˆNØ×&Ò&ð>Ø'4Ð'A¸	ð>ð >à!/ð>ð >ð *<ð>ð >ñô ˆDð 6>ÐG˜Ÿš [Ñ1Ô1Ð1À4ˆIØ×<Ò<¸TÀ8Ð[_Ô[nÐ<ÑoÔoˆKØ?˜Ô?ð Ý2°7Ñ;Ô;ØÝ$Ô0Ø%Ø$/ðð ð ×.Ò.ØØØØ(3Ø"&Ô"5ð /ñ ô ðð ×+Ò+Ñ-Ô-ðð ð ð ð ð ð ð ˆCð$ œ.Ø&Ø*Ø%6Ø!.Ø$4Ø!"ð6ð 6ˆDÔ$¥S¨¡\¤\Ñ2õ  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	Sð 	Sð 	SÝ�NŠNÐ>ÀÄ	ÕKfÐghÑKiÔKiÑjÔjÐjÝ eÕ3NÈqÑ3QÔ3QÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs+   œ# £3²3·D!E Å
F9Å#AF4Æ.F9Æ4F9r[  c              ƒ   ó’  ‡K  — | j         st          dd¬¦  «        S 	 g Št          |¦  «        D ]\  }}t          |                     d¦  «        p|                     d¦  «        pd¦  «        }	|                     d¦  «        rd|	› �}	‰                     t          |	d	|› �¬
¦  «        ¦  «         Œ€‰st          dd¬¦  «        S t          ˆfd„t          dt          ‰¦  «        d¦  «        D ¦   «         ¦  «        }
|r|                     d¦  «        nd}|  
                    d|| j        ¬¦  «        } | j        dt          |¦  «        |                      |¦  «        t          j        |
|dœ|                      ||||| j        ¬¦  «        ¤|                      ¦   «         ¤Žƒ d{V —†}|j        |||dœ| j        t          |¦  «        <   t          dt          |j        ¦  «        ¬¦  «        S # t*          $ rV}t,                               d| j        t3          |¦  «        ¦  «         t          dt3          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)u)  Send a flat inline-keyboard choice picker (one tap â†’ one value).

        Generic single-level companion to ``send_model_picker`` used by
        `/reasoning`, `/fast`, and any future finite-choice command. Each
        choice dict: ``{"value": str, "label": str, "is_current": bool}``.
        Fr‡  rˆ  Úlabelr°   r   Ú
is_currentõ   âœ“ úcp:ró  z
No choicesc                 ó*   •— g | ]}‰||d z   …         ‘ŒS r	  rŠ   r
  s     €r   rì  z6TelegramAdapter.send_choice_picker.<locals>.<listcomp>ç  s&   ø€ ÐEÐEÐE a�˜˜1˜q™5˜Ô!ÐEÐEÐEr>   r   r^  r­  Nrõ  rö  rº  )r5  r  rð  Úon_choice_selectedTrÖ  z"[%s] send_choice_picker failed: %srŠ   )rW  r”   rŸ  r   r‡  r  rt   ru   r‘  r€  r  r[  rï  r    rœ  r€   r   r  r}  rË  r�  r   r(   r0   r   r   )r5  rK  rØ  r  rð  rC  r¦  rŽ  Úchoicer>  rù  r­  rÁ  rÝ  rN  r  s                  @r   Úsend_choice_pickerz"TelegramAdapter.send_choice_pickerÈ  sÂ  øè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð+	SØˆGÝ& wÑ/Ô/ð ð ‘	��6Ý˜FŸJšJ wÑ/Ô/ÐL°6·:²:¸gÑ3FÔ3FÐLÈ"ÑMÔM�Ø—:’:˜lÑ+Ô+ð +Ø* 5˜N˜N�EØ—’Ý(¨¸iÀA¸i¸iÐHÑHÔHñô ð ð ð ð EÝ!¨%°|ÐDÑDÔDÐDå+ØEÐEÐEÐE­5°µC¸±L´LÀ!Ñ+DÔ+DÐEÑEÔEñô ˆHð 6>ÐG˜Ÿš [Ñ1Ô1Ð1À4ˆIØ×<Ò<¸TÀ8Ð[_Ô[nÐ<ÑoÔoˆKØ?˜Ô?ð Ý2°7Ñ;Ô;Ø×(Ò(¨Ñ/Ô/Ý$Ô0Ø%Ø$/ðð ð ×.Ò.ØØØØ(3Ø"&Ô"5ð /ñ ô ðð ×+Ò+Ñ-Ô-ðð ð ð ð ð ð ð ˆCð" œ.Ø"Ø*Ø&8ð	7ð 7ˆDÔ%¥c¨'¡l¤lÑ3õ  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	Sð 	Sð 	SÝ�NŠNÐ?ÀÄÕLgÐhiÑLjÔLjÑkÔkÐkÝ eÕ3NÈqÑ3QÔ3QÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs&   �B#G& ÃD$G& Ç&
IÇ0AIÈ;IÉIÚdatac              ƒ   óÔ  K  — | j                              |¦  «        }|s|                     d¬¦  «        ƒ d{V —† dS t          |dd¦  «        }t          |dd¦  «        }|                      t          t          |j        dd¦  «        ¦  «        t          |dd¦  «        t          |d	d¦  «        �t          t          |d	d¦  «        ¦  «        ndt          |d
d¦  «        �t          t          |d
d¦  «        ¦  «        ndt          |j        dd¦  «        ¬¦  «        s|                     d¬¦  «        ƒ d{V —† dS 	 t          |dd…         ¦  «        }|d         |         }n4# t          t          f$ r  |                     d¬¦  «        ƒ d{V —† Y dS w xY w|                     d¦  «        }	|	s|                     d¬¦  «        ƒ d{V —† dS 	  |	|t          |                     d¦  «        pd¦  «        ¦  «        ƒ d{V —†}
n7# t          $ r*}t                               d|¦  «         d|› �}
Y d}~nd}~ww xY w	 |                     |                      |
¦  «        t          j        d¬¦  «        ƒ d{V —† n@# t          $ r3 	 |                     |
dd¬¦  «        ƒ d{V —† n# t          $ r Y nw xY wY nw xY w|                     ¦   «         ƒ d{V —† | j                              |d¦  «         dS )z.Handle choice picker button taps (cp:<index>).u)   Picker expired â€” run the command again.rû   Nrž  rÓ  rÔ  r   rK  rÙ  rÚ  Ú
first_namer«  u2   â›” You are not authorized to change this setting.rŒ   r  úInvalid selection.rC  úPicker expired.r°   z"Choice picker selection failed: %szError applying selection: ©r   r�  r÷  )r�  r‡  Úanswerrl   rÐ  r   rÒ  r²   r¶   Ú
IndexErrorr   r(   r   rÁ  rœ  r€   r   rB  )r5  ÚqueryrF  rK  ÚstateÚquery_messageÚ
query_chatr%  rD  ÚcallbackÚresult_textr¬  s               r   Ú_handle_choice_picker_callbackz.TelegramAdapter._handle_choice_picker_callback  sê  è è € ð Ô)×-Ò-¨gÑ6Ô6ˆØð 	Ø—,’,Ð$O�,ÑPÔPÐPÐPÐPÐPÐPÐPÐPØˆFõ
    y°$Ñ7Ô7ˆÝ˜]¨F°DÑ9Ô9ˆ
Ø×0Ò0Ý•˜œ¨¨rÑ2Ô2Ñ3Ô3Ý˜M¨9°dÑ;Ô;Ý@GÈ
ÐTZÐ\`Ñ@aÔ@aÐ@m•c�' *¨f°dÑ;Ô;Ñ<Ô<Ð<ÐswÝPWÐXeÐgzð  }Añ  QBô  QBð  QN•c�' -Ð1DÀdÑKÔKÑLÔLÐLð  TXÝ˜eœo¨|¸TÑBÔBð 1ñ 
ô 
ð 	ð —,’,Ð$X�,ÑYÔYÐYÐYÐYÐYÐYÐYÐYØˆFð	Ý�d˜1˜2˜2”h‘-”-ˆCØ˜9Ô% cÔ*ˆFˆFøÝ�JÐ'ð 	ð 	ð 	Ø—,’,Ð$8�,Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØˆFˆFð	øøøð —9’9Ð1Ñ2Ô2ˆØð 	Ø—,’,Ð$5�,Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØˆFð	=Ø ( ¨µ#°f·j²jÀÑ6IÔ6IÐ6OÈRÑ2PÔ2PÑ QÔ QÐQÐQÐQÐQÐQÐQˆKˆKøÝð 	=ð 	=ð 	=Ý�LŠLÐ=¸sÑCÔCÐCØ<°sÐ<Ð<ˆKˆKˆKˆKˆKˆKøøøøð	=øøøð	Ø×)Ò)Ø×(Ò(¨Ñ5Ô5Ý$Ô0Ø!ð *ñ ô ð ð ð ð ð ð ð ð øõ
 ð 	ð 	ð 	ðØ×-Ò-Ø$°ÀDð .ñ ô ð ð ð ð ð ð ð ð øõ ð ð ð Ø�ðøøøøøð	øøøð �lŠl‰nŒnÐÐÐÐÐÐÐØÔ!×%Ò% g¨tÑ4Ô4Ð4Ð4Ð4s`   Ä:%E  Å -FÆFÇ
4G? Ç?
H3È	 H.È.H3È7;I3 É3
J0É>JÊJ0Ê
J*Ê'J0Ê)J*Ê*J0Ê/J0r"  r   Úpagec           	      óö  ‡‡— 	 ddl m} n# t          $ r d}Y nw xY wd„ |D ¦   «         Šd„ }g }|�ç |d„ |D ¦   «         ¦  «        D ]Ð}|d         dk    r‡ˆfd	„|d
         D ¦   «         }t          d„ |D ¦   «         ¦  «        }|d         › d|› d�}	t	          d„ |D ¦   «         ¦  «        rd|	› �}	|                     t          |	d|d         › �¬¦  «        ¦  «         Œ•‰                     |d         ¦  «        }
|
�|                      ||
¦  «        ¦  «         ŒÑn#|D ] }
|                      ||
¦  «        ¦  «         Œ!|                      ||| j	        ¦  «        \  Š}|d         }|d         }ˆfd„t          dt          ‰¦  «        d¦  «        D ¦   «         }|dk    r¦g }|dk    r*|                     t          dd|dz
  › �¬¦  «        ¦  «         |                     t          |dz   › d|› �d¬¦  «        ¦  «         ||dz
  k     r*|                     t          dd|dz   › �¬¦  «        ¦  «         |                     |¦  «         |                     t          dd ¬¦  «        g¦  «         t          |¦  «        |d!         fS )"añ  Build the paginated top-level provider keyboard, folding groups.

        Provider families (Kimi/Moonshot, MiniMax, xAI Grok, ...) collapse to
        a single ``mpg:<gid>`` button; tapping it drills into a member
        sub-keyboard. Single providers (and groups with only one authenticated
        member) render as direct ``mp:<slug>`` buttons. Grouping mirrors the
        CLI ``hermes model`` picker via the shared ``group_providers`` fold,
        so all surfaces stay consistent.
        r   )Úgroup_providersNc                 ó:   — i | ]}|                      d ¦  «        |“ŒS r.  ©r‡  ©rM  Úps     r   rÉ  z<TelegramAdapter._build_provider_keyboard.<locals>.<dictcomp>R  s$   € Ð7Ð7Ð7¨�1—5’5˜‘=”= !Ð7Ð7Ð7r>   c           	      óô   — |                       dt          |                       dg ¦  «        ¦  «        ¦  «        }| d         › d|› d�}|                       d¦  «        rd|› �}t          |d| d	         › �¬
¦  «        S )NÚtotal_modelsÚmodelsr   ú (rò  r?  r@  úmp:r/  ró  )r‡  r€  rt   )r[  r  r>  s      r   Ú_provider_buttonzBTelegramAdapter._build_provider_keyboard.<locals>._provider_buttonT  s„   € Ø—E’E˜.­#¨a¯eªe°H¸bÑ.AÔ.AÑ*BÔ*BÑCÔCˆEØ˜”yÐ,Ð, EÐ,Ð,Ð,ˆEØ�uŠu�\Ñ"Ô"ð 'Ø&˜u˜˜�Ý'¨Ð=NÀ1ÀVÄ9Ð=NÐ=NÐOÑOÔOÐOr>   c                 ó8   — g | ]}|                      d ¦  «        ‘ŒS r.  rY  rZ  s     r   rì  z<TelegramAdapter._build_provider_keyboard.<locals>.<listcomp>]  s"   € Ð'IÐ'IÐ'I¸!¨¯ª¨f©¬Ð'IÐ'IÐ'Ir>   Úkindr  c                 ó(   •— g | ]}|‰v ¯‰|         ‘ŒS rŠ   rŠ   ©rM  r  Úby_slugs     €r   rì  z<TelegramAdapter._build_provider_keyboard.<locals>.<listcomp>_  s"   ø€ ÐRÐRÐR¨aÀQÈ'À\À\˜w qœzÀ\À\À\r>   Úmembersc           
   3   ó„   K  — | ];}|                      d t          |                      dg ¦  «        ¦  «        ¦  «        V — Œ<dS )r]  r^  N)r‡  r€  ©rM  r  s     r   rè  z;TelegramAdapter._build_provider_keyboard.<locals>.<genexpr>`  sW   è è € ð  ð  ØLM˜Ÿš˜n­c°!·%²%¸À"Ñ2EÔ2EÑ.FÔ.FÑGÔGð ð  ð  ð  ð  ð  r>   r>  u    â–¸ (rò  c              3   ó@   K  — | ]}|                      d ¦  «        V — ŒdS )r?  NrY  ri  s     r   rè  z;TelegramAdapter._build_provider_keyboard.<locals>.<genexpr>d  s.   è è € Ð@Ð@°1˜1Ÿ5š5 Ñ.Ô.Ð@Ð@Ð@Ð@Ð@Ð@r>   r@  úmpg:Úgroup_idró  r/  rU  Útotal_pagesc                 ó*   •— g | ]}‰||d z   …         ‘ŒS r	  rŠ   )rM  rŽ  Úpage_buttonss     €r   rì  z<TelegramAdapter._build_provider_keyboard.<locals>.<listcomp>w  s&   ø€ ÐPÐPÐP¨A�˜Q  Q¡˜YÔ'ÐPÐPÐPr>   r^  r»   õ   â—€ Prevúmpv:ú/úmx:noopõ   Next â–¶õ
   âœ— CancelÚmxÚ	page_info)Úhermes_cli.modelsrW  r   r�  ré  r  rt   r‡  Ú_format_choice_pageÚ_PROVIDER_PAGE_SIZEr‘  r€  ru   )r5  r'  rU  rW  ra  r  Úrowrg  r  r>  r[  Ú	page_metarm  r  Únavrf  ro  s                  @@r   r9  z(TelegramAdapter._build_provider_keyboardC  sR  øø€ ð	#Ø9Ð9Ð9Ð9Ð9Ð9Ð9øÝð 	#ð 	#ð 	#Ø"ˆOˆOˆOð	#øøøð 8Ð7¨YÐ7Ñ7Ô7ˆð	Pð 	Pð 	Pð ˆØÐ&Ø&�Ð'IÐ'I¸yÐ'IÑ'IÔ'IÑJÔJð <ð <�Ø�v”; 'Ò)Ð)ØRÐRÐRÐR°3°y´>ÐRÑRÔR�GÝð  ð  ØQXð ñ  ô  ñ ô �Eð  # 7œ|Ð;Ð;°5Ð;Ð;Ð;�EÝÐ@Ð@¸Ð@Ñ@Ô@Ñ@Ô@ð /Ø . u  ˜Ø—N’NÝ,¨UÐBZÈÈZÌÐBZÐBZÐ[Ñ[Ô[ñô ð ð ð  Ÿš C¨¤KÑ0Ô0�AØ�}ØŸšÐ'7Ð'7¸Ñ':Ô':Ñ;Ô;Ð;øð<ð" ð 4ð 4�Ø—’Ð/Ð/°Ñ2Ô2Ñ3Ô3Ð3Ð3à"&×":Ò":Ø�T˜4Ô3ñ#
ô #
Ñˆ�ið ˜Ô ˆØ Ô.ˆàPÐPÐPÐPµ°q½#¸lÑ:KÔ:KÈQÑ1OÔ1OÐPÑPÔPˆà˜Š?ˆ?ØˆCØ�aŠxˆxØ—
’
Õ/°
ÐJ[ÐQUÐXYÑQYÐJ[ÐJ[Ð\Ñ\Ô\Ñ]Ô]Ð]Ø�JŠJÕ+¨t°a©xÐ,GÐ,G¸+Ð,GÐ,GÐW`ÐaÑaÔaÑbÔbÐbØ�k A‘oÒ%Ð%Ø—
’
Õ/°
ÐJ[ÐQUÐXYÑQYÐJ[ÐJ[Ð\Ñ\Ô\Ñ]Ô]Ð]Ø�KŠK˜ÑÔÐà�ŠÕ)¨,ÀdÐKÑKÔKÐLÑMÔMÐMå# DÑ)Ô)¨9°[Ô+AÐAÐAs   „ ‹™r^  c                 ó¾  ‡— |                       ||| j        ¦  «        \  }}|d         }|d         }|d         }g Št          |¦  «        D ]r\  }}||z   }	d|v r|                     d¦  «        d         n|}
t	          |
¦  «        dk    r|
dd…         d	z   }
‰                     t          |
d
|	› �¬¦  «        ¦  «         Œsˆfd„t          dt	          ‰¦  «        d¦  «        D ¦   «         }|dk    r¦g }|dk    r*|                     t          dd|dz
  › �¬¦  «        ¦  «         |                     t          |dz   › d|› �d¬¦  «        ¦  «         ||dz
  k     r*|                     t          dd|dz   › �¬¦  «        ¦  «         |                     |¦  «         |                     t          dd¬¦  «        t          dd¬¦  «        g¦  «         t          |¦  «        |d         fS )zBBuild paginated model buttons. Returns (keyboard, page_info_text).rU  rm  rS   rr  rØ  é&   Né#   z...úmm:ró  c                 ó*   •— g | ]}‰||d z   …         ‘ŒS r	  rŠ   r
  s     €r   rì  z9TelegramAdapter._build_model_keyboard.<locals>.<listcomp>™  s&   ø€ ÐFÐFÐF q�˜˜A ™E˜	Ô"ÐFÐFÐFr>   r   r^  r»   rp  úmg:rs  rt  õ   â—€ BackÚmbru  rv  rw  )	ry  Ú_MODEL_PAGE_SIZErŸ  rÈ  r€  r  rt   r‘  ru   )r5  r^  rU  Úpage_modelsr|  rm  rS   rŽ  Úmodel_idÚabs_idxÚshortr  r}  r  s                @r   Ú_build_model_keyboardz%TelegramAdapter._build_model_keyboard†  s5  ø€ à!%×!9Ò!9Ø�D˜$Ô/ñ"
ô "
Ñˆ�Yð ˜Ô ˆØ Ô.ˆØ˜'Ô"ˆàˆÝ$ [Ñ1Ô1ð 	ð 	‰KˆAˆxØ˜a‘iˆGØ/2°h¨¨�H—N’N 3Ñ'Ô'¨Ô+Ð+ÀHˆEÝ�5‰zŒz˜BŠˆØ˜c˜r˜cœ
 UÑ*�Ø�NŠNÝ$ U¸/À¸/¸/ÐJÑJÔJñô ð ð ð GÐFÐFÐF­E°!µS¸±\´\À1Ñ,EÔ,EÐFÑFÔFˆð ˜Š?ˆ?ØˆCØ�aŠxˆxØ—
’
Õ/°
ÐJZÐPTÐWXÑPXÐJZÐJZÐ[Ñ[Ô[Ñ\Ô\Ð\Ø�JŠJÕ+¨t°a©xÐ,GÐ,G¸+Ð,GÐ,GÐW`ÐaÑaÔaÑbÔbÐbØ�k A‘oÒ%Ð%Ø—
’
Õ/°
ÐJZÐPTÐWXÑPXÐJZÐJZÐ[Ñ[Ô[Ñ\Ô\Ð\Ø�KŠK˜ÑÔÐà�ŠÝ  ¸4Ð@Ñ@Ô@Ý  ¸TÐBÑBÔBð
ñ 	ô 	ð 	õ
 $ DÑ)Ô)¨9°[Ô+AÐAÐAr>   c           
   ƒ   óJ  ‡$‡%‡&K  — | j                              |¦  «        }|s|                     d¬¦  «        ƒ d{V —† dS 	 ddlm} n# t
          $ r d„ }Y nw xY w|                     d¦  «        �r\|dd…         Š&t          ˆ&fd	„|d
         D ¦   «         d¦  «        }|s|                     d¬¦  «        ƒ d{V —† dS |                     dg ¦  «        }‰&|d<   |                     d‰&¦  «        |d<   ||d<   d|d<   |                      |d¦  «        \  }}	|                     d‰&¦  «        }
|                     dt          |¦  «        ¦  «        }t          |¦  «        }||k    r	d||z
  › d�nd}| 
                    |                      d|
› d|	› d|› �¦  «        t          j        |¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† dS |                     d¦  «        �r|	 t          |dd…         ¦  «        }n-# t          $ r  |                     d¬¦  «        ƒ d{V —† Y dS w xY w|                     dg ¦  «        }||d<   |                      ||¦  «        \  }}	|                     dd¦  «        }
|                     dd¦  «        Š&t          ˆ&fd„|d
         D ¦   «         d¦  «        }|r#|                     dt          |¦  «        ¦  «        nt          |¦  «        }t          |¦  «        }||k    r	d||z
  › d�nd}| 
                    |                      d|
› d|	› d|› �¦  «        t          j        |¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† dS |                     d¦  «        rý	 t          |dd…         ¦  «        }n-# t          $ r  |                     d¬¦  «        ƒ d{V —† Y dS w xY w||d<   |                      |d
         |¦  «        \  }}	  ||d          ¦  «        }n# t"          $ r |d          }Y nw xY w| 
                    |                      d!|d"         pd#› d$|› d%|› �¦  «        t          j        |¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† dS |                     d&¦  «        �rð	 t          |dd…         ¦  «        }n-# t          $ r  |                     d'¬¦  «        ƒ d{V —† Y dS w xY w|                     dg ¦  «        }|dk     s|t          |¦  «        k    r|                     d(¬¦  «        ƒ d{V —† dS ||         }|                     dd¦  «        Š&|                     d)¦  «        }|s|                     d*¬¦  «        ƒ d{V —† dS d+}	  |||‰&¦  «        ƒ d{V —†}n9# t"          $ r,}t$                               d,|¦  «         d-|› �}d.}Y d}~nd}~ww xY w	 | 
                    |                      |¦  «        t          j        d¬¦  «        ƒ d{V —† n@# t"          $ r3 	 | 
                    |dd¬¦  «        ƒ d{V —† n# t"          $ r Y nw xY wY nw xY w|                     |rd/nd0¬¦  «        ƒ d{V —† | j                              |d¦  «         dS |                     d1¦  «        �rÎ	 t          |dd…         ¦  «        }n-# t          $ r  |                     d'¬¦  «        ƒ d{V —† Y dS w xY w|                     dg ¦  «        }|dk     s|t          |¦  «        k    r|                     d(¬¦  «        ƒ d{V —† dS ||         }|                     dd¦  «        Š&|                     d)¦  «        }|s|                     d*¬¦  «        ƒ d{V —† dS 	 dd2lm} t/          j        ||‰&¬3¦  «        ƒ d{V —†}n# t"          $ r d}Y nw xY w|�¥t3          t5          d4d&|› �¬5¦  «        gt5          d6d7¬5¦  «        t5          d8d9¬5¦  «        gg¦  «        }| 
                    |                      d:|j        › �¦  «        t          j        |¬¦  «        ƒ d{V —† |                     d;¬¦  «        ƒ d{V —† dS d+}	  |||‰&¦  «        ƒ d{V —†}n9# t"          $ r,}t$                               d,|¦  «         d-|› �}d.}Y d}~nd}~ww xY w	 | 
                    |                      |¦  «        t          j        d¬¦  «        ƒ d{V —† n@# t"          $ r3 	 | 
                    |dd¬¦  «        ƒ d{V —† n# t"          $ r Y nw xY wY nw xY w|                     |rd/nd0¬¦  «        ƒ d{V —† | j                              |d¦  «         dS |                     d<¦  «        �rá|dd…         }	 dd=lm} |                     |ddg f¦  «        \  }}}n# t"          $ r dg }}Y nw xY wd>„ |d
         D ¦   «         Š%ˆ%fd?„|D ¦   «         }|s|                     d@¬¦  «        ƒ d{V —† dS g Š$|D ]Ž} |                      dt          |                      dg ¦  «        ¦  «        ¦  «        }!| d         › dA|!› dB�}"|                      dC¦  «        rdD|"› �}"‰$                     t5          |"d| dE         › �¬5¦  «        ¦  «         Œ�ˆ$fdF„t?          dt          ‰$¦  «        dG¦  «        D ¦   «         }#|#                     t5          d6d7¬5¦  «        t5          d8d9¬5¦  «        g¦  «         t3          |#¦  «        }| 
                    |                      dH|p|› dI�¦  «        t          j        |¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† dS |d7k    r×t          |                     dd¦  «        pd¦  «        }|                      |d
         |¦  «        \  }}	  ||d          ¦  «        }n# t"          $ r |d          }Y nw xY w| 
                    |                      d!|d"         pd#› d$|› d%|› �¦  «        t          j        |¬¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† dS |d9k    rT| j                              |d¦  «         | 
                    dJd¬K¦  «        ƒ d{V —† |                     ¦   «         ƒ d{V —† dS |                     ¦   «         ƒ d{V —† dS )LzHHandle model picker inline keyboard callbacks (mp:/mm:/mc:/mb:/mx:/mg:).u$   Picker expired â€” use /model again.rû   Nr   r+  c                 ó   — | S r7   rŠ   r.  s    r   r,  z@TelegramAdapter._handle_model_picker_callback.<locals>.get_label¸  r0  r>   r`  rŒ   c              3   ó4   •K  — | ]}|d          ‰k    ¯|V — ŒdS ©r/  NrŠ   ©rM  r[  Úprovider_slugs     €r   rè  z@TelegramAdapter._handle_model_picker_callback.<locals>.<genexpr>¿  ó1   øè è € ÐMÐM�q°!°F´)¸}Ò2LÐ2L�Ð2LÐ2LÐ2LÐ2LÐMÐMr>   r'  zProvider not found.r^  Úselected_providerr   Úselected_provider_nameÚ
model_listÚ
model_pager]  z
_u2    more available â€” type `/model <name>` directly_r   u&   âš™ *Model Configuration*

Provider: *rÅ  z
Select a model:rK  rƒ  zInvalid page.c              3   ó4   •K  — | ]}|d          ‰k    ¯|V — ŒdS r�  rŠ   r�  s     €r   rè  z@TelegramAdapter._handle_model_picker_callback.<locals>.<genexpr>ð  r’  r>   rq  é   r7  r)  r1  r(  r2  r3  r4  úmc:rI  zInvalid model index.r6  rJ  FzModel picker switch failed: %szError switching model: TzSwitch failed.zModel switched!r�  )Úexpensive_model_warning)ÚproviderzSwitch anywayró  r„  r…  ru  rv  u   âš  *Expensive Model Warning*

zConfirm expensive modelrk  )ÚPROVIDER_GROUPSc                 ó    — i | ]}|d          |“ŒS r.  rŠ   rZ  s     r   rÉ  zATelegramAdapter._handle_model_picker_callback.<locals>.<dictcomp>±  s   € Ð@Ð@Ð@¨�q˜”y !Ð@Ð@Ð@r>   c                 ó(   •— g | ]}|‰v ¯‰|         ‘ŒS rŠ   rŠ   re  s     €r   rì  zATelegramAdapter._handle_model_picker_callback.<locals>.<listcomp>²  s"   ø€ ÐHÐHÐH a¸1À¸<¸<�w˜q”z¸<¸<¸<r>   zGroup not found.r_  rò  r?  r@  r/  c                 ó*   •— g | ]}‰||d z   …         ‘ŒS r	  rŠ   r
  s     €r   rì  zATelegramAdapter._handle_model_picker_callback.<locals>.<listcomp>À  s&   ø€ ÐJÐJÐJ¨1�G˜A  A¡˜IÔ&ÐJÐJÐJr>   r^  u-   âš™ *Model Configuration*

Provider family: *z*

Select a provider:zModel selection cancelled.©r   r÷  ) rŽ  r‡  rL  r8  r,  râ   Ú
startswithr  r‹  r€  rÁ  rœ  r€   r   r²   r¶   r9  r   r(   r   rB  Úhermes_cli.model_cost_guardrš  r&   Ú	to_threadru   rt   rž  rx  rœ  r  r‘  )'r5  rN  rF  rK  rO  r,  r›  r^  rù  rw  ÚpnameÚtotalÚshownr†  rU  r:  r;  r%  r•  rˆ  rR  Úswitch_failedrS  r¬  rš  r0   rl  rœ  Ú_labelÚ_descÚmember_slugsrg  r[  r  r>  r  r  rf  r‘  s'                                       @@@r   Ú_handle_model_picker_callbackz-TelegramAdapter._handle_model_picker_callback¬  s¤  øøøè è € ð Ô(×,Ò,¨WÑ5Ô5ˆØð 	Ø—,’,Ð$J�,ÑKÔKÐKÐKÐKÐKÐKÐKÐKØˆFð	Ø6Ð6Ð6Ð6Ð6Ð6Ð6øÝð 	ð 	ð 	ðð ð ð ð ð	øøøð �?Š?˜5Ñ!Ô!ñ ~	!à    œHˆMÝØMÐMÐMÐM˜E +Ô.ÐMÑMÔMØñô ˆHð ð Ø—l’lÐ(=�lÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ø�à—\’\ (¨BÑ/Ô/ˆFØ)6ˆEÐ%Ñ&Ø.6¯lªl¸6À=Ñ.QÔ.QˆEÐ*Ñ+Ø"(ˆE�,ÑØ"#ˆE�,Ñà"&×"<Ò"<¸VÀQÑ"GÔ"GÑˆH�ià—L’L ¨Ñ7Ô7ˆEØ—L’L µ°V±´Ñ=Ô=ˆEÝ˜‘K”KˆEØ_dÐglÒ_lÐ_lÐ[˜% %™-Ð[Ð[Ð[Ð[ÐrtˆEà×)Ò)Ø×(Ò(ð2Ø&+ð2ð 2Ø.7ð2ð 2à*/ð2ð 2ñô õ %Ô0Ø%ð *ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð à�_Š_˜UÑ#Ô#ñ Y	!ðÝ˜4   œ8‘}”}��øÝð ð ð Ø—l’l¨�lÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø��ðøøøð —Y’Y˜|¨RÑ0Ô0ˆFØ"&ˆE�,Ñà"&×"<Ò"<¸VÀTÑ"JÔ"JÑˆH�ià—I’IÐ6¸Ñ;Ô;ˆEØ!ŸIšIÐ&9¸2Ñ>Ô>ˆMÝØMÐMÐMÐM˜E +Ô.ÐMÑMÔMØñô ˆHð BJÐZ�H—L’L µ°V±´Ñ=Ô=Ð=ÍsÐSYÉ{Ì{ˆEÝ˜‘K”KˆEØ_dÐglÒ_lÐ_lÐ[˜% %™-Ð[Ð[Ð[Ð[ÐrtˆEà×)Ò)Ø×(Ò(ð2Ø&+ð2ð 2Ø.7ð2ð 2à*/ð2ð 2ñô õ %Ô0Ø%ð *ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð à�_Š_˜VÑ$Ô$ð u	!ðÝ˜4   œ8‘}”}��øÝð ð ð Ø—l’l¨�lÑ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø��ðøøøð &*ˆE�/Ñ"Ø+/×+HÒ+HØ�kÔ" Dñ,ô ,Ñ(ˆHÐ(ð;Ø!* ¨5Ð1CÔ+DÑ!EÔ!E��øÝð ;ð ;ð ;Ø!&Ð'9Ô!:���ð;øøøð ×)Ò)Ø×(Ò(ðBØ+0°Ô+AÐ+NÀYðBð Bà%3ðBð Bð .@ðBð Bñô õ %Ô0Ø%ð *ñ ô ð ð ð ð ð ð ð ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð à�_Š_˜UÑ#Ô#ñ U	!ðÝ˜$˜q˜r˜rœ(‘m”m��øÝð ð ð Ø—l’lÐ(<�lÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø��ðøøøð Ÿš <°Ñ4Ô4ˆJØ�QŠwˆw˜#¥ Z¡¤Ò0Ð0Ø—l’lÐ(>�lÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø�à! #”ˆHØ!ŸIšIÐ&9¸2Ñ>Ô>ˆMØ—y’yÐ!4Ñ5Ô5ˆHàð Ø—l’lÐ(9�lÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ø�à!ˆMð%Ø$, H¨W°hÀÑ$NÔ$NÐNÐNÐNÐNÐNÐN��øÝð %ð %ð %Ý—’Ð=¸sÑCÔCÐCØ=¸Ð=Ð=�Ø $������øøøøð%øøøð
Ø×-Ò-Ø×,Ò,¨[Ñ9Ô9Ý(Ô4Ø!%ð .ñ ô ð ð ð ð ð ð ð ð øõ
 ð ð ð ðØ×1Ò1Ø(Ø#'Ø%)ð 2ñ ô ð ð ð ð ð ð ð ð øõ
 !ð ð ð Ø�Dðøøøøøðøøøð —,’,Ø)6ÐMÐ%Ð%Ð<Mð ñ ô ð ð ð ð ð ð ð ð Ô$×(Ò(¨°$Ñ7Ô7Ð7Ð7Ð7à�_Š_˜UÑ#Ô#ñ d	!ðÝ˜$˜q˜r˜rœ(‘m”m��øÝð ð ð Ø—l’lÐ(<�lÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø��ðøøøð Ÿš <°Ñ4Ô4ˆJØ�QŠwˆw˜#¥ Z¡¤Ò0Ð0Ø—l’lÐ(>�lÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø�à! #”ˆHØ!ŸIšIÐ&9¸2Ñ>Ô>ˆMØ—y’yÐ!4Ñ5Ô5ˆHàð Ø—l’lÐ(9�lÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ø�ðØOÐOÐOÐOÐOÐOõ !(Ô 1Ø+ØØ*ð!ñ !ô !ð ð ð ð ð ð ��øõ
 ð ð ð Ø���ðøøøàÐ"Ý/Ý)¨/ÈÈsÈÈÐUÑUÔUÐVå,¨ZÀtÐLÑLÔLÝ,¨\ÈÐNÑNÔNðð1ñ ô �ð ×-Ò-Ø×,Ò,ØM¸G¼OÐMÐMñô õ  )Ô4Ø!)ð .ñ ô ð ð ð ð ð ð ð ð —l’lÐ(A�lÑBÔBÐBÐBÐBÐBÐBÐBÐBØ�à!ˆMð%Ø$, H¨W°hÀÑ$NÔ$NÐNÐNÐNÐNÐNÐN��øÝð %ð %ð %Ý—’Ð=¸sÑCÔCÐCØ=¸Ð=Ð=�Ø $������øøøøð%øøøðØ×-Ò-Ø×,Ò,¨[Ñ9Ô9Ý(Ô4Ø!%ð .ñ ô ð ð ð ð ð ð ð ð øõ
 ð 	ð 	ð 	ðØ×1Ò1Ø(Ø#'Ø%)ð 2ñ ô ð ð ð ð ð ð ð ð øõ
 !ð ð ð Ø�Dðøøøøøð	øøøð —,’,Ø)6ÐMÐ%Ð%Ð<Mð ñ ô ð ð ð ð ð ð ð ð
 Ô$×(Ò(¨°$Ñ7Ô7Ð7Ð7Ð7à�_Š_˜VÑ$Ô$ñ Q	!à˜A˜B˜B”xˆHð.Ø=Ð=Ð=Ð=Ð=Ð=Ø.=×.AÒ.AÀ(ÈRÐQSÐUWÈLÑ.YÔ.YÑ+�˜˜|˜|øÝð .ð .ð .Ø')¨2˜���ð.øøøð AÐ@¨U°;Ô-?Ð@Ñ@Ô@ˆGØHÐHÐHÐH¨<ÐHÑHÔHˆGØð Ø—l’lÐ(:�lÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ø�àˆGØð ð �ØŸš˜n­c°!·%²%¸À"Ñ2EÔ2EÑ.FÔ.FÑGÔG�Ø˜Vœ9Ð0Ð0¨Ð0Ð0Ð0�Ø—5’5˜Ñ&Ô&ð +Ø* 5˜N˜N�EØ—’Ý(¨Ð>OÀAÀfÄIÐ>OÐ>OÐPÑPÔPñô ð ð ð KÐJÐJÐJµ°a½¸W¹¼ÀqÑ0IÔ0IÐJÑJÔJˆDØ�KŠKÝ$ Z¸tÐDÑDÔDÝ$ \ÀÐFÑFÔFðñ ô ð õ ,¨DÑ1Ô1ˆHà×)Ò)Ø×(Ò(ð.Ø-3Ð-?°xð.ð .ð .ñô õ %Ô0Ø%ð *ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð à�TŠ\ˆ\å�u—y’y °!Ñ4Ô4Ð9¸Ñ:Ô:ˆDØ+/×+HÒ+HØ�kÔ" Dñ,ô ,Ñ(ˆHÐ(ð;Ø!* ¨5Ð1CÔ+DÑ!EÔ!E��øÝð ;ð ;ð ;Ø!&Ð'9Ô!:���ð;øøøð ×)Ò)Ø×(Ò(ðBØ+0°Ô+AÐ+NÀYðBð Bà%3ðBð Bð .@ðBð Bñô õ %Ô0Ø%ð *ñ ô ð ð ð ð ð ð ð ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð à�TŠ\ˆ\àÔ$×(Ò(¨°$Ñ7Ô7Ð7Ø×)Ò)Ø1Ø!ð *ñ ô ð ð ð ð ð ð ð ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð ð —,’,‘.”.Ð Ð Ð Ð Ð Ð Ð Ð Ð s>  ÁA ÁAÁAÇ$G< Ç<&H&È%H&Í5N Î&N7Î6N7ÏO1 Ï1PÐPÒR  Ò &S
Ó	S
Õ0V Ö
V:Ö"V5Ö5V:Ö>;W: ×:
X7ØX$Ø#X7Ø$
X1Ø.X7Ø0X1Ø1X7Ø6X7ÚZ& Ú&&[Û[Ý4#^ Þ^'Þ&^'áa( á(
bá2"bâbâ";c ã
dã)dädä
dädädädädå<#f  æ f1æ0f1în/ î/oïoÚuser_displayc              ƒ   ó  K  — 	 |                      d¬¦  «        ƒ d{V —† n# t          $ r Y nw xY w	 |                     dt          j        |j        j        pd¦  «        › d�t          j        d¬¦  «        ƒ d{V —† dS # t          $ r Y dS w xY w)uš  Tell the user a clarify tap arrived too late to be delivered.

        Fires when the clarify entry was evicted by ``clarify_timeout`` or the
        gateway restarted between asking and the tap. In both cases the agent
        thread is no longer waiting, so the tap would otherwise leave a
        misleading âœ“ (or an "awaiting typed response" prompt) on a button the
        agent never receives.
        u-   âš ï¸� This prompt expired â€” please /retry.rû   Nr  r   uM   

<i>âš ï¸� This question expired or the session reset â€” please /retry.</i>rK  )	rL  r   rÁ  rý  rþ  rž  r   r€   r  )r5  rN  r¬  s      r   Ú_notify_clarify_expiredz'TelegramAdapter._notify_clarify_expiredû  sû   è è € ð	Ø—,’,Ð$S�,ÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTøÝð 	ð 	ð 	ØˆDð	øøøð
	Ø×)Ò)ðb�5œ<¨¬Ô(:Ð(@¸bÑAÔAð bð bð bõ %œ>Ø!ð *ñ ô ð ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   „! ¡
.­.²A
A> Á>
BÂBr×  rq   rk  úContextTypes.DEFAULT_TYPEc           
   ƒ   óø  K  — |j         }|r|j        sdS |j        }t          |dd¦  «        }t          |dd¦  «        }t          |dd¦  «        }t          |dd¦  «        }t          |dd¦  «        }	t          |j        dd¦  «        }
|                     d¦  «        rC|j        rt          |j        j        ¦  «        nd}|r|                      |||¦  «        ƒ d{V —† dS |                     d	¦  «        rC|j        rt          |j        j        ¦  «        nd}|r|  	                    |||¦  «        ƒ d{V —† dS |                     d
¦  «        r#|  
                    |||||	|
¬¦  «        ƒ d{V —† dS |                     d¦  «        �rp|                     dd¦  «        }t          |¦  «        dk    �rD|d         }	 t          |d         ¦  «        }n4# t          t          f$ r  |                     d¬¦  «        ƒ d{V —† Y dS w xY wt          t          |j        dd¦  «        ¦  «        }|                      |||�t          |¦  «        nd|	�t          |	¦  «        nd|
¬¦  «        s|                     d¬¦  «        ƒ d{V —† dS | j                             |d¦  «        }|s|                     d¬¦  «        ƒ d{V —† dS t          |j        dd¦  «        }	 ddlm}  |||¦  «        }t,                               d||||¦  «         n4# t0          $ r'}t,                               d|¦  «         d}Y d}~nd}~ww xY w|r%dddd d!œ}|                     |d"¦  «        }|› d#|› �}nd$}|› d%�}|                     |¬¦  «        ƒ d{V —† 	 |                     |                      |¦  «        t:          j        d¬&¦  «        ƒ d{V —† n# t0          $ r Y nw xY w|r$|�"|                      t          |¦  «        ¦  «         dS |                     d'¦  «        �r;|                     dd¦  «        }t          |¦  «        dk    �r|d         }|d         }t          t          |j        dd¦  «        ¦  «        }|                      |||�t          |¦  «        nd|	�t          |	¦  «        nd|
¬¦  «        s|                     d(¬¦  «        ƒ d{V —† dS | j                              |d¦  «        }|s|                     d)¬¦  «        ƒ d{V —† dS dd*d+d,œ}t          |j        dd¦  «        }|                     |d"¦  «        }|                     |¬¦  «        ƒ d{V —† 	 |                     |                      |› d#|› �¦  «        t:          j        d¬&¦  «        ƒ d{V —† n# t0          $ r Y nw xY w	 dd-l!m"} | #                    |||¦  «        ƒ d{V —†}|�rE|j        �r=t          |j        dd¦  «        }t          |j        dd¦  «        }t          |dd¦  «        }t          |j        d.d¦  «        }t          |j        j        ¦  «        |                      |¦  «        t:          j        d/œ|  $                    ¦   «         ¥}t          |d0|¦  «        } t          | ¦  «         %                    ¦   «         d1t          tL          j'        ¦  «         %                    ¦   «         t          t          tL          j'        d0tL          j'        ¦  «        ¦  «         %                    ¦   «         hv }!|�|!r}|�{t          |¦  «        }"|"|d2<   | (                    |  )                    t          |j        j        ¦  «        t          |¦  «        t          |¦  «        d3d4œ|"| j*        ¬5¦  «        ¦  «         nf|�d| (                    |  )                    t          |j        j        ¦  «        t          |¦  «        d6t          |¦  «        i| j*        ¬7¦  «        ¦  «          | j+        d_i |¤Žƒ d{V —† n:# t0          $ r-}t,                               d8| j,        |d3¬9¦  «         Y d}~nd}~ww xY wdS |                     d:¦  «        �r9|                     dd¦  «        }t          |¦  «        dk    �r|d         }#|d         }$t          t          |j        dd¦  «        ¦  «        }|                      |||�t          |¦  «        nd|	�t          |	¦  «        nd|
¬¦  «        s|                     d(¬¦  «        ƒ d{V —† dS | j-                             |#¦  «        }|s|                     d)¬¦  «        ƒ d{V —† dS t          |j        dd¦  «        }|$d;k    �rd<}%	 dd=l.m/}&  |&|#¦  «        }%n8# t0          $ r+}t,           0                    d>| j,        |¦  «         Y d}~nd}~ww xY w|%s9| j-                             |#d¦  «         |  1                    ||¦  «        ƒ d{V —† dS |                     d?¬¦  «        ƒ d{V —† 	 |                     d@|j        j2        pd› dAtg          j4        |¦  «        › dB�t:          j5        d¬&¦  «        ƒ d{V —† n# t0          $ r Y nw xY wdS 	 t          |$¦  «        }'n4# t          tl          f$ r  |                     dC¬¦  «        ƒ d{V —† Y dS w xY wd}(	 ddDl.m7}) |)                     |#¦  «        }*|*r6|*j8        r/d|'cxk    rt          |*j8        ¦  «        k     rn n|*j8        |'         }(n# t0          $ r d}(Y nw xY w|(€dE|'dz   › �}(| j-                             |#d¦  «         	 ddFl.m9}+  |+|#|(¦  «        },n:# t0          $ r-}t,                               dG| j,        |¦  «         d<},Y d}~nd}~ww xY w|,rÊ|                     dH|(ddI…         › �¬¦  «        ƒ d{V —† 	 |                     d@tg          j4        |j        j2        pd¦  «        › dJtg          j4        |¦  «        › dKtg          j4        |(¦  «        › �t:          j5        d¬&¦  «        ƒ d{V —† n# t0          $ r Y nw xY wt,                               dL|#|(|¦  «         n7|  1                    ||¦  «        ƒ d{V —† t,           0                    dM|#¦  «         dS |                     dN¦  «        sdS |                     dd¦  «        d         }-t          t          |j        dd¦  «        ¦  «        }|                      |||�t          |¦  «        nd|	�t          |	¦  «        nd|
¬¦  «        s|                     dO¬¦  «        ƒ d{V —† dS |                     dP|-› dQ�¬¦  «        ƒ d{V —† |-dRk    rdSndT}	 |                     |                      dU|› dV�¦  «        t:          j        d¬&¦  «        ƒ d{V —† n# t0          $ r Y nw xY w	 ddWl:m;}.  |.¦   «         }/|/dXz  }0|0 <                    dY¦  «        }1|1 =                    |-dZ¬[¦  «         |1 >                    |0¦  «         t,                               d\|-t          |j        dd]¦  «        ¦  «         dS # t0          $ r&}t,                               d^|¦  «         Y d}~dS d}~ww xY w)`z%Handle inline keyboard button clicks.Nrž  rK  rÓ  rÙ  rÚ  rH  )r`  rk  rq  r�  r™  r…  rv  rƒ  rA  zgt:)Úquery_chat_idÚquery_chat_typeÚquery_thread_idÚquery_user_namezea:r«  r^  rŒ   r»   zInvalid approval data.rû   rÔ  r   r«  u/   â›” You are not authorized to approve commands.z(This approval has already been resolved.ÚUserr   )Úresolve_gateway_approvalzKTelegram button resolved %d approval(s) for session %s (choice=%s, user=%s)z;Failed to resolve gateway approval from Telegram button: %su   âœ… Approved onceu   âœ… Approved for sessionu   âœ… Approved permanentlyu
   â�Œ Denied)ÚonceÚsessionÚalwaysÚdenyÚResolvedú by u   âŒ› Approval expiredu]    â€” no command was waiting. It already timed out (and was denied) or was resolved elsewhere.rK  zsc:u1   â›” You are not authorized to answer this prompt.z&This prompt has already been resolved.u   ðŸ”’ Always approveu   â�Œ Cancelled)r·  r¹  rV   )Úslash_confirmrË  r"  r°   r·  r  T)r­  r  rº  r­  rõ  z&[%s] slash-confirm callback failed: %sr#   r#  ÚotherF)Úmark_awaiting_textz"[%s] mark_awaiting_text failed: %su$   âœ�ï¸� Type your answer in the chat.r  z"

<i>Awaiting typed response from u   â€¦</i>zInvalid choice.)Ú_entrieszchoice )Úresolve_gateway_clarifyz'[%s] resolve_gateway_clarify failed: %sr@  r\  z

<b>z:</b> z<Telegram clarify button resolved (id=%s, choice=%r, user=%s)zGTelegram clarify button: resolve_gateway_clarify returned False (id=%s)zupdate_prompt:u4   â›” You are not authorized to answer update prompts.zSent 'z' to the update process.ÚyÚYesÚNou   âš• Update prompt answered: *rÅ  r½  z.update_responsez.tmprÀ   rÀ  z/Telegram update prompt answered '%s' by user %sr2  z1Failed to write update response from callback: %srŠ   )?Úcallback_queryrF  rl   rÒ  r¡  rž  r   rK  r«  rT  Ú_handle_gmail_triage_callbackrÈ  r€  r²   r¶   rM  rL  rÐ  r�  rB  Útools.approvalr¶  r(   r½   r   r   r‡  rÁ  rœ  r€   r   Úresume_typing_for_chatr‘  Útoolsr½  Úresolver}  rÇ   r�   ÚPRIVATEr×  r  r[  rï  r   r’  Útools.clarify_gatewayr¿  r0   r®  r   rý  rþ  r  rµ   rÀ  r  rÁ  rÅ  r¾  Úwith_suffixÚ
write_textrÁ   )2r5  r×  rk  rN  rF  rP  r±  rQ  r²  r³  r´  rK  ÚpartsrD  r  Ú	caller_idrð  r¬  r¶  r  r¬  Ú	label_mapr>  Ú	edit_textr  Ú_slash_confirm_modrS  r­  rÓ  r¬  Úprompt_message_idr=  Úchat_type_valueÚis_private_chatrÁ  r  Úchoice_tokenÚflippedr¿  r%  Úresolved_textÚ_clarify_entriesrµ  rÁ  ÚresolvedrL  r¾  ÚhomeÚresponse_pathÚtmps2                                                     r   rN  z&TelegramAdapter._handle_callback_query  sG  è è € ð Ô%ˆØð 	˜EœJð 	ØˆFØŒzˆÝ  y°$Ñ7Ô7ˆÝ ¨y¸$Ñ?Ô?ˆÝ˜]¨F°DÑ9Ô9ˆ
Ý! *¨f°dÑ;Ô;ˆÝ! -Ð1DÀdÑKÔKˆÝ! %¤/°<ÀÑFÔFˆð �?Š?ÐSÑTÔTð 	Ø49´MÐK•c˜%œ-Ô/Ñ0Ô0Ð0ÀtˆGØð OØ×8Ò8¸ÀÀgÑNÔNÐNÐNÐNÐNÐNÐNÐNØˆFð �?Š?˜5Ñ!Ô!ð 	Ø49´MÐK•c˜%œ-Ô/Ñ0Ô0Ð0ÀtˆGØð PØ×9Ò9¸%ÀÀwÑOÔOÐOÐOÐOÐOÐOÐOÐOØˆFð �?Š?˜5Ñ!Ô!ð 		Ø×4Ò4ØØØ+Ø /Ø /Ø /ð 5ñ ô ð ð ð ð ð ð ð ð ˆFð �?Š?˜5Ñ!Ô!ñ R	Ø—J’J˜s AÑ&Ô&ˆEÝ�5‰zŒz˜QŠ‰Ø˜qœ�ðÝ"% e¨A¤h¡-¤-�K�KøÝ"¥JÐ/ð ð ð ØŸ,š,Ð,D˜,ÑEÔEÐEÐEÐEÐEÐEÐEÐEØ�F�Fðøøøõ
  ¥¨¬¸¸rÑ BÔ BÑCÔC�	Ø×8Ò8ØØ)Ø6EÐ6Q�c /Ñ2Ô2Ð2ÐW[Ø6EÐ6Q�c /Ñ2Ô2Ð2ÐW[Ø-ð 9ñ ô ð ð  Ÿ,š,Ð,]˜,Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ø�Fà"Ô2×6Ò6°{ÀDÑIÔI�Ø"ð ØŸ,š,Ð,V˜,ÑWÔWÐWÐWÐWÐWÐWÐWÐWØ�Få& u¤¸ÀfÑMÔM�ð	ØGÐGÐGÐGÐGÐGØ4Ð4°[À&ÑIÔI�EÝ—K’KØeØ˜{¨F°Lñô ð ð øõ !ð ð ð Ý—L’LÐ!^Ð`cÑdÔdÐdØ�E�E�E�E�E�Eøøøøðøøøð ð ð !4Ø#=Ø"<Ø ,ð	!ð !�Ið &ŸMšM¨&°*Ñ=Ô=�EØ#(Ð <Ð <¨lÐ <Ð <�I�Ià2�Eà ð \ð \ð \ð ð
 —l’l¨�lÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ðØ×1Ò1Ø!×0Ò0°Ñ;Ô;Ý#,Ô#8Ø%)ð 2ñ ô ð ð ð ð ð ð ð ð øõ
 !ð ð ð Ø�Dðøøøð ð D˜]Ð6Ø×/Ò/µ°MÑ0BÔ0BÑCÔCÐCØˆFð �?Š?˜5Ñ!Ô!ñ a	Ø—J’J˜s AÑ&Ô&ˆEÝ�5‰zŒz˜QŠ‰Ø˜qœ�Ø" 1œX�
å¥¨¬¸¸rÑ BÔ BÑCÔC�	Ø×8Ò8ØØ)Ø6EÐ6Q�c /Ñ2Ô2Ð2ÐW[Ø6EÐ6Q�c /Ñ2Ô2Ð2ÐW[Ø-ð 9ñ ô ð ð  Ÿ,š,Ð,_˜,Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ø�Fà"Ô7×;Ò;¸JÈÑMÔM�Ø"ð ØŸ,š,Ð,T˜,ÑUÔUÐUÐUÐUÐUÐUÐUÐUØ�Fð 0Ø3Ø-ðð �	õ
  ' u¤¸ÀfÑMÔM�Ø!Ÿš f¨jÑ9Ô9�à—l’l¨�lÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ðØ×1Ò1Ø!×0Ò0°EÐ1MÐ1M¸|Ð1MÐ1MÑNÔNÝ#,Ô#8Ø%)ð 2ñ ô ð ð ð ð ð ð ð ð øõ
 !ð ð ð Ø�Dðøøøð3jØIÐIÐIÐIÐIÐIØ(:×(BÒ(BØ# Z°ñ)ô )ð #ð #ð #ð #ð #ð #�Kð #ñ ,U u¤}ñ ,Uõ %,¨E¬MÐ;NÐPTÑ$UÔ$U˜	Ý& u¤}°f¸dÑCÔC˜Ý$+¨D°&¸$Ñ$?Ô$?˜	Ý,3°E´MÀ<ÐQUÑ,VÔ,VÐ)å'*¨5¬=Ô+@Ñ'AÔ'AØ$(×$7Ò$7¸Ñ$DÔ$DÝ*3Ô*?ð7ð 7ð #×7Ò7Ñ9Ô9ð	7˜õ +2°)¸WÀiÑ*PÔ*P˜Ý*-¨oÑ*>Ô*>×*DÒ*DÑ*FÔ*FØ%Ý¥Ô 0Ñ1Ô1×7Ò7Ñ9Ô9Ý¥­Ô(8¸'Å8ÔCSÑ TÔ TÑUÔU×[Ò[Ñ]Ô]ðKð +˜ð
 %Ð0°_Ð0ÐIZÐIfÝ*-Ð.?Ñ*@Ô*@˜KØAL˜KÐ(=Ñ>Ø'×.Ò.Ø $× <Ò <Ý$'¨¬Ô(=Ñ$>Ô$>Ý$'¨	¡N¤Nå58¸±^´^ØLPð%&ð %&ð 9DØ26Ô2Eð !=ñ 	!"ô 	!"ñô ð ð ð 'Ð2Ø'×.Ò.Ø $× <Ò <Ý$'¨¬Ô(=Ñ$>Ô$>Ý$'¨	¡N¤NØ%0µ#°i±.´.Ð$AØ26Ô2Eð	 !=ñ !"ô !"ñô ð ð F˜dÔEÐTÐTÈÐTÐTÐTÐTÐTÐTÐTÐTÐTøøÝ ð jð jð jÝ—L’LÐ!IÈ4Ì9ÐVYÐdh�LÑiÔiÐiÐiÐiÐiÐiÐiøøøøðjøøøàˆFð �?Š?˜5Ñ!Ô!ñ q	Ø—J’J˜s AÑ&Ô&ˆEÝ�5‰zŒz˜QŠ‰Ø" 1œX�
Ø$ Qœx�å¥¨¬¸¸rÑ BÔ BÑCÔC�	Ø×8Ò8ØØ)Ø6EÐ6Q�c /Ñ2Ô2Ð2ÐW[Ø6EÐ6Q�c /Ñ2Ô2Ð2ÐW[Ø-ð 9ñ ô ð ð  Ÿ,š,Ð,_˜,Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ø�Fà"Ô1×5Ò5°jÑAÔA�Ø"ð ØŸ,š,Ð,T˜,ÑUÔUÐUÐUÐUÐUÐUÐUÐUØ�Få& u¤¸ÀfÑMÔM�à 7Ò*Ñ*ð $�Gð]ØLÐLÐLÐLÐLÐLØ"4Ð"4°ZÑ"@Ô"@˜˜øÝ$ð ]ð ]ð ]ÝŸšÐ'KÈTÌYÐX[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\øøøøð]øøøð #ð ð Ô+×/Ò/°
¸DÑAÔAÐAØ"×:Ò:¸5À,ÑOÔOÐOÐOÐOÐOÐOÐOÐOØ˜àŸ,š,Ð,R˜,ÑSÔSÐSÐSÐSÐSÐSÐSÐSðØ#×5Ò5ð "J¨¬Ô(:Ð(@¸bð  "Jð  "JÕfkÔfrÐsñ  gAô  gAð  "Jð  "Jð  "JÝ'0¤~Ø)-ð 6ñ ô ð ð ð ð ð ð ð ð øõ
 %ð ð ð Ø˜ðøøøà�FðÝ˜lÑ+Ô+�C�CøÝ"¥IÐ.ð ð ð ØŸ,š,Ð,=˜,Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ø�F�Fðøøøð 04�ð)ØRÐRÐRÐRÐRÐRØ,×0Ò0°Ñ<Ô<�EØð ; ¤ð ;°1¸Ð3PÐ3PÒ3PÐ3P½cÀ%Ä-Ñ>PÔ>PÒ3PÐ3PÐ3PÐ3PÐ3PØ(-¬°cÔ(:˜øøÝ ð )ð )ð )Ø$(�M�M�Mð)øøøð !Ð(ð %8¨c°A©gÐ$7Ð$7�Mð Ô#×'Ò'¨
°DÑ9Ô9Ð9ð%ØMÐMÐMÐMÐMÐMØ6Ð6°zÀ=ÑQÔQ�H�HøÝ ð %ð %ð %Ý—L’LÐ!JÈDÌIÐWZÑ[Ô[Ð[Ø$�H�H�H�H�H�Høøøøð%øøøð ð ØŸ,š,Ð,G°=ÀÀ"ÀÔ3EÐ,GÐ,G˜,ÑHÔHÐHÐHÐHÐHÐHÐHÐHðØ#×5Ò5ð "W­¬°U´]Ô5GÐ5MÈ2Ñ(NÔ(Nð  "Wð  "WÕW\ÔWcÐdpÑWqÔWqð  "Wð  "WÕy~ô  zFð  GTñ  zUô  zUð  "Wð  "WÝ'0¤~Ø)-ð 6ñ ô ð ð ð ð ð ð ð ð øõ
 %ð ð ð Ø˜ðøøøå—K’KØVØ" M°<ñô ð ð ð ×6Ò6°u¸lÑKÔKÐKÐKÐKÐKÐKÐKÐKÝ—N’NØaØ"ñô ð ð ˆFð �ŠÐ/Ñ0Ô0ð 	ØˆFØ—’˜C Ñ#Ô# AÔ&ˆÝ� ¤°°rÑ:Ô:Ñ;Ô;ˆ	Ø×0Ò0ØØ!Ø.=Ð.I•c˜/Ñ*Ô*Ð*ÈtØ.=Ð.I•c˜/Ñ*Ô*Ð*ÈtØ%ð 1ñ 
ô 
ð 	ð —,’,Ð$Z�,Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[ØˆFØ�lŠlÐ I¨Ð IÐ IÐ IˆlÑJÔJÐJÐJÐJÐJÐJÐJÐJà 3š˜��¨Dˆð	Ø×)Ò)Ø×(Ò(Ð)QÈÐ)QÐ)QÐ)QÑRÔRÝ$Ô0Ø!ð *ñ ô ð ð ð ð ð ð ð ð øõ
 ð 	ð 	ð 	ØˆDð	øøøð
	SØ8Ð8Ð8Ð8Ð8Ð8Ø"�?Ñ$Ô$ˆDØ Ð#5Ñ5ˆMØ×+Ò+¨FÑ3Ô3ˆCØ�NŠN˜6¨GˆNÑ4Ô4Ð4Ø�KŠK˜Ñ&Ô&Ð&Ý�KŠKÐIØ¥¨¬¸¸yÑ IÔ IñKô Kð Kð Kð Køåð 	Sð 	Sð 	SÝ�LŠLÐLÈcÑRÔRÐRÐRÐRÐRÐRÐRÐRøøøøð	Søøøs  Æ8G Ç-G?Ç>G?Ë0L Ì
L3ÌL.Ì.L3Î;N= Î=
O
Ï	O
ÕA V Ö
VÖVÖI+`
 à

aà#`<à<aå-e? å?
f4æ	!f/æ/f4èAi é
i*é)i*é0j  ê -j1ê0j1ê7Al ìlìlím í
ní #nînî:A3p. ð.
p;ð:p;õ0?v0 ö0
v=ö<v=÷By	 ù	
y9ùy4ù4y9zsend-draft.shu   âœ“ sent draftz
archive.shu   âœ“ archivedzdraft-blank.shu   âœ“ drafted replyzspam.shu   âœ“ marked spamzmute-add.shÚemailu	   âœ“ mutedÚdomainu   âœ“ muted domainztrusted-ops-add.shu   âœ“ trustedu   âœ“ trusted domainz
vip-add.shu   âœ“ marked VIPu   âœ“ marked VIP domain)
r°  ÚarchiveÚdraftÚspamÚmutezmute-domainÚtrustztrust-domainÚvipz
vip-domainc          	   ƒ   óÚ  K  — |                      dd¦  «        }t          |¦  «        dk    r|                     d¬¦  «        ƒ d{V —† dS |d         |d         }	}t          t	          |j        dd	¦  «        ¦  «        }
|                      |
||�t          |¦  «        nd|�t          |¦  «        nd|¬
¦  «        s|                     d¬¦  «        ƒ d{V —† dS | j                             |¦  «        }|s!|                     d|› �¬¦  «        ƒ d{V —† dS |\  }}}}t          j
        ¦   «         dz  dz  dz  |z  }|                     ¦   «         sC|                     d|› d�¬¦  «        ƒ d{V —† t                               d| j        |¦  «         dS t          |¦  «        |	g|¢}d}	 t          j        |t          j        j        t          j        j        dœŽƒ d{V —†}t          j        |                     ¦   «         d¬¦  «        ƒ d{V —†\  }}|j        dk    r'|}d}t                               d| j        ||	¦  «         nˆ|                     dd¬¦  «                             ¦   «         }|r|                     ¦   «         d         n	d|j        › �}d|› d|dd …         › �}t                               d!| j        ||	|j        |¦  «         n|# t          j        $ r+ d|› d"�}t                               d#| j        ||	¦  «         Y nCt6          $ r7}d|› d$|› �}t                               d%| j        ||	|d¬&¦  «         Y d}~nd}~ww xY w|                     |¬¦  «        ƒ d{V —† |sdS t	          |j        d'd(¦  «        }|j        r|j        j        pd	nd	}|› d)|› d*|› �}	 |r|                     |¬¦  «        ƒ d{V —† dS |                     |d¬+¦  «        ƒ d{V —† dS # t6          $ r Y dS w xY w),z=Dispatch a gmail-triage inline-button callback (gt:verb:arg).r«  r^  rŒ   zInvalid gmail-triage data.rû   Nr»   rÔ  r   r«  u0   â›” You are not authorized to act on this email.zUnknown verb: z.hermesÚscriptszgmail-triageu   â�Œ z missingz$[%s] gmail-triage script missing: %sF)rÓ   Ústderrr\  rõ  r   Tz-[%s] gmail-triage callback ok: verb=%s arg=%srÀ   rÁ   )rÅ   rØ  zexit z	 failed: éP   zA[%s] gmail-triage callback failed: verb=%s arg=%s rc=%s stderr=%sz
 timed outz4[%s] gmail-triage callback timed out: verb=%s arg=%sz error: z;[%s] gmail-triage callback exception: verb=%s arg=%s err=%sr#   rH  rµ  u   
â€” r¼  r   )rÈ  r€  rL  r   rl   rÒ  rÐ  Ú_GT_VERB_DISPATCHr‡  Ú_PathrÜ  rÆ  r(   r   r   r&   Úcreate_subprocess_execrÏ   ÚPIPErö  ÚcommunicaterÒ   r½   Údecoder   r™  rY   r   rž  r   rÁ  )r5  rN  rF  r±  r²  r³  r´  rÏ  ÚverbÚargrÐ  rµ  Úscript_nameÚ
extra_argsÚsuccess_labelÚis_state_verbÚscript_pathÚcmdrÓ  rØ   Ú_stdout_bytesÚstderr_bytesr>  Ústderr_textÚ	last_liner¬  r¬  Úoriginal_textÚappendeds                                r   rÆ  z-TelegramAdapter._handle_gmail_triage_callback¤  sK  è è € ð —
’
˜3 Ñ"Ô"ˆÝˆu‰:Œ:˜Š?ˆ?Ø—,’,Ð$@�,ÑAÔAÐAÐAÐAÐAÐAÐAÐAØˆFØ˜!”H˜e Aœhˆcˆå� ¤°°rÑ:Ô:Ñ;Ô;ˆ	Ø×0Ò0ØØ!Ø.=Ð.I•c˜/Ñ*Ô*Ð*ÈtØ.=Ð.I•c˜/Ñ*Ô*Ð*ÈtØ%ð 1ñ 
ô 
ð 	ð —,’,Ð$V�,ÑWÔWÐWÐWÐWÐWÐWÐWÐWØˆFàÔ&×*Ò*¨4Ñ0Ô0ˆØð 	Ø—,’,Ð$;°TÐ$;Ð$;�,Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØˆFØ@EÑ=ˆ�Z °å”j‘l”l YÑ.°Ñ:¸^ÑKÈkÑYˆØ×!Ò!Ñ#Ô#ð 	Ø—,’,Ð$@¨;Ð$@Ð$@Ð$@�,ÑAÔAÐAÐAÐAÐAÐAÐAÐAÝ�LŠLÐ?ÀÄÈKÑXÔXÐXØˆFå�;ÑÔ Ð2 zÐ2ˆØˆð 	Ý Ô7ØÝÔ)Ô.ÝÔ)Ô.ðð ð ð ð ð ð ð ð ˆDõ
 18Ô0@Ø× Ò Ñ"Ô"¨Bð1ñ 1ô 1ð +ð +ð +ð +ð +ð +Ñ'ˆM˜<ð Œ !Ò#Ð#Ø%�Ø�Ý—’ØCØ”I˜t Sñô ð ð ð
 +×1Ò1°'À)Ð1ÑLÔL×RÒRÑTÔT�Ø<GÐf˜K×2Ò2Ñ4Ô4°RÔ8Ð8ÐMfÐUYÔUdÐMfÐMf�	Ø>˜tÐ>Ð>¨i¸¸¸¬nÐ>Ð>�Ý—’ØWØ”I˜t S¨$¬/¸;ñô ð øøõ Ô#ð 	gð 	gð 	gØ+˜4Ð+Ð+Ð+ˆEÝ�LŠLÐOÐQUÔQZÐ\`ÐbeÑfÔfÐfÐfÐfÝð 	ð 	ð 	Ø.˜4Ð.Ð.¨Ð.Ð.ˆEÝ�LŠLØMØ”	˜4  c°Dð ñ ô ð ð ð ð ð ð øøøøð	øøøð �lŠl ˆlÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Øð 	ØˆFå˜uœ°¸fÑEÔEˆØ6;´mÐK˜œÔ+Ð1¨røÈˆØ#ÐDÐD¨5ÐDÐD°lÐDÐDˆð		Øð Pð ×-Ò-°8Ð-Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð ×-Ò-°8È$Ð-ÑOÔOÐOÐOÐOÐOÐOÐOÐOÐOÐOøÝð 	ð 	ð 	ØˆDˆDð	øøøs7   Æ'D!K	 Ë	7MÌ	MÌ-L=Ì=MÎO Î=O Ï
O*Ï)O*r>  r¹   c                 óH   — |› d|› �}|                      d¦  «        r|dz  }|S )zßBuild an actionable file-not-found error for gateway MEDIA delivery.

        Paths like /workspace/... or /output/... often only exist inside the
        Docker sandbox, while the gateway process runs on the host.
        z file not found: )z/workspace/z/output/z	/outputs/z‘ (path may only exist inside the Docker sandbox. Bind-mount a host directory and emit the host-visible path in MEDIA: for gateway file delivery.))r¡  )r5  r>  r¹   r   s       r   Ú_missing_media_path_errorz)TelegramAdapter._missing_media_path_error  sB   € ð Ð1Ð1¨4Ð1Ð1ˆØ�?Š?ÐCÑDÔDð 	Øð=ñˆEð
 ˆr>   Ú	file_sizeÚ	max_bytesc                 óª   — t          d|dz  ¦  «        }	 t          |pd¦  «        dz  }|d›d�}n# t          t          f$ r d}Y nw xY wd|› d|› d	|› d
�S )Nr»   é   r   z.1fz MBzunknown sizez
[Telegram z skipped: file size z exceeds the z0 MB limit. Ask the user to send a smaller file.])rQ   r²   rµ   r¶   )r5  r>  r  r  Úlimit_mbÚsize_mbÚ	size_texts          r   Ú_telegram_media_too_large_notez.TelegramAdapter._telegram_media_too_large_note  s©   € Ý�q˜)¨Ñ4Ñ5Ô5ˆð	'Ý˜)˜. qÑ)Ô)¨[Ñ9ˆGØ"Ð+Ð+Ð+Ð+ˆIˆIøÝ�:Ð&ð 	'ð 	'ð 	'Ø&ˆIˆIˆIð	'øøøðJ˜ð Jð J°Ið Jð JØðJð Jð Jð	
s   •0 °AÁArÍ  c                 ó  — t          t          | dd¦  «        pd¦  «        }t          |dd¦  «        }	 t          |pd¦  «        }n# t          t          f$ r d}Y nw xY w|dk    rdS ||k    rdS d|                      |||¦  «        fS )z<Validate Telegram media size before downloading into memory.r�  rQ  r  Nr   )TNF)r²   rl   rµ   r¶   r  )r5  rÍ  r>  r  r  Úsizes         r   Ú_telegram_media_size_allowedz,TelegramAdapter._telegram_media_size_allowed  s°   € å� Ð&6Ð8HÑIÔIÐ]ÐM]Ñ^Ô^ˆ	Ý˜F K°Ñ6Ô6ˆ	ð	Ý�y�~ AÑ&Ô&ˆDˆDøÝ�:Ð&ð 	ð 	ð 	ØˆDˆDˆDð	øøøà�1Š9ˆ9Ø�:Ø�9ÒÐØ�:Ø�d×9Ò9¸%ÀÀyÑQÔQÐQÐQs   ³A ÁAÁAÚ
audio_pathÚcaptionc              ‹   ó.	  •‡K  — | j         st          dd¬¦  «        S 	 t          j                             |¦  «        s%t          d|                      d|¦  «        ¬¦  «        S t          j        t          |¦  «        ƒ d{V —†}g }|r�	 |  	                    |¦  «        }	t          |	¦  «        dk    r!|                     |	t          j        f¦  «         n2# t          $ r% t                               d| j        d¬	¦  «         Y nw xY w|                     |dd…         df¦  «         n|                     d
¦  «         t%          |d¦  «        5 Št          j                             |¦  «        d                              ¦   «         }
|
dv �ry|                      |¦  «        }|                      ||| j        ¬¦  «        }|                      ||||| j        ¬¦  «        }d}d}|D �]\  }}	 |                      | j         j        t7          |¦  «        ‰||||t8          dœ|¥|                      |¦  «        ¥||dˆfd„¬¦  «        ƒ d{V —†} n¦# t          $ r™}|�‘dt=          |¦  «                             ¦   «         v s#dt=          |¦  «                             ¦   «         v rKt                               d| j        tA          |¦  «        ¦  «         |}‰ !                    d¦  «         Y d}~�Œ‚ d}~ww xY w|€|ptE          d¦  «        ‚nì|
dv r¼|                      |¦  «        }|                      ||| j        ¬¦  «        }|                      ||||| j        ¬¦  «        }|                      | j         j#        t7          |¦  «        ‰|r
|dd…         nd||t8          dœ|¥|                      |¦  «        ¥||dˆfd„¬¦  «        ƒ d{V —†}n,|  $                    |||||¬¦  «        ƒ d{V —†cddd¦  «         S ddd¦  «         n# 1 swxY w Y   t          dt=          |j%        ¦  «        ¬¦  «        S # t          $ rf}t           &                    d| j        tA          |¦  «        d¬	¦  «         tO          ¦   «                              |||||¬ ¦  «        ƒ d{V —†cY d}~S d}~ww xY w)!z<Send audio as a native Telegram voice message or audio file.Fr‡  rˆ  ÚAudioNr)  zF[%s] voice caption MarkdownV2 formatting failed; sending plain captionTr#   ©NNr¼   r»   >   ú.opusú.oggrõ  rº  )rK  Úvoicer  r�  r  Údurationr  r  c                  ó.   •— ‰                       d¦  «        S ©Nr   ©Úseek©Ú
audio_files   €r   r"  z,TelegramAdapter.send_voice.<locals>.<lambda>z  s   ø€ °J·O²OÀAÑ4FÔ4F€ r>   ©r?  r‘  Úentitz:[%s] voice caption MarkdownV2 rejected, retrying plain: %sr   z3Telegram send_voice failed for all caption variants>   ú.m4aú.mp3)rK  r×   r  r  r  r  r×   c                  ó.   •— ‰                       d¦  «        S r  r  r  s   €r   r"  z,TelegramAdapter.send_voice.<locals>.<lambda>¬  s   ø€ ¨J¯OªO¸AÑ,>Ô,>€ r>   )rK  Ú	file_pathr  r	  r¦  rÖ  zJ[%s] Failed to send Telegram voice/audio, falling back to base adapter: %srŠ  )(rW  r”   r   r¹   rÆ  r   r&   r£  rÙ   rœ  rŸ   r  r€   r   r   r(   r)   r   rÉ   rÆ   rÇ   r  r  r[  r  rE  Ú
send_voicer    Ú_MEDIA_SEND_READ_TIMEOUTrª  r   r0   r   r  rQ  Ú
send_audioÚsend_documentrË  r   rS  )r5  rK  r  r  r	  r¦  r  Ú_duration_secsÚ_caption_variantsÚ_formatted_captionrÔ   Ú_voice_threadrÁ  Úvoice_thread_kwargsrÝ  Ú_last_parse_errorÚ	_cap_textÚ_cap_parse_modeÚ
_cap_errorÚ_audio_threadÚaudio_thread_kwargsrN  r  r—  s                         @€r   r!  zTelegramAdapter.send_voice+  s‹  øøè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCðH	gÝ”7—>’> *Ñ-Ô-ð lÝ!¨%°t×7UÒ7UÐV]Ð_iÑ7jÔ7jÐkÑkÔkÐkõ $+Ô#4Ý-¨zñ$ô $ð ð ð ð ð ð ˆNð .0ÐØð 7ð
Ø)-×)<Ò)<¸WÑ)EÔ)EÐ&Ý Ð!3Ñ4Ô4¸Ò<Ð<Ø)×0Ò0Ø/µÔ1FÐGñô ð øøõ !ð ð ð Ý—L’Lð0Ø15´ÀTð !ñ ô ð ð ð ðøøøð
 "×(Ò(¨'°%°4°%¬.¸$Ð)?Ñ@Ô@Ð@Ð@à!×(Ò(¨Ñ6Ô6Ð6å�j $Ñ'Ô'ð ^¨:Ý”g×&Ò& zÑ2Ô2°1Ô5×;Ò;Ñ=Ô=�àÐ+Ð+Ñ+Ø$(×$<Ò$<¸XÑ$FÔ$F�MØ"&×"DÒ"DÀXÈxÐgkÔgzÐ"DÑ"{Ô"{�KØ*.×*FÒ*FØØ%Ø Ø,7Ø&*Ô&9ð +Gñ +ô +Ð'ð �CØ=AÐ%Ø6Gð %"ñ %"Ñ2˜	 ?ð$"Ø(,×(SÒ(SØ $¤	Ô 4å/IÈ'Ñ/RÔ/RØ-7Ø/8Ø2AØ;FØ0>Ý4Lð
!"ð 
!"ð ':ð
!"ð '+×&?Ò&?ÀÑ&IÔ&Ið
!"ð !)Ø +Ø 'Ø,FÐ,FÐ,FÐ,Fð! )Tñ )ô )ð #ð #ð #ð #ð #ð #˜Cð$ "˜EøÝ(ð "ð "ð "ð !0Ð ;Ø)0µC¸
±O´O×4IÒ4IÑ4KÔ4KÐ)KÐ)KØ,3µs¸:±´×7LÒ7LÑ7NÔ7NÐ,NÐ,NÝ &§¢ð%9à$(¤IÝ$?À
Ñ$KÔ$Kñ	!"ô !"ð !"ð 5?Ð 1Ø *§¢°Ñ 2Ô 2Ð 2Ø (   ¡Ø!øøøøð!"øøøð" �{Ø/ð µ<ØQñ4ô 4ð ð #ð Ð,Ð,Ð,à$(×$<Ò$<¸XÑ$FÔ$F�MØ"&×"DÒ"DÀXÈxÐgkÔgzÐ"DÑ"{Ô"{�KØ*.×*FÒ*FØØ%Ø Ø,7Ø&*Ô&9ð +Gñ +ô +Ð'ð !%× KÒ KØœ	Ô,å'AÀ'Ñ'JÔ'JØ%/Ø9@Ð'J w¨u°¨u¤~ ~ÀdØ3>Ø(6Ý,Dð	ð 	ð 2ð	ð #×7Ò7¸ÑAÔAð	ð !Ø#ØØ$>Ð$>Ð$>Ð$>ð !Lñ !ô !ð ð ð ð ð ð �C�Cð( "&×!3Ò!3Ø 'Ø",Ø 'Ø!)Ø!)ð "4ñ "ô "ð ð ð ð ð ð ðq^ð ^ð ^ð ^ñ ^ô ^ð ^ð ^ð ^ð ^ð ^ñ ^ô ^ð ^ð ^ð ^ð ^ð ^ð ^øøøð ^ð ^ð ^ð ^õ~  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	gð 	gð 	gÝ�LŠLØ\Ø”	Ý+¨AÑ.Ô.Øð	 ñ ô ð õ ™œ×+Ò+¨G°ZÀÈ(Ð]eÐ+ÑfÔfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐføøøøð	gøøøs©   žAP$ Á"$P$ ÂA	C ÃP$ Ã,D Ã=P$ Ã?D Ä AP$ ÅBO6Ç#AIÉO6É
K'ÉBK"ËO6Ë!K"Ë"K'Ë'C6O6ÏP$ Ï*P$ Ï6O:Ï:P$ Ï=O:Ï>%P$ Ð$
RÐ.ARÒ	RÒRrG   ÚimagesÚhuman_delayc              ƒ   óÜ  •‡‡‡K  — | j         sdS |sdS 	 ddlm} nc# t          $ rV}t                               d| j        |¦  «         t          ¦   «                              ||||¦  «        ƒ d{V —† Y d}~dS d}~ww xY wg }g Š|D ]^\  }}	| 	                    d¦  «        s-|  
                    |¦  «        r|                     ||	f¦  «         ŒG‰                     ||	f¦  «         Œ_|r+t          ¦   «                              ||||¬¦  «        ƒ d{V —† ‰sdS ddlm}
 |                      |¦  «        }dŠˆˆfd	„t          dt!          ‰¦  «        ‰¦  «        D ¦   «         }t#          |¦  «        D �]þ\  }}|dk    r |dk    rt%          j        |¦  «        ƒ d{V —† g }g Š	 |D ]â\  }}	|	r
|	dd
…         nd}| 	                    d¦  «        rš |
|dd…         ¦  «        }t(          j                             |¦  «        s"t                               d| j        |¦  «         Œ|t/          |d¦  «        }‰                     |¦  «         |                      |||¬¦  «        ¦  «         ŒÂ|                      |||¬¦  «        ¦  «         Œã|s-	 ‰D ]'}	 |                     ¦   «          Œ# t          $ r Y Œ$w xY w�ŒEt                               d| j        t!          |¦  «        |dz   t!          |¦  «        ¦  «         |                      d|| j        ¬¦  «        }|                      ||||| j        ¬¦  «        }dˆfd„}|                      | j         j        t?          |¦  «        ||t@          dœ|¥|  !                    |¦  «        ¥||d|¬¦  «        ƒ d{V —† n„# t          $ rw}t                               d| j        |dz   t!          |¦  «        tE          |¦  «        d¬¦  «         t          ¦   «                              ||||¬¦  «        ƒ d{V —† Y d}~nd}~ww xY w‰D ]'}	 |                     ¦   «          Œ# t          $ r Y Œ$w xY w�ŒÑ# ‰D ]'}	 |                     ¦   «          Œ# t          $ r Y Œ$w xY ww xY wdS )a)  Send a batch of images natively via Telegram's media group API.

        Telegram's ``send_media_group`` bundles up to 10 photos/videos into
        a single album. Larger batches are chunked. Animated GIFs cannot
        go into a media group (they require ``send_animation``), so they
        are peeled off and sent individually via the base default path.

        URL-based photos go into the group directly; local files are
        opened as byte streams. On failure the whole batch falls back to
        the base adapter's per-image loop.
        Nr   )ÚInputMediaPhotozD[%s] InputMediaPhoto unavailable, falling back to per-image send: %szfile://)r1  )Úunquoter[  c                 ó*   •— g | ]}‰||‰z   …         ‘ŒS rŠ   rŠ   )rM  rŽ  ÚCHUNKÚphotoss     €€r   rì  z8TelegramAdapter.send_multiple_images.<locals>.<listcomp>ú  s&   ø€ ÐLÐLÐL¨!�&˜˜1˜u™9˜Ô%ÐLÐLÐLr>   r)  é   z.[%s] Skipping missing image in media group: %sr¼   )Úmediar  z5[%s] Sending media group of %d photo(s) (chunk %d/%d)r»   rõ  rº  r   c                  ó^   •— ‰D ](} 	 |                       d¦  «         Œ# t          $ r Y Œ%w xY wd S r  )r  r   )ÚfhÚopened_filess    €r   Ú_reset_opened_fileszATelegramAdapter.send_multiple_images.<locals>._reset_opened_files#  sR   ø€ Ø*ð !ð !˜ð!ØŸGšG A™JœJ˜J˜JøÝ(ð !ð !ð !Ø ˜Dð!øøøð!ð !s   ‡�
*©*)rK  r9  r  r  zmedia groupr  zI[%s] send_media_group failed (chunk %d/%d), falling back to per-image: %sTr#   rJ   )#rW  rá   r3  r   r(   r0   r   rS  Úsend_multiple_imagesr¡  Ú_is_animation_urlr  rR  r4  r  r‘  r€  rŸ  r&   ra  r   r¹   rÆ  rÉ   Úcloser½   r  r[  r  rE  Úsend_media_groupr    r"  rª  r   )r5  rK  r0  r¦  r1  r3  r¬  Ú
animationsÚ	image_urlÚalt_textÚ_unquoteÚ_threadr¤  Ú	chunk_idxrŽ  r9  r  Ú
local_pathr;  rÁ  rÂ  r=  rN  r6  r<  r7  r—  s                          @@@€r   r>  z$TelegramAdapter.send_multiple_imagesÂ  sS  øøøøè è € ð$ Œyð 	ØˆFØð 	ØˆFð	Ø0Ð0Ð0Ð0Ð0Ð0Ð0øÝð 	ð 	ð 	Ý�NŠNØVØ”	˜3ñô ð õ ‘'”'×.Ò.¨w¸ÀÈ+ÑVÔVÐVÐVÐVÐVÐVÐVÐVØˆFˆFˆFˆFˆFøøøøð	øøøð #%ˆ
Ø ˆØ#)ð 	5ð 	5ÑˆI�xØ×'Ò'¨	Ñ2Ô2ð 5°t×7MÒ7MÈiÑ7XÔ7Xð 5Ø×!Ò! 9¨hÐ"7Ñ8Ô8Ð8Ð8à—’˜y¨(Ð3Ñ4Ô4Ð4Ð4ð ð 	Ý‘'”'×.Ò.Ø˜ X¸;ð /ñ ô ð ð ð ð ð ð ð ð ð 	ØˆFà4Ð4Ð4Ð4Ð4Ð4Ø×*Ò*¨8Ñ4Ô4ˆð ˆØLÐLÐLÐLÐL­u°Q½¸F¹¼ÀUÑ/KÔ/KÐLÑLÔLˆå )¨&Ñ 1Ô 1ð L	ñ L	ÑˆI�uØ˜QŠˆ 9¨q¢= =Ý”m KÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0à!ˆEØ&(ˆLðFØ+0ð Xð XÑ'�I˜xØ19ÐC˜h u¨ uœo˜o¸t�GØ ×+Ò+¨IÑ6Ô6ð XØ%- X¨i¸¸¸¬mÑ%<Ô%<˜
Ý!œwŸ~š~¨jÑ9Ô9ð %Ý"ŸNšNØ PØ $¤	¨:ñô ð ð %Ý! *¨dÑ3Ô3˜Ø$×+Ò+¨BÑ/Ô/Ð/ØŸš _ _¸2ÀwÐ%OÑ%OÔ%OÑPÔPÐPÐPàŸš _ _¸9ÈgÐ%VÑ%VÔ%VÑWÔWÐWÐWàð Øð` 'ð ð �BðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøñõ] —’ØKØ”I�s 5™zœz¨9°q©=½#¸f¹+¼+ñô ð ð #×@Ò@ÀÀxÐ_cÔ_rÐ@ÑsÔs�Ø $× <Ò <ØØØØ(3Ø"&Ô"5ð !=ñ !ô !�ð!ð !ð !ð !ð !ð !ð ×AÒAØ”IÔ.å#=¸gÑ#FÔ#FØ!&Ø/:Ý(@ð	ð ð
 (ðð ×3Ò3°HÑ=Ô=ðð ØØ!Ø 3ð Bñ ô ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	Ý—’Ø_Ø”I˜y¨1™}­c°&©k¬kÕ;VÐWXÑ;YÔ;YØ!ð ñ ô ð õ ‘g”g×2Ò2Ø˜U H¸+ð 3ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øøøøð	øøøð 'ð ð �BðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøñø˜,ð ð �BðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøðøøøðQL	ð L	s–   • œ
A<¦AA7Á7A<ÆC'NÊ
JÊ
J,Ê+J,Ê1CNÎP=Î
PÎA-P	ÐP=Ð	PÐP=ÐP+Ð+
P8Ð7P8Ð=Q)ÑQÑQ)Ñ
Q%Ñ"Q)Ñ$Q%Ñ%Q)Ú
image_pathc           
   ‹   ó(  •‡K  — | j         st          dd¬¦  «        S 	 t          j                             |¦  «        s%t          d|                      d|¦  «        ¬¦  «        S |                      |¦  «        }|                      ||| j        ¬¦  «        }|  	                    ||||| j        ¬¦  «        }	t          |d¦  «        5 Š|                      | j         j        t          |¦  «        ‰|r
|dd	…         nd|t          d
œ|	¥|                      |¦  «        ¥||dˆfd„¬¦  «        ƒ d{V —†}
ddd¦  «         n# 1 swxY w Y   t          dt!          |
j        ¦  «        ¬¦  «        S # t$          $ �r}t!          |¦  «        }d|v pd|v }|r"t&                               d| j        |¦  «         n0t&                               d| j        t/          |¦  «        d¬¦  «         	 |                      |||t          j                             |¦  «        ||¬¦  «        ƒ d{V —†cY d}~S # t$          $ r^}t&                               d| j        |d¬¦  «         t7          ¦   «                              |||||¬¦  «        ƒ d{V —†cY d}~cY d}~S d}~ww xY wd}~ww xY w)z5Send a local image file natively as a Telegram photo.Fr‡  rˆ  ÚImagerõ  rº  r¼   Nr)  ©rK  Úphotor  r  r  rM  c                  ó.   •— ‰                       d¦  «        S r  r  )Ú
image_files   €r   r"  z1TelegramAdapter.send_image_file.<locals>.<lambda>s  s   ø€ ¨
¯ª¸Ñ(:Ô(:€ r>   r  TrÖ  ÚPhoto_invalid_dimensionsÚPHOTO_INVALID_DIMENSIONSzK[%s] Image dimensions exceed Telegram photo limits, sending as document: %szO[%s] Failed to send Telegram local image as photo, trying document fallback: %sr#   )rK  r   r  Ú	file_namer	  r¦  zV[%s] Failed to send Telegram local image as document, falling back to base adapter: %srŠ  )rW  r”   r   r¹   rÆ  r   r  r  r[  r  rÉ   rE  Ú
send_photor    r"  rª  r   rË  r   r(   r½   r   r0   r   r$  Úbasenamer   rS  Úsend_image_file)r5  rK  rI  r  r	  r¦  r  rF  rÁ  rÂ  rÝ  rN  Ú	error_strÚis_dim_errorÚdoc_errrO  r—  s                  @€r   rU  zTelegramAdapter.send_image_fileJ  sÌ  øøè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCðO	pÝ”7—>’> *Ñ-Ô-ð lÝ!¨%°t×7UÒ7UÐV]Ð_iÑ7jÔ7jÐkÑkÔkÐkà×.Ò.¨xÑ8Ô8ˆGØ×<Ò<¸XÀxÐ_cÔ_rÐ<ÑsÔsˆKØ ×8Ò8ØØØØ$/Ø"Ô1ð 9ñ ô ˆMõ �j $Ñ'Ô'ð ¨:Ø ×GÒGØ”IÔ(å#=¸gÑ#FÔ#FØ!+Ø5<Ð#F 7¨5¨D¨5¤> >À$Ø/:Ý(@ðð ð (ðð ×3Ò3°HÑ=Ô=ðð ØØØ :Ð :Ð :Ð :ð Hñ ô ð ð ð ð ð ð �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ"  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 0	pñ 0	pð 0	pÝ˜A™œˆIð +¨iÐ7ð ;Ø-°Ð:ð ð ð Ý—’ð.à”IØñ	ô ð ð õ —’ð3à”IÝ/°Ñ2Ô2Ø!ð ñ ô ð ðpØ!×/Ò/Ø#Ø(Ø#Ý œg×.Ò.¨zÑ:Ô:Ø%Ø%ð 0ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øõ ð pð pð pÝ—’ð7à”IØØ!ð ñ ô ð õ #™WœW×4Ò4°W¸jÈ'ÐS[ÐfnÐ4ÑoÔoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoÐoøøøøðpøøøøøøøðQ0	pøøøs|   žAE' Á"A!E' ÃA*D9Ä-E' Ä9D=Ä=E' Å D=Å%E' Å'JÅ2A+JÇ=H!ÈJÈ!
J	È+AJÉ9J	É:JÉ>JÊJ	Ê	JÊJr   rR  c              ‹   óö  •‡K  — | j         st          dd¬¦  «        S 	 t          j                             |¦  «        s%t          d|                      d|¦  «        ¬¦  «        S |pt          j                             |¦  «        }|                      |¦  «        }	|                      ||| j	        ¬¦  «        }
|  
                    ||	||
| j	        ¬¦  «        }t          |d¦  «        5 Š|                      | j         j        t          |¦  «        ‰||r
|dd	…         nd|
t          d
œ|¥|                      |¦  «        ¥||
dˆfd„¬¦  «        ƒ d{V —†}ddd¦  «         n# 1 swxY w Y   t          dt#          |j        ¦  «        ¬¦  «        S # t&          $ re}t(                               d| j        t/          |¦  «        ¦  «         t1          ¦   «                              ||||||¬¦  «        ƒ d{V —†cY d}~S d}~ww xY w)z<Send a document/file natively as a Telegram file attachment.Fr‡  rˆ  rÍ   rõ  rº  r¼   Nr)  )rK  ÚdocumentÚfilenamer  r  r  rZ  c                  ó.   •— ‰                       d¦  «        S r  r  ©rÌ  s   €r   r"  z/TelegramAdapter.send_document.<locals>.<lambda>Õ  ó   ø€ ¨¯ª¨q©	¬	€ r>   r  TrÖ  z [%s] Failed to send document: %srŠ  )rW  r”   r   r¹   rÆ  r   rT  r  r  r[  r  rÉ   rE  r$  r    r"  rª  r   rË  r   r(   r0   r   r   rS  )r5  rK  r   r  rR  r	  r¦  r  Údisplay_namerF  rÁ  rÂ  rÝ  rN  rÌ  r—  s                 @€r   r$  zTelegramAdapter.send_document¨  s©  øøè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð'	tÝ”7—>’> )Ñ,Ô,ð jÝ!¨%°t×7UÒ7UÐV\Ð^gÑ7hÔ7hÐiÑiÔiÐià$ÐC­¬×(8Ò(8¸Ñ(CÔ(CˆLØ×.Ò.¨xÑ8Ô8ˆGØ×<Ò<¸XÀxÐ_cÔ_rÐ<ÑsÔsˆKØ ×8Ò8ØØØØ$/Ø"Ô1ð 9ñ ô ˆMõ �i Ñ&Ô&ð ¨!Ø ×GÒGØ”IÔ+å#=¸gÑ#FÔ#FØ$%Ø$0Ø5<Ð#F 7¨5¨D¨5¤> >À$Ø/:Ý(@ð	ð 	ð (ð	ð ×3Ò3°HÑ=Ô=ð	ð ØØØ 1Ð 1Ð 1Ð 1ð Hñ ô ð ð ð ð ð ð �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ$  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	tð 	tð 	tÝ�NŠNØ2Ø”	Õ6°qÑ9Ô9ñô ð õ ™œ×.Ò.¨w¸	À7ÈIÐW_ÐjrÐ.ÑsÔsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsøøøøð	tøøøsK   žAF	 Á"BF	 Ã$A+EÅF	 ÅEÅF	 Å"EÅ#%F	 Æ	
G8ÆAG3Ç-G8Ç3G8Ú
video_pathc           
   ‹   ó°  •‡K  — | j         st          dd¬¦  «        S 	 t          j                             |¦  «        s%t          d|                      d|¦  «        ¬¦  «        S |                      |¦  «        }|                      ||| j        ¬¦  «        }|  	                    ||||| j        ¬¦  «        }	t          |d¦  «        5 Š|                      | j         j        t          |¦  «        ‰|r
|dd	…         nd|t          d
œ|	¥|                      |¦  «        ¥||dˆfd„¬¦  «        ƒ d{V —†}
ddd¦  «         n# 1 swxY w Y   t          dt!          |
j        ¦  «        ¬¦  «        S # t$          $ rd}t&                               d| j        t-          |¦  «        ¦  «         t/          ¦   «                              |||||¬¦  «        ƒ d{V —†cY d}~S d}~ww xY w)z2Send a video natively as a Telegram video message.Fr‡  rˆ  ÚVideorõ  rº  r¼   Nr)  )rK  Úvideor  r  r  rc  c                  ó.   •— ‰                       d¦  «        S r  r  r]  s   €r   r"  z,TelegramAdapter.send_video.<locals>.<lambda>  r^  r>   r  TrÖ  z[%s] Failed to send video: %srŠ  )rW  r”   r   r¹   rÆ  r   r  r  r[  r  rÉ   rE  Ú
send_videor    r"  rª  r   rË  r   r(   r0   r   r   rS  )r5  rK  r`  r  r	  r¦  r  rF  rÁ  rÂ  rÝ  rN  rÌ  r—  s               @€r   re  zTelegramAdapter.send_videoß  s‰  øøè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð$	gÝ”7—>’> *Ñ-Ô-ð lÝ!¨%°t×7UÒ7UÐV]Ð_iÑ7jÔ7jÐkÑkÔkÐkà×.Ò.¨xÑ8Ô8ˆGØ×<Ò<¸XÀxÐ_cÔ_rÐ<ÑsÔsˆKØ ×8Ò8ØØØØ$/Ø"Ô1ð 9ñ ô ˆMõ �j $Ñ'Ô'ð ¨1Ø ×GÒGØ”IÔ(å#=¸gÑ#FÔ#FØ!"Ø5<Ð#F 7¨5¨D¨5¤> >À$Ø/:Ý(@ðð ð (ðð ×3Ò3°HÑ=Ô=ðð ØØØ 1Ð 1Ð 1Ð 1ð Hñ ô ð ð ð ð ð ð �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ"  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	gð 	gð 	gÝ�NŠNØ/Ø”	Õ6°qÑ9Ô9ñô ð õ ™œ×+Ò+¨G°ZÀÈ(Ð]eÐ+ÑfÔfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐføøøøð	gøøøsK   žAE' Á"A!E' ÃA*D9Ä-E' Ä9D=Ä=E' Å D=Å%E' Å'
GÅ1AGÇ
GÇGrC  c           
   ƒ   óR  •K  — | j         st          dd¬¦  «        S ddlm}  ||¦  «        sLt                               d| j        ¦  «         t          ¦   «                              |||||¬¦  «        ƒ d{V —†S 	 |  	                    |¦  «        }|  
                    ||| j        ¬	¦  «        }|                      ||||| j        ¬
¦  «        }	|                      | j         j        t          |¦  «        ||r
|dd…         nd|t           dœ|	¥|                      |¦  «        ¥||d¦  «        ƒ d{V —†}
t          dt%          |
j        ¦  «        ¬¦  «        S # t(          $ �rÉ}t                               d| j        t+          |¦  «        d¬¦  «         	 ddlm} ddlm}  |dd|gi¬¦  «        4 ƒd{V —†	 }|                     |¦  «        ƒ d{V —†}|                     ¦   «          |j        }ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |                      ||||| j        ¬
¦  «        }|                      | j         j        t          |¦  «        ||r
|dd…         nd|t           dœ|¥|                      |¦  «        ¥||d¦  «        ƒ d{V —†}
t          dt%          |
j        ¦  «        ¬¦  «        cY d}~S # t(          $ r^}t                               d| j        |d¬¦  «         t          ¦   «                              |||||¬¦  «        ƒ d{V —†cY d}~cY d}~S d}~ww xY wd}~ww xY w)zÎSend an image natively as a Telegram photo.
        
        Tries URL-based send first (fast, works for <5MB images).
        Falls back to downloading and uploading as file (supports up to 10MB).
        Fr‡  rˆ  r   )Úis_safe_urlz/[%s] Blocked unsafe image URL (SSRF protection)rŠ  Nrõ  rº  r)  rL  z	URL photoTrÖ  z8[%s] URL-based send_photo failed, trying file upload: %sr#   )Ú_ssrf_redirect_guard)Úcreate_ssrf_safe_async_clientr  Úresponse)r,   Úevent_hookszuploaded photoz+[%s] File upload send_photo also failed: %s)rW  r”   Útools.url_safetyrg  r(   r0   r   rS  Ú
send_imager  r  r[  r  rE  rS  r    r"  rª  r   rË  r   r   Úgateway.platforms.baserh  ri  r‡  Úraise_for_statusr~  r   )r5  rK  rC  r  r	  r¦  rg  Ú_photo_threadrÁ  Úphoto_thread_kwargsrÝ  rN  rh  ri  ÚclientÚrespÚ
image_dataÚupload_thread_kwargsÚe2r—  s                      €r   rm  zTelegramAdapter.send_image  së  øè è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCà0Ð0Ð0Ð0Ð0Ð0Øˆ{˜9Ñ%Ô%ð 	fÝ�NŠNÐLÈdÌiÑXÔXÐXÝ™œ×+Ò+¨G°YÀÈÐ\dÐ+ÑeÔeÐeÐeÐeÐeÐeÐeÐeðN	jà ×4Ò4°XÑ>Ô>ˆMØ×<Ò<¸XÀxÐ_cÔ_rÐ<ÑsÔsˆKØ"&×">Ò">ØØØØ$/Ø"Ô1ð #?ñ #ô #Ðð ×CÒCØ”	Ô$å9¸'ÑBÔBØ&Ø18ÐB˜w u¨ uœ~˜~¸dØ+6Ý$<ðð ð *ðð ×/Ò/°Ñ9Ô9ðð ØØñô ð ð ð ð ð ð ˆCõ  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 3	jñ 3	jð 3	jÝ�NŠNØJØ”	Ý+¨AÑ.Ô.Øð	 ñ ô ð ð+jØGÐGÐGÐGÐGÐGØJÐJÐJÐJÐJÐJà8Ð8Ø Ø!+Ð.BÐ-CÐ Dðñ ô ð .ð .ð .ð .ð .ð .ð .ð .ð Ø!'§¢¨IÑ!6Ô!6Ð6Ð6Ð6Ð6Ð6Ð6�DØ×)Ò)Ñ+Ô+Ð+Ø!%¤�Jð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð (,×'CÒ'CØØ!ØØ(3Ø"&Ô"5ð (Dñ (ô (Ð$ð !×GÒGØ”IÔ(å#=¸gÑ#FÔ#FØ!+Ø5<Ð#F 7¨5¨D¨5¤> >À$Ø/:Ý(@ðð ð /ðð ×3Ò3°HÑ=Ô=ðð ØØ$ñô ð ð ð ð ð ð �õ "¨$½3¸s¼~Ñ;NÔ;NÐOÑOÔOÐOÐOÐOÐOÐOÐOøÝð jð jð jÝ—’ØAØ”IØØ!ð	 ñ ô ð õ #™WœW×/Ò/°¸ÀGÈXÐ`hÐ/ÑiÔiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiÐiøøøøðjøøøøøøøðW3	jøøøsu   Á:CE ÅL&Å0L!Æ"J6Æ17G:Ç(J6Ç:
H	ÈJ6ÈH	ÈB(J6Ê0L&Ê6
LË ALÌLÌL!ÌL&ÌLÌL!Ì!L&Úanimation_urlc           	   ƒ   ó¶  K  — | j         st          dd¬¦  «        S 	 |                      |¦  «        }|                      ||| j        ¬¦  «        }|                      ||||| j        ¬¦  «        }|                      | j         j        t          |¦  «        ||r
|dd…         nd|t          dœ|¥|  
                    |¦  «        ¥||d	¦  «        ƒ d{V —†}	t          d
t          |	j        ¦  «        ¬¦  «        S # t          $ rZ}
t                               d| j        t#          |
¦  «        d
¬¦  «         |                      |||||¬¦  «        ƒ d{V —†cY d}
~
S d}
~
ww xY w)zJSend an animated GIF natively as a Telegram animation (auto-plays inline).Fr‡  rˆ  rõ  rº  Nr)  )rK  Ú	animationr  r  r  ry  TrÖ  zA[%s] Failed to send Telegram animation, falling back to photo: %sr#   rŠ  )rW  r”   r  r  r[  r  rE  Úsend_animationr    r"  rª  r   rË  r   r(   r   r   r   rm  )r5  rK  rw  r  r	  r¦  Ú_anim_threadrÁ  Úanimation_thread_kwargsrÝ  rN  s              r   rz  zTelegramAdapter.send_animationw  sÚ  è è € ð Œyð 	DÝ e°?ÐCÑCÔCÐCð"	gØ×3Ò3°HÑ=Ô=ˆLØ×<Ò<¸XÀxÐ_cÔ_rÐ<ÑsÔsˆKØ&*×&BÒ&BØØØØ$/Ø"Ô1ð 'Cñ 'ô 'Ð#ð ×CÒCØ”	Ô(å9¸'ÑBÔBØ!.Ø18ÐB˜w u¨ uœ~˜~¸dØ+6Ý$<ðð ð .ðð ×/Ò/°Ñ9Ô9ðð ØØñô ð ð ð ð ð ð ˆCõ  dµs¸3¼>Ñ7JÔ7JÐKÑKÔKÐKøÝð 	gð 	gð 	gÝ�LŠLØSØ”	Ý+¨AÑ.Ô.Øð	 ñ ô ð ð Ÿš¨°-ÀÈ(Ð]e˜ÑfÔfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐfÐføøøøð	gøøøs   œCC4 Ã4
EÃ>AEÅEÅEc                 ó–  ‡— t          | dd¦  «        }|�dS t          | dd¦  «        pt          | dd¦  «        }t          |t          ¦  «        r|dk    s|dk    rdS t          | ¦  «                             ¦   «         Št          ˆfd„d	D ¦   «         ¦  «        rdS t          | t          t          t          t          j        f¦  «        rdS d
S )z:Return True for Telegram typing errors worth cooling down.rÒ  NTr  r�  i­  iô  c              3   ó    •K  — | ]}|‰v V — Œ	d S r7   rŠ   )rM  r8  r   s     €r   rè  z=TelegramAdapter._is_transient_typing_error.<locals>.<genexpr>³  s'   øè è € ÐtÐt &ˆv˜ˆ~ÐtÐtÐtÐtÐtÐtr>   )ztoo many requestsz
rate limitrÑ  r,   ÚtemporarF)
rl   r0  r²   r   rÇ   ré  r]  rY   ÚConnectionErrorr&   )r¬  rÒ  r  r   s      @r   Ú_is_transient_typing_errorz*TelegramAdapter._is_transient_typing_error§  sØ   ø€ õ ˜c =°$Ñ7Ô7ˆØÐ"Ø�4å˜c =°$Ñ7Ô7ÐU½7À3ÈÐPTÑ;UÔ;UˆÝ�k¥3Ñ'Ô'ð 	¨[¸CÒ-?Ð-?À;ÐRUÒCUÐCUØ�4å�3‰xŒx�~Š~ÑÔˆÝÐtÐtÐtÐtÐ,sÐtÑtÔtÑtÔtð 	Ø�4Ý�c�G¥\µ?ÅGÔDXÐYÑZÔZð 	Ø�4Øˆur>   c                 ó€  — t          | d¦  «        si | _        t          j        ¦   «         }t	          |dd¦  «        }	 |�t          |¦  «        n| j        }n# t          t          f$ r
 | j        }Y nw xY wt          dt          |d¦  «        ¦  «        }|                     ¦   «         |z   | j        t          |¦  «        <   dS )zJSuppress Telegram typing refreshes for this chat after transient failures.rb  rÒ  Nr?  r  )r%  rb  r&   rL   rl   r´   rd  rµ   r¶   rQ   r0  rp  r   )r5  rK  r¬  rA   rÒ  ri  s         r   Ú_record_typing_cooldownz'TelegramAdapter._record_typing_cooldown¹  sÈ   € å�tÐ>Ñ?Ô?ð 	6Ø35ˆDÔ0ÝÔ'Ñ)Ô)ˆÝ˜c =°$Ñ7Ô7ˆð	;Ø*5Ð*A•E˜+Ñ&Ô&Ð&ÀtÔGmˆEˆEøÝ�:Ð&ð 	;ð 	;ð 	;ØÔ:ˆEˆEˆEð	;øøøå�C�˜U EÑ*Ô*Ñ+Ô+ˆØ=A¿YºY¹[¼[È5Ñ=PˆÔ,­S°©\¬\Ñ:Ð:Ð:s   ½A ÁA1Á0A1c                 ó>  — t          | d¦  «        si | _        d| _        | j                             t	          |¦  «        ¦  «        }|€dS t          j        ¦   «                              ¦   «         |k     rdS | j                             t	          |¦  «        d ¦  «         dS )Nrb  r  FT)	r%  rb  rd  r‡  r   r&   rL   rp  rB  )r5  rK  Úuntils      r   Ú_typing_in_cooldownz#TelegramAdapter._typing_in_cooldownÆ  s”   € Ý�tÐ>Ñ?Ô?ð 	:Ø35ˆDÔ0Ø59ˆDÔ2ØÔ4×8Ò8½¸W¹¼ÑFÔFˆØˆ=Ø�5ÝÔ#Ñ%Ô%×*Ò*Ñ,Ô,¨uÒ4Ð4Ø�4ØÔ,×0Ò0µ°W±´¸tÑDÔDÐDØˆur>   c              ƒ   óÌ  K  — | j         r|                      |¦  «        rdS d}d}	 |                      |¦  «        }t          |o|                     d¦  «        ¦  «        }|                      |¦  «        }| j                              t          |¦  «        d|¬¦  «        ƒ d{V —† | j         	                    t          |¦  «        d¦  «         dS # t          $ �r
}|r¢|� 	 | j                              t          |¦  «        d¬¦  «        ƒ d{V —† | j         	                    t          |¦  «        d¦  «         Y d}~dS # t          $ r5}|                      |¦  «        r|                      ||¦  «         Y d}~n3d}~ww xY w|                      |¦  «        r|                      ||¦  «         t                               d| j        t#          |¦  «        d¬	¦  «         Y d}~dS d}~ww xY w)
zSend typing indicator.NFr  Útyping)rK  ÚactionrÚ  )rK  r‰  z1[%s] Failed to send Telegram typing indicator: %sTr#   )rW  r†  r  r…  r‡  r  Úsend_chat_actionr    rb  rB  r   r   r�  rƒ  r(   r)   r   r   )r5  rK  r¦  Ú_is_dm_topicrÚ  Ú_typing_threadrN  Úfallback_excs           r   r›  zTelegramAdapter.send_typingÒ  su  è è € àŒyð 	˜D×4Ò4°WÑ=Ô=ð 	ØˆFà"ˆØ+/Ðð!	Ø!×5Ò5°hÑ?Ô?ˆNÝ Ð ]¨X¯\ª\Ð:\Ñ-]Ô-]Ñ^Ô^ˆLØ $× BÒ BÀ>Ñ RÔ RÐØ”)×,Ò,Ý2°7Ñ;Ô;ØØ"3ð -ñ ô ð ð ð ð ð ð ð ð
 Ô0×4Ò4µS¸±\´\À4ÑHÔHÐHÐHÐHøÝð 	ñ 	ð 	ð ð 9Ð 1Ð =ð	LØœ)×4Ò4Ý :¸7Ñ CÔ CØ'ð 5ñ ô ð ð ð ð ð ð ð ð Ô8×<Ò<½SÀ¹\¼\È4ÑPÔPÐPØ�F�F�F�F�FøÝ ð Lð Lð LØ×6Ò6°|ÑDÔDð LØ×4Ò4°W¸lÑKÔKÐKøøøøøøøøøðLøøøð ×0Ò0°Ñ3Ô3ð 9Ø×,Ò,¨W°aÑ8Ô8Ð8å�LŠLØCØ”	Ý+¨AÑ.Ô.Øð	 ñ ô ð ð ð ð ð ð ð øøøøð%	øøøs>   ¦B&C ÃG#ÃGÃAD;Ä;
E:Å+E5Å0GÅ5E:Å:AGÇG#c           	   ƒ   óZ  K  — | j         sdddœS 	 | j                              t          |¦  «        ¦  «        ƒ d{V —†}d}|j        t          j        k    rd}n8|j        t          j        k    rd}|j        rd}n|j        t          j        k    rd}|j	        p|j
        pt          |¦  «        ||j        t          |dd	¦  «        d
œS # t          $ r[}t                               d| j        |t%          |¦  «        d¬¦  «         t          |¦  «        dt          |¦  «        dœcY d}~S d}~ww xY w)z&Get information about a Telegram chat.ÚUnknownr¶  )r   rÙ  Nr  r¹  rô  rÜ  F)r   rÙ  rÕ  rÜ  z0[%s] Failed to get Telegram chat info for %s: %sTr#   )r   rÙ  r   )rW  Úget_chatr    rÙ  r�   ÚGROUPÚ
SUPERGROUPrÜ  ÚCHANNELrØ  rÖ  r   rÕ  rl   r   r(   r   r   r   )r5  rK  rÓ  r¬  rN  s        r   Úget_chat_infozTelegramAdapter.get_chat_infoü  sn  è è € àŒyð 	5Ø%¨tÐ4Ð4Ð4ð	IØœ×+Ò+Õ,FÀwÑ,OÔ,OÑPÔPÐPÐPÐPÐPÐPÐPˆDàˆIØŒy�HœNÒ*Ð*Ø#�	�	Ø”�hÔ1Ò1Ð1Ø#�	Ø”=ð (Ø '�IøØ”�hÔ.Ò.Ð.Ø%�	ð œ
ÐD d¤nÐD½¸G¹¼Ø!Ø œMÝ# D¨*°eÑ<Ô<ð	ð ð øõ ð 	Ið 	Ið 	IÝ�LŠLØBØ”	ØÝ+¨AÑ.Ô.Øð ñ ô ð õ   ™LœL°$ÅÀQÁÄÐHÐHÐHÐHÐHÐHÐHÐHøøøøð	Iøøøs   �B4C Ã
D*ÃAD%ÄD*Ä%D*c                 ó@  ‡‡‡— |s|S i ŠdgŠdt           dt           fˆˆfd„Š|}t          |¦  «        }ˆfd„}t          j        d||¦  «        }t          j        dˆfd„|¦  «        }ˆfd	„}t          j        d
||¦  «        }ˆfd„}t          j        d||t          j        ¬¦  «        }t          j        dˆfd„|¦  «        }t          j        dˆfd„|¦  «        }t          j        dˆfd„|¦  «        }t          j        dˆfd„|¦  «        }ˆfd„}t          j        d||t          j        ¬¦  «        }t          |¦  «        }t          t          ‰                     ¦   «         ¦  «        ¦  «        D ]}| 	                    |‰|         ¦  «        }Œt          j
        d|¦  «        }g }	t          |¦  «        D ]R\  }
}|
dz  dk    r|	                     |¦  «         Œ$|fd„}|	                     t          j        d||¦  «        ¦  «         ŒSd                     |	¦  «        }|S )af  
        Convert standard markdown to Telegram MarkdownV2 format.

        Protected regions (code blocks, inline code) are extracted first so
        their contents are never modified.  Standard markdown constructs
        (headers, bold, italic, links) are translated to MarkdownV2 syntax,
        and all remaining special characters are escaped.
        r   r°   r   c                 óJ   •— d‰d         › d�}‰dxx         dz  cc<   | ‰|<   |S )z@Stash *value* behind a placeholder token that survives escaping.z PHr   ú r»   rŠ   )r°   rç  ÚcounterÚplaceholderss     €€r   Ú_phz+TelegramAdapter.format_message.<locals>._ph-  s;   ø€ à+˜7 1œ:Ð+Ð+Ð+ˆCØ�AˆJˆJŒJ˜!‰OˆJˆJ‰JØ %ˆL˜ÑØˆJr>   c                 ó,  •— |                       d¦  «        }d|dd …         v r|                     d¦  «        dz   nd}|d |…         }||d …         }|d d…         }|                     dd¦  «                             dd	¦  «        } ‰||z   d
z   ¦  «        S )Nr   r
  rŒ   r»   éýÿÿÿú\ú\\ú`z\`z```)r  ÚindexrÁ   )r  r1  Úopen_endÚopeningÚbody_and_closeÚbodyrš  s         €r   Ú_protect_fencedz7TelegramAdapter.format_message.<locals>._protect_fenced<  sŸ   ø€ Ø—'’'˜!‘*”*ˆCà.2°c¸!¸"¸"´g¨o¨o�s—y’y ‘”¨Ñ*Ð*À1ˆHØ˜)˜8˜)”nˆGØ    œ^ˆNØ! # 2 #Ô&ˆDØ—<’<  fÑ-Ô-×5Ò5°c¸5ÑAÔAˆDØ�3�w ‘~¨Ñ-Ñ.Ô.Ð.r>   z(```(?:[^\n]*\n)?[\s\S]*?```)z	(`[^`]+`)c                 óh   •—  ‰|                       d¦  «                             dd¦  «        ¦  «        S )Nr   r�  rž  )r  rÁ   ©r  rš  s    €r   r"  z0TelegramAdapter.format_message.<locals>.<lambda>P  s+   ø€ �c�c˜!Ÿ'š' !™*œ*×,Ò,¨T°6Ñ:Ô:Ñ;Ô;€ r>   c                 óæ   •— t          |                      d¦  «        ¦  «        }|                      d¦  «                             dd¦  «                             dd¦  «        } ‰d|› d|› d�¦  «        S )	Nr»   r^  r�  rž  rò  z\)Ú[ú]()rü   r  rÁ   )r  ÚdisplayÚurlrš  s      €r   Ú_convert_linkz5TelegramAdapter.format_message.<locals>._convert_linkV  sm   ø€ Ý" 1§7¢7¨1¡:¤:Ñ.Ô.ˆGØ—'’'˜!‘*”*×$Ò$ T¨6Ñ2Ô2×:Ò:¸3ÀÑFÔFˆCØ�3Ð,˜7Ð,Ð, cÐ,Ð,Ð,Ñ-Ô-Ð-r>   z-\[([^\]]+)\]\(([^()]*(?:\([^()]*\)[^()]*)*)\)c                 ó¶   •— |                       d¦  «                             ¦   «         }t          j        dd|¦  «        } ‰dt	          |¦  «        › d�¦  «        S )Nr»   ú\*\*(.+?)\*\*rþ   rÅ  )r  r   r   rú   rü   )r  Úinnerrš  s     €r   Ú_convert_headerz7TelegramAdapter.format_message.<locals>._convert_header^  sV   ø€ Ø—G’G˜A‘J”J×$Ò$Ñ&Ô&ˆEå”FÐ+¨U°EÑ:Ô:ˆEØ�3Ð1�<¨Ñ.Ô.Ð1Ð1Ð1Ñ2Ô2Ð2r>   z^#{1,6}\s+(.+)$)Úflagsr¯  c                 ób   •—  ‰dt          |                      d¦  «        ¦  «        › d�¦  «        S )NrÅ  r»   ©rü   r  r§  s    €r   r"  z0TelegramAdapter.format_message.<locals>.<lambda>k  ó/   ø€ �c�cÐ9�l¨1¯7ª7°1©:¬:Ñ6Ô6Ð9Ð9Ð9Ñ:Ô:€ r>   z\*([^*\n]+)\*c                 ób   •—  ‰dt          |                      d¦  «        ¦  «        › d�¦  «        S )Nr]   r»   r´  r§  s    €r   r"  z0TelegramAdapter.format_message.<locals>.<lambda>t  rµ  r>   z	~~(.+?)~~c                 ób   •—  ‰dt          |                      d¦  «        ¦  «        › d�¦  «        S )NÚ~r»   r´  r§  s    €r   r"  z0TelegramAdapter.format_message.<locals>.<lambda>{  rµ  r>   z\|\|(.+?)\|\|c                 ób   •—  ‰dt          |                      d¦  «        ¦  «        › d�¦  «        S )Nú||r»   r´  r§  s    €r   r"  z0TelegramAdapter.format_message.<locals>.<lambda>‚  s/   ø€ �c�cÐ;�|¨A¯GªG°A©J¬JÑ7Ô7Ð;Ð;Ð;Ñ<Ô<€ r>   c           	      ó2  •— |                       d¦  «        }|                       d¦  «        }|                     d¦  «        r;|                     d¦  «        r& ‰|› dt          |d d…         ¦  «        › d�¦  «        S  ‰|› dt          |¦  «        › �¦  «        S )Nr»   r^  z**rº  Ú éþÿÿÿ)r  r¡  r.  rü   )r  Úprefixr~  rš  s      €r   Ú_convert_blockquotez;TelegramAdapter.format_message.<locals>._convert_blockquote‰  s§   ø€ Ø—W’W˜Q‘Z”ZˆFØ—g’g˜a‘j”jˆGð × Ò  Ñ&Ô&ð G¨7×+;Ò+;¸DÑ+AÔ+Að GØ�s˜fÐEÐE¥|°G¸C¸R¸C´LÑ'AÔ'AÐEÐEÐEÑFÔFÐFØ�3˜&Ð:Ð:¥<°Ñ#8Ô#8Ð:Ð:Ñ;Ô;Ð;r>   z^((?:\*\*)?>{1,3}) (.+)$z(```[\s\S]*?```|`[^`]+`)r^  r»   c                 óÒ  — |                       ¦   «         }|                      d¦  «        }|dk    r||dz
           dk    r|S |dk    r|dk    r||dz
           dk    r|S |dk    r€|d |…         }d|v sd|v rnd}t          |dz
  t          |d	z
  d
¦  «        d
¦  «        D ]F}||         dk    r'|dz  }|dk     r|dk    r||dz
           dk    r|c S  nŒ5||         dk    r|dz  }ŒGd|z   S )Nr   r»   r�  ú(Ú]rò  z](httprª  iÐ  rØ  )rS   r  r‘  rQ   )r  Ú_segr´  ÚchÚbeforeÚdepthÚjs          r   Ú	_esc_barez1TelegramAdapter.format_message.<locals>._esc_bare¬  s1  € ØŸš™	œ	�AØŸš ™œ�Bà˜1’u�u  a¨!¡e¤°Ò!4Ð!4Ø!˜	à˜S’y�y Q¨¢U U¨t°A¸±E¬{¸cÒ/AÐ/AØ!˜	à˜S’y�yØ!% b q b¤˜Ø# vÐ-Ð-°¸°°à$%˜EÝ%*¨1¨q©5µ#°a¸$±hÀÑ2CÔ2CÀRÑ%HÔ%Hð /ð / Ø#'¨¤7¨c¢> >Ø$)¨Q¡J EØ',¨q¢y yØ+,¨qª5¨5°T¸!¸a¹%´[ÀCÒ5GÐ5GØ35¨I¨I¨IØ(-¨ð (1ð &*¨!¤W°¢^ ^Ø$)¨Q¡J EøØ "™9Ð$r>   z[(){}]r   )r   Ú_wrap_markdown_tablesr   rú   Ú	MULTILINErü   Úreversedrt  rê  rÁ   rÈ  rŸ  r  r  )r5  r~  r   r¥  r­  r±  r¿  rç  Ú_code_splitÚ_safe_partsÚ_idxrÃ  rÈ  rš  r˜  r™  s                @@@r   rœ  zTelegramAdapter.format_message  s  øøø€ ð ð 	ØˆNàˆØ�#ˆð	•sð 	�sð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ˆõ % TÑ*Ô*ˆð	/ð 	/ð 	/ð 	/ð 	/õ ŒvØ,ØØñ
ô 
ˆõ ŒvØØ;Ð;Ð;Ð;Øñ
ô 
ˆð	.ð 	.ð 	.ð 	.ð 	.õ
 ŒvÐFÈÐW[Ñ\Ô\ˆð	3ð 	3ð 	3ð 	3ð 	3õ ŒvØ °½R¼\ð
ñ 
ô 
ˆõ
 ŒvØØ:Ð:Ð:Ð:Øñ
ô 
ˆõ ŒvØØ:Ð:Ð:Ð:Øñ
ô 
ˆõ ŒvØØ:Ð:Ð:Ð:Øñ
ô 
ˆõ ŒvØØ<Ð<Ð<Ð<Øñ
ô 
ˆð	<ð 	<ð 	<ð 	<ð 	<õ ŒvØ'ØØÝ”,ð	
ñ 
ô 
ˆõ ˜DÑ!Ô!ˆõ �D ×!2Ò!2Ñ!4Ô!4Ñ5Ô5Ñ6Ô6ð 	8ð 	8ˆCØ—<’<  \°#Ô%6Ñ7Ô7ˆDˆDõ
 ”hÐ:¸DÑAÔAˆØˆÝ# KÑ0Ô0ð 	Gð 	G‰JˆD�$Ø�a‰x˜1Š}ˆ}à×"Ò" 4Ñ(Ô(Ð(Ð(ð '+ð %ð %ð %ð %ð2 ×"Ò"¥2¤6¨)°YÀÑ#EÔ#EÑFÔFÐFÐFØ�wŠw�{Ñ#Ô#ˆàˆr>   c                 ó
  — | j         j                             d¦  «        }|�:t          |t          ¦  «        r|                     ¦   «         dv S t          |¦  «        S t          j        dd¦  «                             ¦   «         dv S )zBReturn whether group chats should require an explicit bot trigger.Úrequire_mentionN>   r%  rr  r¾  r¿  ÚTELEGRAM_REQUIRE_MENTIONru  ©	r7  r†  r‡  r0  r   rÇ   r…  r   r   rK  s     r   Ú_telegram_require_mentionz)TelegramAdapter._telegram_require_mentionÌ  s   € à”[Ô&×*Ò*Ð+<Ñ=Ô=ˆ
ØÐ!Ý˜*¥cÑ*Ô*ð HØ!×'Ò'Ñ)Ô)Ð-GÐGÐGÝ˜
Ñ#Ô#Ð#ÝŒyÐ3°WÑ=Ô=×CÒCÑEÔEÐIcÐcÐcr>   c                 óL  — | j         j                             d¦  «        }|€| j         j                             d¦  «        }|�:t          |t          ¦  «        r|                     ¦   «         dv S t          |¦  «        S t          j        dd¦  «                             ¦   «         dv S )aM  Return whether skipped unmentioned group messages are stored as context.

        When enabled with ``require_mention``, Telegram matches the Yuanbao /
        OpenClaw-style group UX: observe ordinary group chatter in the session
        transcript, but only dispatch the agent when the bot is explicitly
        addressed.
        Ú"observe_unmentioned_group_messagesNÚ!ingest_unmentioned_group_messages>   r%  rr  r¾  r¿  Ú+TELEGRAM_OBSERVE_UNMENTIONED_GROUP_MESSAGESru  rÒ  rK  s     r   Ú,_telegram_observe_unmentioned_group_messagesz<TelegramAdapter._telegram_observe_unmentioned_group_messagesÕ  s    € ð ”[Ô&×*Ò*Ð+OÑPÔPˆ
ØÐØœÔ*×.Ò.Ð/RÑSÔSˆJØÐ!Ý˜*¥cÑ*Ô*ð HØ!×'Ò'Ñ)Ô)Ð-GÐGÐGÝ˜
Ñ#Ô#Ð#ÝŒyÐFÈÑPÔP×VÒVÑXÔXÐ\vÐvÐvr>   c                 ó
  — | j         j                             d¦  «        }|�:t          |t          ¦  «        r|                     ¦   «         dv S t          |¦  «        S t          j        dd¦  «                             ¦   «         dv S )zFReturn whether non-allowlisted groups may trigger via direct @mention.Ú
guest_modeN>   r%  rr  r¾  r¿  ÚTELEGRAM_GUEST_MODEru  rÒ  rK  s     r   Ú_telegram_guest_modez$TelegramAdapter._telegram_guest_modeæ  s~   € à”[Ô&×*Ò*¨<Ñ8Ô8ˆ
ØÐ!Ý˜*¥cÑ*Ô*ð HØ!×'Ò'Ñ)Ô)Ð-GÐGÐGÝ˜
Ñ#Ô#Ð#ÝŒyÐ.°Ñ8Ô8×>Ò>Ñ@Ô@ÐD^Ð^Ð^r>   c                 ó
  — | j         j                             d¦  «        }|�:t          |t          ¦  «        r|                     ¦   «         dv S t          |¦  «        S t          j        dd¦  «                             ¦   «         dv S )zJReturn whether explicit @...bot mentions exclusively route group messages.Úexclusive_bot_mentionsN>   r%  rr  r¾  r¿  ÚTELEGRAM_EXCLUSIVE_BOT_MENTIONSr¿  rÒ  rK  s     r   Ú _telegram_exclusive_bot_mentionsz0TelegramAdapter._telegram_exclusive_bot_mentionsï  s   € à”[Ô&×*Ò*Ð+CÑDÔDˆ
ØÐ!Ý˜*¥cÑ*Ô*ð HØ!×'Ò'Ñ)Ô)Ð-GÐGÐGÝ˜
Ñ#Ô#Ð#ÝŒyÐ:¸FÑCÔC×IÒIÑKÔKÐOiÐiÐir>   c                 óü   — | j         j                             d¦  «        }|€t          d¦  «        }t	          |t
          ¦  «        rd„ |D ¦   «         S d„ t          |¦  «                             d¦  «        D ¦   «         S )NÚfree_response_chatsÚTELEGRAM_FREE_RESPONSE_CHATSc                 ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES rŠ   ©r   r   ©rM  Úparts     r   rO  z@TelegramAdapter._telegram_free_response_chats.<locals>.<setcomp>ý  ó=   € ÐKÐKÐK¨$½¸T¹¼¿ºÑ9JÔ9JÐK•C˜‘I”I—O’OÑ%Ô%ÐKÐKÐKr>   c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   rÁ  ræ  s     r   rO  z@TelegramAdapter._telegram_free_response_chats.<locals>.<setcomp>þ  ó-   € ÐMÐMÐM ÀÇ
Â
ÁÄÐM�—
’
‘”ÐMÐMÐMr>   rÄ  ©r7  r†  r‡  r    r0  rt  r   rÈ  ©r5  r1  s     r   Ú_telegram_free_response_chatsz-TelegramAdapter._telegram_free_response_chatsø  s{   € ØŒkÔ×#Ò#Ð$9Ñ:Ô:ˆØˆ;Ý"Ð#AÑBÔBˆCÝ�c�4Ñ Ô ð 	LØKÐK°#ÐKÑKÔKÐKØMÐM­¨S©¬¯ª¸Ñ)<Ô)<ÐMÑMÔMÐMr>   c                 óü   — | j         j                             d¦  «        }|€t          d¦  «        }t	          |t
          ¦  «        rd„ |D ¦   «         S d„ t          |¦  «                             d¦  «        D ¦   «         S )a5  Return topic-level free-response allowlist entries as ``<chat_id>:<thread_id>``.

        Unlike ``free_response_chats`` (whole-chat), each entry opens a single
        forum topic for free-response. A missing/omitted thread id on incoming
        messages is normalized to the General topic (``1``).
        Úfree_response_topicsNÚTELEGRAM_FREE_RESPONSE_TOPICSc                 ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES rŠ   rå  ræ  s     r   rO  zATelegramAdapter._telegram_free_response_topics.<locals>.<setcomp>  rè  r>   c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   rÁ  ræ  s     r   rO  zATelegramAdapter._telegram_free_response_topics.<locals>.<setcomp>  rê  r>   rÄ  rë  rì  s     r   Ú_telegram_free_response_topicsz.TelegramAdapter._telegram_free_response_topics   s}   € ð ŒkÔ×#Ò#Ð$:Ñ;Ô;ˆØˆ;Ý"Ð#BÑCÔCˆCÝ�c�4Ñ Ô ð 	LØKÐK°#ÐKÑKÔKÐKØMÐM­¨S©¬¯ª¸Ñ)<Ô)<ÐMÑMÔMÐMr>   c           	      ó   — |                       ¦   «         }|sdS t          t          t          |dd¦  «        dd¦  «        ¦  «        }|sdS |                      |¦  «        }|�t          |¦  «        n| j        }|› d|› �|v S )zGTrue when the message's chat/topic pair is in ``free_response_topics``.FrÓ  NrÔ  r   r«  )ró  r   rl   Ú_effective_message_thread_idr  )r5  rž  r¬  rK  r­  r  s         r   Ú _telegram_is_free_response_topicz0TelegramAdapter._telegram_is_free_response_topic  s•   € à×4Ò4Ñ6Ô6ˆØð 	Ø�5Ý•g�g g¨v°tÑ<Ô<¸dÀBÑGÔGÑHÔHˆØð 	Ø�5Ø×5Ò5°gÑ>Ô>ˆ	Ø%.Ð%:•3�y‘>”>�>ÀÔ@]ˆØÐ&Ð&˜HÐ&Ð&¨&Ð0Ð0r>   c                 óü   — | j         j                             d¦  «        }|€t          d¦  «        }t	          |t
          ¦  «        rd„ |D ¦   «         S d„ t          |¦  «                             d¦  «        D ¦   «         S )a_  Return the whitelist of group/supergroup chat IDs the bot will respond in.

        When non-empty, group messages from chats NOT in this set are
        silently ignored unless ``guest_mode`` is enabled and the bot is
        explicitly @mentioned.  DMs are never filtered.
        Empty set means no restriction (fully backward compatible).
        Úallowed_chatsNÚTELEGRAM_ALLOWED_CHATSc                 ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES rŠ   rå  ræ  s     r   rO  z:TelegramAdapter._telegram_allowed_chats.<locals>.<setcomp>&  rè  r>   c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   rÁ  ræ  s     r   rO  z:TelegramAdapter._telegram_allowed_chats.<locals>.<setcomp>'  rê  r>   rÄ  rë  rì  s     r   Ú_telegram_allowed_chatsz'TelegramAdapter._telegram_allowed_chats  s|   € ð ŒkÔ×#Ò# OÑ4Ô4ˆØˆ;Ý"Ð#;Ñ<Ô<ˆCÝ�c�4Ñ Ô ð 	LØKÐK°#ÐKÑKÔKÐKØMÐM­¨S©¬¯ª¸Ñ)<Ô)<ÐMÑMÔMÐMr>   c                 óü   — | j         j                             d¦  «        }|€t          d¦  «        }t	          |t
          ¦  «        rd„ |D ¦   «         S d„ t          |¦  «                             d¦  «        D ¦   «         S )z0Return Telegram chats authorized at group scope.Úgroup_allowed_chatsNrã  c                 ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES rŠ   rå  ræ  s     r   rO  z@TelegramAdapter._telegram_group_allowed_chats.<locals>.<setcomp>/  rè  r>   c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   rÁ  ræ  s     r   rO  z@TelegramAdapter._telegram_group_allowed_chats.<locals>.<setcomp>0  rê  r>   rÄ  rë  rì  s     r   Ú_telegram_group_allowed_chatsz-TelegramAdapter._telegram_group_allowed_chats)  s{   € àŒkÔ×#Ò#Ð$9Ñ:Ô:ˆØˆ;Ý"Ð#AÑBÔBˆCÝ�c�4Ñ Ô ð 	LØKÐK°#ÐKÑKÔKÐKØMÐM­¨S©¬¯ª¸Ñ)<Ô)<ÐMÑMÔMÐMr>   c                 ó„   — |                       ¦   «         }|st          ¦   «         S |                      ¦   «         }|r||z  S |S )a#  Chats where observed group context may use a shared source.

        ``group_allowed_chats`` is the gateway authorization allowlist for
        user-less group sources.  ``allowed_chats`` remains an optional response
        gate; when set, observed context must satisfy both lists.
        )r  r8   rü  )r5  Úgroup_allowedÚresponse_alloweds      r   Ú_telegram_observe_allowed_chatsz/TelegramAdapter._telegram_observe_allowed_chats2  sR   € ð ×:Ò:Ñ<Ô<ˆØð 	Ý‘5”5ˆLØ×7Ò7Ñ9Ô9ÐØð 	4Ø Ð#3Ñ3Ð3ØÐr>   c                 óü   — | j         j                             d¦  «        }|€t          d¦  «        }t	          |t
          ¦  «        rd„ |D ¦   «         S d„ t          |¦  «                             d¦  «        D ¦   «         S )aa  Return the whitelist of Telegram forum topic IDs this bot handles.

        When non-empty, group/supergroup messages from other topics are
        silently ignored. DMs are never filtered by topic. Telegram may omit
        ``message_thread_id`` for the forum General topic, so ``None`` is
        treated as topic ``1`` for matching purposes.
        Úallowed_topicsNÚTELEGRAM_ALLOWED_TOPICSc                 ó’   — h | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ’ŒES rŠ   rå  ræ  s     r   rO  z;TelegramAdapter._telegram_allowed_topics.<locals>.<setcomp>M  rè  r>   c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S rŠ   rÁ  ræ  s     r   rO  z;TelegramAdapter._telegram_allowed_topics.<locals>.<setcomp>N  rê  r>   rÄ  rë  rì  s     r   Ú_telegram_allowed_topicsz(TelegramAdapter._telegram_allowed_topicsA  s}   € ð ŒkÔ×#Ò#Ð$4Ñ5Ô5ˆØˆ;Ý"Ð#<Ñ=Ô=ˆCÝ�c�4Ñ Ô ð 	LØKÐK°#ÐKÑKÔKÐKØMÐM­¨S©¬¯ª¸Ñ)<Ô)<ÐMÑMÔMÐMr>   c                 óþ  — | j         j                             d¦  «        }|€t          d¦  «        }t	          |t
          ¦  «        r|}n"t          |¦  «                             d¦  «        }t          ¦   «         }|D ]�}t          |¦  «         	                    ¦   «         }|sŒ&	 | 
                    t          |¦  «        ¦  «         ŒJ# t          t          f$ r$ t                               d| j        |¦  «         Y Œ~w xY w|S )NÚignored_threadsÚTELEGRAM_IGNORED_THREADSrÄ  z,[%s] Ignoring invalid Telegram thread id: %r)r7  r†  r‡  r    r0  rt  r   rÈ  r8   r   rd  r²   rµ   r¶   r(   r0   r   )r5  r1  ru  Úignoredr°   r   s         r   Ú_telegram_ignored_threadsz)TelegramAdapter._telegram_ignored_threadsP  s  € ØŒkÔ×#Ò#Ð$5Ñ6Ô6ˆØˆ;Ý"Ð#=Ñ>Ô>ˆCå�c�4Ñ Ô ð 	)ØˆFˆFå˜‘X”X—^’^ CÑ(Ô(ˆFå™EœEˆØð 	að 	aˆEÝ�u‘:”:×#Ò#Ñ%Ô%ˆDØð ØðaØ—’�C ™IœIÑ&Ô&Ð&Ð&øÝ�zÐ*ð að að aÝ—’ÐMÈtÌyÐZ_Ñ`Ô`Ð`Ð`Ð`ðaøøøàˆs   Â""CÃ2C:Ã9C:c                 ó¨  — | j         j                             d¦  «        }|€�t          j        dd¦  «                             ¦   «         }|rg	 t          j        |¦  «        }nO# t          $ rB d„ | 	                    ¦   «         D ¦   «         }|sd„ | 
                    d¦  «        D ¦   «         }Y nw xY w|}|€g S t          || j        dd	t          ¬
¦  «        S )z=Compile optional regex wake-word patterns for group triggers.Úmention_patternsNÚTELEGRAM_MENTION_PATTERNSr   c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S rŠ   rÁ  ræ  s     r   rì  z=TelegramAdapter._compile_mention_patterns.<locals>.<listcomp>n  s-   € ÐXÐXÐX¨tÈ4Ï:Ê:É<Ì<ÐX˜dŸjšj™lœlÐXÐXÐXr>   c                 ó^   — g | ]*}|                      ¦   «         ¯|                      ¦   «         ‘Œ+S rŠ   rÁ  ræ  s     r   rì  z=TelegramAdapter._compile_mention_patterns.<locals>.<listcomp>p  s-   € Ð!ZÐ!ZÐ!Z°4ÈTÏZÊZÉ\Ì\Ð!Z $§*¢*¡,¤,Ð!ZÐ!ZÐ!Zr>   rÄ  rá   ÚTelegram)Ú
log_prefixÚplatform_labelÚdisplay_labelÚlogger_)r7  r†  r‡  r   r   r   ÚjsonÚloadsr   r™  rÈ  r  r   r(   )r5  Úpatternsr1  Úloadeds       r   rY  z)TelegramAdapter._compile_mention_patternse  sü   € à”;Ô$×(Ò(Ð);Ñ<Ô<ˆØÐÝ”)Ð7¸Ñ<Ô<×BÒBÑDÔDˆCØð "ð[Ý!œZ¨™_œ_�F�FøÝ ð [ð [ð [ØXÐX°s·~²~Ñ7GÔ7GÐXÑXÔX�FØ!ð [Ø!ZÐ!Z¸3¿9º9ÀS¹>¼>Ð!ZÑ!ZÔ!Z˜øøð[øøøð "�àÐð ˆIå'ØØ”yØ%Ø$Ýð
ñ 
ô 
ð 	
s   ÁA! Á!A	B-Â,B-c                 óÆ   — t          |dd ¦  «        }|sdS t          t          |dd¦  «        ¦  «                             d¦  «        d                              ¦   «         }|dv S )NrÓ  FrÙ  r   ú.rØ  >   r  r¸  )rl   r   rÈ  rÇ   )r5  rž  rÓ  r¬  s       r   Ú_is_group_chatzTelegramAdapter._is_group_chat�  sd   € Ý�w ¨Ñ-Ô-ˆØð 	Ø�5Ý�  f¨bÑ1Ô1Ñ2Ô2×8Ò8¸Ñ=Ô=¸bÔA×GÒGÑIÔIˆ	ØÐ3Ð3Ð3r>   c                 óÄ  — t          |dd¦  «        }|rIt          t          |dd¦  «        ¦  «                             d¦  «        d                              ¦   «         nd}t          |dd¦  «        }t	          t          |dd	¦  «        ¦  «        }|d
v ot          |dd	¦  «        du }|�0|s|d
v r|rt          |¦  «        S |dk    r|rt          |¦  «        S dS |r| j        S dS )aH  Return the routable thread id for a Telegram message.

        Forum supergroup messages posted in the General topic arrive with
        ``message_thread_id=None`` while Telegram itself addresses that topic
        as thread id ``1``.  Ordinary replies are the opposite footgun:
        Telegram populates ``message_thread_id`` with a reply-UI anchor id on
        plain group/DM replies, but those ids are not topic/session routing
        ids and must not be treated as such.  Gating, skill binding, and
        outbound routing must all agree on the same normalized value.
        rÓ  NrÙ  r   r   rØ  rÚ  rÛ  F)r  r¸  rÜ  Tr·  )rl   r   rÈ  rÇ   r…  r  )r   rž  rÓ  r¬  r1  rÛ  rß  s          r   rõ  z,TelegramAdapter._effective_message_thread_idˆ  s	  € õ �w ¨Ñ-Ô-ˆØMQÐY•C�  f¨bÑ1Ô1Ñ2Ô2×8Ò8¸Ñ=Ô=¸bÔA×GÒGÑIÔIÐIÐWYˆ	Ý�gÐ2°DÑ9Ô9ˆÝ¥¨Ð1CÀUÑ KÔ KÑLÔLÐØ"Ð&=Ð=ÐjÅ'È$ÐPZÐ\aÑBbÔBbÐfjÐBjˆØˆ?Øð   )Ð/FÐ"FÐ"FÐK[Ð"FÝ˜3‘x”x�Ø˜IÒ%Ð%Ð*:Ð%Ý˜3‘x”x�Ø�4Øð 	0ØÔ/Ð/Øˆtr>   z[a-z0-9_]{2,29}botr  c                 ó¦   — t          | dd¦  «        }|r|S t          | j        dd¦  «        pd                     d¦  «                             ¦   «         S )uG  Return this bot's live @username (lowercased, no leading ``@``).

        Prefers the most recently observed handle over PTB's ``get_me()``
        cache. ``Bot.username`` reads ``Bot._bot_user``, which is written only
        by ``get_me()`` â€” after a BotFather rename it keeps returning the old
        handle, so every mention comparison silently stops matching and the
        exclusive-mention gate concludes the message is addressed to a
        different bot. Observing the handle from inbound updates closes that
        window without an extra Bot API round-trip.
        rz  NrÕ  r   ú@)rl   rW  ÚlstriprÇ   )r5  Úobserveds     r   Ú_current_bot_usernamez%TelegramAdapter._current_bot_username¬  sV   € õ ˜4Ð!9¸4Ñ@Ô@ˆØð 	ØˆOÝ˜œ	 :¨tÑ4Ô4Ð:¸×BÒBÀ3ÑGÔG×MÒMÑOÔOÐOr>   rÕ  c                 ó  — |pd                      d¦  «                             ¦   «         }|sdS t          | dd¦  «        }||k    rdS || _        t	          j        ¦   «         | _        |r$t                               d| j	        ||¦  «         dS dS )z9Record the bot's current @username, logging real renames.r   r$  Nrz  z[[%s] Telegram bot username changed: @%s -> @%s (mention routing now follows the new handle))
r%  rÇ   rl   rz  rp  rq  r{  r(   r½   r   )r5  rÕ  Úhandler4  s       r   rs  z"TelegramAdapter._note_bot_username¼  s¬   € à�.˜b×(Ò(¨Ñ-Ô-×3Ò3Ñ5Ô5ˆØð 	ØˆFÝ˜4Ð!9¸4Ñ@Ô@ˆØ�vÒÐØˆFØ&,ˆÔ#Ý(,¬Ñ(8Ô(8ˆÔ%Øð 	Ý�KŠKð?à”	˜8 Vñô ð ð ð ð	ð 	r>   c                 ó  — t          | j        dd¦  «        }|€dS t          |dd¦  «        t          t          |dd¦  «        dd¦  «        fD ]?}|€Œt          |dd¦  «        |k    rŒ|                      t          |dd¦  «        ¦  «         Œ@dS )u«  Learn our own handle from a message Telegram says we authored.

        Telegram stamps the *current* username on the bot's own outgoing
        messages and on ``reply_to_message`` when a user replies to us, so a
        rename is observable from the update stream itself â€” no getMe needed.
        Only trusted when the user id matches this bot, so another account's
        handle can never be adopted as our own.
        rÔ  NrÒ  Úreply_to_messagerÕ  )rl   rW  rs  )r5  rž  Úbot_idr¶  s       r   Ú"_observe_bot_identity_from_messagez2TelegramAdapter._observe_bot_identity_from_messageÍ  s³   € õ ˜œ D¨$Ñ/Ô/ˆØˆ>ØˆFå�G˜[¨$Ñ/Ô/Ý•G˜GÐ%7¸Ñ>Ô>ÀÈTÑRÔRð
ð 	Jð 	JˆIð Ð ØÝ�y $¨Ñ-Ô-°Ò7Ð7ØØ×#Ò#¥G¨I°zÀ4Ñ$HÔ$HÑIÔIÐIÐIð	Jð 	Jr>   c                 ój   — t          | dd¦  «        }|€dS t          j        ¦   «         |z
  | j        k     S )aT  True when identity was re-read within the TTL.

        ``None`` means never checked, which is always stale. Do not fold the
        sentinel into ``0.0``: monotonic clocks have an arbitrary epoch that
        can legitimately be smaller than the TTL on a freshly-booted host,
        which would make "never" look like "just now".
        r{  NF)rl   rp  rq  rÙ  )r5  Ú
checked_ats     r   Ú_bot_identity_is_freshz&TelegramAdapter._bot_identity_is_freshã  s<   € õ ˜TÐ#=¸tÑDÔDˆ
ØÐØ�5Ý”Ñ Ô  :Ñ-°Ô1OÒOÐOr>   r   r   c             ƒ   ó&  K  — | j         }|�t          t          |dd¦  «        ¦  «        sdS |s|                      ¦   «         rdS 	 t	          j        |                     ¦   «         | j        ¦  «        ƒ d{V —†}n]# t          j        $ r ‚ t          $ rA}t                               d| j        |                      ¦   «         pd|¦  «         Y d}~dS d}~ww xY wt          j        ¦   «         | _        |                      t          |dd¦  «        ¦  «         dS )a'  Re-read the bot's identity from Telegram when the cache may be stale.

        ``get_me()`` rewrites PTB's ``Bot._bot_user`` in place, so this also
        repairs every other consumer of ``self._bot.username``. Best-effort:
        a failed probe leaves the last known handle in place.
        Nro  z7[%s] Telegram identity refresh failed (keeping @%s): %sr2  rÕ  )rW  rÆ  rl   r0  r&   rö  ro  Ú_BOT_IDENTITY_PROBE_TIMEOUTr'   r   r(   r)   r   r'  rp  rq  r{  rs  )r5  r   ri   Úmer¬  s        r   rÚ  z%TelegramAdapter._refresh_bot_identityð  s8  è è € ð ŒiˆØˆ;�h¥w¨s°H¸dÑ'CÔ'CÑDÔDˆ;ØˆFØð 	˜×4Ò4Ñ6Ô6ð 	ØˆFð		ÝÔ'¨¯
ª
©¬°dÔ6VÑWÔWÐWÐWÐWÐWÐWÐWˆBˆBøÝÔ%ð 	ð 	ð 	ØÝð 	ð 	ð 	Ý�LŠLØIØ”	˜4×5Ò5Ñ7Ô7ÐD¸9Àcñô ð ð ˆFˆFˆFˆFˆFøøøøð	øøøõ )-¬Ñ(8Ô(8ˆÔ%Ø×Ò¥¨¨J¸Ñ =Ô =Ñ>Ô>Ð>Ð>Ð>s   Á2A8 Á8CÂ6CÃCr  c                 óÒ   — | j         rt          |dd ¦  «        sdS t          |j        dd ¦  «        }t          |o(t          |dd ¦  «        t          | j         dd ¦  «        k    ¦  «        S )Nr+  FrÒ  rÔ  )rW  rl   r+  r…  )r5  rž  Ú
reply_users      r   Ú_is_reply_to_botz TelegramAdapter._is_reply_to_bot   sm   € ØŒyð 	¥¨Ð1CÀTÑ JÔ Jð 	Ø�5Ý˜WÔ5°{ÀDÑIÔIˆ
Ý�JÐd¥7¨:°t¸TÑ#BÔ#BÅgÈdÌiÐY]Ð_cÑFdÔFdÒ#dÑeÔeÐer>   Úself_usernamec           	      óÌ  ‡ ‡‡— t          ¦   «         }|pd                     d¦  «                             ¦   «         Šdt          dt          fˆ ˆfd„}ˆfd„} |¦   «         D �]�\  }}|D �]…}t          t          |dd¦  «        ¦  «                             d¦  «        d	                              ¦   «         }	|	d
vrŒQt          t          |dd	¦  «        ¦  «        }
t          t          |dd¦  «        ¦  «        }|
dk     s|dk    rŒšt           	                    ||
|¦  «         
                    ¦   «         }|	dk    rI|                     d¦  «                             ¦   «         } ||¦  «        r|                     |¦  «         �Œ|                     d¦  «        }|dk     r�Œ4||dz   d…          
                    ¦   «                              ¦   «         } ||¦  «        r|                     |¦  «         �Œ‡�Œ‘ |¦   «         D ]i\  }}|r|rŒ
t          j        d|¦  «        D ]I}|                     d¦  «                             ¦   «         } ||¦  «        r|                     |¦  «         ŒJŒj|S )aë  Extract explicit Telegram bot usernames mentioned in text/captions.

        Foreign handles are only treated as bot mentions when they look
        bot-shaped (``...bot``), which keeps human ``@handles`` from acting as
        routing hints. ``self_username`` opts our OWN handle into the same set
        regardless of shape: collectible (Fragment) usernames can be assigned
        to bots and need not end in "bot" (@jarvis, @pic), and a bot addressed
        by such a handle must still recognise itself.

        Entity mentions are authoritative. The raw-text fallback is intentionally narrow so
        entity-less mobile/client variants still work without treating email
        addresses or arbitrary substrings as bot mentions.
        r   r$  r)  r   c                 ón   •— | sdS ‰r| ‰k    rdS t          ‰j                             | ¦  «        ¦  «        S )NFT)r…  Ú_FOREIGN_BOT_HANDLE_REÚ	fullmatch)r)  r   Úowns    €€r   Ú_is_bot_handlezFTelegramAdapter._extract_bot_mention_usernames.<locals>._is_bot_handle#   sD   ø€ Øð Ø�uØð �v ’}�}Ø�tÝ˜Ô2×<Ò<¸VÑDÔDÑEÔEÐEr>   c               3   ó¬   •K  — t          ‰ dd ¦  «        pdt          ‰ dd ¦  «        pg fV — t          ‰ dd ¦  «        pdt          ‰ dd ¦  «        pg fV — d S ©Nr   r   Úentitiesr  Úcaption_entities©rl   ©rž  s   €r   Ú_iter_sourceszETelegramAdapter._extract_bot_mention_usernames.<locals>._iter_sources*   óx   øè è € Ý˜' 6¨4Ñ0Ô0Ð6°B½ÀÈÐUYÑ8ZÔ8ZÐ8`Ð^`Ð`Ð`Ð`Ð`Ý˜' 9¨dÑ3Ô3Ð9°r½7À7ÐL^Ð`dÑ;eÔ;eÐ;kÐikÐkÐkÐkÐkÐkÐkr>   rÙ  r   rØ  >   ÚmentionÚbot_commandÚoffsetr¾   r   rF  r»   Nz.(?i)(?<![A-Za-z0-9_`/])@([A-Za-z0-9_]{2,31})\b)r8   r%  rÇ   r   r…  rl   rÈ  r²   r"  Ú_telegram_entity_textr   rd  Úfindr   r  r  )r   rž  r7  Úmentioned_bot_usernamesr=  rD  Úsource_textr@  ÚentityÚentity_typerH  r¾   Úentity_textr)  Úat_indexÚcommand_targetÚraw_textr–  r<  s   ``                @r   Ú_extract_bot_mention_usernamesz.TelegramAdapter._extract_bot_mention_usernames   sÔ  øøø€ õ -0©E¬EÐØÐ" ×*Ò*¨3Ñ/Ô/×5Ò5Ñ7Ô7ˆð	F¥3ð 	F­4ð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð	lð 	lð 	lð 	lð 	lð &3 ]¡_¤_ð 	@ñ 	@Ñ!ˆK˜Ø"ð @ñ @�Ý!¥'¨&°&¸"Ñ"=Ô"=Ñ>Ô>×DÒDÀSÑIÔIÈ"ÔM×SÒSÑUÔU�ØÐ&@Ð@Ð@ØÝ�W V¨X°rÑ:Ô:Ñ;Ô;�Ý�W V¨X°qÑ9Ô9Ñ:Ô:�Ø˜A’:�: ¨1¢ Øå-×CÒCÀKÐQWÐY_Ñ`Ô`×fÒfÑhÔh�Ø )Ò+Ð+Ø(×/Ò/°Ñ4Ô4×:Ò:Ñ<Ô<�FØ%�~ fÑ-Ô-ð <Ø/×3Ò3°FÑ;Ô;Ð;Ùð '×+Ò+¨CÑ0Ô0�Ø˜a’<�<ÙØ!,¨X¸©\¨]¨]Ô!;×!AÒ!AÑ!CÔ!C×!IÒ!IÑ!KÔ!K�Ø!�> .Ñ1Ô1ð @Ø+×/Ò/°Ñ?Ô?Ð?ùñ3@ð< #0 -¡/¤/ð 	8ð 	8ÑˆH�hØð ˜xð ØÝœÐ%VÐX`ÑaÔað 8ð 8�ØŸš Q™œ×-Ò-Ñ/Ô/�Ø!�> &Ñ)Ô)ð 8Ø+×/Ò/°Ñ7Ô7Ð7øð8ð
 'Ð&r>   rL  rH  r¾   c                 óÀ   — |dk     s|dk    rdS 	 |                       d¦  «        }|dz  }||z   dz  }|||…                              d¦  «        S # t          $ r Y dS w xY w)z=Return a Telegram entity span using UTF-16 code-unit offsets.r   r   z	utf-16-ler^  )Úencoderð  ÚUnicodeDecodeError)rL  rH  r¾   r1  rS   r  s         r   rI  z%TelegramAdapter._telegram_entity_textW   s‡   € ð �AŠ:ˆ:˜ 1š˜Ø�2ð	Ø×$Ò$ [Ñ1Ô1ˆCØ˜Q‘JˆEØ˜F‘? aÑ'ˆCØ�u˜S�y”>×(Ò(¨Ñ5Ô5Ð5øÝ!ð 	ð 	ð 	Ø�2�2ð	øøøs   �>A Á
AÁAc           	      óŒ  ‡— | j         sdS |                      ¦   «         }t          | j         dd ¦  «        }|rd|› �nd }ˆfd„} |¦   «         D �]Û\  }}|D �]Ñ}t          t          |dd¦  «        ¦  «                             d¦  «        d                              ¦   «         }	|	d	k    r�|r�t          t          |d
d¦  «        ¦  «        }
t          t          |dd¦  «        ¦  «        }|
dk     s|dk    rŒ�|                      ||
|¦  «                             ¦   «                              ¦   «         |k    r  dS Œá|	dk    r.t          |dd ¦  «        }|rt          |dd ¦  «        |k    r  dS �Œ|	dk    r¶|r´t          t          |d
d¦  «        ¦  «        }
t          t          |dd¦  «        ¦  «        }|
dk     s|dk    r�Œg|                      ||
|¦  «        }| 	                    d¦  «        }|dk     r�Œ›||d …                              ¦   «                              ¦   «         |k    r  dS �ŒÓ�ŒÝ|r||  
                    ‰|¦  «        v S dS )NFrÔ  r$  c               3   ó¬   •K  — t          ‰ dd ¦  «        pdt          ‰ dd ¦  «        pg fV — t          ‰ dd ¦  «        pdt          ‰ dd ¦  «        pg fV — d S r?  rB  rC  s   €r   rD  z<TelegramAdapter._message_mentions_bot.<locals>._iter_sourcesl   rE  r>   rÙ  r   r   rØ  rF  rH  r¾   r   TÚtext_mentionrÝ  rG  )rW  r'  rl   r   rÈ  rÇ   r²   rI  r   rJ  rS  )r5  rž  Úbot_usernamer,  ÚexpectedrD  rL  r@  rM  rN  rH  r¾   rÝ  Úcommand_textrP  s    `             r   Ú_message_mentions_botz%TelegramAdapter._message_mentions_botd   s¦  ø€ ØŒyð 	Ø�5à×1Ò1Ñ3Ô3ˆÝ˜œ D¨$Ñ/Ô/ˆØ)5Ð?Ð%�|Ð%Ð%Ð%¸4ˆð	lð 	lð 	lð 	lð 	lð &3 ]¡_¤_ð !	$ñ !	$Ñ!ˆK˜Ø"ð  $ñ  $�Ý!¥'¨&°&¸"Ñ"=Ô"=Ñ>Ô>×DÒDÀSÑIÔIÈ"ÔM×SÒSÑUÔU�Ø )Ò+Ð+°Ð+Ý ¥¨°¸2Ñ!>Ô!>Ñ?Ô?�FÝ ¥¨°¸1Ñ!=Ô!=Ñ>Ô>�FØ ’z�z V¨q¢[ [Ø Ø×1Ò1°+¸vÀvÑNÔN×TÒTÑVÔV×\Ò\Ñ^Ô^ÐbjÒjÐjØ#˜t˜t˜tð kà  NÒ2Ð2Ý" 6¨6°4Ñ8Ô8�DØð $¥¨¨d°DÑ 9Ô 9¸VÒ CÐ CØ#˜t˜t˜tùØ  MÒ1Ð1°hÐ1õ !¥¨°¸2Ñ!>Ô!>Ñ?Ô?�FÝ ¥¨°¸1Ñ!=Ô!=Ñ>Ô>�FØ ’z�z V¨q¢[ [Ù Ø#'×#=Ò#=¸kÈ6ÐSYÑ#ZÔ#Z�LØ+×0Ò0°Ñ5Ô5�HØ !’|�|Ù Ø# H I IÔ.×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>À(ÒJÐJØ#˜t˜t˜tùñA $ðB ð 	^Ø 4×#FÒ#FÀwÐP\Ñ#]Ô#]Ð]Ð]Øˆur>   c                 óÚ  — t          | dd¦  «        }|�|                     ¦   «         sdS |                      ¦   «         rdS 	 t          j        ¦   «         }n# t
          $ r Y dS w xY w|                     |                      ¦   «         ¦  «        }|| _        t          | dd¦  «        }t          |t          ¦  «        r1|                     |¦  «         |                     |j        ¦  «         dS dS )u0  Fire a TTL-guarded identity refresh in the background.

        Called when routing is about to discard a message because the bot
        handles it names don't include ours â€” the exact symptom of a stale
        username after a BotFather rename. The TTL in
        ``_refresh_bot_identity`` bounds this to one getMe per
        ``_BOT_IDENTITY_TTL_SECONDS``, so a busy group that legitimately
        addresses other bots cannot turn this into per-message API traffic.
        Fire-and-forget: the current message still routes on what we know now.
        r|  Nr.  )rl   r9   r0  r&   rL   rQ  r1  rÚ  r|  r0  r8   rd  rW   r/  )r5  ÚexistingrA   r!   Útrackeds        r   Ú_schedule_bot_identity_recheckz.TelegramAdapter._schedule_bot_identity_recheckœ   s  € õ ˜4Ð!=¸tÑDÔDˆØÐ¨¯ª©¬ÐØˆFØ×&Ò&Ñ(Ô(ð 	ØˆFð	ÝÔ+Ñ-Ô-ˆDˆDøÝð 	ð 	ð 	ØˆFˆFð	øøøà×Ò × :Ò :Ñ <Ô <Ñ=Ô=ˆØ*.ˆÔ'Ý˜$Ð 3°TÑ:Ô:ˆÝ�g�sÑ#Ô#ð 	4Ø�KŠK˜ÑÔÐØ×"Ò" 7¤?Ñ3Ô3Ð3Ð3Ð3ð	4ð 	4s   ÁA Á
A#Á"A#c                 óÆ   — | j         sdS |                      ¦   «         }|sdS |                      ||¦  «        }t          |¦  «        o||v}|r|                      ¦   «          |S )aL  Return True when explicit bot handles target other bots, not this one.

        Telegram groups can contain several Hermes bot profiles. A message like
        ``@bot3 hi @bot4`` must not wake ``@bot1`` through reply/wake-word
        fallbacks. Treat explicit bot-handle mentions as an exclusive routing
        hint: if at least one @...bot username is present and none matches this
        adapter's own bot username, this adapter should ignore the message.

        MessageEntity values are preferred, but some Telegram clients expose
        selected bot handles as plain text in group messages. Foreign handles
        are limited to the ``...bot`` shape so human @handles never suppress
        this bot; our own handle is matched by identity, so a collectible
        username without that suffix still counts as addressing us.
        F)rW  r'  rS  r…  ra  )r5  rž  rZ  rK  Úexcludes_selfs        r   Ú#_explicit_bot_mentions_exclude_selfz3TelegramAdapter._explicit_bot_mentions_exclude_self·   s‚   € ð Œyð 	Ø�5à×1Ò1Ñ3Ô3ˆØð 	Ø�5à"&×"EÒ"EÀgÈ|Ñ"\Ô"\ÐÝÐ4Ñ5Ô5Ðe¸,ÐNeÐ:eˆØð 	2ð
 ×/Ò/Ñ1Ô1Ð1ØÐr>   c                 ó®   — | j         sdS t          |dd ¦  «        t          |dd ¦  «        fD ](}|sŒ| j         D ]}|                     |¦  «        r  dS ŒŒ)dS )NFr   r  T)rZ  rl   r�  )r5  rž  r¶  Úpatterns       r   Ú!_message_matches_mention_patternsz1TelegramAdapter._message_matches_mention_patterns×   sŠ   € ØÔ%ð 	Ø�5Ý! '¨6°4Ñ8Ô8½'À'È9ÐVZÑ:[Ô:[Ð\ð 	 ð 	 ˆIØð ØØÔ1ð  ð  �Ø—>’> )Ñ,Ô,ð  Ø˜4˜4˜4ð ð ð ˆur>   c                 óT   — |                       ¦   «         o|                      |¦  «        S )zàReturn True for the narrow guest-mode bypass: explicit bot mention.

        The caller (:meth:`_should_process_message`) has already verified
        the message is a group chat, so that check is not repeated here.
        )rÜ  r]  )r5  rž  s     r   Ú_is_guest_mentionz!TelegramAdapter._is_guest_mentionâ   s)   € ð ×(Ò(Ñ*Ô*ÐR¨t×/IÒ/IÈ'Ñ/RÔ/RÐRr>   c                 ó¾   — |                       ¦   «         }|r|s|S t          j        |¦  «        }t          j        d|› d�d|¦  «                             ¦   «         }|p|S )Nz(?i)@z\b[,:\-]*\s*r   )r'  r   rþ  rú   r   )r5  r   rZ  rÕ  r  s        r   Ú_clean_bot_trigger_textz'TelegramAdapter._clean_bot_trigger_textê   sk   € Ø×1Ò1Ñ3Ô3ˆØð 	˜<ð 	ØˆKÝ”9˜\Ñ*Ô*ˆÝ”&Ð8 (Ð8Ð8Ð8¸"¸dÑCÔC×IÒIÑKÔKˆØˆ˜$Ðr>   c           	      ó–  — |                       |¦  «        rdS |                      ¦   «         sdS |                      |¦  «        sdS t          |dd¦  «        }|                      ¦   «         }|r|�t          |¦  «        n| j        }||vrdS |�?	 t          |¦  «        |                      ¦   «         v rdS n# t          t          f$ r Y dS w xY wt          t          t          |dd¦  «        dd¦  «        ¦  «        }|                      ¦   «         r|                      |¦  «        rdS |                      ¦   «         }|r||vrdS ||                      ¦   «         v rdS |                      |¦  «        rdS |                      ¦   «         sdS |                      |¦  «        rdS |                      |¦  «        rdS |                      |¦  «        rdS dS )zEReturn True when a group message should be stored but not dispatched.FrÚ  NrÓ  rÔ  r   T)Ú_is_own_messagerØ  r!  rl   r  r   r  r²   r  rµ   r¶   rà  rd  r  rí  rö  rÓ  r6  r]  rg  )r5  rž  r­  r  r  Úchat_id_strrû  s          r   Ú)_should_observe_unmentioned_group_messagez9TelegramAdapter._should_observe_unmentioned_group_messageò   s%  € à×Ò Ñ(Ô(ð 	Ø�5Ø×@Ò@ÑBÔBð 	Ø�5Ø×"Ò" 7Ñ+Ô+ð 	Ø�5å˜GÐ%8¸$Ñ?Ô?ˆ	Ø×6Ò6Ñ8Ô8ˆØð 	Ø)2Ð)>•s˜9‘~”~�~ÀDÔDaˆHØ˜~Ð-Ð-Ø�uàÐ ðÝ�y‘>”> T×%CÒ%CÑ%EÔ%EÐEÐEØ ˜5ð Føå�zÐ*ð ð ð Ø�u�uðøøøõ �'¥'¨'°6¸4Ñ"@Ô"@À$ÈÑKÔKÑLÔLˆØ×0Ò0Ñ2Ô2ð 	°t×7_Ò7_Ð`gÑ7hÔ7hð 	Ø�5à×6Ò6Ñ8Ô8ˆð ð 	˜+¨WÐ4Ð4Ø�5ð
 ˜$×<Ò<Ñ>Ô>Ð>Ð>Ø�5Ø×0Ò0°Ñ9Ô9ð 	Ø�5Ø×-Ò-Ñ/Ô/ð 	Ø�5Ø× Ò  Ñ)Ô)ð 	Ø�5Ø×%Ò% gÑ.Ô.ð 	Ø�5Ø×1Ò1°'Ñ:Ô:ð 	Ø�5Øˆts   Â#B3 Â3CÃCc                 ó2   — t          j        |ddd¬¦  «        S )zFReturn a chat/topic-scoped source for observed Telegram group context.N)r¯  r®  Úuser_id_alt)ÚdataclassesrÁ   )r5  rÍ  s     r   Ú%_telegram_group_observe_shared_sourcez5TelegramAdapter._telegram_group_observe_shared_source'!  s   € åÔ" 6°4À4ÐUYÐZÑZÔZÐZr>   Úeventc                 ó^   — |j         j        pd}|j         j        p|}d|› d|› d|j        pd› �S )Nr2  r©  Ú|z]
r   )rÍ  r¯  r®  r   )r5  rt  r¯  Úsenders       r   Ú'_telegram_group_observe_attributed_textz7TelegramAdapter._telegram_group_observe_attributed_text+!  sE   € Ø”,Ô&Ð3¨)ˆØ”Ô'Ð2¨7ˆØ:�6Ð:Ð:˜GÐ:Ð:¨¬
Ð(8°bÐ:Ð:Ð:r>   c                 ó„   — |                       ¦   «         pd}t          t          | dd ¦  «        dd ¦  «        pd}d|› d|› d�S )Nr2  rW  rÔ  zIYou are handling a Telegram group chat message.
- Your identity: user_id=z , @-mention name in this group=@a)  
- observed Telegram group context may be provided in a separate context-only block before the current message; it is not necessarily addressed to you.
- Treat only the current new message as a request explicitly directed at you, and use observed context only when the current message asks for it.)r'  rl   )r5  rÕ  r,  s      r   Ú&_telegram_group_observe_channel_promptz6TelegramAdapter._telegram_group_observe_channel_prompt0!  si   € Ø×-Ò-Ñ/Ô/Ð<°9ˆÝ�  v¨tÑ4Ô4°d¸DÑAÔAÐNÀYˆðRØ(.ðRð RØPXðRð Rð Rð	
r>   c           	      óF  — |                       ¦   «         s|S t          |dd¦  «        }|r|                      |¦  «        s|S t          t          t          |dd¦  «        dd¦  «        ¦  «        }|                      ¦   «         }|r||vr|S |                      |j        ¦  «        }|                      ¦   «         }|j        r|j        › d|› �n|}|j	        t          j        k    rt          j        ||¬¦  «        S t          j        ||                      |¦  «        ||¬¦  «        S )	z>Align triggered group turns with observed-history attribution.Úraw_messageNrÓ  rÔ  r   r!  )Úchannel_prompt)r   rÍ  r}  )rØ  rl   r!  r   r  rs  rÍ  rz  r}  Úmessage_typer’   rA  rr  rÁ   rx  )r5  rt  r|  rn  rû  Úshared_sourceÚobserve_promptr}  s           r   Ú)_apply_telegram_group_observe_attributionz9TelegramAdapter._apply_telegram_group_observe_attribution<!  sN  € à×@Ò@ÑBÔBð 	ØˆLÝ˜e ]°DÑ9Ô9ˆØð 	 $×"5Ò"5°kÑ"BÔ"Bð 	ØˆLÝ�'¥'¨+°v¸tÑ"DÔ"DÀdÈBÑOÔOÑPÔPˆØ×6Ò6Ñ8Ô8ˆØð 	˜+¨WÐ4Ð4ØˆLØ×BÒBÀ5Ä<ÑPÔPˆØ×DÒDÑFÔFˆØJOÔJ^Ðr˜EÔ0ÐFÐF°nÐFÐFÐFÐdrˆØÔ¥Ô!4Ò4Ð4õ Ô&ØØ-ðñ ô ð õ Ô"ØØ×=Ò=¸eÑDÔDØ Ø)ð	
ñ 
ô 
ð 	
r>   rÝ  c                 óØ   — |j         rt          j        S |j        rt          j        S |j        rt          j        S |j        rt          j        S |j	        rt          j
        S t          j        S )z5Classify a Telegram media message into a MessageType.)Ústickerr’   ÚSTICKERrM  rF  rc  rG  r×   rH  r  rI  ÚDOCUMENT)r5  rÝ  s     r   Ú_media_message_typez#TelegramAdapter._media_message_type]!  sj   € àŒ;ð 	'ÝÔ&Ð&ØŒ9ð 	%ÝÔ$Ð$ØŒ9ð 	%ÝÔ$Ð$ØŒ9ð 	%ÝÔ$Ð$ØŒ9ð 	%ÝÔ$Ð$ÝÔ#Ð#r>   c              ƒ   óü  K  — ddl m} |                      |¦  «        \  }}}}|€dS t          | dd¦  «        }t          |dd¦  «        }		 t	          |	pd¦  «        }
n# t
          t          f$ r d}
Y nw xY wd|
cxk     r|k    sHn |dz  }|                      |j        d|› d	�¦  «        |_        t           
                    d
|	¦  «         dS 	 |                     ¦   «         ƒ d{V —†}t          |                     ¦   «         ƒ d{V —†¦  «        }|s0t          j                             t          |dd¦  «        pd¦  «        } |||||¬¦  «        }nB# t"          $ r5}t                               dt'          |¦  «        d¬¦  «         Y d}~dS d}~ww xY w|€"|                      |j        d¦  «        |_        dS |j        g|_        |j        g|_        |j        dk    rt0          j        |_        n9|j        dk    rt0          j        |_        n|j        dk    rt0          j        |_        |                      |j        |                     ¦   «         ¦  «        |_        t           
                    d|j        |j        ¦  «         dS )a2  Cache an unmentioned group attachment and annotate the observed text.

        Passive group traffic, so downloads are bounded by the same
        ``_max_doc_bytes`` limit as the addressed document path. Oversized or
        unsupported attachments are noted in the transcript without downloading.
        r   ©Úcache_media_bytesNr�  rQ  r  r  zB[Observed Telegram attachment too large or unverifiable. Maximum: z MB.]z6[Telegram] Observed group attachment skipped (size=%s)r   r   ©r[  Ú	mime_typeÚdefault_kindz3[Telegram] Failed to cache observed group media: %sTr#   z=[Observed Telegram attachment could not be read, not cached.]Úimagerc  r×   z)[Telegram] Cached observed group %s at %s)rn  r‰  Ú_observed_media_sourcerl   r²   rµ   r¶   Ú_append_observed_noter   r(   r½   Úget_fileÚbytesÚdownload_as_bytearrayr   r¹   rT  r   r0   r   Ú
media_urlsÚ
media_typeÚmedia_typesrc  r’   rF  r~  rG  rH  Úcontext_note)r5  rÝ  rt  r‰  rÍ  r[  Úmimerc  r  r  r
  r  Úfile_objrF  r²  r¬  s                   r   Ú_cache_observed_mediaz%TelegramAdapter._cache_observed_mediak!  sí  è è € ð 	=Ð<Ð<Ð<Ð<Ð<à'+×'BÒ'BÀ3Ñ'GÔ'GÑ$ˆ�˜$ Øˆ>ØˆFå˜DÐ"2Ð4DÑEÔEˆ	Ý˜F K°Ñ6Ô6ˆ	ð	Ý�y�~ AÑ&Ô&ˆDˆDøÝ�:Ð&ð 	ð 	ð 	ØˆDˆDˆDð	øøøà�DÐ%Ð%Ò%Ð%˜IÒ%Ð%Ð%Ð%Ø  [Ñ1ˆHØ×3Ò3Ø”
ØdÐU]ÐdÐdÐdñô ˆEŒJõ �KŠKÐPÐR[Ñ\Ô\Ð\ØˆFð	Ø#Ÿ_š_Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.ˆHÝ˜x×=Ò=Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ñ@Ô@ˆDØð VÝœ7×+Ò+­G°H¸kÈ2Ñ,NÔ,NÐ,TÐRTÑUÔU�Ø&Ð& t°hÈ$Ð]aÐbÑbÔbˆFˆFøÝð 	ð 	ð 	Ý�NŠNÐPÕRmÐnqÑRrÔRrð  ~BˆNñ  Cô  Cð  CØˆFˆFˆFˆFˆFøøøøð	øøøð ˆ>ð ×3Ò3Ø”
Ð[ñô ˆEŒJð ˆFà"œK˜=ˆÔØ#Ô.Ð/ˆÔØŒ;˜'Ò!Ð!Ý!,Ô!2ˆEÔÐØŒ[˜GÒ#Ð#Ý!,Ô!2ˆEÔÐØŒ[˜GÒ#Ð#Ý!,Ô!2ˆEÔØ×/Ò/°´
¸F×<OÒ<OÑ<QÔ<QÑRÔRˆŒ
Ý�ŠÐ?ÀÄÈfÌkÑZÔZÐZÐZÐZs+   Á
A ÁA2Á1A2ÃBE Å
FÅ*FÆFc           
   ƒ   óä  K  — ddl m} t          |dd¦  «        }|€dS |                      |¦  «        \  }}}}|€dS t          | dd¦  «        }	t          |dd¦  «        }
	 t	          |
pd¦  «        }n# t
          t          f$ r d}Y nw xY wd|cxk     r|	k    sn dS 	 |                     ¦   «         ƒ d{V —†}t          | 	                    ¦   «         ƒ d{V —†¦  «        }|s0t          j                             t          |dd	¦  «        pd	¦  «        } |||||¬
¦  «        }nB# t          $ r5}t                               dt!          |¦  «        d¬¦  «         Y d}~dS d}~ww xY w|€dS |j                             |j        ¦  «         |j                             |j        ¦  «         t+          |j        ¦  «        dk    rV|j        dk    rt.          j        |_        n9|j        dk    rt.          j        |_        n|j        dk    rt.          j        |_        |                      |j        d|j        › d|j        › d|j        › d�¦  «        |_        t                               d|j        |j        ¦  «         dS )z:Cache media from the message this turn replies to, if any.r   rˆ  r+  Nr�  rQ  r  r   r   rŠ  z/[Telegram] Failed to cache replied-to media: %sTr#   r»   r�  rc  r×   z[Replied-to z 'z' saved at: rÂ  z%[Telegram] Cached replied-to %s at %s) rn  r‰  rl   rŽ  r²   rµ   r¶   r�  r‘  r’  r   r¹   rT  r   r(   r0   r   r“  r  r•  r”  r€  rc  r’   rF  r~  rG  rH  r�  r   r_  r½   )r5  rÝ  rt  r‰  Ú	reply_msgrÍ  r[  r—  rc  r  r  r
  r˜  rF  r²  r¬  s                   r   Ú_cache_replied_mediaz$TelegramAdapter._cache_replied_media¥!  sØ  è è € à<Ð<Ð<Ð<Ð<Ð<å˜CÐ!3°TÑ:Ô:ˆ	ØÐØˆFØ'+×'BÒ'BÀ9Ñ'MÔ'MÑ$ˆ�˜$ Øˆ>ØˆFå˜DÐ"2Ð4DÑEÔEˆ	Ý˜F K°Ñ6Ô6ˆ	ð	Ý�y�~ AÑ&Ô&ˆDˆDøÝ�:Ð&ð 	ð 	ð 	ØˆDˆDˆDð	øøøà�DÐ%Ð%Ò%Ð%˜IÒ%Ð%Ð%Ð%ØˆFð	Ø#Ÿ_š_Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.ˆHÝ˜x×=Ò=Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ñ@Ô@ˆDØð VÝœ7×+Ò+­G°H¸kÈ2Ñ,NÔ,NÐ,TÐRTÑUÔU�Ø&Ð& t°hÈ$Ð]aÐbÑbÔbˆFˆFøÝð 	ð 	ð 	Ý�NŠNÐLÕNiÐjmÑNnÔNnÐy}ˆNÑ~Ô~Ð~ØˆFˆFˆFˆFˆFøøøøð	øøøð ˆ>ØˆFàÔ×Ò ¤Ñ,Ô,Ð,ØÔ× Ò  Ô!2Ñ3Ô3Ð3ÝˆuÔÑ Ô  AÒ%Ð%ØŒ{˜gÒ%Ð%Ý%0Ô%6�Ô"Ð"Ø” Ò'Ð'Ý%0Ô%6�Ô"Ð"Ø” Ò'Ð'Ý%0Ô%6�Ô"Ø×/Ò/ØŒJØY˜6œ;ÐYÐY¨&Ô*=ÐYÐYÈ6Ì;ÐYÐYÐYñ
ô 
ˆŒ
õ 	�ŠÐ;¸V¼[È&Ì+ÑVÔVÐVÐVÐVs+   ÁA1 Á1BÂBÂBD Ä
EÄ)*EÅEc                 ó6  — |j         r|j         d         dddfS |j        r|j        dddfS |j        r|j        dddfS |j        r!|j        t	          |j        d	d¦  «        pdddfS |j        r-|j        }||j        pd|j        pd                     ¦   «         d
fS dS )zEReturn (telegram_file_source, filename, mime, default_kind) or Nones.rØ  r   r�  ú	video/mp4rc  z	voice.oggú	audio/oggr×   rR  N)Nr   r   N)	rM  rc  r  r×   rl   rZ  rR  r‹  rÇ   )r5  rÝ  Údocs      r   rŽ  z&TelegramAdapter._observed_media_sourceÕ!  sÈ   € àŒ9ð 	2Ø”9˜R”= " b¨'Ð1Ð1ØŒ9ð 	7Ø”9˜b +¨wÐ6Ð6ØŒ9ð 	@Ø”9˜k¨;¸Ð?Ð?ØŒ9ð 	UØ”9�g c¤i°¸bÑAÔAÐGÀRÈÈWÐTÐTØŒ<ð 	QØ”,ˆCØ˜œÐ+¨¨c¬mÐ.A¸r×-HÒ-HÑ-JÔ-JÈDÐPÐPØ!Ð!r>   r_  Únotec                 ó$   — |s| pdS | s|S | › d|› �S )Nr   r!  rŠ   )r_  r¡  s     r   r�  z%TelegramAdapter._append_observed_noteä!  s5   € àð 	"Ø�>˜rÐ!Øð 	ØˆKØÐ&Ð& Ð&Ð&Ð&r>   rc  r_  c              ƒ   óR  K  — |rd|› d�nd}	 |                      d|› |› d|j        j        › d�¦  «        ƒ d{V —† n5# t          $ r(}t                               d||d¬	¦  «         Y d}~nd}~ww xY wd
|› |› d|j        j        › d�}|                      |j        |¦  «        |_        dS )uK  Surface a failed media download/cache on BOTH ends instead of swallowing it.

        When download_as_bytearray()/cache_*_from_bytes() raises (typically a
        transient httpx.ConnectError to Telegram's CDN), the attachment never
        made it into event.media_urls. Without this, the handler falls through
        and dispatches an empty turn: the user thinks the file was delivered,
        the agent sees nothing, and the only record is a buried log warning.

        This (1) replies to the user in Telegram so they know to retry, and
        (2) appends an agent-visible notice to event.text via the existing
        observed-note channel so the agent knows an attachment was attempted
        and failed â€” never a silent empty turn. No new event fields (the
        structured-event refactor is out of scope per #23045).
        r_  rò  r   u   âš ï¸� Couldn't download your z). Please try sending it again.Nz;[Telegram] Failed to notify user about %s cache failure: %sTr#   z[The user attempted to send a z! but it could not be downloaded (z"); they have been asked to retry.])Ú
reply_textr—  r†   r   r(   r0   r�  r   )	r5  rÝ  rt  rc  r¬  r_  ÚnamedÚ	reply_errÚ
agent_notes	            r   Ú_surface_media_cache_failurez,TelegramAdapter._surface_media_cache_failureì!  sR  è è € ð, )5Ð<Ð$�\Ð$Ð$Ð$Ð$¸"ˆð	Ø—.’.ðL°tð L¸Uð Lð LØ”MÔ*ðLð Lð Lñô ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	Ý�NŠNØMØØØð	 ñ ô ð ð ð ð ð ð øøøøð	øøøðV¨Tð V°5ð Vð VØœ=Ô1ðVð Vð Vð 	ð ×/Ò/°´
¸JÑGÔGˆŒ
ˆ
ˆ
s   Ž.= ½
A/ÁA*Á*A/Úmsg_typeÚ	update_idc                 ó  — t          | dd¦  «        }|sdS 	 |p|                      |||¬¦  «        }|                      |j        ¦  «        }|                     |¦  «        }d|                      |¦  «        t          j        t          j	        ¬¦  «         
                    ¦   «         ddœ}|j        rt          |j        ¦  «        |d<   |                     |j        |¦  «         t          | d	d
¦  «        }	t                               d|	t          t          |dd¦  «        dd¦  «        |j        j        pd¦  «         dS # t$          $ r8}
t          | d	d
¦  «        }	t                               d|	|
¦  «         Y d}
~
dS d}
~
ww xY w)zGAppend skipped group chatter to the target session without dispatching.r"  N©rª  rÝ  )ÚtzT)Úroler~  Ú	timestampr&  rË  r   rá   zF[%s] Telegram group message observed (no bot trigger): chat=%s from=%srÓ  rÔ  r2  z1[%s] Failed to observe Telegram group message: %s)rl   Ú_build_message_eventrs  rÍ  Úget_or_create_sessionrx  r   rz  r   ÚutcÚ	isoformatrË  r   Úappend_to_transcriptÚ
session_idr(   r½   r¯  r   r0   )r5  rž  r©  rª  rt  r&  r  Úsession_entryrµ  Úadapter_namer¬  s              r   Ú"_observe_unmentioned_group_messagez2TelegramAdapter._observe_unmentioned_group_message"  s­  € õ ˜Ð.°Ñ5Ô5ˆØð 	ØˆFð	cØÐ^˜T×6Ò6°wÀÐT]Ð6Ñ^Ô^ˆEØ ×FÒFÀuÄ|ÑTÔTˆMØ!×7Ò7¸ÑFÔFˆMàØ×GÒGÈÑNÔNÝ%œ\­X¬\Ð:Ñ:Ô:×DÒDÑFÔFØ ð	ð ˆEð Ôð <Ý&)¨%Ô*:Ñ&;Ô&;��lÑ#Ø×&Ò& }Ô'?ÀÑGÔGÐGÝ" 4¨°Ñ<Ô<ˆLÝ�KŠKØXØÝ� ¨°Ñ6Ô6¸¸iÑHÔHØ”Ô$Ð1¨	ñ	ô ð ð ð øõ ð 	cð 	cð 	cÝ" 4¨°Ñ<Ô<ˆLÝ�NŠNÐNÐP\Ð^aÑbÔbÐbÐbÐbÐbÐbÐbÐbøøøøð	cøøøs   —D#D< Ä<
E>Å-E9Å9E>c                 ó¨   — | j         sdS t          |dd¦  «        }|€dS t          | j         dd¦  «        }t          |dd¦  «        }|duo	|duo||k    S )ac  Return True when the message was sent by this bot itself.

        In some Telegram environments (groups, supergroups where the bot can
        see its own messages), getUpdates returns the bot's own outgoing
        messages as updates.  These must be filtered out so they are not
        counted as incoming unread messages in the Hermes inbox.
        FrÒ  NrÔ  )rW  rl   )r5  rž  rÒ  r,  r¯  s        r   rm  zTelegramAdapter._is_own_message8"  sr   € ð Œyð 	Ø�5Ý˜G [°$Ñ7Ô7ˆ	ØÐØ�5Ý˜œ D¨$Ñ/Ô/ˆÝ˜) T¨4Ñ0Ô0ˆØ˜TÐ!ÐO g°TÐ&9ÐO¸fÈÒ>OÐOr>   ©Ú
is_commandr»  c          	      ó  — |                       |¦  «         |                      |¦  «        rdS |                      |¦  «        sdS |                      |¦  «        }|                      ¦   «         }|r|�t          |¦  «        n| j        }||vrdS |�_	 t          |¦  «        |                      ¦   «         v rdS n8# t          t          f$ r$ t                               d| j        |¦  «         Y nw xY w|                      |¦  «        s^|€Z| j        j                             dd¦  «        r:t          t#          t#          |dd¦  «        dd¦  «        ¦  «        }|s|| j        v rdS dS t          t#          t#          |dd¦  «        dd¦  «        ¦  «        }|                      ¦   «         r|                      |¦  «        rdS |                      |¦  «        }|                      ¦   «         }	|	r||	vr|S |rdS ||                      ¦   «         v rdS |                      |¦  «        rdS |                      ¦   «         sdS |                      |¦  «        rdS |                      ¦   «         s|                      |¦  «        rdS |                      |¦  «        S )	u¸  Apply Telegram group trigger rules.

        DMs remain unrestricted. Group/supergroup messages are accepted when:
        - the chat passes the ``allowed_chats`` whitelist (when set), or
          ``guest_mode`` is enabled and the bot is explicitly mentioned
        - the chat is explicitly allowlisted in ``free_response_chats``
        - ``require_mention`` is disabled
        - the message replies to the bot
        - the bot is @mentioned
        - the text/caption matches a configured regex wake-word pattern

        When ``allowed_chats`` is non-empty, it remains a hard gate except for
        the narrow ``guest_mode`` bypass: group/supergroup messages that
        explicitly @mention this bot. Replies and regex wake words do not bypass
        ``allowed_chats``. When ``require_mention`` is enabled, slash commands are not given
        special treatment â€” they must pass the same mention/reply checks
        as any other group message.  Users can still trigger commands via
        the Telegram bot menu (``/command@botname``) or by explicitly
        mentioning the bot (``@botname /command``), both of which are
        recognised as mentions by :meth:`_message_mentions_bot`.
        FTNz8[%s] Ignoring non-numeric Telegram message_thread_id: %rÚignore_root_dmrÓ  rÔ  r   )r-  rm  r!  rõ  r  r   r  r²   r  rµ   r¶   r(   r0   r   r7  r†  r‡  rl   rŒ  rà  rd  ri  rü  rí  rö  rÓ  r6  rÜ  r]  rg  )
r5  rž  r»  r­  r  r  rK  rn  Úguest_mentionrû  s
             r   Ú_should_process_messagez'TelegramAdapter._should_process_messageI"  së  € ð@ 	×/Ò/°Ñ8Ô8Ð8Ø×Ò Ñ(Ô(ð 	Ø�5à×"Ò" 7Ñ+Ô+ð 	Ø�4à×5Ò5°gÑ>Ô>ˆ	Ø×6Ò6Ñ8Ô8ˆØð 	Ø)2Ð)>•s˜9‘~”~�~ÀDÔDaˆHØ˜~Ð-Ð-Ø�uð Ð ðqÝ�y‘>”> T×%CÒ%CÑ%EÔ%EÐEÐEØ ˜5ð Føå�zÐ*ð qð qð qÝ—’ÐYÐ[_Ô[dÐfoÑpÔpÐpÐpÐpðqøøøð ×"Ò" 7Ñ+Ô+ð 	àÐ  T¤[Ô%6×%:Ò%:Ð;KÈUÑ%SÔ%SÐ Ý�g¥g¨g°v¸tÑ&DÔ&DÀdÈBÑOÔOÑPÔP�Ø!ð ! g°Ô1HÐ&HÐ&HØ ˜5Ø�4å�'¥'¨'°6¸4Ñ"@Ô"@À$ÈÑKÔKÑLÔLˆà×0Ò0Ñ2Ô2ð 	°t×7_Ò7_Ð`gÑ7hÔ7hð 	Ø�5ð ×.Ò.¨wÑ7Ô7ˆð
 ×.Ò.Ñ0Ô0ˆØð 	!�{¨'Ð1Ð1Ø Ð àð 	Ø�4Ø˜$×<Ò<Ñ>Ô>Ð>Ð>Ø�4Ø×0Ò0°Ñ9Ô9ð 	Ø�4Ø×-Ò-Ñ/Ô/ð 	Ø�4Ø× Ò  Ñ)Ô)ð 	Ø�4ð ×(Ò(Ñ*Ô*ð 	¨t×/IÒ/IÈ'Ñ/RÔ/Rð 	Ø�4Ø×5Ò5°gÑ>Ô>Ð>s   Â#B6 Â62C+Ã*C+c           	   ƒ   ó$  ‡K  — | j         4 ƒd{V —† 	 t          |dd¦  «        }|rt          |dd¦  «        s	 ddd¦  «        ƒd{V —† dS t          |j        ¦  «        }|| j        v r	 ddd¦  «        ƒd{V —† dS ddlmŠm} ddlm	}m
}  | |¦   «         ¬¦  «        \  }}ˆfd	„|D ¦   «         }	| j                             |	 ||¬
¦  «        ¬¦  «        ƒ d{V —† | j                             |¦  «         t                               d| j        t#          |	¦  «        |¦  «         nE# t$          $ r8}
t                               d| j        t)          |
¦  «        ¦  «         Y d}
~
nd}
~
ww xY wddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )uÿ   Lazy-register bot commands for forum supergroups.

        Forum topics don't inherit AllGroupChats scope â€” Telegram resolves
        via BotCommandScopeChat(chat_id).  Register on first message so the
        command menu works in topic views.
        NrÓ  rÜ  Fr   )rà  ÚBotCommandScopeChaträ  rç  c                 ó.   •— g | ]\  }} ‰||¦  «        ‘ŒS rŠ   rŠ   rê  s      €r   rì  z:TelegramAdapter._ensure_forum_commands.<locals>.<listcomp>¹"  rí  r>   rJ  rî  z2[%s] Lazy-registered %d commands for forum chat %sz/[%s] Forum command lazy-registration failed: %s)r„  rl   r²   rÔ  rƒ  rá   rà  rÁ  rò  rå  ræ  rW  ró  rd  r(   r½   r   r€  r   r0   r   )r5  rž  rÓ  rK  rÁ  rå  ræ  rõ  r]   r÷  rN  rà  s              @r   Ú_ensure_forum_commandsz&TelegramAdapter._ensure_forum_commands§"  s7  øè è € ð Ô#ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð}Ý˜w¨°Ñ5Ô5�Øð ¥7¨4°¸UÑ#CÔ#Cð Øð		}ð 	}ð 	}ñ 	}ô 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}õ
 ˜dœg™,œ,�Ø˜dÔ<Ð<Ð<Øð	}ð 	}ð 	}ñ 	}ô 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð EÐDÐDÐDÐDÐDÐDÐDØbÐbÐbÐbÐbÐbÐbÐbØ#9Ð#9ÐGaÐGaÑGcÔGcÐ#dÑ#dÔ#dÑ �˜qØWÐWÐWÐWÈÐWÑWÔW�Ø”i×/Ò/°ÐDWÐDWÐ`gÐDhÑDhÔDhÐ/ÑiÔiÐiÐiÐiÐiÐiÐiÐiØÔ.×2Ò2°7Ñ;Ô;Ð;Ý—’ÐPÐRVÔR[Õ]`ÐamÑ]nÔ]nÐpwÑxÔxÐxÐxøÝð }ð }ð }Ý—’ÐPÐRVÔR[Õ]xÐyzÑ]{Ô]{Ñ|Ô|Ð|Ð|Ð|Ð|Ð|Ð|øøøøð}øøøð	}ð 	}ð 	}ñ 	}ô 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}ð 	}øøøð 	}ð 	}ð 	}ð 	}ð 	}ð 	}sG   ‘E?“$D'ÁD'Á<B*D'Ä&E?Ä'
E)Ä1.E$ÅE?Å$E)Å)E?Å?
F	ÆF	c                 óF   — t          |dd¦  «        pt          |dd¦  «        S )a|  Return the message-like payload for normal messages and channel posts.

        Telegram exposes channel broadcasts as ``update.channel_post`` rather
        than ``update.message``.  MessageHandler filters can still dispatch
        those updates, so handlers must use ``effective_message`` to avoid
        consuming channel posts without ever building a gateway event.
        Úeffective_messageNrž  rB  )r5  r×  s     r   Ú_effective_update_messagez)TelegramAdapter._effective_update_messageÀ"  s)   € õ �vÐ2°DÑ9Ô9Ð]½WÀVÈYÐX\Ñ=]Ô=]Ð]r>   c              ƒ   ó&  K  — |                       |¦  «        }|r|j        sdS |                      |¦  «        sZt                               dt          t          |dd¦  «        dd¦  «        t          t          |dd¦  «        dd¦  «        ¦  «         dS |                      |¦  «        s>|                      |¦  «        r'|                      |t          j
        |j        ¬¦  «         dS |                      |j        ¦  «        ƒ d{V —† |                      |t          j
        |j        ¬¦  «        }|                      |j        ¦  «        |_        |                      ||¦  «        ƒ d{V —† |                      |¦  «        }|                      |¦  «         dS )zýHandle incoming text messages.

        Telegram clients split long messages into multiple updates.  Buffer
        rapid successive text messages from the same user/chat and aggregate
        them into a single MessageEvent before dispatching.
        Nú2[Telegram] Blocked unauthorized user %s in chat %srÒ  rÔ  rÓ  r¬  )rÆ  r   rý  r(   r0   rl   r¿  ro  r¸  r’   r@  rª  rÃ  rž  r°  rk  rœ  r�  Ú_enqueue_text_event©r5  r×  rk  rÝ  rt  s        r   rB  z$TelegramAdapter._handle_text_messageÊ"  s§  è è € ð ×,Ò,¨VÑ4Ô4ˆØð 	˜#œ(ð 	ØˆFð
 ×4Ò4°SÑ9Ô9ð 	Ý�NŠNØDÝ�  [°$Ñ7Ô7¸¸tÑDÔDÝ�  V¨TÑ2Ô2°D¸$Ñ?Ô?ñô ð ð
 ˆFØ×+Ò+¨CÑ0Ô0ð 	Ø×=Ò=¸cÑBÔBð kØ×7Ò7¸½[Ô=MÐY_ÔYiÐ7ÑjÔjÐjØˆFØ×)Ò)¨&¬.Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à×)Ò)¨#­{Ô/?È6ÔK[Ð)Ñ\Ô\ˆØ×1Ò1°%´*Ñ=Ô=ˆŒ
Ø×'Ò'¨¨UÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø×>Ò>¸uÑEÔEˆØ× Ò  Ñ'Ô'Ð'Ð'Ð'r>   c              ƒ   ó   K  — |                       |¦  «        }|r|j        sdS |                      |d¬¦  «        sdS |                      |¦  «        sZt                               dt          t          |dd¦  «        dd¦  «        t          t          |dd¦  «        dd¦  «        ¦  «         dS |                      |¦  «        ƒ d{V —† |                      |t          j
        |j        ¬¦  «        }|                      |j        ¦  «        |_        |                      ||¦  «        ƒ d{V —† |                      |¦  «        }t          |j        pd	¦  «        | j        k    r|                      |¦  «         dS |                      |¦  «        ƒ d{V —† dS )
z!Handle incoming command messages.NTrº  rÈ  rÒ  rÔ  rÓ  r¬  r   )rÆ  r   r¿  rý  r(   r0   rl   rÃ  r°  r’   rA  rª  rk  rœ  r�  r€  Ú_SPLIT_THRESHOLDrÉ  Úhandle_messagerÊ  s        r   rC  zTelegramAdapter._handle_commandë"  s·  è è € à×,Ò,¨VÑ4Ô4ˆØð 	˜#œ(ð 	ØˆFØ×+Ò+¨C¸DÐ+ÑAÔAð 	ØˆFØ×4Ò4°SÑ9Ô9ð 	Ý�NŠNØDÝ�  [°$Ñ7Ô7¸¸tÑDÔDÝ�  V¨TÑ2Ô2°D¸$Ñ?Ô?ñô ð ð
 ˆFØ×)Ò)¨#Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.à×)Ò)¨#­{Ô/BÈfÔN^Ð)Ñ_Ô_ˆØ×1Ò1°%´*Ñ=Ô=ˆŒ
Ø×'Ò'¨¨UÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø×>Ò>¸uÑEÔEˆõ ˆuŒzÐ˜RÑ Ô  DÔ$9Ò9Ð9Ø×$Ò$ UÑ+Ô+Ð+ØˆFØ×!Ò! %Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r>   c              ƒ   óÚ  K  — |                       |¦  «        }|sdS |                      |¦  «        sZt                               dt	          t	          |dd¦  «        dd¦  «        t	          t	          |dd¦  «        dd¦  «        ¦  «         dS |                      |¦  «        s>|                      |¦  «        r'|                      |t          j	        |j
        ¬¦  «         dS t	          |dd¦  «        }|rt	          |dd¦  «        nt	          |dd¦  «        }|sdS t	          |d	d¦  «        }t	          |d
d¦  «        }|�|€dS dg}|rVt	          |dd¦  «        }	t	          |dd¦  «        }
|	r|                     d|	› �¦  «         |
r|                     d|
› �¦  «         |                     d|› �¦  «         |                     d|› �¦  «         |                     d|› d|› �¦  «         |                     d¦  «         |                      |t          j	        |j
        ¬¦  «        }d                     |¦  «        |_        |                      |¦  «        }|                      |¦  «        ƒ d{V —† dS )z,Handle incoming location/venue pin messages.NrÈ  rÒ  rÔ  rÓ  r¬  ÚvenueÚlocationÚlatitudeÚ	longitudez![The user shared a location pin.]rØ  ÚaddresszVenue: z	Address: z
latitude: zlongitude: z5Map: https://www.google.com/maps/search/?api=1&query=rÄ  zSAsk what they'd like to find nearby (restaurants, cafes, etc.) and any preferences.r
  )rÆ  rý  r(   r0   rl   r¿  ro  r¸  r’   rD  rª  r  r°  r  r   r�  rÍ  )r5  r×  rk  rÝ  rÏ  rÐ  ÚlatÚlonrÏ  rØ  rÓ  rt  s               r   rE  z(TelegramAdapter._handle_location_message#  sµ  è è € à×,Ò,¨VÑ4Ô4ˆØð 	ØˆFØ×4Ò4°SÑ9Ô9ð 	Ý�NŠNØDÝ�  [°$Ñ7Ô7¸¸tÑDÔDÝ�  V¨TÑ2Ô2°D¸$Ñ?Ô?ñô ð ð
 ˆFØ×+Ò+¨CÑ0Ô0ð 	Ø×=Ò=¸cÑBÔBð oØ×7Ò7¸½[Ô=QÐ]cÔ]mÐ7ÑnÔnÐnØˆFå˜˜W dÑ+Ô+ˆØ7<Ð`•7˜5 *¨dÑ3Ô3Ð3Å'È#ÈzÐ[_ÑB`ÔB`ˆàð 	ØˆFå�h 
¨DÑ1Ô1ˆÝ�h ¨TÑ2Ô2ˆØˆ;˜#˜+ØˆFð 5Ð5ˆØð 	4Ý˜E 7¨DÑ1Ô1ˆEÝ˜e Y°Ñ5Ô5ˆGØð 0Ø—’Ð. uÐ.Ð.Ñ/Ô/Ð/Øð 4Ø—’Ð2¨Ð2Ð2Ñ3Ô3Ð3Ø�ŠÐ' #Ð'Ð'Ñ(Ô(Ð(Ø�ŠÐ( 3Ð(Ð(Ñ)Ô)Ð)Ø�ŠÐXÈSÐXÐXÐSVÐXÐXÑYÔYÐYØ�ŠÐjÑkÔkÐkà×)Ò)¨#­{Ô/CÈvÔO_Ð)Ñ`Ô`ˆØ—Y’Y˜uÑ%Ô%ˆŒ
Ø×>Ò>¸uÑEÔEˆØ×!Ò! %Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r>   c                 óì   — ddl m} |                      |¦  «          ||j        | j        j                             dd¦  «        | j        j                             dd¦  «        |j        j        ¬¦  «        S )a  Session-scoped key for text message batching.

        Applies the installed topic-recovery hook first so DM-topic batches
        coalesce on (and dispatch to) the recovered lane rather than the
        raw inbound ``message_thread_id`` Telegram may have attached.
        r   ©Úbuild_session_keyÚgroup_sessions_per_userTÚthread_sessions_per_userF)rÙ  rÚ  rî  )rÇ  rØ  Ú_apply_topic_recoveryrÍ  r7  r†  r‡  rî  )r5  rt  rØ  s      r   Ú_text_batch_keyzTelegramAdapter._text_batch_key@#  s…   € ð 	6Ð5Ð5Ð5Ð5Ð5Ø×"Ò" 5Ñ)Ô)Ð)Ø Ð ØŒLØ$(¤KÔ$5×$9Ò$9Ð:SÐUYÑ$ZÔ$ZØ%)¤[Ô%6×%:Ò%:Ð;UÐW\Ñ%]Ô%]Ø”LÔ(ð	
ñ 
ô 
ð 	
r>   c                 óì  — |                       ¦   «         rt                               d¦  «         dS |                      |¦  «        }| j                             |¦  «        }t          |j        pd¦  «        }|€||_        || j        |<   nw|j        r$|j        r|j        › d|j        › �n|j        |_        ||_        |j	        r>|j	         
                    |j	        ¦  «         |j         
                    |j        ¦  «         | j                             |¦  «        }|r(|                     ¦   «         s|                     ¦   «          t          j        |                      |¦  «        ¦  «        | j        |<   dS )a2  Buffer a text event and reset the flush timer.

        When Telegram splits a long user message into multiple updates,
        they arrive within a few hundred milliseconds.  This method
        concatenates them and waits for a short quiet period before
        dispatching the combined message.
        z?[Telegram] Dropping text batch enqueue after disconnect startedNr   r
  )r¥  r(   r)   rÜ  rl  r‡  r€  r   Ú_last_chunk_lenr“  Úextendr•  rm  r9   rV   r&   r1  Ú_flush_text_batch)r5  rt  rç  r_  Ú	chunk_lenÚ
prior_tasks         r   rÉ  z#TelegramAdapter._enqueue_text_eventP#  s|  € ð ×-Ò-Ñ/Ô/ð 	Ý�LŠLÐZÑ[Ô[Ð[ØˆFà×"Ò" 5Ñ)Ô)ˆØÔ-×1Ò1°#Ñ6Ô6ˆÝ˜œ
Ð( bÑ)Ô)ˆ	ØÐØ$-ˆEÔ!Ø.3ˆDÔ& sÑ+Ð+ð Œzð bØDLÄMÐ a 8¤=Ð @Ð @°E´JÐ @Ð @Ð @ÐW\ÔWa�”Ø'0ˆHÔ$àÔð ?ØÔ#×*Ò*¨5Ô+;Ñ<Ô<Ð<ØÔ$×+Ò+¨EÔ,=Ñ>Ô>Ð>ð Ô3×7Ò7¸Ñ<Ô<ˆ
Øð 	 ˜jŸošoÑ/Ô/ð 	 Ø×ÒÑÔÐÝ.5Ô.AØ×"Ò" 3Ñ'Ô'ñ/
ô /
ˆÔ& sÑ+Ð+Ð+r>   c              ƒ   óà  K  — t          j        ¦   «         }	 | j                             |¦  «        }|rt	          |dd¦  «        nd}|r t          t	          |dd¦  «        pd¦  «        nd}|| j        k    r| j        }nS|| j        k    rt          | j
        | j        ¦  «        }n-|| j        k    rt          | j
        | j        ¦  «        }n| j
        }t          j        |¦  «        ƒ d{V —† | j                             |d¦  «        }|s<	 | j                             |¦  «        |u r| j                             |d¦  «         dS dS |                      ¦   «         rVt$                               d¦  «         	 | j                             |¦  «        |u r| j                             |d¦  «         dS dS t$                               d|t          |j        pd¦  «        ¦  «         |                      |¦  «        ƒ d{V —† | j                             |¦  «        |u r| j                             |d¦  «         dS dS # | j                             |¦  «        |u r| j                             |d¦  «         w w xY w)zØWait for the quiet period then dispatch the aggregated text.

        Uses a longer delay when the latest chunk is near Telegram's 4096-char
        split point, since a continuation chunk is almost certain.
        rÞ  r   r   r   Nz=[Telegram] Dropping text batch flush after disconnect startedz,[Telegram] Flushing text batch %s (%d chars))r&   r˜  rl  r‡  rl   r€  rÌ  rk  Ú_TEXT_BATCH_FAST_LENr0  rj  Ú_TEXT_BATCH_FAST_DELAY_SÚ_TEXT_BATCH_SHORT_LENÚ_TEXT_BATCH_SHORT_DELAY_Sra  rB  rm  r¥  r(   r)   r½   r   rÍ  )r5  rç  r˜  r‚  Úlast_lenÚ	total_lenri  rt  s           r   rà  z!TelegramAdapter._flush_text_batcht#  s»  è è € õ Ô+Ñ-Ô-ˆð&	>ð Ô0×4Ò4°SÑ9Ô9ˆGØAHÐO•w˜wÐ(9¸1Ñ=Ô=Ð=ÈaˆHØCJÐQ��G G¨V°RÑ8Ô8Ð>¸BÑ?Ô?Ð?ÐPQˆIØ˜4Ô0Ò0Ð0ØÔ<��Ø˜dÔ7Ò7Ð7Ý˜DÔ:¸DÔ<YÑZÔZ��Ø˜dÔ8Ò8Ð8Ý˜DÔ:¸DÔ<ZÑ[Ô[��àÔ6�Ý”- Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ.×2Ò2°3¸Ñ=Ô=ˆEØð Øð Ô-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFð ×1Ò1Ñ3Ô3ð Ý—’Ð\Ñ]Ô]Ð]Øð Ô-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFõ �KŠKØ>Ø•S˜œÐ) rÑ*Ô*ñô ð ð ×%Ò% eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,àÔ-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFøˆtÔ-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=ð Gøøøs   —C0H3 Å.H3 Æ-AH3 È3:I-c                 óê   — ddl m}  ||j        | j        j                             dd¦  «        | j        j                             dd¦  «        ¬¦  «        }t          |dd	¦  «        }|r|› d
|› �S |› d�S )z1Return a batching key for Telegram photos/albums.r   r×  rÙ  TrÚ  F)rÙ  rÚ  Úmedia_group_idNz:album:z:photo-burst)rÇ  rØ  rÍ  r7  r†  r‡  rl   )r5  rt  rÝ  rØ  rð  rë  s         r   Ú_photo_batch_keyz TelegramAdapter._photo_batch_key§#  s£   € à5Ð5Ð5Ð5Ð5Ð5Ø'Ð'ØŒLØ$(¤KÔ$5×$9Ò$9Ð:SÐUYÑ$ZÔ$ZØ%)¤[Ô%6×%:Ò%:Ð;UÐW\Ñ%]Ô%]ð
ñ 
ô 
ˆõ
 ! Ð&6¸Ñ=Ô=ˆØð 	;Ø!Ð:Ð:¨.Ð:Ð:Ð:ØÐ+Ð+Ð+Ð+r>   Ú	batch_keyc              ƒ   ót  K  — t          j        ¦   «         }	 t          j        | j        ¦  «        ƒ d{V —† | j                             |d¦  «        }|s<	 | j                             |¦  «        |u r| j                             |d¦  «         dS dS |                      ¦   «         rVt           
                    d¦  «         	 | j                             |¦  «        |u r| j                             |d¦  «         dS dS t                               d|t          |j        ¦  «        ¦  «         |                      |¦  «        ƒ d{V —† | j                             |¦  «        |u r| j                             |d¦  «         dS dS # | j                             |¦  «        |u r| j                             |d¦  «         w w xY w)z;Send a buffered photo burst/album as a single MessageEvent.Nz>[Telegram] Dropping photo batch flush after disconnect startedz3[Telegram] Flushing photo batch %s with %d image(s))r&   r˜  ra  re  rf  rB  rg  r‡  r¥  r(   r)   r½   r€  r“  rÍ  )r5  rí  r˜  rt  s       r   Ú_flush_photo_batchz"TelegramAdapter._flush_photo_batch´#  së  è è € åÔ+Ñ-Ô-ˆð	EÝ”- Ô ?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ØÔ/×3Ò3°I¸tÑDÔDˆEØð Øð Ô.×2Ò2°9Ñ=Ô=ÀÐMÐMØÔ/×3Ò3°I¸tÑDÔDÐDÐDÐDð NÐMð ×1Ò1Ñ3Ô3ð Ý—’Ð]Ñ^Ô^Ð^Øð Ô.×2Ò2°9Ñ=Ô=ÀÐMÐMØÔ/×3Ò3°I¸tÑDÔDÐDÐDÐDð NÐMõ �KŠKÐMÈyÕZ]Ð^cÔ^nÑZoÔZoÑpÔpÐpØ×%Ò% eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,àÔ.×2Ò2°9Ñ=Ô=ÀÐMÐMØÔ/×3Ò3°I¸tÑDÔDÐDÐDÐDð NÐMøˆtÔ.×2Ò2°9Ñ=Ô=ÀÐMÐMØÔ/×3Ò3°I¸tÑDÔDÐDÐDð Nøøøs   —<E= Â.E= Ã9A	E= Å=:F7c                 ón  — |                       ¦   «         rt                               d¦  «         dS | j                             |¦  «        }|€|| j        |<   nj|j                             |j        ¦  «         |j                             |j        ¦  «         |j        r%|  	                    |j        |j        ¦  «        |_        | j
                             |¦  «        }|r(|                     ¦   «         s|                     ¦   «          t          j        |                      |¦  «        ¦  «        | j
        |<   dS )z;Merge photo events into a pending batch and schedule flush.z@[Telegram] Dropping photo batch enqueue after disconnect startedN)r¥  r(   r)   rf  r‡  r“  rß  r•  r   Ú_merge_captionrg  r9   rV   r&   r1  rï  )r5  rí  rt  r_  râ  s        r   Ú_enqueue_photo_eventz$TelegramAdapter._enqueue_photo_eventÅ#  s"  € à×-Ò-Ñ/Ô/ð 	Ý�LŠLÐ[Ñ\Ô\Ð\ØˆFàÔ.×2Ò2°9Ñ=Ô=ˆØÐØ5:ˆDÔ'¨	Ñ2Ð2àÔ×&Ò& uÔ'7Ñ8Ô8Ð8ØÔ ×'Ò'¨Ô(9Ñ:Ô:Ð:ØŒzð OØ $× 3Ò 3°H´MÀ5Ä:Ñ NÔ N�”àÔ4×8Ò8¸ÑCÔCˆ
Øð 	 ˜jŸošoÑ/Ô/ð 	 Ø×ÒÑÔÐå5<Ô5HÈ×I`ÒI`ÐajÑIkÔIkÑ5lÔ5lˆÔ'¨	Ñ2Ð2Ð2r>   c              ƒ   óÔ  K  — |j         sdS |                      |j         ¦  «        sdt                               dt	          t	          |j         dd¦  «        dd¦  «        t	          t	          |j         dd¦  «        dd¦  «        ¦  «         dS |                      |j         ¦  «        sº|                      |j         ¦  «        rž|j         }|                      |¦  «        }|                      |||j	        ¬¦  «        }|j
        r|                      |j
        ¦  «        |_        |                      ||¦  «        ƒ d{V —† |                      ||j        |j	        |¬¦  «         dS |j         }|                      |¦  «        }|                      |||j	        ¬¦  «        }|j
        r|                      |j
        ¦  «        |_        |j        rN|                      ||¦  «        ƒ d{V —† |                      |¦  «        }|                      |¦  «        ƒ d{V —† dS |                      |¦  «        }|j        �r©	 |j        d         }	|	                     ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}d	}|
j        r5d
D ]2}|
j                             ¦   «                              |¦  «        r|} nŒ3t5          t7          |¦  «        |¬¦  «        }|g|_        d|                     d¦  «        › �g|_        t                               d|¦  «         t	          |dd¦  «        }|r*|                      tA          |¦  «        |¦  «        ƒ d{V —† n,|  !                    ||¦  «        }|  "                    ||¦  «         dS # tF          $ rR}t           $                    dtK          |¦  «        d¬¦  «         |  &                    ||d|¦  «        ƒ d{V —† Y d}~nd}~ww xY w|j'        �rs	 |  (                    |j'        d¦  «        \  }}|sn|  )                    |j        |pd¦  «        |_        t                               dt	          |j'        dd¦  «        ¦  «         |                      |¦  «        ƒ d{V —† dS |j'                             ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}tU          t7          |¦  «        d¬¦  «        }|g|_        dg|_        t                               d|¦  «         �
n# tF          $ rS}t           $                    dtK          |¦  «        d¬¦  «         |  &                    ||d|¦  «        ƒ d{V —† Y d}~�	nÄd}~ww xY w|j+        �rs	 |  (                    |j+        d¦  «        \  }}|sn|  )                    |j        |pd¦  «        |_        t                               dt	          |j+        dd¦  «        ¦  «         |                      |¦  «        ƒ d{V —† dS |j+                             ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}tU          t7          |¦  «        d¬¦  «        }|g|_        dg|_        t                               d |¦  «         �n¡# tF          $ rS}t           $                    d!tK          |¦  «        d¬¦  «         |  &                    ||d|¦  «        ƒ d{V —† Y d}~�nId}~ww xY w|j,        �rÓ	 |  (                    |j,        d"¦  «        \  }}|sn|  )                    |j        |pd¦  «        |_        t                               d#t	          |j,        dd¦  «        ¦  «         |                      |¦  «        ƒ d{V —† dS |j,                             ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}d$}t	          |
d%d¦  «        r:tZ          D ]2}|
j                             ¦   «                              |¦  «        r|} nŒ3t]          t7          |¦  «        |¬¦  «        }|g|_        t[          j/        |d&¦  «        g|_        t                               d'|¦  «         �nÆ# tF          $ rS}t           $                    d(tK          |¦  «        d¬¦  «         |  &                    ||d"|¦  «        ƒ d{V —† Y d}~�nnd}~ww xY w|j0        �r^|j0        }	 d}|j1        pd}|r6td          j3         4                    |¦  «        \  }}|                     ¦   «         }|j5        pd                     ¦   «         }|sR|rPtl           /                    |d¦  «        }|s3d)„ to          j8        ¦   «         D ¦   «         }| /                    |d¦  «        }|j9        r|j9        | j:        k    rR| j:        d*z  }d+|› d,�|_        t                               d-|j9        ¦  «         |                      |¦  «        ƒ d{V —† dS |tv          v s| <                    d¦  «        �r¿|                     ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}|tv          v r|ntl           /                    |d	¦  «        }	 t5          t7          |¦  «        |¬¦  «        }nn# tz          $ ra}t           $                    d.tK          |¦  «        d¬¦  «         d/|p|p|pd0› d1�|_        |                      |¦  «        ƒ d{V —† Y d}~dS d}~ww xY wt|          j?        |_        |g|_        | <                    d¦  «        r|nt€           /                    |d2¦  «        g|_        t                               d3|¦  «         t	          |dd¦  «        }|r*|                      tA          |¦  «        |¦  «        ƒ d{V —† n,|  !                    ||¦  «        }|  "                    ||¦  «         dS |s?|j5        r8d4„ t[          j8        ¦   «         D ¦   «         }| /                    |j5        d¦  «        }|sS|j5        rLi }tƒ          j8        ¦   «         D ]\  }} | B                    | |¦  «         Œ| /                    |j5        d¦  «        }|tZ          v r¶|                     ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}t]          t7          |¦  «        |¬¦  «        }|g|_        tZ          |         g|_        t|          jC        |_        t                               d5|¦  «         |                      |¦  «        ƒ d{V —† dS |                     ¦   «         ƒ d{V —†}
|
                     ¦   «         ƒ d{V —†}!t7          |!¦  «        }"d6d7lDmE}#  |#|"|pd8|pd9› �|¬:¦  «        }$|$€.d;|p|p|pd0› d<�|_        |                      |¦  «        ƒ d{V —† dS |$j3        g|_        |$jF        g|_        |$jG        d=k    rt|          jH        |_        t                               d>|$jG        |$j3        |$jF        ¦  «         d?}%|t’          v p|pd <                    d@¦  «        }&|&r�t•          |"¦  «        |%k    rn	 |" K                    dA¦  «        }'|pd8|pdB› �}(t™          jM        dCdD|(¦  «        }(dE|(› dF|'› �})|j        r|)› dG|j        › �|_        n|)|_        n# tœ          $ r Y nw xY wnr# tF          $ re}t           $                    dHtK          |¦  «        d¬¦  «         |  &                    ||dI|t	          |dJd¦  «        pd¬K¦  «        ƒ d{V —† Y d}~nd}~ww xY wt	          |dd¦  «        }|r+|                      tA          |¦  «        |¦  «        ƒ d{V —† dS |                      |¦  «        ƒ d{V —† dS )LzBHandle incoming media messages, downloading images to local cache.Nz=[Telegram] Blocked media from unauthorized user %s in chat %srÒ  rÔ  rÓ  r¬  )rª  rt  rØ  r¨   )r©   r«   r§   rª   r¨   ©rÔ   zimage/r   z"[Telegram] Cached user photo at %srë  z$[Telegram] Failed to cache photo: %sTr#   rM  zvoice messager   z1[Telegram] Skipped oversized user voice (size=%s)r  r  rŸ  z"[Telegram] Cached user voice at %sz$[Telegram] Failed to cache voice: %sz
audio filez1[Telegram] Skipped oversized user audio (size=%s)r  z	audio/mp3z"[Telegram] Cached user audio at %sz$[Telegram] Failed to cache audio: %sz
video filez1[Telegram] Skipped oversized user video (size=%s)z.mp4r   rž  z"[Telegram] Cached user video at %sz$[Telegram] Failed to cache video: %sc                 ó   — i | ]\  }}||“Œ	S rŠ   rŠ   rÇ  s      r   rÉ  z9TelegramAdapter._handle_media_message.<locals>.<dictcomp>w$  s   € Ð&YÐ&YÐ&Y±°°1 q¨!Ð&YÐ&YÐ&Yr>   r  zFThe document is too large or its size could not be verified. Maximum: z MB.z'[Telegram] Document too large: %s bytesz-[Telegram] Failed to cache image document: %szImage document 'r2  z ' could not be read as an image.r­   z+[Telegram] Cached user image-document at %sc                 ó   — i | ]\  }}||“Œ	S rŠ   rŠ   rÇ  s      r   rÉ  z9TelegramAdapter._handle_media_message.<locals>.<dictcomp>¦$  s   € Ð(XÐ(XÐ(X±$°!°Q¨¨AÐ(XÐ(XÐ(Xr>   z+[Telegram] Cached user video document at %sr   rˆ  rZ  z.bin)r[  r‹  z
Document 'z' could not be cached.r×   z$[Telegram] Cached user %s at %s (%s)i � ztext/rÀ   z.txtz	[^\w.\- ]r]   z[Content of z]:
r!  z'[Telegram] Failed to cache document: %sÚ
attachmentrR  )r_  )Orž  rý  r(   r½   rl   r¿  ro  r†  r°  rª  r  rk  r   r™  r¸  r~  rƒ  Ú_handle_stickerr�  rÍ  rM  r�  r’  r   rÇ   r.  r–   r‘  r“  r%  r•  Ú_queue_media_group_eventr   rì  rò  r   r0   r   r¨  r  r  r�  r—   r×   rc  r›   r˜   r‡  rZ  rR  r   r¹   rÆ   r‹  Ú_TELEGRAM_IMAGE_MIME_TO_EXTrœ   rØ  r  r�  Ú_TELEGRAM_IMAGE_EXTENSIONSr¡  r¶   r’   rF  Ú_TELEGRAM_IMAGE_EXT_TO_MIMEr�   r¯  rG  rn  r‰  r”  rc  rH  rž   r€  rð  r   rú   rV  )*r5  r×  rk  rä  Ú_observe_typeÚ_eventrÝ  r©  rt  rM  r˜  Úimage_bytesrÔ   r¶  Úcached_pathrë  rí  rN  rû  r¡  Úaudio_bytesÚvideo_bytesr   Úoriginal_filenamer]   Údoc_mimeÚmime_to_extr  Ú	image_extÚvideo_mime_to_extÚimage_mime_to_extÚ_extÚ_mimeÚ	doc_bytesÚ	raw_bytesr‰  r²  ÚMAX_TEXT_INJECT_BYTESÚ_is_textÚtext_contentr_  Ú	injections*                                             r   rM  z%TelegramAdapter._handle_media_messageÚ#  sŽ  è è € àŒ~ð 	ØˆFØ×4Ò4°V´^ÑDÔDð 	Ý�KŠKØOÝ� ¤°¸TÑBÔBÀDÈ$ÑOÔOÝ� ¤°¸Ñ=Ô=¸tÀTÑJÔJñô ð ð
 ˆFØ×+Ò+¨F¬NÑ;Ô;ð 	Ø×=Ò=¸f¼nÑMÔMð 	Ø”^�Ø $× 8Ò 8¸Ñ <Ô <�Ø×2Ò2°2°}ÐPVÔP`Ð2ÑaÔa�Ø”:ð KØ"&×">Ò">¸r¼zÑ"JÔ"J�F”KØ×0Ò0°°VÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø×7Ò7Ø˜Ô+°vÔ7GÈvð 8ñ ô ð ð ˆFàŒnˆà×+Ò+¨CÑ0Ô0ˆà×)Ò)¨#¨xÀ6ÔCSÐ)ÑTÔTˆð Œ;ð 	CØ×5Ò5°c´kÑBÔBˆEŒJð Œ;ð 	Ø×&Ò& s¨EÑ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø×BÒBÀ5ÑIÔIˆEØ×%Ò% eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØˆFð ×>Ò>¸uÑEÔEˆð Œ9ñ 	PðPàœ	 "œ�Ø!&§¢Ñ!1Ô!1Ð1Ð1Ð1Ð1Ð1Ð1�à$,×$BÒ$BÑ$DÔ$DÐDÐDÐDÐDÐDÐD�à�ØÔ%ð "Ø%Oð "ð "˜	Ø#Ô-×3Ò3Ñ5Ô5×>Ò>¸yÑIÔIð "Ø"+˜CØ!˜Eð"õ 5µU¸;Ñ5GÔ5GÈSÐQÑQÔQ�Ø$/ =�Ô Ø%?¨c¯jªj¸©o¬oÐ%?Ð%?Ð$A�Ô!Ý—’Ð@À+ÑNÔNÐNÝ!(¨Ð.>ÀÑ!EÔ!E�Ø!ð @Ø×7Ò7½¸NÑ8KÔ8KÈUÑSÔSÐSÐSÐSÐSÐSÐSÐSÐSà $× 5Ò 5°e¸SÑ AÔ A�IØ×-Ò-¨i¸Ñ?Ô?Ð?Ø�øåð Pð Pð PÝ—’ÐEÕGbÐcdÑGeÔGeÐpt�ÑuÔuÐuØ×7Ò7¸¸UÀGÈQÑOÔOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOÐOøøøøðPøøøð
 Œ9ñ T	ðXØ $× AÒ AÀ#Ä)È_Ñ ]Ô ]‘�˜Øð Ø!%×!;Ò!;¸E¼JÈÈ
ÐPRÑ!SÔ!S�E”JÝ—K’KÐ SÕU\Ð]`Ô]fÐhsÐuyÑUzÔUzÑ{Ô{Ð{Ø×-Ò-¨eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�FØ!$¤×!3Ò!3Ñ!5Ô!5Ð5Ð5Ð5Ð5Ð5Ð5�Ø$,×$BÒ$BÑ$DÔ$DÐDÐDÐDÐDÐDÐD�Ý4µU¸;Ñ5GÔ5GÈVÐTÑTÔT�Ø$/ =�Ô Ø%0 M�Ô!Ý—’Ð@À+ÑNÔNÐNÑNøÝð Xð Xð XÝ—’ÐEÕGbÐcdÑGeÔGeÐpt�ÑuÔuÐuØ×7Ò7¸¸UÀOÐUVÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÑWøøøøðXøøøð ŒYñ C	ðUØ $× AÒ AÀ#Ä)È\Ñ ZÔ Z‘�˜Øð Ø!%×!;Ò!;¸E¼JÈÈ
ÐPRÑ!SÔ!S�E”JÝ—K’KÐ SÕU\Ð]`Ô]fÐhsÐuyÑUzÔUzÑ{Ô{Ð{Ø×-Ò-¨eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�FØ!$¤×!3Ò!3Ñ!5Ô!5Ð5Ð5Ð5Ð5Ð5Ð5�Ø$,×$BÒ$BÑ$DÔ$DÐDÐDÐDÐDÐDÐD�Ý4µU¸;Ñ5GÔ5GÈVÐTÑTÔT�Ø$/ =�Ô Ø%0 M�Ô!Ý—’Ð@À+ÑNÔNÐNÑNøÝð Uð Uð UÝ—’ÐEÕGbÐcdÑGeÔGeÐpt�ÑuÔuÐuØ×7Ò7¸¸UÀLÐRSÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÑTøøøøðUøøøð ŒYñ q	ðUØ $× AÒ AÀ#Ä)È\Ñ ZÔ Z‘�˜Øð Ø!%×!;Ò!;¸E¼JÈÈ
ÐPRÑ!SÔ!S�E”JÝ—K’KÐ SÕU\Ð]`Ô]fÐhsÐuyÑUzÔUzÑ{Ô{Ð{Ø×-Ò-¨eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�FØ!$¤×!3Ò!3Ñ!5Ô!5Ð5Ð5Ð5Ð5Ð5Ð5�Ø$,×$BÒ$BÑ$DÔ$DÐDÐDÐDÐDÐDÐD�Ø�Ý˜8 [°$Ñ7Ô7ð "Ý%:ð "ð "˜	Ø#Ô-×3Ò3Ñ5Ô5×>Ò>¸yÑIÔIð "Ø"+˜CØ!˜Eð"õ 5µU¸;Ñ5GÔ5GÈSÐQÑQÔQ�Ø$/ =�Ô Ý%:Ô%>¸sÀKÑ%PÔ%PÐ$Q�Ô!Ý—’Ð@À+ÑNÔNÐNÑNøÝð Uð Uð UÝ—’ÐEÕGbÐcdÑGeÔGeÐpt�ÑuÔuÐuØ×7Ò7¸¸UÀLÐRSÑTÔTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÐTÑTøøøøðUøøøð
 Œ\ñ X	Ø”,ˆCðVà�Ø$'¤MÐ$7°RÐ!Ø$ð &ÝœW×-Ò-Ð.?Ñ@Ô@‘F�A�sØŸ)š)™+œ+�Cð  œMÐ/¨R×6Ò6Ñ8Ô8�ð ð <˜xð <Ý5×9Ò9¸(ÀBÑGÔG�CØð <Ø&YÐ&YÕ8PÔ8VÑ8XÔ8XÐ&YÑ&YÔ&Y˜Ø)Ÿošo¨h¸Ñ;Ô;˜ð ”}ð ¨¬¸Ô8KÒ(KÐ(KØ#Ô2°{ÑC�Hð3Ø$,ð3ð 3ð 3ð ”Jõ —K’KÐ IÈ3Ì=ÑYÔYÐYØ×-Ò-¨eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�Fð
 Õ4Ð4Ð4¸×8KÒ8KÈHÑ8UÔ8UÑ4Ø%(§\¢\¡^¤^Ð3Ð3Ð3Ð3Ð3Ð3�HØ(0×(FÒ(FÑ(HÔ(HÐ"HÐ"HÐ"HÐ"HÐ"HÐ"H�KØ'*Õ.HÐ'HÐ'H  ÕNi×NmÒNmÐnvÐx~ÑNÔN�Ið	Ý&<½UÀ;Ñ=OÔ=OÐU^Ð&_Ñ&_Ô&_˜˜øÝ%ð ð ð ÝŸšÐ'VÕXsÐtuÑXvÔXvð  BF˜ñ  Gô  Gð  Gð=Ð/@Ð/`ÀHÐ/`ÐPSÐ/`ÐW`ð =ð =ð =ð œ
ð #×1Ò1°%Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ø˜˜˜˜˜øøøøðøøøõ *5Ô):�EÔ&Ø(3 }�EÔ$Ø5=×5HÒ5HÈÑ5RÔ5Rð  *Q¨¨ÕXs×XwÒXwð  yBð  DPñ  YQô  YQð  )R�EÔ%Ý—K’KÐ MÈ{Ñ[Ô[Ð[å%,¨SÐ2BÀDÑ%IÔ%I�NØ%ð DØ"×;Ò;½CÀÑ<OÔ<OÐQVÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWà$(×$9Ò$9¸%ÀÑ$EÔ$E˜	Ø×1Ò1°)¸UÑCÔCÐCØ�Fàð C˜sœ}ð CØ(XÐ(XÕ:OÔ:UÑ:WÔ:WÐ(XÑ(XÔ(XÐ%Ø+×/Ò/°´¸rÑBÔB�Càð C˜sœ}ð Cð 9;Ð%Ý'EÔ'KÑ'MÔ'Mð Bð B™˜˜eØ)×4Ò4°U¸DÑAÔAÐAÐAØ+×/Ò/°´¸rÑBÔB�CàÕ/Ð/Ð/Ø%(§\¢\¡^¤^Ð3Ð3Ð3Ð3Ð3Ð3�HØ(0×(FÒ(FÑ(HÔ(HÐ"HÐ"HÐ"HÐ"HÐ"HÐ"H�KÝ"8½¸{Ñ9KÔ9KÐQTÐ"UÑ"UÔ"U�KØ(3 }�EÔ$Ý)>¸sÔ)CÐ(D�EÔ%Ý)4Ô):�EÔ&Ý—K’KÐ MÈ{Ñ[Ô[Ð[Ø×-Ò-¨eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�Fð "%§¢¡¤Ð/Ð/Ð/Ð/Ð/Ð/�Ø"*×"@Ò"@Ñ"BÔ"BÐBÐBÐBÐBÐBÐB�	Ý! )Ñ,Ô,�	ØDÐDÐDÐDÐDÐDà*Ð*ØØ.ÐLÐ2L¸S¸]ÀFÐ2LÐ2LØ&ðñ ô �ð
 �>ð/Ð%6Ð%V¸(Ð%VÀcÐ%VÈYð /ð /ð /ð ”Jð ×-Ò-¨eÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�FØ$*¤K =�Ô Ø%+Ô%6Ð$7�Ô!Ø”; 'Ò)Ð)Ý)4Ô):�EÔ&Ý—’Ø:Ø”KØ”KØÔ%ñ	ô ð ð )3Ð%ØÕ"9Ð9Ða¸h¸nÈ"×=XÒ=XÐY`Ñ=aÔ=a�Øð ¥ I¡¤Ð2GÒ GÐ GðØ'0×'7Ò'7¸Ñ'@Ô'@˜Ø'8Ð'VÐ<VÀsÀ}ÈfÐ<VÐ<V˜Ý')¤v¨l¸CÀÑ'NÔ'N˜Ø$S°<Ð$SÐ$SÀ\Ð$SÐ$S˜	Ø œ:ð 3Ø,5Ð)GÐ)G¸5¼:Ð)GÐ)G˜EœJ˜Jà)2˜EœJøøÝ-ð ð ð ð ˜ðøøøøøõ
 ð ð ð Ý—’ÐHÕJeÐfgÑJhÔJhÐsw�ÑxÔxÐxØ×7Ò7Ø˜ ¨aÝ!(¨¨k¸4Ñ!@Ô!@Ð!HÀDð 8ñ ô ð ð ð ð ð ð ð ð ð ð ð ð øøøøðøøøõ ! Ð&6¸Ñ=Ô=ˆØð 	Ø×/Ò/µ°NÑ0CÔ0CÀUÑKÔKÐKÐKÐKÐKÐKÐKÐKØˆFà×!Ò! %Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(s  È0EM9 Í9
OÎAOÏOÏ!BS3 Ñ/BS3 Ó3
UÓ=AUÕUÕBY. ×*BY. Ù.
[Ù8A[Û[ÛBa	 Ý%C"a	 á	
b&áAb!â!b&â9Dz çA9z éi- é,z é-
ké7Akëz ëkëCz î2Ez ôBz öBz ø/Az úz ú
zúz úzúz ú
|ú'A|ü|rë  c              ƒ   óJ  K  — |                       ¦   «         rt                               d¦  «         dS | j                             |¦  «        }|€|| j        |<   nj|j                             |j        ¦  «         |j                             |j        ¦  «         |j        r%|  	                    |j        |j        ¦  «        |_        | j
                             |¦  «        }|r|                     ¦   «          t          j        |                      |¦  «        ¦  «        | j
        |<   dS )a€  Buffer Telegram media-group items so albums arrive as one logical event.

        Telegram delivers albums as multiple updates with a shared media_group_id.
        If we forward each item immediately, the gateway thinks the second image is a
        new user message and interrupts the first. We debounce briefly and merge the
        attachments into a single MessageEvent.
        z@[Telegram] Dropping media group enqueue after disconnect startedN)r¥  r(   r)   rh  r‡  r“  rß  r•  r   rñ  ri  rV   r&   r1  Ú_flush_media_group_event)r5  rë  rt  r_  râ  s        r   rù  z(TelegramAdapter._queue_media_group_event%  s  è è € ð ×-Ò-Ñ/Ô/ð 	Ý�LŠLÐ[Ñ\Ô\Ð\ØˆFàÔ+×/Ò/°Ñ?Ô?ˆØÐØ7<ˆDÔ$ ^Ñ4Ð4àÔ×&Ò& uÔ'7Ñ8Ô8Ð8ØÔ ×'Ò'¨Ô(9Ñ:Ô:Ð:ØŒzð OØ $× 3Ò 3°H´MÀ5Ä:Ñ NÔ N�”àÔ,×0Ò0°Ñ@Ô@ˆ
Øð 	 Ø×ÒÑÔÐå29Ô2EØ×)Ò)¨.Ñ9Ô9ñ3
ô 3
ˆÔ Ñ/Ð/Ð/r>   c              ƒ   ó@  K  — t          j        ¦   «         }	 t          j        | j        ¦  «        ƒ d {V —† | j                             |d ¦  «        }|�…|                      ¦   «         rVt                               d¦  «         	 | j	         
                    |¦  «        |u r| j	                             |d ¦  «         d S d S |                      |¦  «        ƒ d {V —† nO# t           j        $ r= Y | j	         
                    |¦  «        |u r| j	                             |d ¦  «         d S d S w xY w| j	         
                    |¦  «        |u r| j	                             |d ¦  «         d S d S # | j	         
                    |¦  «        |u r| j	                             |d ¦  «         w w xY w)Nz>[Telegram] Dropping media group flush after disconnect started)r&   r˜  ra  ÚMEDIA_GROUP_WAIT_SECONDSrh  rB  r¥  r(   r)   ri  r‡  rÍ  r'   )r5  rë  r˜  rt  s       r   r  z(TelegramAdapter._flush_media_group_event#%  sâ  è è € ÝÔ+Ñ-Ô-ˆð	BÝ”- Ô =Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÔ,×0Ò0°ÀÑFÔFˆEØÐ Ø×5Ò5Ñ7Ô7ð Ý—L’LÐ!aÑbÔbÐbØð
 Ô&×*Ò*¨>Ñ:Ô:¸lÐJÐJØÔ'×+Ò+¨N¸DÑAÔAÐAÐAÐAð KÐJð	 ×)Ò)¨%Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøÝÔ%ð 	ð 	ð 	ØàÔ&×*Ò*¨>Ñ:Ô:¸lÐJÐJØÔ'×+Ò+¨N¸DÑAÔAÐAÐAÐAð KÐJð	øøøð Ô&×*Ò*¨>Ñ:Ô:¸lÐJÐJØÔ'×+Ò+¨N¸DÑAÔAÐAÐAÐAð KÐJøˆtÔ&×*Ò*¨>Ñ:Ô:¸lÐJÐJØÔ'×+Ò+¨N¸DÑAÔAÐAÐAð Køøøs0   —A*C Â=C ÃE# ÃD%Ã(E# Ä$D%Ä%E# Å#:Fr‘   c              ƒ   óB  K  — ddl m}m}m}m}m} |j        }|j        pd}	|j        pd}
|j	        s|j
        r ||	¦  «        |_        dS  ||j        ¦  «        }|rb ||d         |                     d|	¦  «        |                     d|
¦  «        ¦  «        |_        t                               d|j        ¦  «         dS 	 |                     ¦   «         ƒ d{V —†}|                     ¦   «         ƒ d{V —†}t%          t'          |¦  «        d	¬
¦  «        }t                               d|¦  «         ddlm}  |||¬¦  «        ƒ d{V —†}t-          j        |¦  «        }|                     d¦  «        r=|                     dd¦  «        } ||j        ||	|
¦  «          |||	|
¦  «        |_        dS  ||	rd|	› �nd|	|
¦  «        |_        dS # t0          $ rN}t                               dt5          |¦  «        d¬¦  «          ||	rd|	› �nd|	|
¦  «        |_        Y d}~dS d}~ww xY w)a  
        Describe a Telegram sticker via vision analysis, with caching.

        For static stickers (WEBP), we download, analyze with vision, and cache
        the description by file_unique_id. For animated/video stickers, we inject
        a placeholder noting the emoji.
        r   )Úget_cached_descriptionÚcache_sticker_descriptionÚbuild_sticker_injectionÚ build_animated_sticker_injectionÚSTICKER_VISION_PROMPTr   Nr  ÚemojiÚset_namez [Telegram] Sticker cache hit: %sr«   rô  z"[Telegram] Analyzing sticker at %s)Úvision_analyze_tool)rC  Úuser_promptrÓ  Úanalysisz	a stickerza sticker with emoji z%[Telegram] Sticker analysis error: %sTr#   )Úgateway.sticker_cacher  r  r  r  r  rƒ  r  r  Úis_animatedÚis_videor   Úfile_unique_idr‡  r(   r½   r�  r’  r–   r‘  Útools.vision_toolsr  r  r  r   r0   r   )r5  rÝ  rt  r  r  r  r  r  rƒ  r  r  r²  r˜  rÿ  r   r  Úresult_jsonrg   r  rN  s                       r   rø  zTelegramAdapter._handle_sticker3%  sþ  è è € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ”+ˆØ”Ð# ˆØÔ#Ð) rˆð Ôð 	 'Ô"2ð 	Ø9Ð9¸%Ñ@Ô@ˆEŒJØˆFð (Ð'¨Ô(>Ñ?Ô?ˆØð 	Ø0Ð0Ø�}Ô% v§z¢z°'¸5Ñ'AÔ'AÀ6Ç:Â:ÈjÐZbÑCcÔCcñô ˆEŒJõ �KŠKÐ:¸GÔ<RÑSÔSÐSØˆFð	Ø$×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/ˆHØ (× >Ò >Ñ @Ô @Ð@Ð@Ð@Ð@Ð@Ð@ˆKÝ0µ°{Ñ1CÔ1CÈÐQÑQÔQˆKÝ�KŠKÐ<¸kÑJÔJÐJà>Ð>Ð>Ð>Ð>Ð>Ø 3Ð 3Ø%Ø1ð!ñ !ô !ð ð ð ð ð ð ˆKõ ”Z Ñ,Ô,ˆFà�zŠz˜)Ñ$Ô$ð 	Ø$Ÿjšj¨°[ÑAÔA�Ø)Ð)¨'Ô*@À+ÈuÐV^Ñ_Ô_Ð_Ø4Ð4°[À%ÈÑRÔR�”
�
�
ð 5Ð4Ø7<ÐMÐ3¨EÐ3Ð3Ð3À+Ø˜8ñô �”
�
�
øõ ð 	ð 	ð 	Ý�NŠNÐBÕD_Ð`aÑDbÔDbÐmqˆNÑrÔrÐrØ0Ð0Ø38ÐIÐ/¨Ð/Ð/Ð/¸kØ�xñô ˆEŒJˆJˆJˆJˆJˆJˆJøøøøð	øøøs    Â?C*G Æ+G Ç
HÇAHÈHc                 ó  — 	 ddl m}  |¦   «         }|                     di ¦  «                             di ¦  «                             di ¦  «                             dg ¦  «        }|sg | _        t	          ¦   «         | _        dS || _        d„ |D ¦   «         | _        |D ]ª}|                     d	¦  «        }|sŒ|                     d
g ¦  «        D ]y}|                     d¦  «        }|                     d¦  «        }|rK|rI|› d|› �}	|	| j        vr9t          |¦  «        | j        |	<   t           	                    d| j
        |	|¦  «         ŒzŒ«dS # t          $ r,}
t                               d| j
        |
¦  «         Y d}
~
dS d}
~
ww xY w)zÒRe-read dm_topics from config.yaml and load any new thread_ids into cache.

        This allows topics created externally (e.g. by the agent via API) to be
        recognized without a gateway restart.
        r   )Úload_config_readonlyrÁ  rá   r†  rH  Nc                 ó@   — h | ]}d |v ¯t          |d          ¦  «        ’ŒS rJ  rL  )rM  r´  s     r   rO  z@TelegramAdapter._reload_dm_topics_from_config.<locals>.<setcomp>�%  s7   € ð 'ð 'ð 'Ø/9È)ÐWaÐJaÐJa•�J˜yÔ)Ñ*Ô*ÐJaÐJaÐJar>   rK  r¬  r­  r   r«  z8[%s] Hot-loaded DM topic from config: %s -> thread_id=%sz/[%s] Failed to reload dm_topics from config: %s)rÉ  r'  r‡  r‹  r8   rŒ  r‚  r²   r(   r½   r   r   r)   )r5  r'  r7  rH  r´  ÚcidrÑ  Útidr   r±  rN  s              r   Ú_reload_dm_topics_from_configz-TelegramAdapter._reload_dm_topics_from_configt%  sç  € ð(	Zð ?Ð>Ð>Ð>Ð>Ð>Ø)Ð)Ñ+Ô+ˆFð —
’
˜;¨Ñ+Ô+ß’�Z Ñ$Ô$ß’�W˜bÑ!Ô!ß’�[ "Ñ%Ô%ð	 ð ð à)+�Ô&Ý*-©%¬%�Ô'Ø�ð &/ˆDÔ"ð'ð 'Ø=Fð'ñ 'ô 'ˆDÔ#ð (ð ð �
Ø —n’n YÑ/Ô/�Øð ØØ#Ÿš¨°"Ñ5Ô5ð 
ð 
�AØŸ%š% Ñ,Ô,�CØŸ5š5 ™=œ=�DØð ˜tð Ø'* O O¨T O O˜	Ø$¨D¬OÐ;Ð;Ý9<¸S¹¼˜DœO¨IÑ6Ý"ŸKšKØ ZØ $¤	¨9°cñô ð øð
ð	ð øõ ð 	Zð 	Zð 	ZÝ�LŠLÐJÈDÌIÐWXÑYÔYÐYÐYÐYÐYÐYÐYÐYøøøøð	Zøøøs   ‚A>E	 ÂCE	 Å	
E?Å!E:Å:E?c                 óx  — |sdS t          |¦  «        }| j                             ¦   «         D ]¯\  }}||k    r¤|                     |› d�¦  «        rŒ|                     dd¦  «        d         }| j        D ]b}t          |                     d¦  «        ¦  «        |k    r:|                     dg ¦  «        D ]#}|                     d¦  «        |k    r|c c c S Œ$Œcd|ic S Œ°|                      ¦   «          | j                             ¦   «         D ]¯\  }}||k    r¤|                     |› d�¦  «        rŒ|                     dd¦  «        d         }| j        D ]b}t          |                     d¦  «        ¦  «        |k    r:|                     dg ¦  «        D ]#}|                     d¦  «        |k    r|c c c S Œ$Œcd|ic S Œ°dS )z²Look up DM topic config by chat_id and thread_id.

        Returns the topic config dict (name, skill, etc.) if this thread_id
        matches a known DM topic, or None.
        Nr«  r»   rK  r¬  r   )	r²   r‚  rØ  r¡  rÈ  r‹  r   r‡  r+  )	r5  rK  r­  Úthread_id_intrç  Ú
cached_tidr¨  r´  rÑ  s	            r   Ú_get_dm_topic_infoz"TelegramAdapter._get_dm_topic_info¤%  s  € ð ð 	Ø�4å˜I™œˆð  $œ×4Ò4Ñ6Ô6ð 		,ð 		,‰OˆC�Ø˜]Ò*Ð*¨s¯~ª~À¸m¸m¸mÑ/LÔ/LÐ*Ø ŸYšY s¨AÑ.Ô.¨qÔ1�
à"&Ô"8ð )ð )�JÝ˜:Ÿ>š>¨)Ñ4Ô4Ñ5Ô5¸Ò@Ð@Ø!+§¢°¸"Ñ!=Ô!=ð )ð )˜AØ Ÿušu V™}œ}°
Ò:Ð:Ø'(       ð  ;øà 
Ð+Ð+Ð+Ð+øð 	×*Ò*Ñ,Ô,Ð,ð  $œ×4Ò4Ñ6Ô6ð 	,ð 	,‰OˆC�Ø˜]Ò*Ð*¨s¯~ª~À¸m¸m¸mÑ/LÔ/LÐ*Ø ŸYšY s¨AÑ.Ô.¨qÔ1�
Ø"&Ô"8ð )ð )�JÝ˜:Ÿ>š>¨)Ñ4Ô4Ñ5Ô5¸Ò@Ð@Ø!+§¢°¸"Ñ!=Ô!=ð )ð )˜AØ Ÿušu V™}œ}°
Ò:Ð:Ø'(       ð  ;øà 
Ð+Ð+Ð+Ð+øàˆtr>   c                 óœ   — |› d|› �}|| j         vr;t          |¦  «        | j         |<   t                               d| j        ||¦  «         dS dS )zLCache a thread_id -> topic_name mapping discovered from an incoming message.r«  z5[%s] Cached DM topic from message: %s -> thread_id=%sN)r‚  r²   r(   r½   r   )r5  rK  r­  r¨  r±  s        r   Ú_cache_dm_topic_from_messagez,TelegramAdapter._cache_dm_topic_from_messageË%  sh   € àÐ-Ð- Ð-Ð-ˆ	Ø˜DœOÐ+Ð+Ý),¨Y©¬ˆDŒO˜IÑ&Ý�KŠKØGØ”	˜9 iñô ð ð ð ð ,Ð+r>   r°   c                 ó„  ‡ — |€dS t          |t          ¦  «        r|S t          |t          ¦  «        r!d                     ˆ fd„|D ¦   «         ¦  «        S t          |t          ¦  «        rX|                     d¦  «        }|�‰                      |¦  «        S |                     d¦  «        }|�‰                      |¦  «        S dS )zFBest-effort plaintext flattener for Bot API rich-message inline nodes.Nr   c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r7   )Ú_flatten_rich_inline_text)rM  Úitemr   s     €r   rè  z<TelegramAdapter._flatten_rich_inline_text.<locals>.<genexpr>Ý%  s1   øè è € ÐQÐQÀ4˜3×8Ò8¸Ñ>Ô>ÐQÐQÐQÐQÐQÐQr>   r   Úchildren)r0  r   rt  r  rA  r‡  r4  )r   r°   r   r6  s   `   r   r4  z)TelegramAdapter._flatten_rich_inline_textÕ%  sÍ   ø€ ð ˆ=Ø�2Ý�e�SÑ!Ô!ð 	ØˆLÝ�e�TÑ"Ô"ð 	RØ—7’7ÐQÐQÐQÐQÈ5ÐQÑQÔQÑQÔQÐQÝ�e�TÑ"Ô"ð 	?Ø—9’9˜VÑ$Ô$ˆDØÐØ×4Ò4°TÑ:Ô:Ð:Ø—y’y Ñ,Ô,ˆHØÐ#Ø×4Ò4°XÑ>Ô>Ð>Øˆrr>   Úblocksc                 ó>  — t          |t          ¦  «        sdS g }|D �]b}t          |t          ¦  «        sŒ|                     d¦  «        }|dk    rÝ|                     dg ¦  «        D ]Ä}t          |t          ¦  «        sŒ|                      |                     d¦  «        ¦  «        }|sŒC|                     d¦  «        }|                     ¦   «         }|sŒo|d         }	|r|› d|	› �                     ¦   «         }	|                     |	¦  «         |                     |d	d
…         ¦  «         ŒÅ�Œ|  	                    |                     d¦  «        ¦  «        }
|
r'|                     |
                     ¦   «         ¦  «         �Œdd 
                    d„ |D ¦   «         ¦  «        S )z@Best-effort plaintext flattener for Bot API rich-message blocks.r   rÙ  rt  rØ  r7  r>  r   r¼  r»   Nr   r
  c              3   óB   K  — | ]}|¯|                      ¦   «         V — Œd S r7   )Úrstripr—  s     r   rè  z7TelegramAdapter._flatten_rich_blocks.<locals>.<genexpr>	&  s/   è è € ÐAÐA¨4¸DÐA˜Ÿš™œÐAÐAÐAÐAÐAÐAr>   )r0  rt  rA  r‡  Ú_flatten_rich_blocksr™  r   r  rß  r4  r  )r   r7  ÚlinesÚblockÚ
block_typer5  Ú	item_textr>  Ú
item_linesÚ
first_liner   s              r   r;  z$TelegramAdapter._flatten_rich_blocksç%  s±  € õ ˜&¥$Ñ'Ô'ð 	Ø�2àˆØð 	0ñ 	0ˆEÝ˜e¥TÑ*Ô*ð ØàŸš 6Ñ*Ô*ˆJØ˜VÒ#Ð#Ø!ŸIšI g¨rÑ2Ô2ð 1ð 1�DÝ% d­DÑ1Ô1ð !Ø Ø #× 8Ò 8¸¿ºÀ(Ñ9KÔ9KÑ LÔ L�IØ$ð !Ø Ø ŸHšH WÑ-Ô-�EØ!*×!5Ò!5Ñ!7Ô!7�JØ%ð !Ø Ø!+¨A¤�JØð EØ(-Ð%<Ð%<°
Ð%<Ð%<×%BÒ%BÑ%DÔ%D˜
Ø—L’L Ñ,Ô,Ð,Ø—L’L ¨A¨B¨B¤Ñ0Ô0Ð0Ð0Ùà×0Ò0°·²¸6Ñ1BÔ1BÑCÔCˆDØð 0Ø—’˜TŸ_š_Ñ.Ô.Ñ/Ô/Ð/ùà�yŠyÐAÐA°5ÐAÑAÔAÑAÔAÐAr>   r+  c                 óN  — 	 t          |dd¦  «        }t          |dd¦  «        }t          |¦  «        sdS  |d¦  «        }t          |dd¦  «        }t          |¦  «        sdS |                       |d¦  «        ¦  «                             ¦   «         }|pdS # t          $ r Y dS w xY w)zAReturn plaintext echoed by Telegram's rich_message reply payload.rÏ  Nr‡  rÅ  r7  )rl   rÆ  r;  r   r   )r   r+  rÏ  ÚgetterrÅ  Úrich_getterr   s          r   Ú_extract_rich_reply_textz(TelegramAdapter._extract_rich_reply_text&  sÉ   € ð	Ý Ð!1°<ÀÑFÔFˆJÝ˜Z¨°Ñ5Ô5ˆFÝ˜FÑ#Ô#ð Ø�tØ!˜6 .Ñ1Ô1ˆLÝ! ,°°tÑ<Ô<ˆKÝ˜KÑ(Ô(ð Ø�tØ×+Ò+¨K¨K¸Ñ,AÔ,AÑBÔB×HÒHÑJÔJˆDØ�<˜4ÐøÝð 	ð 	ð 	Ø�4�4ð	øøøs   ‚1B µ+B Á"3B Â
B$Â#B$c                 óV	  — |j         }|j        }t          t          |dd¦  «        ¦  «                             d¦  «        d                              ¦   «         }d}|dv rd}n|dk    rd}|                      |¦  «        }d	}	d	}
|dk    rª|r¨|                      t          |j        ¦  «        |¦  «        }|r*| 	                    d
¦  «        }	| 	                    d¦  «        }
t          |d¦  «        rB|j        r;|j        j        }|r-|                      t          |j        ¦  «        ||¦  «         |	s|}	�n`|dk    �rY|�rV| j        j         	                    dg ¦  «        }t!          |t"          ¦  «        rd„ |                     ¦   «         D ¦   «         }n$t!          |t&          ¦  «        rd„ |D ¦   «         }ng }|D ]Û}t          | 	                    dd¦  «        ¦  «        t          |j        ¦  «        k    r | 	                    dg ¦  «        }t!          |t&          ¦  «        sg }|D ]n}t!          |t"          ¦  «        sŒ| 	                    d¦  «        }|�?t          |¦  «        |k    r,| 	                    d
¦  «        }	| 	                    d¦  «        }
 nŒo nŒÜ|                      t          |j        ¦  «        |j        pt          |d¦  «        r|j        nd	||rt          |j        ¦  «        n|dv rt          |j        ¦  «        nd	|r|j        n+t          |d¦  «        r|dk    r|j        n|dk    r|j        nd	||	t          |j        ¦  «        |rt1          t          |dd¦  «        ¦  «        nd¬¦	  «	        }d	}d	}|j        r¾t          |j        j        ¦  «        }t          |dd	¦  «        }|�t          |dd	¦  «        nd	}|r|}nz|j        j        p|j        j        pd	}|s|                      |j        ¦  «        }|sB	 ddlm} |                     t          |j        ¦  «        |¦  «        }n# t@          $ r d	}Y nw xY wddl!m"} t          |j        ¦  «        } || j        j        |p||r|nd	¦  «        }tG          |j        pd|||t          |j        ¦  «        ||||
||j$        ¬¦  «        S )aO  Build a MessageEvent from a Telegram message.

        ``update_id`` is the ``Update.update_id`` from PTB; passing it through
        lets ``/restart`` record the triggering offset so the new gateway
        process can advance past it (prevents ``/restart`` being re-delivered
        when PTB's graceful-shutdown ACK fails).
        rÙ  r   r   rØ  r¶  >   r  r¸  r  rô  Nr   ÚskillÚforum_topic_createdÚgroup_topicsc                 ó   — g | ]
\  }}||d œ‘ŒS )r­  rŠ   )rM  Úcfg_chat_idr¬  s      r   rì  z8TelegramAdapter._build_message_event.<locals>.<listcomp>W&  s4   € ð %ð %ð %á+˜ Vð !,°vÐ>Ð>ð%ð %ð %r>   c                 ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS rŠ   )r0  rA  )rM  rµ  s     r   rì  z8TelegramAdapter._build_message_event.<locals>.<listcomp>\&  s8   € ð %ð %ð %Ø#½jÈÕPTÑ>UÔ>Uð%Øð%ð %ð %r>   rK  r¬  r­  rÖ  >   r¶  rô  Úis_botF)	rK  Ú	chat_namer¬  r¯  r®  r­  Ú
chat_topicrË  rM  Úquoter   r   rÔ  )Úresolve_channel_prompt)r   r~  rÍ  r|  rË  Úplatform_update_idr  Úreply_to_textÚ
auto_skillr}  r¯  )%rÓ  rÒ  r   rl   rÈ  rÇ   rõ  r/  rÔ  r‡  r%  rH  r   r1  r7  r†  r0  rA  rØ  rt  Úbuild_sourcerØ  rÖ  rË  r…  r+  r   r  rE  rÚ  rÕ  Úlookupr   rn  rQ  r‘   Údate)r5  rž  r©  rª  rÓ  rÝ  Útelegram_chat_typer¬  Úthread_id_strrO  Útopic_skillÚ
topic_infoÚcreated_nameÚgroup_topics_configÚgroup_topics_iterr´  r¬  r¡  r*  rÍ  rÁ  rS  rP  Ú
quote_textrÕ  rQ  Ú_chat_id_strÚ_channel_prompts                               r   r°  z$TelegramAdapter._build_message_event&  sŽ  € ð Œ|ˆØÔ ˆõ
 !¥¨¨v°rÑ!:Ô!:Ñ;Ô;×AÒAÀ#ÑFÔFÀrÔJ×PÒPÑRÔRÐØˆ	ØÐ!8Ð8Ð8ØˆIˆIØ 9Ò,Ð,Ø!ˆIð ×9Ò9¸'ÑBÔBˆØˆ
Øˆà˜ÒÐ ÐØ×0Ò0µ°T´W±´¸}ÑMÔMˆJØð 6Ø'Ÿ^š^¨FÑ3Ô3�
Ø(Ÿnšn¨WÑ5Ô5�õ �wÐ 5Ñ6Ô6ð 2¸7Ô;Vð 2Ø&Ô:Ô?�Øð 2Ø×5Ò5µc¸$¼'±l´lÀMÐS_Ñ`Ô`Ð`Ø%ð 2Ø%1˜
ùà˜'Ò!Ñ! mÑ!ð #'¤+Ô"3×"7Ò"7¸ÈÑ"KÔ"KÐÝÐ-­tÑ4Ô4ð 
'ð%ð %à/B×/HÒ/HÑ/JÔ/Jð%ñ %ô %Ð!Ð!õ Ð/µÑ6Ô6ð 'ð%ð %Ø':ð%ñ %ô %Ð!Ð!ð %'Ð!Ø/ð ð �
Ý�z—~’~ i°Ñ4Ô4Ñ5Ô5½¸T¼W¹¼ÒEÐEØ'Ÿ^š^¨H°bÑ9Ô9�FÝ% f­dÑ3Ô3ð $Ø!#˜Ø!'ð "ð "˜Ý)¨%µÑ6Ô6ð %Ø$Ø#Ÿiši¨Ñ4Ô4˜Ø˜?­s°3©x¬x¸=Ò/HÐ/HØ).¯ª°6Ñ):Ô):˜JØ*/¯)ª)°GÑ*<Ô*<˜KØ!˜EøØ�Eð Fð ×"Ò"Ý˜œ‘L”LØ”jÐ\µw¸tÀ[Ñ7QÔ7QÐ%[ T¤^ ^ÐW[Øð ðP•�D”G‘”�à&/Ð3DÐ&DÐ&D•c˜$œ'‘l”l�lÈ$ð ð�”�õ ˜t [Ñ1Ô1ðJØ6?À4Ò6GÐ6Gð ”N�Nà(1°YÒ(>Ð(>˜$œ*˜*ÀDð $Ø!Ý˜7Ô-Ñ.Ô.Ø;?ÐJ•4�  h°Ñ6Ô6Ñ7Ô7Ð7ÀUð+ #ñ 
ô 
ˆð@ ˆØˆØÔ#ð 	-Ý˜gÔ6ÔAÑBÔBˆKÝ˜G W¨dÑ3Ô3ˆEØ9>Ð9J� ¨°Ñ5Ô5Ð5ÐPTˆJØð -Ø *��ð Ô,Ô1ð ØÔ/Ô7ðàð ð
 %ð \ð %)×$AÒ$AÀ'ÔBZÑ$[Ô$[�MØ$ð -ð-Ø;Ð;Ð;Ð;Ð;Ð;Ø(7×(>Ò(>Ý ¤™LœL¨+ñ)ô )˜˜øõ %ð -ð -ð -Ø(,˜˜˜ð-øøøð 	BÐAÐAÐAÐAÐAÝ˜4œ7‘|”|ˆØ0Ð0ØŒKÔØÐ)˜\Ø)Ð3ˆLˆL¨tñ
ô 
ˆõ Ø”Ð# Ø!ØØÝ˜7Ô-Ñ.Ô.Ø(Ø +Ø'Ø"Ø*Ø”lð
ñ 
ô 
ð 	
s   Ï;.P* Ð*P9Ð8P9c                 óT   — t          j        dd¦  «                             ¦   «         dvS )z6Check if message reactions are enabled via config/env.ÚTELEGRAM_REACTIONSru  >   rs  rt  ru  )r   r   rÇ   r4  s    r   Ú_reactions_enabledz"TelegramAdapter._reactions_enabledÆ&  s'   € åŒyÐ-¨wÑ7Ô7×=Ò=Ñ?Ô?ÐG[Ð[Ð[r>   r  c           	   ƒ   ó&  K  — | j         sdS 	 | j                              t          |¦  «        t          |¦  «        |¬¦  «        ƒ d{V —† dS # t          $ r:}t
                               d| j        |t          |¦  «        ¦  «         Y d}~dS d}~ww xY w)z2Set a single emoji reaction on a Telegram message.F©rK  rË  ÚreactionNTz)[%s] set_message_reaction failed (%s): %s©	rW  Úset_message_reactionr    r²   r   r(   r)   r   r   )r5  rK  rË  r  rN  s        r   Ú_set_reactionzTelegramAdapter._set_reactionÊ&  sÇ   è è € àŒyð 	Ø�5ð		Ø”)×0Ò0Ý2°7Ñ;Ô;Ý˜z™?œ?Øð 1ñ ô ð ð ð ð ð ð ð ð
 �4øÝð 	ð 	ð 	Ý�LŠLÐDÀdÄiÐQVÕXsÐtuÑXvÔXvÑwÔwÐwØ�5�5�5�5�5øøøøð	øøøs   �=A Á
BÁ/BÂBc              ƒ   ó$  K  — | j         sdS 	 | j                              t          |¦  «        t          |¦  «        d¬¦  «        ƒ d{V —† dS # t          $ r9}t
                               d| j        t          |¦  «        ¦  «         Y d}~dS d}~ww xY w)uN  Clear all reactions from a Telegram message.

        Calling ``set_message_reaction`` with ``reaction=None`` (or an empty
        sequence) is the documented Bot API way to remove all bot-set
        reactions on a message â€” equivalent to Bot API 10.0's
        ``deleteMessageReaction`` but supported in PTB 22.6 already.
        FNrf  Tz[%s] clear reactions failed: %srh  rå  s       r   Ú_clear_reactionsz TelegramAdapter._clear_reactionsÙ&  sÆ   è è € ð Œyð 	Ø�5ð		Ø”)×0Ò0Ý2°7Ñ;Ô;Ý˜z™?œ?Øð 1ñ ô ð ð ð ð ð ð ð ð
 �4øÝð 	ð 	ð 	Ý�LŠLÐ:¸D¼IÕGbÐcdÑGeÔGeÑfÔfÐfØ�5�5�5�5�5øøøøð	øøøs   �=A Á
BÁ.B
Â
Bc              ƒ   óÎ   K  — |                       ¦   «         sdS t          |j        dd¦  «        }t          |dd¦  «        }|r!|r!|                      ||d¦  «        ƒ d{V —† dS dS dS )z;Add an in-progress reaction when message processing begins.NrK  rË  u   ðŸ‘€)rd  rl   rÍ  rj  )r5  rt  rK  rË  s       r   Úon_processing_startz#TelegramAdapter.on_processing_startî&  sœ   è è € à×&Ò&Ñ(Ô(ð 	ØˆFÝ˜%œ,¨	°4Ñ8Ô8ˆÝ˜U L°$Ñ7Ô7ˆ
Øð 	H�zð 	HØ×$Ò$ W¨j¸,ÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGð	Hð 	Hð 	Hð 	Hr>   Úoutcomec              ƒ   óJ  K  — |                       ¦   «         sdS t          |j        dd¦  «        }t          |dd¦  «        }|r|sdS |t          j        k    r|                      ||¦  «        ƒ d{V —† dS |                      |||t          j        k    rdnd¦  «        ƒ d{V —† dS )u   Swap the in-progress reaction for a final success/failure reaction.

        Unlike Discord (additive reactions), Telegram's set_message_reaction
        replaces all existing reactions in one call â€” no remove step needed.

        On CANCELLED outcomes (e.g. the user runs ``/stop``, or a session is
        interrupted mid-flight), we explicitly clear the ðŸ‘€ in-progress
        reaction so it doesn't linger on the user's message indefinitely.
        Without this clear, the only way to remove the ðŸ‘€ was to wait for
        another agent run to swap it to ðŸ‘�/ðŸ‘Ž â€” which never happens if the
        cancellation was the last activity in the chat.
        NrK  rË  u   ðŸ‘�u   ðŸ‘Ž)rd  rl   rÍ  r“   Ú	CANCELLEDrl  rj  ÚSUCCESS)r5  rt  ro  rK  rË  s        r   Úon_processing_completez&TelegramAdapter.on_processing_complete÷&  sñ   è è € ð ×&Ò&Ñ(Ô(ð 	ØˆFÝ˜%œ,¨	°4Ñ8Ô8ˆÝ˜U L°$Ñ7Ô7ˆ
Øð 	˜Jð 	ØˆFØÕ'Ô1Ò1Ð1Ø×'Ò'¨°Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à×$Ò$ØØØ 'Õ+<Ô+DÒ DÐ D��È,ñô ð ð ð ð ð ð ð ð ð r>   rJ   r  )NNNr7   rÎ  )r   r   N)r   NTTF)r   )r×  rq   rk  r¯  r   N)NrG   )NNNN©r   (  r†   r‡   rˆ   r   rž  Úsupports_code_blocksÚsplits_long_messagesr�  ÚRICH_MESSAGE_MAX_BYTESrÌ  r  r  r&  r…  Ú__annotations__r'  r(  rä  rå  ræ  rç  Ústaticmethodr   r´   r   r2  Úpropertyr6  r�   rT  r™  rœ  r¢  r¥  r   r
   rª  rÐ  rs   rà  rë  rò  rý  Úclassmethodr  r  r²   r
  r  r  r  r  r  r  r   r   r)  r1  r;  rE  rt  rM  rP  r^  rl  rp  r\  rc  r}  rƒ  rˆ  r   ÚcompilerÙ  ÚDOTALLrŠ  rŒ  r‘  r�  r’  rš  rœ  rž  r¢  r¤  r¦  r«  rµ  r¸  rÙ  rÃ  r”   ræ  rì  rî  ró  rú  r&   rO   rþ  r  r  r  r*  r(  r€  r7  r:  r?  rE  rY  r>  r}  rt  r2  rŠ  rT  r`  r£  r§  r·  r»  r°  r×  rÛ  rÞ  rÝ  rj  rô  rw  r{  r‚  r»  r°  r·  rµ  rÀ  r¿  rä  rè  rí  rï  rú  Ú
_EA_HEADERÚ_EA_CODE_OPENÚ_EA_CODE_CLOSEÚ_EA_SMART_DENY_LINEÚ_EA_CMD_BUDGETrÿ  r  r  r&  r<  rz  rE  rT  r†  r9  r‹  r«  r®  rN  rë  rÆ  r   r  r  r!  r   r>  rU  r$  re  rm  rz  r�  rƒ  r†  r›  r”  rœ  rÓ  rØ  rÜ  rà  r8   rí  ró  rö  rü  r  r  r  r  ÚPatternrY  r!  rõ  r:  rÙ  r'  rs  r-  r0  rÚ  r2  r6  rS  rI  r]  ra  rd  rg  ri  rk  ro  rs  r‘   rx  rz  r�  r’   r†  r™  rœ  rŽ  r�  r¨  r¸  rm  r¿  rÃ  rq   rÆ  r}   r‰   rB  rC  rE  rÜ  rÉ  rà  rì  rï  rò  rM  rù  r  rø  r+  r/  r1  r4  r;  rE  r°  rd  rj  rl  rn  r“   rs  r  )r—  s   @r   r"  r"  y  sT,  ø€ € € € € € ðð ð ÐØÐØÐð #Ðð 4Ðð ÐØ"ÐØ"Ðð $(Ð˜DÐ'Ð'Ñ'ð *.Ð  $Ð-Ð-Ñ-ð 37Ð)¨4Ð6Ð6Ñ6ð ÐØ#ÐØ ÐØ $Ðàð
 &*Ø%)ðð ð Øðàðð ˜E”?ð	ð
 ˜E”?ðð 
ðð ð ñ „\ðð6 ðð ñ „Xðð|?˜~ð |?ð |?ð |?ð |?ð |?ð |?ñ|"ð "ð "ð "ð "ð "ñ%ð %ð %ð %ð %ð %ðE Sð E°3ð EÀdð EÈtð Eð Eð Eð Eð Eð EðF¨tð Fð Fð Fð Fð.Ø   c¨3 h¤Ô0ð.à	ˆc�3ˆhŒð.ð .ð .ð .ð& "&Ø#'Ø#'Ø#'ð2Gð 2Gð 2Gàð2Gð ˜#”ð	2Gð
 ˜C”=ð2Gð ˜C”=ð2Gð ˜C”=ð2Gð 
ð2Gð 2Gð 2Gð 2Gðh:
°Wð :
ð :
ð :
ð :
ðx
B¨tð 
Bð 
Bð 
Bð 
Bð XÀ$ð  Xð  Xð  Xð  XðDSE¸ð SEÀDð SEð SEð SEð SEðj ðA¨8°D¸¸c¸´NÔ+Cð AÈÐQTÌð Að Að Añ „[ðAð ð?¸(À4ÈÈSÈÄ>Ô:Rð ?ÐW_Ð`cÔWdð ?ð ?ð ?ñ „[ð?ð ð?°X¸dÀ3ÈÀ8¼nÔ5Mð ?ÐRZÐ[^ÔR_ð ?ð ?ð ?ñ „[ð?ð ð
àð
ð ˜C”=ð
ð ˜4  S œ>Ô*ð	
ð
 
ð
ð 
ð 
ñ „[ð
ð( ðr¨Cð rð rð rñ „\ðrð ð .2Ø'+ñ	ð à˜3”-ðð ˜4  S œ>Ô*ðð   ”}ð	ð
 
�#Œðð ð ñ „[ðð ð
 .2Ø-1Ø'+ñ*Qð *Qàð*Qð ˜C”=ð*Qð ˜4  S œ>Ô*ð	*Qð
 & cœ]ð*Qð   ”}ð*Qð 
ˆc�3ˆhŒð*Qð *Qð *Qñ „[ð*QðX ð°H¸S´Mð ÀhÈsÄmð ð ð ñ „[ðð
 ð
°h¸s´mð 
ÈÐQTÌð 
ð 
ð 
ñ „[ð
ð ð8¨)ð 8¸ð 8ð 8ð 8ñ „\ð8ð'Øð'Ø'*ð'à	ð'ð 'ð 'ð 'ðR ð Yð °4ð ð ð ñ „\ðð ð)àð)ð ˜4  S œ>Ô*ð)ð & cœ]ð	)ð
 
ð)ð )ð )ñ „[ð)ðd &*ñ 1ð  1àð 1ð ˜#˜s˜(”^ð 1ð ˜4  S œ>Ô*ð	 1ð
 & cœ]ð 1ð ð 1ð ˜c”]ð 1ð 
ð 1ð  1ð  1ð  1ðDc˜t Cœyð cð cð cð cð ð
¨Ið 
¸$ð 
ð 
ð 
ñ „\ð
ð ð*¨ð *°tð *ð *ð *ñ „\ð*ð0 ð¨9ð ¸ð ð ð ñ „\ðð6 ð ¨	ð  °dð  ð  ð  ñ „\ð ñDð  cð °Dð ÀTð ð ð ð ð$ &*Ø%)ðð ð àðð ðð
 ˜E”?ðð ˜E”?ðð 
ðð ð ð ð*2 d¨3°¨8¤nð 2ð 2ð 2ð 2ð$	;°ð 	;¸ð 	;ð 	;ð 	;ð 	;ð
W Dð 
Wð 
Wð 
Wð 
Wð "�r”zÐ"BÀBÄMÐTVÔT]ÑD]Ñ^Ô^ÐØ)˜rœzð	Nð
 	Œ˜œ	Ñ!ñ ô  Ðð �2”:ð	ñ	ô 	€LðÀcð Èdð ð ð ð ð CÀ3ð CÈ4ð Cð Cð Cð Cð¨Sð °Tð ð ð ð ð,C¨ð Cð Cð Cð Cð
 cð 
¨dð 
ð 
ð 
ð 
ð, BFñ
ð 
Øð
Ø&.¨t°C¸°H¬~Ô&>ð
à	ð
ð 
ð 
ð 
ð BFñð ØðØ&.¨t°C¸°H¬~Ô&>ðà	ðð ð ð ð¨(°3¬-ð ð ð ð ð( >Cðð ð ØðØ6:ðà	ˆc�3ˆhŒðð ð ð ð"%¨Yð %¸4ð %ð %ð %ð %ð,<¨9ð <¸ð <ð <ð <ð <ð,*àð,*ð ˜3”-ð,*ð ˜4  S œ>Ô*ð	,*ð
 ˜C”=ð,*ð 
�%Œð,*ð ,*ð ,*ð ,*ð\i
àði
ð ði
ð ˜3”-ð	i
ð
 ˜4  S œ>Ô*ði
ð 
�*Ô	ði
ð i
ð i
ð i
ð` .2ñS?ð S?àðS?ð ðS?ð ð	S?ð
 ˜4  S œ>Ô*ðS?ð 
�*Ô	ðS?ð S?ð S?ð S?ðj
°#ð 
¸$ð 
ð 
ð 
ð 
ð&àð&ð ð&ð ð	&ð
 ˜4  S œ>Ô*ð&ð 
ð&ð &ð &ð &ñP+ð +ð +ð +ðZF¨5°°g´mÐ1CÔ+Dð Fð Fð Fð Fð*)°3ð )¸4ð )ð )ð )ð )ð 6ð 6ð 6ð0 ð  ð  ðP (-Ø"&ð>$ð >$ð >$ð #ð	>$ð !%ð>$ð  ð>$ð 
ˆs�G”MÐ!Ô	"ð>$ð >$ð >$ð >$ð@9Øð9Ø)0¬ð9à	ð9ð 9ð 9ð 9ð2°´ð ð ð ð ñ#ð #ð #ð #ðJS°	ð SÀcð SÈdð Sð Sð Sð Sð: */ð#ð #ð #Ø"&ð#à	ð#ð #ð #ð #ðT "'ðAð Að Að #ðAð
 ðAð 
ðAð Að Að AðFw0¸ð w0Àtð w0ð w0ð w0ð w0ñrpð pð pð pðdj¸uð jÈð jð jð jð jð\ %)Ø,0ñY
ð Y
à˜S”MðY
ð ˜7œ=Ô)ðY
ð 
ð	Y
ð Y
ð Y
ð Y
ñv=
ð =
ð =
ð =
ð~n6°Ið n6À$ð n6ð n6ð n6ð n6ñ`)ð )ð )ð )ð* %)Ø.2ñ1ð 1àð1ð ð1ð ˜S”Mð	1ð
 ' sœmð1ð 
�#Œð1ð 1ð 1ð 1ðf5àð5ð ð5ð 
�#Œð	5ð 5ð 5ð 5ñ$3ð 3¨Sð 3¸cð 3ÐQUð 3ÐbjÐknÔboð 3ð 3ð 3ð 3ðj
àð
ð ð
ð ð	
ð
 
ð
ð 
ð 
ð 
ð8 "'ñHjð HjàðHjð ðHjð ð	Hjð
 ðHjð 
ðHjð Hjð Hjð HjñTRð Rð Rð Rñhð ð ð ñ0
ð 
ð 
ð 
ñJ/ð J/ð J/ð J/ðX 5:ð gð gð g¨Tð g¸dð gð gð gð gðR°$ð ¸4ð ð ð ð ñ:08ð 08ð 08ð 08ðd'¸uð 'ÈCð 'ÐTXð 'ð 'ð 'ð 'ñRWBð WBð WBð WBðr$¨X°c¬]ð $Èð $ÐQUð $ð $ð $ð $ð0 #'Ø-1ñEð EàðEð ðEð ˜3”-ð	Eð
 ˜4  S œ>Ô*ðEð 
ðEð Eð Eð EðZ
 .2ð ð  ð  àð ð ð ð ð	 ð ˜4  S œ>Ô*ð ð 
ð ð  ð  ð  ðP Ø-1ðM?ð M?ð M?àðM?ð ðM?ð ð	M?ð ðM?ð ˜4  S œ>Ô*ðM?ð 
ðM?ð M?ð M?ð M?ð^¸ð Àð ð ð ð ð, .2ðH
ð H
ð H
àðH
ð ðH
ð ð	H
ð ðH
ð ˜4  S œ>Ô*ðH
ð 
ðH
ð H
ð H
ð H
ðT¨Cð ¸Sð ÀTð ð ð ð ð6 $(Ø-1ñ>ð >à˜C”=ð>ð ˜4  S œ>Ô*ð>ð 
ð	>ð >ð >ð >ðL .2ñWAð WAàðWAð ðWAð ð	WAð
 ˜4  S œ>Ô*ðWAð 
ðWAð WAð WAð WAðr%ð %ð %ðP 9;ØØ-1ñ)Sð )SØð)SØ$'ð)SØ25ð)Sàð)Sð ˜4  S œ>Ô*ð)Sð 
ð	)Sð )Sð )Sð )SðX ?€JØ€MØ!€NØeÐØ€Nð"˜sð " sð "ð "ð "ð "ð
 /Ø-1Ø $Ø"Ø"ñJSð JSØðJSØ%(ðJSØ7:ðJSàðJSð ˜4  S œ>Ô*ðJSð ð	JSð
 ðJSð ðJSð 
ðJSð JSð JSð JSð\ ?Cñ.Sð .SØð.SØ#&ð.SØ14ð.SØCFð.Sàð.Sà#+¨D°°c°¬NÔ#;ð.Sð 
ð.Sð .Sð .Sð .Sðn .2ñPSð PSàðPSð ðPSð ˜$”ð	PSð
 ðPSð ðPSð ˜4  S œ>Ô*ðPSð 
ðPSð PSð PSð PSðt .2ñFSð FSàðFSð ðFSð ð	FSð
 ðFSð ðFSð ˜4  S œ>Ô*ðFSð 
ðFSð FSð FSð FSðP Ðð .2ñ=Sð =Sàð=Sð ð=Sð ð	=Sð
 ð=Sð ˜4  S œ>Ô*ð=Sð 
ð=Sð =Sð =Sð =Sð~85Øð85Ø),ð85à	ð85ð 85ð 85ð 85ðt ÐñABð AB°$ð AB¸cð ABÈ%ð ABð ABð ABð ABðF$B¨Dð $B¸ð $BÀð $Bð $Bð $Bð $BðLM!ØðM!Ø),ðM!à	ðM!ð M!ð M!ð M!ð^
Àð Èð ð ð ð ð2zSØðzSØ)DðzSà	ñzSð zSð zSð zSðH )¨rÐ;KÐUZÐ[Ø%¨r¸>ÐUZÐ[Ø)¨rÐ;NÐUZÐ[Ø"¨rÐ;LÐUZÐ[Ø&°¨y¸;ÐUYÐZØ&°¨zÐ;MÐUYÐZØ-°¨y¸=ÐUYÐZØ-°¨zÐ;OÐUYÐZØ%°¨yÐ;KÐUYÐZØ%°¨zÐ;RÐUYÐZðð Ðð\ð ð\ð 
ð\ð \ð \ð \ð|¨sð ¸#ð À#ð ð ð ð ð

°Cð 

ÀCð 

ÐTWð 

Ð\_ð 

ð 

ð 

ð 

ðR°3ð R¸sð RÀuÈTÐS[Ð\_ÔS`ÐM`ÔGað Rð Rð Rð Rð$ "&Ø"&Ø-1ñUgð UgàðUgð ðUgð ˜#”ð	Ugð
 ˜3”-ðUgð ˜4  S œ>Ô*ðUgð 
ðUgð Ugð Ugð Ugð Ugð Ugðv .2Ø ñFð FàñFð �U”ðFð ˜4  S œ>Ô*ñ	Fð
 ðFð 
ðFð Fð Fñ Fð Fð FðX "&Ø"&Ø-1ñ\pð \pàñ\pð ð\pð ˜#”ð	\pð
 ˜3”-ð\pð ˜4  S œ>Ô*ð\pð 
ð\pð \pð \pñ \pð \pð \pðD "&Ø#'Ø"&Ø-1ñ5tð 5tàñ5tð ð5tð ˜#”ñ	5tð
 ˜C”=ð5tð ˜3”-ð5tð ˜4  S œ>Ô*ð5tð 
ð5tð 5tð 5tñ 5tð 5tð 5tðv "&Ø"&Ø-1ñ1gð 1gàñ1gð ð1gð ˜#”ð	1gð
 ˜3”-ð1gð ˜4  S œ>Ô*ð1gð 
ð1gð 1gð 1gñ 1gð 1gð 1gðn "&Ø"&Ø-1ñcjð cjàñcjð ðcjð ˜#”ð	cjð
 ˜3”-ðcjð ˜4  S œ>Ô*ðcjð 
ðcjð cjð cjñ cjð cjð cjðR "&Ø"&Ø-1ñ.gð .gàñ.gð ð.gð ˜#”ð	.gð
 ˜3”-ð.gð ˜4  S œ>Ô*ð.gð 
ð.gñ .gð .gð .gð` ð¨	ð °dð ñ ð ñ „\ðð"Q¨sð Q¸ð QÀtð Qñ Qð Qð Qð
¨3ð 
°4ð 
ñ 
ð 
ð 
ñ(ð (¨ð (¸ÀÀcÈ3ÀhÄÔ8Pð (Ð\`ð (ñ (ð (ð (ðT I¨3ð  I°4¸¸S¸´>ð  Iñ  Ið  Ið  IðDj cð j¨cð jñ jð jð jð\d¨4ð dñ dð dð dðw¸dð wñ wð wð wð"_ dð _ñ _ð _ð _ðj°$ð jñ jð jð jðN¨s°3¬xð Nñ Nð Nð NðN°°C´ð Nñ Nð Nð Nð
1¸ð 
1ÀDð 
1ñ 
1ð 
1ð 
1ðN¨¨S¬ð Nñ Nð Nð NðN¨s°3¬xð Nñ Nð Nð Nð°°S´ð ñ ð ð ðN¨#¨c¬(ð Nñ Nð Nð Nð¨3¨s¬8ð ñ ð ð ð*
¨4°´
Ô+;ð 
ñ 
ð 
ð 
ð84 gð 4°$ð 4ñ 4ð 4ð 4ð ð°7ð ¸xÈ¼}ð ñ ð ñ „[ðð> (˜RœZÑ(=¸r¼}ÑMÔMÐá %ÐðP sð Pñ Pð Pð Pñ ¨8°C¬=ð ¸Tð ñ ð ð ð"J¸'ð JÀdð Jñ Jð Jð Jð,P¨ð Pñ Pð Pð Pð <Añ ?ð ?ñ ?°Dð ?ÀTð ?ñ ?ð ?ð ?ñ2 #'Ððf¨ð f°Dð fñ fð fð fð ñC'ð C'°Wñ C'ÈSð C'ÐZ]Ð^aÔZbð C'ñ C'ð C'ñ „[ðC'ðJ ñ
¨3ñ 
¸ñ 
ÀSð 
ÈSð 
ñ 
ð 
ñ „\ð
ð6¨Wð 6¸ð 6ñ 6ð 6ð 6ñp4ñ 4ð 4ð 4ð6¸7ð Àtð ñ ð ð ð@	¸ð 	ÀTð 	ñ 	ð 	ð 	ðS¨ð S°Tð Sñ Sð Sð Sð¨H°S¬Mð ¸hÀs¼mð ñ ð ð ð3Àð 3ÈTð 3ñ 3ð 3ð 3ñj[ð [ð [ñ;¸\ð ;Ècð ;ñ ;ð ;ð ;ð


¸ð 

ñ 

ð 

ð 

ñ
¸|ð 
ÐP\ð 
ñ 
ð 
ð 
ñB$ wð $°;ð $ñ $ð $ð $ñ8[¨wñ 8[¸|ð 8[ÐPTð 8[ñ 8[ð 8[ð 8[ñt.W¨cñ .W¸,ð .WÈ4ð .Wñ .Wð .Wð .Wñ`"¨'ð "ñ "ð "ð "ð ñ'¨°¬ñ '¸Sð 'ÀSð 'ñ 'ð 'ñ „\ð'ð '+ñ'Hñ 'Hàñ'Hð ñ'Hð ð	'Hð
 ñ'Hð ˜s”mð'Hð 
ð'Hñ 'Hð 'Hð 'HðZ $(Ø(,ñ!cð !càñ!cð ñ!cð ˜C”=ñ	!cð
 ˜Ô%ð!cð 
ð!cñ !cð !cð !cðFP wð P°4ð Pñ Pð Pð Pð" OTñ \?ð \?ð \?¨wñ \?Àtð \?ÐX\ð \?ñ \?ð \?ð \?ñ|}ñ }ð }ð }ð2^°ð ^¸8ÀGÔ;Lð ^ñ ^ð ^ð ^ð(°ð (À,ÔB[ð (Ð`dð (ñ (ð (ð (ðB )¨Fð  )¸\Ô=Vð  )Ð[_ð  )ñ  )ð  )ð  )ðD-)°Vð -)ÀlÔF_ð -)Ðdhð -)ñ -)ð -)ð -)ñf
 \ð 
°cð 
ñ 
ð 
ð 
ñ "
¨ð "
¸$ð "
ñ "
ð "
ð "
ðH->¨3ð ->°4ð ->ñ ->ð ->ð ->ñf, lñ ,¸ð ,ÀSð ,ñ ,ð ,ð ,ñE°#ð E¸$ð Eñ Eð Eð Eñ"m¨cñ m¸,ð mÈ4ð mñ mð mð mð*j)°&ð j)À<ÔC\ð j)Ðaeð j)ñ j)ð j)ð j)ñX	
¸Sñ 
Èð 
ÐZ^ð 
ñ 
ð 
ð 
ñ:B¸Sð BÀTð Bñ Bð Bð Bñ ?¨ñ ?¹ð ?ÈDð ?ñ ?ð ?ð ?ñB.Zñ .Zð .Zð .Zð`%¨#ð %¸(À3¼-ð %ÈHÐUYÐZ]Ð_bÐZbÔUcÔLdð %ñ %ð %ð %ðN°Cð ÀCð ÐUXð Ð]að ñ ð ð ð ñ¨cð °cð ñ ð ñ „[ðð" ñ!B¨#ð !B°#ð !Bñ !Bð !Bñ „[ð!BðF ñ¸ð ÀÈÄð ñ ð ñ „[ðð( $(ñ	f
ð f
àñf
ð ñf
ð ˜C”=ð	f
ð
 
ðf
ñ f
ð f
ð f
ðT\ Dð \ñ \ð \ñ \ð¨3ð ¸Cñ Èð ÐPTð ñ ð ñ ð¨cð ¸sð Àtð ñ ð ñ ñ*H¨|ð HÀð Hñ Hð Hñ Hñ°,ñ ÑIZð Ð_cð ñ ð ñ ð ð ñ ð r>   r"  c                  óZ  — t          j        dd¦  «        } | sn	 ddlm} ddlm}  |¦   «         } ||dddd	¦  «        }|d
vr3t          |¦  «                             ¦   «                              ¦   «         } n# t          $ r Y nw xY w| pd} | dvrt                               d| ¦  «         d} | S )züResolve the Telegram notification mode (all/important) from env or
    config.yaml display.platforms.telegram.notifications, defaulting to
    'important'.  Mirrors the post-construction logic that used to live in
    gateway/run.py::_create_adapter().ÚHERMES_TELEGRAM_NOTIFICATIONSr   r   )Úload_gateway_config)Úcfg_getr«  rÁ  rá   Únotifications>   Nr   rR  >   r…  rR  z[Unknown telegram notifications mode '%s', defaulting to 'important' (valid: all, important))r   r   Úgateway.configr†  Úgateway.runr‡  r   r   rÇ   r   r(   r0   )rh  r†  r‡  Ú_gw_cfgÚ_raws        r   Ú_resolve_notifications_moder�  #'  sù   € õ
 Œ9Ð4°bÑ9Ô9€DØð 	ð	Ø:Ð:Ð:Ð:Ð:Ð:Ø+Ð+Ð+Ð+Ð+Ð+Ø)Ð)Ñ+Ô+ˆGØ�7˜7 I¨{¸JÈÑXÔXˆDØ˜:Ð%Ð%Ý˜4‘y”y—’Ñ(Ô(×.Ò.Ñ0Ô0�øøÝð 	ð 	ð 	ØˆDð	øøøàÐ�;€DØÐ'Ð'Ð'Ý�Šð&Ø'+ñ	
ô 	
ð 	
ð ˆØ€Ks   ™AA6 Á6
BÂBc                 ó|   — t          | ¦  «        }	 t          ¦   «         |_        n# t          $ r
 d|_        Y nw xY w|S )z�Factory wrapper that constructs TelegramAdapter and applies the
    notification mode (preserving the gateway/run.py post-construction step).rR  )r"  r�  r“  r   )r7  r  s     r   Ú_build_adapterr�  ='  sU   € õ ˜fÑ%Ô%€Gð2Ý&AÑ&CÔ&CˆÔ#Ð#øÝð 2ð 2ð 2Ø&1ˆÔ#Ð#Ð#ð2øøøà€Ns   ‘% ¥9¸9c                 ó¾   — t          | dd¦  «        }|sddlm} |                     d¦  «        pd}t	          t          |¦  «                             ¦   «         ¦  «        S )uÕ  Telegram is connected when a bot token is configured.

    check_telegram_requirements() only verifies the python-telegram-bot SDK is
    importable, NOT that a token is set â€” so without this is_connected the
    registry-driven plugin-enable pass in gateway/config.py would enable
    Telegram on any machine that merely has the SDK installed. Gate on the
    token (env or PlatformConfig.token), matching the generic token check
    Telegram had as a built-in.
    r7  Nr   ÚTELEGRAM_BOT_TOKENr   )rl   Úhermes_cli.gatewayrÚ  Úget_env_valuer…  r   r   )r7  r7  Úgateway_mods      r   Ú_is_connectedr•  H'  si   € õ �F˜G TÑ*Ô*€EØð FØ0Ð0Ð0Ð0Ð0Ð0Ø×)Ò)Ð*>Ñ?Ô?ÐEÀ2ˆÝ•�E‘
”
× Ò Ñ"Ô"Ñ#Ô#Ð#r>   )r­  Úmedia_filesÚforce_documentc          	   ƒ   ó   K  — t          | dd¦  «        }|sddlm}  |dd¦  «        pd}t          t          | di ¦  «        o| j                             d¦  «        ¦  «        }dd	lm}	  |	|||||||¬
¦  «        ƒ d{V —†S )aw  Out-of-process Telegram delivery. Delegates to the standalone
    ``_send_telegram`` REST sender in tools/send_message_tool.py (which already
    handles chunking-agnostic single sends, threads, media, retries, and
    parse-mode fallback). Implements the standalone_sender_fn contract so
    deliver=telegram cron jobs succeed when cron runs separately from the
    gateway.r7  Nr   )r*  r‘  r   r†  r;  )Ú_send_telegram)r–  r­  r;  r—  )rl   rQ  r*  r…  r†  r‡  Útools.send_message_toolr™  )
ÚpconfigrK  rž  r­  r–  r—  r7  r*  r;  r™  s
             r   Ú_standalone_sendrœ  Y'  sá   è è € õ �G˜W dÑ+Ô+€EØð ;ð 	2Ð1Ð1Ð1Ð1Ð1à�
Ð/°Ñ4Ô4Ð:¸ˆÝ Ý�˜ "Ñ%Ô%ÐT¨'¬-×*;Ò*;Ð<SÑ*TÔ*Tñô Ðð 7Ð6Ð6Ð6Ð6Ð6Ø�ØØØØØØ3Ø%ðñ ô ð ð ð ð ð ð ð r>   c                  ó:   — ddl m}  |                      ¦   «          dS )a`  Configure Telegram bot credentials and allowlist.

    Delegates to the existing CLI setup helpers (managed-bot QR onboarding,
    token validation, allowlist capture) via lazy import so the full wizard
    behavior is preserved without duplicating ~150 lines. Replaces the
    _PLATFORMS["telegram"] static dict dispatch in hermes_cli/gateway.py.
    r   )ÚsetupN)Ú
hermes_clirž  Ú_setup_telegram)Ú
_setup_mods    r   Úinteractive_setupr¢  ~'  s.   € ð /Ð.Ð.Ð.Ð.Ð.Ø×ÒÑ Ô Ð Ð Ð r>   Úyaml_cfgÚtelegram_cfgc                 óL  — ddl }i }	 ddlm}m} t	           |¦   «         o |¦   «         du¦  «        }n# t
          $ r d}Y nw xY wd|v r|                     d|d         ¦  «         |                     d|                      d¦  «        ¦  «        }|�Bt          j	        d¦  «        s.t          |¦  «                             ¦   «         t          j        d<   d|v r<t          j	        d	¦  «        s(|                     |d         ¦  «        t          j        d	<   d
|v rHt          j	        d¦  «        s4t          |d
         ¦  «                             ¦   «         t          j        d<   d|v rHt          j	        d¦  «        s4t          |d         ¦  «                             ¦   «         t          j        d<   d|v rHt          j	        d¦  «        s4t          |d         ¦  «                             ¦   «         t          j        d<   d|v rHt          j	        d¦  «        s4t          |d         ¦  «                             ¦   «         t          j        d<   |                     d¦  «        }|�||                     d|¦  «         t          |t          ¦  «        rd                     d„ |D ¦   «         ¦  «        }|s0t          j	        d¦  «        st          |¦  «        t          j        d<   |                     d¦  «        }	|	�ft          |	t          ¦  «        rd                     d„ |	D ¦   «         ¦  «        }	|s0t          j	        d¦  «        st          |	¦  «        t          j        d<   |                     d¦  «        }
|
�ft          |
t          ¦  «        rd                     d„ |
D ¦   «         ¦  «        }
|s0t          j	        d¦  «        st          |
¦  «        t          j        d<   |                     d¦  «        }|�ft          |t          ¦  «        rd                     d„ |D ¦   «         ¦  «        }|s0t          j	        d¦  «        st          |¦  «        t          j        d<   |                     d¦  «        }|�||                     d|¦  «         t          |t          ¦  «        rd                     d „ |D ¦   «         ¦  «        }|s0t          j	        d!¦  «        st          |¦  «        t          j        d!<   d"|v rHt          j	        d#¦  «        s4t          |d"         ¦  «                             ¦   «         t          j        d#<   d$|v rHt          j	        d%¦  «        s4t          |d$         ¦  «                             ¦   «         t          j        d%<   t          |                     d&¦  «        t$          ¦  «        r|                     d&¦  «        ni }d'|v r|d'         n|                     d'¦  «        }|�Jt          j	        d(¦  «        s6|du rd)n t          |¦  «                             ¦   «         }|t          j        d(<   |                     d*¦  «        }|�ft          |t          ¦  «        rd                     d+„ |D ¦   «         ¦  «        }|s0t          j	        d,¦  «        st          |¦  «        t          j        d,<   |                     d-¦  «        p|                     d-¦  «        }|�ft          |t          ¦  «        rd                     d.„ |D ¦   «         ¦  «        }|s0t          j	        d/¦  «        st          |¦  «        t          j        d/<   |                     d0¦  «        p|                     d0¦  «        }|�ft          |t          ¦  «        rd                     d1„ |D ¦   «         ¦  «        }|s0t          j	        d2¦  «        st          |¦  «        t          j        d2<   d3D ]"}||v r|                     |||         ¦  «         Œ#h d4£}|                     ¦   «         D ]\  }}||vr|                     ||¦  «         Œ |pdS )5a›  Translate config.yaml telegram: keys into TELEGRAM_* env vars and
    PlatformConfig.extra entries.

    Implements the apply_yaml_config_fn contract (#24849). Mirrors the legacy
    telegram_cfg block from gateway/config.py::load_gateway_config(). Env vars
    take precedence over YAML. Returns a dict of extras to merge into
    PlatformConfig.extra (disable_topic_auto_rename + runtime flags), or None.
    r   N)Úcurrent_secret_scopeÚis_multiplex_activeFÚdisable_topic_auto_renamerÐ  rÑ  r  r  rÞ  rß  Ú
allow_botsÚTELEGRAM_ALLOW_BOTSrÚ  rÛ  rÕ  r×  râ  rÄ  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>¶'  ó(   è è € Ð/Ð/ a�3˜q™6œ6Ð/Ð/Ð/Ð/Ð/Ð/r>   rã  rï  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>¼'  r¬  r>   rð  rø  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>Â'  s(   è è € Ð-Ð- Q�#˜a™&œ&Ð-Ð-Ð-Ð-Ð-Ð-r>   rù  r  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>Ë'  s(   è è € Ð%EÐ%E°¥c¨!¡f¤fÐ%EÐ%EÐ%EÐ%EÐ%EÐ%Er>   r  r  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>Ó'  s(   è è € Ð&GÐ&G°!¥s¨1¡v¤vÐ&GÐ&GÐ&GÐ&GÐ&GÐ&Gr>   r  Ú	reactionsrc  r[  r  r†  r9  ÚTELEGRAM_REPLY_TO_MODEr  rö  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>å'  s(   è è € Ð$CÐ$C°¥S¨¡V¤VÐ$CÐ$CÐ$CÐ$CÐ$CÐ$Cr>   r¼  rõ  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>ë'  ó(   è è € Ð*OÐ*O°a­3¨q©6¬6Ð*OÐ*OÐ*OÐ*OÐ*OÐ*Or>   râ  rþ  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r7   rL  rI  s     r   rè  z%_apply_yaml_config.<locals>.<genexpr>ñ'  rµ  r>   rã  )rÚ  r;  rÕ  rï  >   Ú	dm_policyrö  Úgroup_policyÚreply_prefixr9  Úchannel_promptsÚnotice_deliveryÚreply_in_threadrÐ  Úallow_admin_fromÚchannel_skill_bindingsrð  Úgateway_restart_notification)r  rQ  r¦  r§  r…  r   r¯  r‡  r   r   r   rÇ   ÚenvironÚdumpsr0  rt  r  r   rA  rØ  )r£  r¤  Ú_jsonÚextrasr¦  r§  Ú_skip_env_bridgeÚ_effective_rmÚfrcÚfrtÚacr  r  Ú_telegram_extraÚ_telegram_rtmÚ_rtm_strÚallowed_usersÚgroup_allowed_usersrþ  Ú_keyÚ_GENERIC_MERGE_KEYSÚ_kÚ_vs                          r   Ú_apply_yaml_configrÒ  Š'  se  € ð ÐÐÐØ€Fð!ØPÐPÐPÐPÐPÐPÐPÐPåÐ 3Ð 3Ñ 5Ô 5Ð \Ð:NÐ:NÑ:PÔ:PÐX\Ð:\Ñ]Ô]ÐÐøÝð !ð !ð !Ø ÐÐÐð!øøøð # lÐ2Ð2Ø×ÒÐ5°|ÐD_Ô7`ÑaÔaÐaà ×$Ò$Ð%6¸¿ºÐEVÑ8WÔ8WÑXÔX€MØÐ ­¬Ð3MÑ)NÔ)NÐ Ý14°]Ñ1CÔ1C×1IÒ1IÑ1KÔ1K�Œ
Ð-Ñ.Ø˜\Ð)Ð)µ"´)Ð<WÑ2XÔ2XÐ)Ø27·+²+¸lÐK]Ô>^Ñ2_Ô2_�Œ
Ð.Ñ/Ø <Ð/Ð/½¼	ÐBcÑ8dÔ8dÐ/Ý8;¸LÐIaÔ<bÑ8cÔ8c×8iÒ8iÑ8kÔ8k�Œ
Ð4Ñ5Ø�|Ð#Ð#­B¬IÐ6KÑ,LÔ,LÐ#Ý,/°¸\Ô0JÑ,KÔ,K×,QÒ,QÑ,SÔ,S�Œ
Ð(Ñ)Ø�|Ð#Ð#­B¬IÐ6KÑ,LÔ,LÐ#Ý,/°¸\Ô0JÑ,KÔ,K×,QÒ,QÑ,SÔ,S�Œ
Ð(Ñ)Ø+¨|Ð;Ð;ÅBÄIÐN{ÑD|ÔD|Ð;ÝDGÈÐUyÔHzÑD{ÔD{÷  EBò  EBñ  EDô  ED�Œ
Ð@ÑAØ
×
Ò
Ð0Ñ
1Ô
1€CØ
€Ø×ÒÐ/°Ñ5Ô5Ð5Ý�c�4Ñ Ô ð 	0Ø—(’(Ð/Ð/¨3Ð/Ñ/Ô/Ñ/Ô/ˆCØð 	B­¬	Ð2PÑ(QÔ(Qð 	BÝ9<¸S¹¼�BŒJÐ5Ñ6Ø
×
Ò
Ð1Ñ
2Ô
2€CØ
€Ý�c�4Ñ Ô ð 	0Ø—(’(Ð/Ð/¨3Ð/Ñ/Ô/Ñ/Ô/ˆCØð 	C­¬	Ð2QÑ(RÔ(Rð 	CÝ:=¸c¹(¼(�BŒJÐ6Ñ7Ø	×	Ò	˜/Ñ	*Ô	*€BØ	€~Ý�b�$ÑÔð 	.Ø—’Ð-Ð-¨"Ð-Ñ-Ô-Ñ-Ô-ˆBð  ð 	;­¬	Ð2JÑ(KÔ(Kð 	;Ý36°r±7´7�BŒJÐ/Ñ0Ø!×%Ò%Ð&6Ñ7Ô7€NØÐ!Ý�n¥dÑ+Ô+ð 	FØ ŸXšXÐ%EÐ%E°nÐ%EÑ%EÔ%EÑEÔEˆNàð 	H­¬	Ð2KÑ(LÔ(Lð 	HÝ47¸Ñ4GÔ4G�BŒJÐ0Ñ1Ø"×&Ò&Ð'8Ñ9Ô9€OØÐ"Ø×ÒÐ+¨_Ñ=Ô=Ð=Ý�o¥tÑ,Ô,ð 	HØ!ŸhšhÐ&GÐ&G°Ð&GÑ&GÔ&GÑGÔGˆOØð 	J­¬	Ð2LÑ(MÔ(Mð 	JÝ58¸Ñ5IÔ5I�BŒJÐ1Ñ2Ø�lÐ"Ð"­2¬9Ð5IÑ+JÔ+JÐ"Ý+.¨|¸KÔ/HÑ+IÔ+I×+OÒ+OÑ+QÔ+Q�Œ
Ð'Ñ(Ø�lÐ"Ð"­2¬9Ð5EÑ+FÔ+FÐ"Ý'*¨<¸Ô+DÑ'EÔ'E×'KÒ'KÑ'MÔ'M�Œ
Ð#Ñ$Ý3=¸l×>NÒ>NÈwÑ>WÔ>WÕY]Ñ3^Ô3^Ðf�l×&Ò& wÑ/Ô/Ð/Ðdf€Oà)8¸LÐ)HÐ)Hˆ�_Ô%Ð%Ø× Ò  Ñ1Ô1ð ð Ð ­¬Ð3KÑ)LÔ)LÐ Ø)¨UÐ2Ð2�5�5½¸MÑ8JÔ8J×8PÒ8PÑ8RÔ8RˆØ/7�Œ
Ð+Ñ,Ø ×$Ò$ \Ñ2Ô2€MØÐ Ý�m¥TÑ*Ô*ð 	DØŸHšHÐ$CÐ$C°]Ð$CÑ$CÔ$CÑCÔCˆMØð 	F­¬	Ð2JÑ(KÔ(Kð 	FÝ36°}Ñ3EÔ3E�BŒJÐ/Ñ0Ø&×*Ò*Ð+=Ñ>Ô>ÐiÀ/×BUÒBUÐVhÑBiÔBiÐØÐ&ÝÐ)­4Ñ0Ô0ð 	PØ"%§(¢(Ð*OÐ*OÐ;NÐ*OÑ*OÔ*OÑ"OÔ"OÐØð 	R­¬	Ð2PÑ(QÔ(Qð 	RÝ9<Ð=PÑ9QÔ9Q�BŒJÐ5Ñ6Ø&×*Ò*Ð+@ÑAÔAÐoÀ_×EXÒEXÐYnÑEoÔEoÐØÐ&ÝÐ)­4Ñ0Ô0ð 	PØ"%§(¢(Ð*OÐ*OÐ;NÐ*OÑ*OÔ*OÑ"OÔ"OÐàð 	R­¬	Ð2PÑ(QÔ(Qð 	RÝ9<Ð=PÑ9QÔ9Q�BŒJÐ5Ñ6Øuð 8ð 8ˆØ�<ÐÐØ×Ò˜d L°Ô$6Ñ7Ô7Ð7øðð ð Ðð "×'Ò'Ñ)Ô)ð &ð &‰ˆˆBØÐ(Ð(Ð(Ø×Ò˜b "Ñ%Ô%Ð%øàˆ>�TÐs   ˆ+4 ´AÁAc                 óš   — |                       ddt          t          t          t          dgdt
          t          dddt          dd	d
¬¦  «         dS )u:   Plugin entry point â€” called by the Hermes plugin system.rá   r  r‘  z/Run `hermes setup` to install Telegram support.r¼  rä  ÚTELEGRAM_HOME_CHANNELr#  u   âœˆï¸�T)r   r>  Úadapter_factoryÚcheck_fnÚensure_deps_fnÚis_connectedÚrequired_envÚinstall_hintÚsetup_fnÚapply_yaml_config_fnÚallowed_users_envÚallow_all_envÚcron_deliver_env_varÚstandalone_sender_fnÚmax_message_lengthr  Úallow_update_commandN)Úregister_platformr�  rÜ   r÷   r•  r¢  rÒ  rœ  )Úctxs    r   Úregisterrå  (  s_   € à×ÒØØÝ&Ý&Ý2Ý"Ø*Ð+ØFÝ"Ý/Ø2Ø0Ø4Ý-ØØØ!ð# ñ ô ð ð ð r>   rt  )r`   ra   r   NrJ   )”r   r&   rr  r1   r†  r  Úloggingr   Úhtmlrý  r   rN   rp  Úcontextvarsr   r   r   rˆ  r   r   r   r	   r
   Ú	getLoggerr†   r(   Úobjectr   r   r    r3  r*   rE   r´   r3   r_   rc   rX   rp   rá   rq   rr   rs   rt   ru   rw   râ   rã   ry   rz   r{   r|   ræ   r}   r~   rä   r€   r�   rå   rƒ   rÛ   r…   rP  Úpathlibr‹   rì  r¹   ÚinsertÚ__file__rÊ  Úparentsr   r�   r‰  rŽ   r�   rn  r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   Ú'plugins.platforms.telegram.telegram_idsr    Ú+plugins.platforms.telegram.telegram_networkr¡   r¢   r£   Úutilsr¤   r¥   r¦   rû  rú  rü  r²   r¸   rÙ   r…  rÜ   r÷   r|  rù   rü   r  r  r  Úgateway.platforms.helpersr  r•  r  r  rÉ  rÊ  r  r  rd  r}  r'  rR  r÷  rr  r„  r"  r  rx  rQ  r  r"  r�  r�  r•  rœ  r¢  rA  rÒ  rå  rŠ   r>   r   ú<module>ró     sâ  ððð ð ð €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à	ˆÔ	˜8Ñ	$Ô	$€ð
+ vð 
+°#ð 
+ð 
+ð 
+ð 
+ð4ð 4˜3ð 4¨ð 4°cð 4ð 4ð 4ð 4ð"Y '¤,ð Y°4ð Yð Yð Yð Yð Ð ðJ¨Eð J¸%ð JÀDð Jð Jð Jð Jð* PTð K$ð K$ð K$¸%ð K$ð K$ð K$ð K$ð\Jð Jð Jð JðNð Nð Nð Nð#Vð #Vð #Vð #VðJ&%ØYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYð"Ø/Ð/Ð/Ð/Ð/Ð/Ð/øØð "ð "ð "Ø!ÐÐÐð"øøøðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 7Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ø-Ð-Ð-Ð-Ð-Ð-ØÐÐøØð %ð %ð %ØÐØ€FØ
€CØ€GØÐØÐØÐØ€KØ€NØÐØ ÐØ€LØ€GØ€IØ€Hðð ð ð ð ñ ô ð à$€L€L€Lð+%øøøð. €
€
€
Ø !Ð !Ð !Ð !Ð !Ð !Ø „‡‚��3�3�u�u˜X‘”×.Ò.Ñ0Ô0Ô8¸Ô;Ñ<Ô<Ñ =Ô =Ð =à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð$ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð
 5Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4àGÐGÐGÐ àØØØØðð Ð ð ØØØØðð Ð ð& Cð &¨H°S¬Mð &ð &ð &ð &ð9¨ð 9°¸´ð 9ð 9ð 9ð 9ðx˜tð ð ð ð ð4 Tð 4ð 4ð 4ð 4ðr �"”*Ð<Ñ=Ô=€ð.�sð .˜sð .ð .ð .ð .ð
�cð ˜cð ð ð ð ð,  *˜rœzØ9ñ ô  Ð ð

I¨sð 
I°sð 
Ið 
Ið 
Ið 
Ið*ð ð ð ð ð ð ð ð ð ð  '˜BœJðð „Lñô Ð ð Sð ¨Sð ð ð ð ðH Ð ð
 Ð ð Ð ð %)Ð !ð €ð %*Ð !ð !Ð ð  Ð Ø9C¸Ø!¨4ð:ñ :ô :Ð ˜Z¨°¬Ô6ð ð ñ ð
Hð Hð Hð Hð H˜\ñ Hô Hð HðXRð XRð XRð XRð XRÐ)ñ XRô XRð XRðTe Sð ð ð ð ð4ð ð ð$˜Tð $ð $ð $ð $ð, ØØð"ð "ð "ð "ð "ðJ	!ð 	!ð 	!ð 	!ð~ ð ~°Tð ~¸dÀT¹kð ~ð ~ð ~ð ~ðBð ð ð ð ð s6   ÂC" Â-B4 Â3C" Â4B>Â;C" Â=B>Â>#C" Ã"2DÄD