+
    kHàjÞ¿ ã            
       ó”  a € R� tÀ0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t^ RIt^ RIt^ RIHt ^ RIHtHtHt ^ RIHtHtHtHtHtHtHtHt ^ RIHt ]P<                  ! ]4      t ^ RI!H"t" ^ RI#H$t$ ^ RI%H&t'H(t)H*t+H,t- R	 R
 lt.R R lt/RRRRRR/R R llt0R R lt1R R lt2 ^ RI3H4s4H5s5H6s6H7s7H8s8  ^ RI3H9s9 ^ RI;H<s<H=s=H>s>H?s?H@sAHBsBHCsCHDsD ^ RIEHFsFHGsG ^ RIHHIsI RsJ^ RILtL^ R IMHNtO ]LP                   P£                  ^ ]R! ]O! ]S4      P©                  4       Pª                  ^,          4      4       ^ R!IVHWtW ^ R"IXHYtYHZtZ ^ R#I[H\t\H]t] ^ R$I^H_t_H`t`HataHbtbHctcHdtdHeteHftfHgtgHhthHitiHjtjHktkHltl ^ÈtmR%tnR& R' ltoR( R) ltpR* R+ ltqR,R-R.R/R0R1R2R3R4R5/tr^ R6IsHtttHutuHvtv ^ R7IwHxtx ^ R8IyHztz ^ R9I{H|t|H}t}H~t~ ^ R:IH€t€H�t� ^ R;I‚HƒtƒH„t„H…t…H†t†H‡t‡ ^ R<IˆH‰t‰ ^ R=IŠH‹t‹HŒtŒ 0 R‚mt�RCtŽRDt�RE RF lt�RGR>RHR?RIR?RJRARKRB/t‘R>RGR?RHR@RHRARJRBRK/t’RL RM lt“RN RO lt”RP RQ lt•RR RS lt–RT RU lt—RV RW lt˜]EP2                  ! RX4      tšRY RZ lt›R[ R\ ltœ]EP2                  ! R]4      t�R^ R_ ltž^ R`IŸH t¡H¢t¢H£t¤ ]EP2                  ! Ra]EPJ                  4      t¦Rb Rc lt§Rdt¨Ret©RftªRgt«Rdt¬Rht­Rgt®Rit¯^t°Rgt±Rft²Rht³]! RjRRk7      t´] ^ k  ! Rl Rm]µ4      t¶ ! Rn Ro]µ4      t· ! Rp Rq]z]‰]_4      t¸Rr Rs lt¹Rt tºRu Rv lt»RwRRxRRyR/Rz lt¼R{ R| lt½R} R~ lt¾R R€ lt¿R#   ]: d    Rs9 ELEi ; i  ]: d3    RsJ];s4;s5;s6;s7;s8s<];s=;s>;s?;sC;sAsIR;s9;sD;sFsG ! R R4      tK]KsB EL]i ; i)ƒzcTelegram platform adapter (python-telegram-bot): inbound messages/media/commands, outbound replies.N)Ú
ContextVar)ÚdatetimeÚtimezoneÚUTC)ÚAnyÚ	AwaitableÚCallableÚDictÚIteratorÚListÚOptionalÚSet)Úsetup_platforms)Úrun_bounded_async)Úplatform_ssl_context)Údecode_json_list_literalÚextra_or_secretÚget_scoped_secretÚplatform_gate_envc                ó0   € V ^8„  d   QhR\         R\        /# ©é   ÚerrorÚreturn)ÚobjectÚstr)Úformats   "ÚG/home/ubuntu/.hermes/hermes-agent/plugins/platforms/telegram/adapter.pyÚ__annotate__r      s   € ÷ +ñ +¤vð +´#ñ +ó    c                ó¸   € V f   RM
\        V 4      pV'       g    V e   R\        V 4      P                   R2# T#  ^ RIHp V! VRR7      #   \
         d     R# i ; i)zORedact secrets from Telegram transport errors before logging or returning them.Ú Ú<Ú>)Úredact_sensitive_textT©Úforcez<telegram error redacted>)r   ÚtypeÚ__name__Úagent.redactr$   Ú	Exception)r   Útextr$   s   &  r   Ú_redact_telegram_error_textr,      sa   € à’‰2¤C¨£J€Dßð /4Ò.?�”4˜“;×'Ñ'Ð(¨Ð*ÐIÀTÐIð+Ý6Ù$ T°Ô6Ð6øÜô +Ú*ð+ús   ºA
 Á
AÁAc                ó<   € V ^8„  d   QhR\         P                  RR/# )r   Útaskr   N©ÚasyncioÚTask)r   s   "r   r   r   -   s"   € ÷ Yñ Y¤'§,¡,ð Y°4ñ Yr   c                ó¨   €  V P                  4        R#   \        P                   d     R# \         d    \        P                  RRR7        R# i ; i)zFObserve a detached task's terminal exception to avoid noisy loop logs.z1Abandoned Telegram init task failed after timeoutT©Úexc_infoN)Ú	exceptionr0   ÚCancelledErrorr*   ÚloggerÚdebug)r.   s   &r   Ú_consume_abandoned_taskr9   -   sF   € ðYØ�‰ÖøÜ×!Ñ!ô ÚÜô YÜ�‰ÐHÐSWˆ×XðYús   ‚ ”A¬AµAÁAÚ
on_abandonÚlabelÚtelegramÚdump_on_blocked_loopTc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   Útimeoutr;   r=   ©Úfloatr   Úbool)r   s   "r   r   r   7   s$   € ÷ ñ ÜðÜ:=ðÜbfñr   c             ƒ  óœ   "  € \        WW2VR7      G Rj  x€L
 pVP                  '       d   \        RVR RV R24      hVP                  #  L55i)u8  Wall-clock deadline that survives a blocked loop / cancellation-shielded PTB+httpcore init.

``on_abandon`` runs detached so an abandoned initialize() can't leak an httpx pool. Raises
``asyncio.TimeoutError`` on expiry (feeds the PTB retry ladder). Send/media call sites pass
``dump_on_blocked_loop=False``: the bug they bound is a shielded socket on a LIVE loop, and the init
wrapper already reports a blocked loop, so N in-flight sends must not each arm a stack-dump timer.

Thin wrapper over :func:`agent.deadline.run_bounded_async` (#85125 Phase 2f) â€” this adapter's private
implementation was the ancestor of that primitive and is now consolidated onto it. The unified layer
keeps every property the 9 call sites here rely on: thread-timer deadline that survives a blocked event
loop (#63309), abandonment of cancellation-shielded tasks (PTB/httpcore init inside anyio scopes),
detached best-effort ``on_abandon`` cleanup so an abandoned initialize() can't leak an httpx pool per
retry attempt, and off-loop stack-dump diagnostics when the loop never processes the expiry.
)r;   r:   r=   Nztimed out after ú.0fzs (Ú))r   Ú	timed_outÚTimeoutErrorÚvalue)Ú	awaitabler?   r:   r;   r=   Úresults   &&$$$ r   Ú_await_with_thread_deadlinerK   7   sY   é € ô" %Ø %ÐUiôk÷ k€Fà××ÐÜÐ-¨g°c¨]¸#¸e¸WÀAÐFÓGÐGØ�<‰<Ðñ	kùs   ‚A”A
•A« Ac                óF   € V ^8„  d   QhR\         R\        \         ,          /# r   )ÚBaseExceptionr
   )r   s   "r   r   r   O   s#   € ÷ wñ w¤ð w´8¼MÕ3Jñ wr   c           	   #  ó  "  € \        4       pV .pV'       dk   VP                  4       p\        V4      pWA9   d   K+  VP                  V4       Vx € VP	                  R \        VRR4      \        VRR4      3 4       4       Kr  R# 5i)u›   Yield ``error`` and every ``__cause__``/``__context__`` ancestor (DFS, cycle-safe) â€”
PTB wraps httpx errors, so classifiers must inspect the whole graph.c              3   ó0   "  € T F  qf   K  Vx € K  	  R # 5i©N© )Ú.0Úxs   & r   Ú	<genexpr>Ú(_iter_exception_graph.<locals>.<genexpr>[   s   é € ÐvÑ d˜1—Q’QÓ dùs   ‚Œ
Ú	__cause__NÚ__context__)ÚsetÚpopÚidÚaddÚextendÚgetattr)r   ÚseenÚstackÚcurÚidents   &    r   Ú_iter_exception_graphrb   O   ss   é € ô “U€DØ"' €Eß
Ø�i‰i‹kˆÜ�3“ˆØŒ=ÙØ�‰�ŒØŠ	Ø�‰Ñv¤¨¨k¸4Ó!@Ä'È#È}Ð^bÓBcÑ dÓvÖvñ ùs   ‚B˜A,Bc                ó   € V ^8„  d   QhRR/# ©r   r   NrQ   )r   s   "r   r   r   ^   s   € ÷ Vñ V¨$ñ Vr   c              ƒ  ó  "  € V f   R#  V P                  4       G Rj  x€L
  \	        V RR4      pVe   \	        VRR4      MR;'       g    R	 Fb  p\	        VRR4      pVf   K   V! 4       p\
        P                  ! V4      '       g   \
        P                  ! V4      '       d   VG Rj  x€L
  Kb  Kd  	  R#  L–  \         d    \        P                  RRR7        L¸i ; i L6  \         d    \        P                  RRR7        K¹  i ; i5i)
z¶Release a half-built PTB app's httpx transports after an abandoned init: ``app.shutdown()``
no-ops when ``_initialized`` was never set, so the request transports are closed directly.Nz(Abandoned Telegram app.shutdown() failedTr3   ÚbotÚ_requestÚshutdownz*Abandoned Telegram request shutdown failedrQ   )rh   r*   r7   r8   r]   r0   ÚiscoroutineÚisfuture)Úapprf   Úrequestrh   rJ   s   &    r   Ú_shutdown_abandoned_apprm   ^   sú   é € ð ‚{ÙðPØ�l‰l‹n×Ðô �#�u˜dÓ
#€CØ69²o”G˜C ¨TÔ2È4×VÐVÐTVÒVˆÜ˜7 J°Ó5ˆØÒÙð	VÙ“ZˆFÜ×"Ò" 6×*Ò*¬g×.>Ò.>¸v×.FÒ.FØ—’ñ /Gó Wñ	 	øÜô PÜ�‰Ð?È$ˆÖOðPúñ øÜô 	VÜ�L‰LÐEÐPTˆL×Uð	Vüs   ‚D	ŠB6 �B4žB6 ¢&D	Á	D	Á#"C ÂC Â"C Â'CÂ(C Â,D	Â4B6 Â6"CÃD	ÃCÃD	ÃC Ã "DÄD	ÄDÄD	©ÚUpdateÚBotÚMessageÚInlineKeyboardButtonÚInlineKeyboardMarkup)ÚLinkPreviewOptions)ÚApplicationÚCommandHandlerÚCallbackQueryHandlerÚInlineQueryHandlerÚMessageHandlerÚContextTypesÚTypeHandlerÚfilters)Ú	ParseModeÚChatType)ÚHTTPXRequestFc                   ó   € ] tR t^†t]tRtR# )Ú_MockContextTypesrQ   N)r(   Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚDEFAULT_TYPEÚ__static_attributes__rQ   r   r   r�   r�   †   s   † ØŒr   r�   )ÚPath)Ú_coerce_allow_set)Úget_languageÚt)ÚPlatformÚPlatformConfig)ÚBasePlatformAdapterÚExecApprovalPromptÚ
SendResultÚclassify_send_errorÚunauthorized_action_noticeÚcache_image_from_bytes_asyncÚcache_audio_from_bytes_asyncÚcache_video_from_bytes_asyncÚresolve_proxy_urlÚSUPPORTED_VIDEO_TYPESÚSUPPORTED_DOCUMENT_TYPESÚSUPPORTED_IMAGE_DOCUMENT_TYPESÚ_TEXT_INJECT_EXTENSIONSÚ	utf16_lené   c                ó$   € V ^8„  d   QhR\         /# ©r   r   ©r   )r   s   "r   r   r   œ   s   € ÷ Hñ H”sñ Hr   c                 óB   € \        \        P                  4      R\         # )u„   Every refused button tap answers with the same sentence â€” resolved per tap so the active
language applies (never bound at import).N)r‘   r‹   ÚTELEGRAMÚ_TOAST_LIMITrQ   r   r   Ú_unauthorizedr¢   œ   s   € ô &¤h×&7Ñ&7Ó8¸¼,ÐGÐGr   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   ÚkeyÚkwargsr   ©r   r   )r   s   "r   r   r   ¢   s!   € ÷ +ñ +”ð +œsð +¤sñ +r   c                ó(   € \        V 3/ VB R\         # )zV``t()`` for ``query.answer(text=...)`` payloads, cut at Telegram's 200-char toast cap.N)rŠ   r¡   )r¤   r¥   s   &,r   Ú_toastr¨   ¢   s   € äˆSÑ�FÑ˜Mœ\Ð*Ð*r   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úliner   rž   )r   s   "r   r   r   §   s   € ÷ @ñ @œ3ð @¤3ñ @r   c                óÎ   € V P                  R4      w  rpV'       g   R\        P                  ! V 4       R2# R\        P                  ! V4       R\        P                  ! V4       2# )zWHTML-bold the ``Label:`` prefix of a translated line (whole line when it has no colon).Ú:z<b>z</b>z:</b>)Ú	partitionÚ_htmlÚescape)rª   r;   ÚsepÚrests   &   r   Ú_bold_label_htmlr²   §   sX   € à—~‘~ cÓ*Ñ€E�ßØ”U—\’\ $Ó'Ð(¨Ð-Ð-Ø”—’˜eÓ$Ð% U¬5¯<ª<¸Ó+=Ð*>Ð?Ð?r   Ú
attachmentz'platform.telegram.media.kind_attachmentÚphotoz"platform.telegram.media.kind_photoúvoice messagez"platform.telegram.media.kind_voiceú
audio filez"platform.telegram.media.kind_audioú
video filez"platform.telegram.media.kind_video)ÚMessageEventÚMessageTypeÚProcessingOutcome)Úexpand_link_entities)ÚTelegramHeldInboundMixin)Únormalize_telegram_chat_idÚparse_send_targetÚparse_telegram_message_id)ÚTopicTransferFnÚapply_root_dm_topic_transfer)ÚSEED_FALLBACK_IPSÚTelegramFallbackTransportÚdiscover_fallback_ipsÚparse_fallback_ip_envÚtcp_keepalive_socket_options)ÚTelegramTopicRoutingMixin)Ú	env_floatÚenv_intú.pngú.jpgú.jpegú.webpú.gifç      @ç      ð?c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úwaitr   )rA   r�   )r   s   "r   r   r   Ò   s   € ÷ ]ñ ]œEð ]¤jñ ]r   c                ó6   € \        RRV  2\        V 4      R7      # )z=The shared fail-closed SendResult for an over-cap flood wait.Fzflood_control:)Úsuccessr   Úretry_after)r�   rA   )rÒ   s   &r   Ú_flood_cap_resultrÖ   Ò   s   € ä˜e¨^¸D¸6Ð+BÔPUÐVZÓP[Ô\Ð\r   z	image/pngú
image/jpegz	image/jpgz
image/webpz	image/gifc                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r   rH   r   )r   r   Úint)r   s   "r   r   r   Û   s   € ÷ &ñ &¤Cð &¬H´S­Mñ &r   c                ór   €  \        \        V 4      4      pT^ 8”  d   T# R#   \        \        3 d     R# i ; i)zBRound a raw length to whole positive seconds, or None if unusable.N)ÚroundrA   Ú	TypeErrorÚ
ValueError)rH   Úsecss   & r   Ú_coerce_duration_secondsrà   Û   sA   € ðÜ”U˜5“\Ó"ˆð ˜!”8ˆ4Ð% Ð%øô ”zÐ"ô Úðús   ‚! ¡6µ6c                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r   Úpathr   ©r   r   rÚ   )r   s   "r   r   r   ä   s   € ÷  ñ  ¬ð  ´¼µñ  r   c                ót  € \         P                  P                  V 4      ^,          P                  4       R8X  d}    ^ RIpVP                  V R4      ;_uu_ 4       pVP                  4       ;'       g    ^ pV'       d*   \        VP                  4       \        V4      ,          4      MRpRRR4       Xe   V#   ^ RIp\        \        \        VP                  V 4      RR4      RR4      4      pVe   V#   ^ RIp^ RIpVP!                  R4      '       d`   VP#                  RRRR	R
RRV .VP$                  RRRR^RR7      pVP&                  ^ 8X  d$   \        VP(                  P+                  4       4      # R#   + '       g   i     LÔ; i  \         d     LÝi ; i  \         d     L²i ; i  \         d     R# i ; i)u¹   Best-effort whole-second audio length (wave â†’ mutagen â†’ ffprobe; None if unreadable).

Telegram renders long clips as 0:00 without an explicit duration. Blocking: use ``to_thread``.z.wavNÚrbÚinfoÚlengthÚffprobeú-vr   ú-show_entriesúformat=durationú-ofz"default=noprint_wrappers=1:nokey=1Túutf-8ÚreplaceF©ÚstdinÚcapture_outputr+   ÚencodingÚerrorsr?   Úcheck)Úosrã   ÚsplitextÚlowerÚwaveÚopenÚgetframeraterà   Ú
getnframesrA   r*   Úmutagenr]   ÚFileÚshutilÚ
subprocessÚwhichÚrunÚDEVNULLÚ
returncodeÚstdoutÚstrip)	rã   rù   ÚwfÚraterß   rý   rÿ   r   Úprocs	   &        r   Ú_probe_voice_duration_secondsr
  ä   s§  € ô 
‡w�w×Ñ˜Ó˜aÕ ×&Ñ&Ó(¨FÔ2ð	ÛØ—‘˜4 ×&Ô&¨"Ø—‘Ó(×-Ð-¨A�ßRVÔ/°·±³Ä%ÈÃ+Õ0MÔNÐ\`�÷ 'ð ÒØ�ð  ðÛÜ'¬´¸¿¹ÀTÓ8JÈFÐTXÓ0YÐ[cÐeiÓ(jÓkˆØÒØˆKð ð
ÛÛØ�<‰<˜	×"Ò"Ø—>‘>Ø˜D '¨?Ð<MÈuÐVzð  }Að  BØ ×(Ñ(¸ÀDÐSZÐclÐvwð  @Eð "ó FˆDð �‰ !Ô#Ü/°·±×0AÑ0AÓ0CÓDÐDñ ÷3 '×&ûô
 ô 	Ùð	ûô ô Ùðûô ô ØÙðúsZ   »F Á"E3Á<+E3Â'F Â79F Ã3F( ÄAF( Å3F	Å>F ÆFÆFÆF%Æ$F%Æ(F7Æ6F7c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# râ   )r   ÚdictrÚ   )r   s   "r   r   r     s"   € ÷ ñ ¤ð ¬¬S´#¨X­ñ r   c                ó¨  €  ^ RI p^ RIpVP                  R4      '       g   / # VP                  RRRRRRRRR	R
RV .VP                  RRRR^RR7      pVP
                  ^ 8w  d   / # \        P                  ! VP                  ;'       g    R4      pVP                  R4      ;'       g    . pV'       g   / # R\        V^ ,          R,          4      R\        V^ ,          R,          4      /p\        VP                  R4      ;'       g    / P                  R4      4      pV'       d   WvR&   V#   \         d    \        P                  RT RR7       / u # i ; i)a_  ``{"width", "height", "duration"}`` for a local video; ``{}`` when ffprobe can't read it.

Telegram runs its own video processing only for uploads under roughly 10 MB; above that it
stores the file as an unprocessed ``320x320`` video with ``duration=0``, so the message must
carry the real geometry or clients draw a square tile for any aspect ratio.
Nré   rê   r   z-select_streamszv:0rë   zstream=width,heightrì   rí   ÚjsonTrî   rï   Frð   z{}ÚstreamsÚwidthÚheightr   Údurationz-[Telegram] video geometry probe failed for %sr3   )rÿ   r   r  r  r  r  r  Úloadsr  ÚgetrÚ   rà   r*   r7   r8   )rã   rÿ   r   r	  Úblobr  Úgeometryr  s   &       r   Ú_probe_video_geometryr    sJ  € ðÛÛØ�|‰|˜I×&Ò&ØˆIØ�~‰~Ø˜˜gÐ'8¸%ØÐ3°_ÐFWØ�F˜Dð"ð ×$Ñ$°TÀÈwÐ_hÐrtð  }Bð	 ó Cˆð
 �?‰?˜aÔØˆIÜ�zŠz˜$Ÿ+™+×-Ð-¨Ó.ˆØ—(‘(˜9Ó%×+Ð+¨ˆßØˆIØœS ¨¥¨GÕ!4Ó5°xÄÀWÈQÅZÐPXÕEYÓAZÐ[ˆÜ+¨T¯X©X°hÓ-?×-EÐ-EÀ2×,JÑ,JÈ:Ó,VÓWˆßØ#+�ZÑ ØˆøÜô Ü�‰ÐDÀdÐUYˆÔZØŠ	ðúsA   ‚D) ¡D) £AD) Á%"D) ÂD) Â'
D) Â2D) Â4A.D) Ä#D) Ä)%EÅEc                óh   € V ^8„  d   QhR\         R\        \        ,          R\        \         ,          /# )r   rã   r  r   rä   )r   s   "r   r   r   (  s)   € ÷ ñ ¤ð ¬x¼­}ð ÄÌ#Åñ r   c                ó’  € Rp ^ RI p^ RIp^ RIpVP                  R4      '       g   R# \	        ^\        T;'       g    ^R,          4      4      pVP                  RRR7      w  rr\        P                  ! V4       VP                  RRR\        V4      R	V R
RRRRRV.VP                  RRRR^RR7      pVP                  ^ 8w  g&   \        P                  P                  V4      '       gD   \        P                   ! \"        4      ;_uu_ 4        \        P$                  ! V4       RRR4       R# V#   + '       g   i     R# ; i  \&         dz    \(        P+                  RT RR7       T'       dV   \        P                   ! \"        4      ;_uu_ 4        \        P$                  ! T4       RRR4       M  + '       g   i     M; i R# i ; i)uö   Write a 320px-wide JPEG frame for Telegram's ``thumbnail`` field; None on failure.

Telegram keeps a supplied thumbnail for the uploads it did not process itself â€” without one the
chat shows a square placeholder tile until the video is opened.
NÚffmpegg      Ð?rË   zhermes-tg-thumb-©ÚsuffixÚprefixz-yz-ssz-iz	-frames:vÚ1z-vfzscale=320:-2z-q:vÚ6Trî   rï   Frð   z3[Telegram] video thumbnail extraction failed for %sr3   )rÿ   r   Útempfiler  ÚmaxrÚ   Úmkstemprö   Úcloser  r   r  r  rã   ÚgetsizeÚ
contextlibÚsuppressÚOSErrorÚremover*   r7   r8   )	rã   r  Úoutrÿ   r   r   ÚseekÚfdr	  s	   &&       r   Ú_video_thumbnail_jpegr,  (  se  € ð €CðÛÛÛØ�|‰|˜H×%Ò%ÙÜ�1”c˜8Ÿ=˜= q¨DÕ0Ó1Ó2ˆØ×"Ñ"¨&Ð9KÐ"ÓL‰ˆÜ
�Š�ŒØ�~‰~Ø�t˜U¤C¨£I¨t°T¸;ÈØ�N F¨C°ð6à×$Ñ$°TÀÈwÐ_hÐrtð  }Bð ó Cˆð �?‰?˜aÔ¤r§w¡w§¡°s×';Ò';Ü×$Ò$¤W×-Õ-Ü—	’	˜#”÷ .áØˆ
÷ .Ö-áûäô Ü�‰ÐJÈDÐ[_ˆÔ`ßÜ×$Ò$¤W×-Õ-Ü—	’	˜#”÷ .×-×-Ð-úâðúsd   „"E ©E ½B+E Ã)"E ÄD.Ä"E Ä,E Ä.D?	Ä9E Ä?E Å*GÅ-"GÆF/Æ&	GÆ/F?Æ:GÇGc                ó$   € V ^8„  d   QhR\         /# r�   ©rB   )r   s   "r   r   r   I  s   € ÷ ñ œtñ r   c                 ó   € \         # )u¨  PASSIVE registry ``check_fn``: is python-telegram-bot importable? Never installs
(``check_telegram_requirements`` is the active ``ensure_deps_fn``).

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_AVAILABLErQ   r   r   Útelegram_deps_presentr1  I  s
   € ô Ðr   c                ó$   € V ^8„  d   QhR\         /# r�   r.  )r   s   "r   r   r   T  s   € ÷ "ñ "¤Tñ "r   c                 ó¾  aaa€ \         '       d   R#  ^ RIHp  V ! R4        ^ RIoT3R lR
 4       w  oorT3R lR 4       w  sssss	\        SRR4      sT3R	 lR 4       w  sssssSP"                  SP$                  SP&                  usssTP(                  TP*                  ussTP,                  sRs R#   \         d     R# i ; i  \.        \0        3 d     R# i ; i)a#  Check if Telegram dependencies are available.

If python-telegram-bot is missing, attempts to lazy-install it via
``pm.ensure_import("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.
T)Úensure_importr<   FNc              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5irP   )Úimport_module)rR   ÚmÚ	importlibs   & €r   rT   Ú.check_telegram_requirements.<locals>.<genexpr>i  s$   øé € ð #xÙ0v¨1ˆI×#Ñ# A×&Ð&Ó0vùó   ƒ!c              3   ó<   <"  € T F  p\        SV4      x € K  	  R # 5irP   ©r]   )rR   ÚnÚ_tgs   & €r   rT   r9  k  s   øé € ð LsÙ%q ŒG�C˜�OˆOÓ%qùó   ƒrt   c              3   ó<   <"  € T F  p\        SV4      x € K  	  R # 5irP   r<  )rR   r=  Ú_exts   & €r   rT   r9  n  s'   øé € ð iIñ 'H ŒG�D˜!×Ðó  'Hùr?  )r<   ztelegram.extztelegram.constantsztelegram.requestrn   )ru   rv   rw   rx   ry   )r0  Úpmr4  r*   r8  ro   rp   rq   rr   rs   r]   rt   ru   rv   rw   rx   ÚTelegramMessageHandlerrz   r|   r{   r}   r~   r   ÚImportErrorÚAttributeError)Ú_lazy_ensureÚ_constÚ_reqrA  r>  r8  s      @@@r   Úcheck_telegram_requirementsrI  T  s
  ú€ ÷ ÓÙðÝ4Ù�ZÔ ðÛô#xÙ0vó#xÑˆˆT�6ôLsÙ%qóLsÑHˆ��WÐ2Ð4Hä$ SÐ*>ÀÓEÐôiIñ 'HóiIÑeˆ�^Ð%9Ð;MÐOeà-1×->Ñ->ÀÇÁÈd×N^ÑN^Ð*ˆ�g˜{Ø$×.Ñ.°·±Ðˆ	�8Ø×(Ñ(ˆð ÐÙøô# ô Úðûô œÐ(ô Úðús#   “B5 ¢BC Â5CÃCÃCÃCz([_*\[\]()~`>#\+\-=|{}.!\\])c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r+   r   rž   )r   s   "r   r   r   }  s   € ÷ .ñ .”sð .œsñ .r   c                ó.   € \         P                  RV 4      # )zIEscape Telegram MarkdownV2 special characters with a preceding backslash.z\\\1)Ú_MDV2_ESCAPE_REÚsub©r+   s   &r   Ú_escape_mdv2rP  }  s   € ä×Ñ˜w¨Ó-Ð-r   c                ó0   € V ^8„  d   QhR\         R\         /# rK  rž   )r   s   "r   r   r   ‚  s   € ÷ ñ ”cð œcñ r   c                ó&  € \         P                  ! RRV 4      p\         P                  ! RRV4      p\         P                  ! RRV4      p\         P                  ! RRV4      p\         P                  ! RRV4      p\         P                  ! RRV4      pV# )zLStrip MarkdownV2 escapes and formatting markers for the plain-text fallback.z\\([_*\[\]()~`>#\+\-=|{}.!\\])ú\1z\*\*([^*]+)\*\*z\*([^*]+)\*z(?<!\w)_([^_]+)_(?!\w)z	~([^~]+)~z\|\|([^|]+)\|\|©ÚrerN  )r+   Úcleaneds   & r   Ú_strip_mdv2rW  ‚  sw   € ä�fŠfÐ6¸¸tÓD€GÜ�fŠfÐ'¨°Ó8€GÜ�fŠf�^ U¨GÓ4€GÜ�fŠfÐ.°°wÓ?€GÜ�fŠf�\ 5¨'Ó2€GÜ�fŠfÐ'¨°Ó8€GØ€Nr   z2(?m)^``` (?P<indicator>(?:\\)?\(\d+/\d+(?:\\)?\))$c                ó0   € V ^8„  d   QhR\         R\         /# rK  rž   )r   s   "r   r   r   �  s   € ÷ Iñ I¬sð I´sñ Ir   c                ó.   € \         P                  RV 4      # )u¤   Move a ``(N/M)`` chunk marker that ``truncate_message()`` appended to a synthesized closing
fence onto its own line â€” Telegram rejects ````` \(1/2\)`` as a fence.z```\n\g<indicator>)Ú_CHUNK_INDICATOR_ON_FENCE_RErN  rO  s   &r   Ú$_separate_chunk_indicator_from_fencer[  �  s   € ô (×+Ñ+Ð,AÀ4Ó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                ó0   € V ^8„  d   QhR\         R\         /# rK  rž   )r   s   "r   r   r   ¤  s   € ÷ ñ ¤Sð ¬Sñ r   c                ó¦  € V '       d   RV 9  d   V # . p^ p\         P                  V 4       Fj  pVP                  \        P                  ! RRWVP                  4        4      4       VP                  VP                  ^ 4      4       VP                  4       pKl  	  VP                  \        P                  ! RRWR 4      4       RP                  V4      # )z‰Convert lone ``\n`` (a Markdown soft break) to hard breaks for sendRichMessage; ``\n\n``,
fenced code and pipe tables are left untouched.Ú
z(?<!\n)\n(?!\n)z  
Nr!   )	Ú_RICH_PROTECTED_REGION_REÚfinditerÚappendrU  rN  ÚstartÚgroupÚendÚjoin)r+   r)  Úposr7  s   &   r   Ú_rich_normalize_linebreaksrj  ¤  s¤   € ÷ �4˜tÔ#ØˆØ€CØ
€CÜ&×/Ñ/°Ö5ˆØ�
‰
”2—6’6Ð,¨f°d¸q¿w¹w»yÐ6IÓJÔKØ�
‰
�1—7‘7˜1“:ÔØ�e‰e‹gŠñ 6ð ‡J�JŒr�vŠvÐ(¨&°$°t°*Ó=Ô>Ø�7‰7�3‹<Ðr   ç      .@ç       @ç      >@ç      N@ç     Àr@g     Àb@Útelegram_polling_generation©Údefaultc                   ó   € ] tR tRtRtRtR# )Ú_PollingLifecycleAbortiú  z=Internal control flow for polling startup fenced by teardown.rQ   N©r(   r‚   rƒ   r„   Ú__doc__r†   rQ   r   r   rt  rt  ú  s   † ÝGr   rt  c                   ó   € ] tR tRtRtRtR# )Ú_PollingStallErroriþ  a6  A confirmed getUpdates stall (watchdog or post-reconnect verifier), as opposed to a transport drop.

Typed so the recovery ladder can hand the adapter to the supervisor instead of classifying log text:
restarting the same Updater cannot heal a wedged long-poll consumer whose stop() did not quiesce (#113618).
rQ   Nru  rQ   r   r   rx  rx  þ  s   † õr   rx  c                   ó$  a a€ ] tR tRt oRtRtRtRtRtRt	Rt
Rt^@tR	tR
tRt^UtRtRtRtRtRtRtRtRtRt]RRRR/V3R lR ll4       t]V3R lR l4       t]R 4       tV3R lV 3R llt]V3R lR l4       t V3R lV 3R llt!V3R  lV 3R! llt"V3R" lV 3R# llt#V3R$ lR% lt$V3R& lR' lt%V3R( lR) lt&V3R* lR+ lt'V3R, lR- lt(]V3R. lR/ l4       t)R0 t*]V3R1 lR2 l4       t+R3RR4RR5RR6R/V3R7 lR8 llt,V3R9 lR: lt-R; t.V3R< lR= lt/V3R> lR? lt0V3R@ lRA lt1]2V3RB lRC l4       t3]2V3RD lRE l4       t4]2V3RF lRG l4       t5]V3RH lRI l4       t6]2V3RJ lRK l4       t7]V3RL lRM l4       t8]2ERùV3RN lRO ll4       t9]2ERúV3RP lRQ ll4       t:]2V3RR lRS l4       t;V3RT lRU lt<]2V3RV lRW l4       t=]2V3RX lRY l4       t>]V3RZ lR[ l4       t?R\R/V3R] lR^ llt@]V3R_ lR` l4       tA]2V3Ra lRb l4       tBERûV3Rc lRd lltCV3Re lRf ltD]V3Rg lRh l4       tE]V3Ri lRj l4       tF]V3Rk lRl l4       tG]V3Rm lRn l4       tH]2V3Ro lRp l4       tI]V3Rq lRr l4       tJERüV3Rt lRu lltKV3Rv lRw ltLV3Rx lRy ltMV3Rz lR{ ltN]OP                   ! R|]OP¢                  ]OP¤                  ,          4      tS]OP                   ! R}]OP¢                  ]OP¤                  ,          4      tT]OP                   ! R~4      tUV3R lR€ ltVV3R� lR‚ ltWV3Rƒ lR„ ltXV3R… lR† ltYV3R‡ lRˆ ltZV3R‰ lRŠ lt[ERûV3R‹ lRŒ llt\ERûV3R� lRŽ llt]V3R� lR� lt^V3R‘ lR’ lt_R“Rs/V3R” lR• llt`V3R– lR— ltaV3R˜ lR™ ltbV3Rš lR› ltcV3Rœ lR� ltd]V3Rž lRŸ l4       teR R/V3R¡ lR¢ lltf]V3R£ lR¤ l4       tgV3R¥ lR¦ lthV3R§ lR¨ ltiV3R© lRª ltjERûV3R« lR¬ lltkV3R­ lR® ltlV3R¯ lR° ltmV3R± lR² ltnV3R³ lR´ ltoV3Rµ lR¶ ltpV3R· lR¸ ltqV3R¹ lRº ltrV3R» lR¼ ltsR½ ttV3R¾ lR¿ ltuRÀ tvRÁRsRÂR/V3RÃ lRÄ lltwV3RÅ lRÆ ltxV3RÇ lRÈ ltyV3RÉ lRÊ ltzV3RË lRÌ lt{V3RÍ lRÎ lt|V3RÏ lRÐ lt}RÑRs/V3RÒ lRÓ llt~V3RÔ lRÕ ltRÖRs/V3R× lRØ llt€V3RÙ lRÚ lt�V3RÛ lRÜ lt‚V3RÝ lRÞ ltƒV3Rß lRà lt„V3Rá lRâ lt…V3Rã lRä lt†V3Rå lRæ lt‡V3Rç lRè ltˆV3Ré lRê lt‰V3Rë lRì ltŠERùV3Rí lRî llt‹V3Rï lRð ltŒV3Rñ lRò lt�V3Ró lRô ltŽERùV3Rõ lRö llt�V3R÷ lRø lt�ERüV3Rù lRú llt‘V3Rû lRü lt’ERüV3Rý lRþ llt“V3Rÿ lER  lt”V3ER lER lt•V3ER lER lt–V3ER lER lt—]V3ER lER l4       t˜]V3ER	 lER
 l4       t™V3ER lER ltšV3ER lER lt›ER tœV3ER lER lt�]V3ER lER l4       tžV3ER lER ltŸV3ER lER lt V3ER lER lt¡V3ER lER lt¢V3ER lV 3ER llt£V3ER lER lt¤V3ER  lER! lt¥ERûV3ER" lV 3ER# lllt¦V3ER$ lER% lt§V3ER& lER' lt¨V3ER( lER) lt©V3ER* lER+ ltªV3ER, lER- lt«ER.Rs/V3ER/ lER0 llt¬V3ER1 lER2 lt­]V3ER3 lER4 l4       t®V3ER5 lER6 lt¯V3ER7 lER8 lt°V3ER9 lER: lt±V3ER; lER< lt²V3ER= lER> lt³V3ER? lER@ lt´V3ERA lERB ltµ]V3ERC lERD l4       t¶V3ERE lERF lt·V3ERG lERH lt¸V3ERI lERJ lt¹ERùV3ERK lERL lltºV3ERM lERN lt»V3ERO lERP lt¼V3ERQ lERR lt½]ERSR/V3ERT lERU ll4       t¾V3ERV lERW lt¿R\R/V3ERX lERY lltÀERûV3ERZ lER[ lltÁV3ER\ lER] ltÂER^RsR\R/V3ER_ lER` lltÃV3ERa lERb ltÄV3ERc lERd ltÅR\R/V3ERe lERf lltÆV3ERg lERh ltÇERùV3ERi lERj lltÈERûV3ERk lERl lltÉERm tÊERnRERoR/V3ERp lERq lltËERrRR5RERoR/V3ERs lERt lltÌ]V3ERu lERv l4       tÍERýV3ERw lERx lltÎ]V3ERy lERz l4       tÏER{tÐER|tÑ]V3ER} lER~ l4       tÒ]V3ER lER€ l4       tÓER�tÔV3ER‚ lERƒ ltÕV3ER„ lER… ltÖ]V3ER† lER‡ l4       t×V3ERˆ lER‰ ltØERûV3ERŠ lER‹ lltÙERûV3ERŒ lER� lltÚ]ERŽ 4       tÛERûV3ER� lER� lltÜ^
tÝERûV3ER‘ lER’ lltÞV3ER“ lER” ltßV3ER• lER– ltà^tá]V3ER— lER˜ l4       tâ]V3ER™ lERš l4       tã]V3ER› lERœ l4       täV3ER� lERž ltåERþV3ERŸ lER  lltæERûV3ER¡ lER¢ lltçV3ER£ lER¤ ltèV3ER¥ lER¦ lté]V3ER§ lER¨ l4       têV3ER© lERª ltëV3ER« lER¬ ltìV3ER­ lER® ltí]V3ER¯ lER° l4       tîV3ER± lER² ltïV3ER³ lER´ ltð]V3ERµ lER¶ l4       tñV3ER· lER¸ ltòV3ER¹ lERº ltó]V3ER» lER¼ l4       tôV3ER½ lER¾ ltõV3ER¿ lERÀ ltöERÁR/V3ERÂ lERÃ llt÷V3ERÄ lERÅ ltøV3ERÆ lERÇ ltùV3ERÈ lERÉ ltúV3ERÊ lERË ltûERÌERÍ. ERÎRs3ERÏERÐ. ERÑRs3ERÒERÓ. ERÔRs3ERÕERÖ. ER×Rs3ERØERÙERÚ.ERÛR3ERÜERÙERÝ.ERÞR3ERßERàERÚ.ERáR3ERâERàERÝ.ERãR3ERäERåERÚ.ERæR3ERçERåERÝ.ERèR3/
tüV3ERé lERê ltýV3ERë lERì ltþ]V3ERí lERî l4       tÿV3ERï lERð lEt V3ERñ lERò lEt]V3ERó lERô l4       EtV3ERõ lERö lEtV3ER÷ lERø lEtERûV3ERù lERú llEt]V3ERû lERü l4       EtERý EtERúV3ERþ lV 3ERÿ lllEtERÿV3ER  lV 3ER lllEt	ERúV3ER lV 3ER lllEt
V3ER lER lEtV3ER lER lEtER V3ER lV 3ER	 lllEtERúV3ER
 lV 3ER lllEtERúV3ER lV 3ER lllEtERúV3ER lER llEt]V3ER lER l4       EtV3ER lER lEtV3ER lER lEtE]EP*                  V3ER lER l4       EtV3ER lER lEtV3ER lER lEtV3ER lER lEtV3ER lER lEtERûV3ER  lER! llEtV3ER" lER# lEtV3ER$ lER% lEt]V3ER& lER' l4       EtV3ER( lER) lEtV3ER* lER+ lEt V3ER, lER- lEt!V3ER. lER/ lEt"V3ER0 lER1 lEt#V3ER2 lER3 lEt$V3ER4 lER5 lEt%V3ER6 lER7 lEt&V3ER8 lER9 lEt'V3ER: lER; lEt(V3ER< lER= lEt)V3ER> lER? lEt*V3ER@ lERA lEt+V3ERB lERC lEt,V3ERD lERE lEt-V3ERF lERG lEt.]V3ERH lERI l4       Et/]V3ERJ lERK l4       Et0]2V3ERL lERM l4       Et1V3ERN lERO lEt2]2V3ERP lERQ l4       Et3]OP                   ! ERR]OP¢                  4      Et4ERSEt5V3ERT lERU lEt6V3ERV lERW lEt7V3ERX lERY lEt8V3ERZ lER[ lEt9ER\Rs/V3ER] lER^ llEt:R
Et;V3ER_ lER` lEt<]V3ERa lERb l4       Et=]V3ERc lERd l4       Et>]2V3ERe lERf l4       Et?]2ERV3ERg lERh ll4       Et@]V3ERi lERj l4       EtAV3ERk lERl lEtBV3ERm lERn lEtCV3ERo lERp lEtDV3ERq lERr lEtEV3ERs lERt lEtFV3ERu lERv lEtGV3ERw lERx lEtHV3ERy lERz lEtIV3ER{ lER| lEtJER} EtKV3ER~ lER lEtLV3ER€ lER� lEtMV3ER‚ lERƒ lEtNV3ER„ lER… lEtOER†E]PEP¢                  ER‡E]PEP¤                  ERˆE]PEP¦                  /EtTV3ER‰ lERŠ lEtUV3ER‹ lERŒ lEtVV3ER� lERŽ lEtWV3ER� lER� lEtXV3ER‘ lER’ lEtY]V3ER“ lER” l4       EtZERûV3ER• lER– llEt[ERùV3ER— lER˜ llEt\V3ER™ lERš lEt]V3ER› lERœ lEt^ER�Rs/V3ERž lERŸ llEt_V3ER  lER¡ lEt`V3ER¢ lER£ lEtaER¤E]bEPÆ                  ER¥ER¦/V3ER§ lER¨ llEtdV3ER© lERª lEteV3ER« lER¬ lEtfV3ER­ lER® lEtgV3ER¯ lER° lEthV3ER± lER² lEtiV3ER³ lV 3ER´ llEtjV3ERµ lV 3ER¶ llEtkERûV3ER· lER¸ llEtlV3ER¹ lERº lEtmV3ER» lER¼ lEtnV3ER½ lER¾ lEtoV3ER¿ lERÀ lEtpV3ERÁ lERÂ lEtqV3ERÃ lERÄ lEtrV3ERÅ lERÆ lEts]V3ERÇ lERÈ l4       EttV3ERÉ lERÊ lEtuV3ERË lERÌ lEtv]V3ERÍ lERÎ l4       EtwV3ERÏ lERÐ lEtxV3ERÑ lERÒ lEtyV3ERÓ lERÔ lEtzV3ERÕ lERÖ lEt{V3ER× lERØ lEt|V3ERÙ lERÚ lEt}V3ERÛ lERÜ lEt~V3ERÝ lERÞ lEt]2V3ERß lERà l4       Et€]2V3ERá lERâ l4       Et�]2V3ERã lERä l4       Et‚V3ERå lERæ lEtƒV3ERç lERè lEt„ERûV3ERé lERê llEt…]V3ERë lERì l4       Et†V3ERí lERî lEt‡V3ERï lERð lEtˆV3ERñ lERò lEt‰V3ERó lERô lEtŠV3ERõ lERö lEt‹V3ER÷ lEtŒERøEt�VEtŽV ;Et�# (  ÚTelegramAdapteri  zLTelegram bot adapter: users/groups, MarkdownV2 replies, forum topics, media.éÐ  é   Ti €  i   çš™™™™™é?r  rk  ç      à?i@  é   i@  g
×£p=
Ç?é   g¸…ëQ¸Î?Ú	min_valueNÚ	max_valuec          
      óX   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[S[,          RS[/# )r   Únamerr  r�  r‚  r   )r   rA   r   )r   Ú__classdict__s   "€r   r   ÚTelegramAdapter.__annotate__/  s@   ø€ ÷ ñ ¡ð ©uð ÁHÉUÅOð ÑgoÑpuÕgvð ñ  CHñ r   c               ó4  € ^ RI p\        P                  ! V 4      p Ve   \        V4      M
\        V4      pVP                  V4      '       g   \        V4      pVe   \        Wb4      pVe   \        Wc4      pV#   \        \
        3 d    \        T4      p L`i ; i)uW   Read a float env var; non-finite â†’ default; clamp to bounds (safe for asyncio.sleep).N)	Úmathrö   ÚgetenvrA   rÝ   rÞ   Úisfiniter!  Úmin)r„  rr  r�  r‚  rˆ  ÚrawrH   s   &&$$   r   Ú_env_float_clampedÚ"TelegramAdapter._env_float_clamped.  sŠ   € ó 	Ü�iŠi˜‹oˆð	#Ø"%¢/”E˜#”J´u¸W³~ˆEð �}‰}˜U×#Ò#Ü˜'“NˆEØÒ Ü˜Ó)ˆEØÒ Ü˜Ó)ˆEØˆøô œ:Ð&ô 	#Ü˜'“NŠEð	#ús   œA8 Á8BÂBc                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  @  s   ø€ ÷ Añ A¡4ñ Ar   c                ó   € \        V RR4      # )zOTrue once disconnect() fenced polling (tolerates object.__new__ test adapters).Ú_polling_teardown_startedFr<  ©Úselfs   &r   Ú_teardown_startedÚ!TelegramAdapter._teardown_started?  s   € ô �tÐ8¸%Ó@Ð@r   c                ó   € \         # )z6Telegram measures message length in UTF-16 code units.)rš   r’  s   &r   Úmessage_len_fnÚTelegramAdapter.message_len_fnD  s
   € ô Ðr   c                ó    <€ V ^8„  d   QhRS[ /# )r   Úconfig)rŒ   )r   r…  s   "€r   r   r†  I  s   ø€ ÷ L;ñ L;™~ñ L;r   c                óÈ  <€ \         SV `  V\        P                  4       V P                  P
                  pR V n        / V n        / V n        R V n	        ^ RI
Hp V! 4       V n        \        4       V n        \        4       V n        R V n        R V n        RV n        V P'                  4       V n        \+        VRR4      ;'       g    RV n        V P/                  RR4      V n        V P/                  RR4      V n        V P/                  RR4      V n        V P/                  RR4      V n        R;V n        V n        / V n        V P?                  R	R
RRR7      V n         / V n!        / V n"        V P?                  RRRR
R7      V n#        \I        RR4      V n%        / V n&        / V n'        / V n(        / V n)        / V n*        V PW                  RV PX                  RV PZ                  R7      V n.        V PW                  RV P^                  V P\                  V P`                  R7      V n1        RV n2        . V n3        R V n4        R V n5        R V n6        R V n7        R V n8        R V n9        ^ ;V n:        ;V n;        V n<        R V n=        \|        P~                  ! 4       V n@        R;V nA        V nB        R V nC        R V nD        R V nE        ^ V nF        ^ V nG        ^ V nH        ^ V nI        R V nJ        R V nK        ^ ;V nL        V nM        RV nN        \|        Pž                  ! 4       V nP        / V nQ        / V nR        \        4       V nS        RV nT        \|        Pž                  ! 4       V nU        \­        VP¯                  RR4      4      V nX        \³        VP¯                  RR4      4      V nZ        \³        VP¯                  RR4      4      V n[        V P/                  RR4      V n\        VP¯                  R. 4      V n]        V Pº                   Uu0 uF  pRV9   g   K  \³        VR,          4      kK   	  upV n^        VP¯                  R 4      '       d   R"MR#V n_        / V n`        / V na        / V nb        / V nc        / V nd        R!V ne        / V nf        / V ng        R # u upi )$N©Úget_hermes_homeFÚreply_to_modeÚfirstÚdisable_link_previewsÚrich_messagesÚallow_cjk_rich_messagesÚrich_draftsÚtyping_cooldown_secondsrm  rÐ   ro  )r�  r‚  Ú%typing_retrigger_min_interval_secondsrl  ç        Ú)HERMES_TELEGRAM_MEDIA_BATCH_DELAY_SECONDSr}  Ú(HERMES_TELEGRAM_TEXT_BATCH_DELAY_SECONDSg{®Gáz´?Ú.HERMES_TELEGRAM_TEXT_BATCH_SPLIT_DELAY_SECONDSr!   Ústatus_indicatorÚstatus_onlineÚOnlineÚstatus_offlineÚOfflineÚdrop_pending_on_cold_bootTÚ	dm_topicsÚchat_idÚbase_urlÚ	importantl        é  @)hÚsuperÚ__init__r‹   r    rš  ÚextraÚ_appÚ_seen_update_idsÚ_inflight_update_idsÚ_update_admissionÚhermes_constantsr�  Ú_update_receipt_dirrX   Ú_update_receipts_loadedÚ_update_receipts_dirtyÚ_update_receipt_flushÚ_botÚ_webhook_modeÚ_compile_mention_patternsÚ_mention_patternsr]   Ú_reply_to_modeÚ_coerce_bool_extraÚ_disable_link_previewsÚ_rich_messages_enabledÚ_allow_cjk_rich_messagesÚ_rich_drafts_enabledÚ_rich_send_disabledÚ_rich_draft_disabledÚ_telegram_typing_cooldown_untilÚ_coerce_float_extraÚ!_telegram_typing_cooldown_secondsÚ _telegram_typing_retrigger_tasksÚ_telegram_typing_retrigger_atÚ#_telegram_typing_retrigger_intervalrÈ   Ú_media_batch_delay_secondsÚ_pending_photo_batchesÚ_pending_photo_batch_tasksÚ_media_group_eventsÚ_media_group_tasksÚ_committed_flush_tasksr�  Ú_TEXT_BATCH_DEFAULT_DELAY_SÚ_TEXT_BATCH_MAX_DELAY_SÚ_text_batch_delay_secondsÚ!_TEXT_BATCH_DEFAULT_SPLIT_DELAY_SÚ_TEXT_BATCH_MAX_SPLIT_DELAY_SÚ_text_batch_split_delay_secondsÚ_drop_delayed_deliveriesÚ_held_inbound_eventsÚ_held_inbound_redispatch_taskÚ_polling_error_taskÚ_polling_progress_verifier_taskÚ_polling_heartbeat_taskÚ_bot_identity_refresh_taskÚ_post_connect_taskÚ_polling_conflict_countÚ_polling_network_error_countÚ_polling_generationÚ%_polling_conflict_recovery_generationr0   ÚEventÚ_polling_progress_eventÚ_polling_progress_acceptingr‘  Ú_polling_error_callback_refÚ%_polling_generation_started_monotonicÚ _polling_last_progress_monotonicÚ_updates_received_totalÚ_updates_dispatched_totalÚ_ingress_dispatched_seenÚ_ingress_stalled_heartbeatsÚ_bot_username_observedÚ_bot_identity_checked_atÚ_polling_pending_stuck_countÚ_polling_not_running_countÚ_send_path_degradedÚLockÚ_general_request_drain_lockÚ
_dm_topicsÚ_pending_created_topicsÚ_forum_command_registeredÚ_command_menu_fingerprintÚ_forum_lockrB   r  Ú_status_indicator_enabledr   Ú_status_online_textÚ_status_offline_textÚ_drop_pending_on_cold_bootÚ_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)r“  rš  r·  r�  ÚeÚ	__class__s   &&   €r   r¶  ÚTelegramAdapter.__init__I  sf  ø€ Ü‰Ñ˜¤×!2Ñ!2Ô3Ø—‘×!Ñ!ˆØ+/ˆŒ	Ø&(ˆÔØ*,ˆÔ!Ø!%ˆÔõ 	5Ù#2Ó#4ˆÔ Ü,/«EˆÔ$Ü+.«5ˆÔ#Ø=AˆÔ"Ø#'ˆŒ	Ø#(ˆÔØ!%×!?Ñ!?Ó!AˆÔÜ#*¨6°?ÀGÓ#L×#WÐ#WÐPWˆÔØ,0×,CÑ,CÐD[Ð]bÓ,cˆÔ#ð
 -1×,CÑ,CÀOÐUZÓ,[ˆÔ#à.2×.EÑ.EÐF_ÐafÓ.gˆÔ%Ø*.×*AÑ*AÀ-ÐQVÓ*WˆÔ!Ø?DÐDˆÔ  4Ô#<àACˆÔ,Ø8<×8PÑ8PØ% t°sÀeð 9Qó 9MˆÔ.ð
 JLˆÔ-Ø?AˆÔ*ð ;?×:RÑ:RØ3°SÀCÐSWð ;Só ;YˆÔ0ô +4Ð4_ÐadÓ*eˆÔ'Ø?AˆÔ#ØCEˆÔ'Ø<>ˆÔ Ø;=ˆÔàKMˆÔ#ð *.×)@Ñ)@Ø6¸×8XÑ8XØ d×&BÑ&Bð *Aó *DˆÔ&ð 04×/FÑ/FØ<¸d×>dÑ>dØ×4Ñ4À×@bÑ@bð 0Gó 0dˆÔ,ð ).ˆÔ%ð 9;ˆÔ!ØEIˆÔ*Ø;?ˆÔ ØGKˆÔ,Ø?CˆÔ$ØBFˆÔ'Ø:>ˆÔØfgÐgˆÔ$Ðg tÔ'HÈ4ÔKcØDHˆÔ2Ü'.§}¢}£ˆÔ$ØLQÐQˆÔ(¨4Ô+IØ+/ˆÔ(ð GKˆÔ2ØAEˆÔ-à,-ˆÔ$Ø./ˆÔ&Ø-.ˆÔ%Ø01ˆÔ(ð 6:ˆÔ#ð :>ˆÔ%ð OPÐOˆÔ)¨DÔ,Kð */ˆÔ Ü+2¯<ª<«>ˆÔ(Ø*,ˆŒð Y[ˆÔ$Ü36³5ˆÔ&Ø.0ˆÔ&Ü"Ÿ<š<›>ˆÔô 04°E·I±IÐ>PÐRWÓ4XÓ/YˆÔ&Ü(+¨E¯I©I°oÀxÓ,PÓ(QˆÔ Ü),¨U¯Y©YÐ7GÈÓ-SÓ)TˆÔ!ð
 15×0GÑ0GÐHcÐeiÓ0jˆÔ'Ø7<·y±yÀÈbÓ7QˆÔàHL×H^ÒH^Ó,qÑH^À1ÐbkÐopÑbpÔ->¬S°°9µÖ->ÑH^Ñ,qˆÔà=B¿Y¹YÀz×=RÒ=RÑ#9ÐXhˆÔØ46ˆÔ Ø57ˆÔ!Ø/1ˆÔØ46ˆÔ!Ø.0ˆÔð )4ˆÔ ð
 68ˆÔ ð 9;ˆÖ#ùò% -rs   Ï	QÏ'Qc                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  Ø  s   ø€ ÷ Añ A¡Dñ Ar   c                ó.   € \        \        V R R4      4      # )rù  F©rB   r]   r’  s   &r   Úsend_path_degradedÚ"TelegramAdapter.send_path_degraded×  s   € ô
 ”G˜DÐ"7¸Ó?Ó@Ð@r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  Þ  s   ø€ ÷ 1ñ 1 ñ 1r   c                óR   <€ R V n         \        SV `	  4        V P                  4        R# )FN)rß  rµ  Ú_mark_connectedÚ!_schedule_held_inbound_redispatch©r“  r  s   &€r   r  ÚTelegramAdapter._mark_connectedÞ  s"   ø€ Ø(-ˆÔ%Ü‰ÑÔ!Ø×.Ñ.Ö0r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  ã  s   ø€ ÷ %ñ % Dñ %r   c                ó2   <€ R V n         \        SV `	  4        R# ©TN)rß  rµ  Ú_mark_disconnectedr  s   &€r   r!  Ú"TelegramAdapter._mark_disconnectedã  s   ø€ Ø(,ˆÔ%Ü‰Ñ"Ö$r   c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[RR/# )r   ÚcodeÚmessageÚ	retryabler   N©r   rB   )r   r…  s   "€r   r   r†  ç  s/   ø€ ÷ vñ v¡Sð v±3ð vÁdð vÈtñ vr   c               ó   <€ R V n         \        SV `	  WVR7       V'       g]   \        V RR4      pV'       d   \	        V4      M^ pV'       d   VP                  4        V'       d   \        P                  RW4       R# R# R# )T©r&  rà  NzJ[Telegram] Non-retryable fatal (%s); discarding %d held inbound message(s))rß  rµ  Ú_set_fatal_errorr]   ÚlenÚclearr7   Úwarning)r“  r$  r%  r&  Úheldr=  r  s   &&&$  €r   r*  Ú TelegramAdapter._set_fatal_errorç  sg   ø€ Ø(,ˆÔ%Ü‰Ñ  ¸)Ð ÔD÷ Ü˜4Ð!7¸Ó>ˆDß!”�D”	 qˆAßØ—
‘
”ßÜ—‘ÐkÐmqÖuñ ñ r   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  õ  s   ø€ ÷ Gñ G¡Tñ Gr   c                ób   € \        V RR4      '       g   R# \        \        V RR4      4      '       * # )uA   True after non-retryable fatal â€” holds must discard, not queue.Ú_fatal_error_codeNFÚ_fatal_error_retryableT)r]   rB   r’  s   &r   Ú_is_permanent_fatalÚ#TelegramAdapter._is_permanent_fatalõ  s-   € ä�tÐ0°$×7Ò7ÙÜœ Ð&>ÀÓEÓFÔFÐFr   c                ó   <€ V ^8„  d   QhRR/# )r   r   zOptional[TelegramAdapter]rQ   )r   r…  s   "€r   r   r†  û  s   ø€ ÷ ñ Ð/Jñ r   c                óÀ   € \        V RR4      p\        VRR4      ;'       g    / pVP                  V P                  4      pVe   W0Jd   \        VRR4      '       d   V# R# )zšLive adapter if the reconnect watcher replaced us in ``runner.adapters`` (an in-flight
``send()`` still holds the old instance whose ``_bot`` stays None).Úgateway_runnerNÚadaptersrÁ  )r]   r  Úplatform)r“  Úrunnerr9  Úlives   &   r   Ú_replacement_telegram_adapterÚ-TelegramAdapter._replacement_telegram_adapterû  s\   € ô ˜Ð/°Ó6ˆÜ˜6 :¨tÓ4×:Ð:¸ˆØ�|‰|˜DŸM™MÓ*ˆØÒ Ó 0´W¸TÀ6È4×5PÒ5PØˆKÙr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†    s   ø€ ÷ ñ ©dñ r   c              ƒ  óˆ  "  € V P                   '       g   V P                  4       e   R# V P                  4       '       d   R# \        \	        V RR4      4      p\        \	        V RR4      4      p\
        P                  RV P                  V4       R	pW18  dˆ   \        P                  ! V4      G Rj  x€L
  W2,          pV P                  4       '       d   R# V P                   '       g   V P                  4       f   Kj  \
        P                  R
V P                  V4       R# \
        P                  RV P                  V4       R#  L�5i)zOWait for ``_bot`` or a replacement adapter; False on expiry or permanent fatal.NTFÚ_RECONNECT_WAIT_SECONDSrk  Ú_RECONNECT_POLL_INTERVALr~  u=   [%s] Not connected â€” waiting for reconnection (up to %.0fs)r¦  z[%s] Reconnected after %.1fsz$[%s] Still not connected after %.0fs)rÁ  r=  r4  rA   r]   r7   rç   r„  r0   Úsleepr-  )r“  Úwait_sÚpoll_sÚwaiteds   &   r   Ú_wait_for_reconnectionÚ&TelegramAdapter._wait_for_reconnection  sô   é € à�9�9ˆ9˜×:Ñ:Ó<ÒHÙØ×#Ñ#×%Ò%ÙÜ”w˜tÐ%>ÀÓEÓFˆÜ”w˜tÐ%?ÀÓEÓFˆÜ�‰ÐSÐUY×U^ÑU^Ð`fÔgØˆØŒoÜ—-’- Ó'×'Ð'ØÕˆFØ×'Ñ'×)Ò)ÙØ�y�yˆy˜D×>Ñ>Ó@ÔLÜ—‘Ð:¸D¿I¹IÀvÔNÙÜ�‰Ð=¸t¿y¹yÈ&ÔQÙñ (ùs$   ‚<E¿A0EÂ/E Â05EÃ&EÃ:AEc                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†    s   ø€ ÷ Fñ F©tñ Fr   c                ó.   € \        \        V RR4      4      # )u»   True once teardown/fatal started: delayed flushes must not dispatch onto a torn-down session.
Callers must NOT destroy the event (PTB already advanced the offset) â€” hold and redispatch.rß  Fr  r’  s   &r   Ú_should_drop_delayed_deliveryÚ-TelegramAdapter._should_drop_delayed_delivery  s   € ô ”G˜DÐ"<¸eÓDÓEÐEr   c                ób   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[S[S[3,          /# ©r   Úmetadatar   ©r   r  r   r   )r   r…  s   "€r   r   r†    s1   ø€ ÷ .ñ .©X±d¹3Á¸8µnÕ-Eð .É$ÉsÑTWÈxÍ.ñ .r   c                ó¶   € \        V RR4      R8w  gC   T;'       g    / P                  R4      '       g"   T;'       g    / P                  R4      '       d   / # RR/# )zkIn "important" mode return disable_notification=True unless ``notify`` or ``is_approval_prompt`` (#132516).r  r³  ÚnotifyÚis_approval_promptÚdisable_notificationT)r]   r  )r“  rO  s   &&r   Ú_notification_kwargsÚ$TelegramAdapter._notification_kwargs  sW   € ä�4Ð.°Ó<ÀÔKÐPX×P^ÐP^Ð\^×OcÑOcÐdl×OmÒOmØ—N�N ×'Ñ'Ð(<×=Ò=ØˆIØ&¨Ð-Ð-r   c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   Ú	chat_typeÚis_forumr   )r   rB   r   )r   r…  s   "€r   r   r†  '  s"   ø€ ÷ ñ ©ð ¹$ð Á3ñ r   c               ó´   € \        T ;'       g    R4      P                  4       P                  4       ;'       g    RpVR8X  d   R# VR8X  d   V'       d   R# R# V# )u^   Telegram chat type â†’ gateway chat type (``private``â†’``dm``, ``supergroup``â†’forum/group).ÚdmÚprivateÚ
supergroupÚforumrf  )r   r  rø   )rX  rY  Ú
normalizeds   &$ r   Ú_normalize_chat_typeÚ$TelegramAdapter._normalize_chat_type&  sV   € ô ˜×*Ð* dÓ+×1Ñ1Ó3×9Ñ9Ó;×CÐC¸tˆ
Ø˜Ô"ÙØ˜Ô%ß&�7Ð3¨GÐ3ØÐr   c                óv   € \        \        V RR4      RR4      p\        VRR4      p\        V4      '       d   V# R# )z¢``runner._is_user_authorized`` resolved off the bound handler (bare-adapter tests, direct
embedding); None under multiplex where the handler is a profile closure.Ú_message_handlerNÚ__self__Ú_is_user_authorized)r]   Úcallable)r“  r;  Úauth_fns   &  r   Ú_legacy_runner_auth_fnÚ&TelegramAdapter._legacy_runner_auth_fn0  s@   € ô œ Ð'9¸4Ó@À*ÈdÓSˆÜ˜&Ð"7¸Ó>ˆÜ" 7×+Ò+ˆwÐ5°Ð5r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   Úuser_idr   ©r   r   rB   )r   r…  s   "€r   r   r†  ?  s   ø€ ÷ <ñ <©ð <±¹$µñ <r   c                óþ   € \        R4      P                  4       pV'       g   R# VP                  R4       Uu0 uF*  q"P                  4       '       g   K  VP                  4       kK,  	  ppRV9   ;'       g    W9   # u upi )zFTELEGRAM_ALLOWED_USERS decision; None when no allowlist is configured.ÚTELEGRAM_ALLOWED_USERSNÚ,Ú*)Ú_scoped_gate_envr  Úsplit)rk  Úallowed_csvÚuidÚallowed_idss   &   r   Ú_env_allowlist_decisionÚ'TelegramAdapter._env_allowlist_decision>  si   € ô 'Ð'?Ó@×FÑFÓHˆßÙØ.9×.?Ñ.?ÀÔ.DÓTÑ.D sÏ	É	Ï”{�s—y‘y–{Ñ.DˆÐTØ�kÑ!×;Ð; WÑ%;Ð;ùò Us   ·A:ÁA:r±  rX  Ú	thread_idÚ	user_namec                ó~   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[ ,          RS[S[ ,          RS[S[ ,          RS[/# )r   rk  r±  rX  rx  ry  r   rl  )r   r…  s   "€r   r   r†  G  sN   ø€ ÷ #ñ #Ùð#Ù(0±­ð#ÙIQÑRUÍð#á™C•=ð#á4<¹SµMð#áMQñ#r   c          
     óæ  € \        T;'       g    R4      P                  4       pV'       g   R# V P                  W4RJR7      p\        V RR4      e=   T P	                  Yg\        T;'       g    T4      Ve   \        V4      MRR7      pVe   V# V P                  4       p	V	ew    ^ RIHp
 T
! \        P                  \        T;'       g    T4      TYe'       d   \        V4      P                  4       MRVe   \        V4      MRR7      p\        V	! V4      4      # V P                  V4      pVf   \        R4      P!                  4       R9   # V#   \         d    \        P                  R	TR
R7        LXi ; i)zIReturn whether a Telegram inline-button caller may perform gated actions.r!   FN©rY  Ú_authorization_check)rX  r±  rx  ©ÚSessionSource)r:  r±  rX  rk  ry  rx  z=[Telegram] Falling back to env-only callback auth for user %sTr3   ÚGATEWAY_ALLOW_ALL_USERS>   r  ÚyesÚtrue)r   r  r`  r]   Ú_is_sender_authorizedrh  Úgateway.sessionr  r‹   r    rB   r*   r7   r8   rv  rq  rø   )r“  rk  r±  rX  rx  ry  Únormalized_user_idÚnormalized_chat_typeÚinjectedrg  r  ÚsourceÚdecisions   &&$$$$       r   Ú_is_callback_user_authorizedÚ,TelegramAdapter._is_callback_user_authorizedG  sy  € ô ! § ¨BÓ/×5Ñ5Ó7Ðß!ÙØ#×8Ñ8¸Ð^bÐMbÐ8ÓcÐô �4Ð/°Ó6ÒBØ×1Ñ1Ø"ÌCÐPW×PmÐPmÐ[mÓLnØ,5Ò,Aœ#˜iœ.Àtð 2ó MˆHð Ò#Ø�Ø×-Ñ-Ó/ˆØÒð	xÝ9Ù&Ü%×.Ñ.¼¸G×<YÐ<YÐGYÓ8ZÐfzØ.ÖT]¼#¸i».×:NÑ:NÔ:PÐcgØ09Ò0Eœc )œnÈ4ôQ�ô ™G F›OÓ,Ð,ð ×/Ñ/Ð0BÓCˆØÒô $Ð$=Ó>×DÑDÓFÐJ^Ñ^Ð^Øˆøô ô xÜ—‘ØSÐUgÐrvð ö xðxús   Â"$E
 ÃAE
 Å
#E0Å/E0c                ó    <€ V ^8„  d   QhRS[ /# ©r   r%  ©rq   )r   r…  s   "€r   r   r†  l  s   ø€ ÷ Eñ E±Wñ Er   c           
     ó^  € ^ RI Hp \        VRR4      p\        VRR4      p\        \        VRR4      4      P	                  4       ;'       g    RpVe   \        \        VRR4      4      MRp\        \        VR	R4      ;'       g    \        VR
R4      ;'       g    R4      P	                  4       ;'       g    RpV'       g€   \        VRR4      pVeo   \        \        VRR4      4      P	                  4       ;'       g    RpV'       g9   \        \        VRR4      ;'       g    R4      P	                  4       ;'       g    Rp\        \        VRR4      4      P	                  4       ;'       g    Tp	\        VRR4      p
\        \        VRR4      4      p\        VRR4      RJ pT P                  \        VRR4      V
RJ;'       d    T;'       g    TR7      pRpV
e2   VR8X  d   V'       g   V'       g   VR8X  d   V'       d   \        V
4      pT! \        P                  T	;'       g    RWÕW~VR7      # )z´Build the SessionSource the gateway auth path expects; identity comes from ``from_user``,
falling back to ``sender_chat`` for channel posts so an unauthorized channel can't inject.r~  Ú	from_userNÚchatrZ   r!   Úis_botFÚusernameÚ	full_nameÚsender_chatÚtitleÚmessage_thread_idÚis_topic_messagerY  Tr'   r[  r|  r^  )r:  r±  rX  rk  ry  rx  r’  )	r„  r  r]   r   r  rB   r`  r‹   r    )r“  r%  r  Úuserr‘  rk  r’  ry  r•  r±  Úthread_id_rawr˜  Úis_forum_grouprX  rx  s   &&             r   Ú_source_from_message_for_authÚ-TelegramAdapter._source_from_message_for_authl  s÷  € õ 	2Ü�w ¨TÓ2ˆÜ�w ¨Ó-ˆÜ”g˜d D¨"Ó-Ó.×4Ñ4Ó6×>Ð>¸$ˆà9=Ò9I””g˜d H¨eÓ4Ô5ÈuˆÜœ  j°"Ó5×]Ð]¼ÀÀ{ÐTVÓ9W×]Ð]Ð[]Ó^×dÑdÓf×nÐnÐjnˆ	ßÜ! '¨=¸$Ó?ˆKØÒ&Üœg k°4¸Ó<Ó=×CÑCÓE×MÐMÈ�ß Ü #¤G¨K¸À"Ó$E×$KÐ$KÈÓ L× RÑ RÓ T× \Ð \ÐX\�IÜ”g˜d D¨"Ó-Ó.×4Ñ4Ó6×AÐA¸'ˆÜ Ð)<¸dÓCˆÜ¤¨Ð1CÀUÓ KÓLÐÜ   z°5Ó9¸TÐAˆØ×-Ñ-Ü�D˜& $Ó'°-ÀtÐ2K×2tÐ2tÐQa×QsÐQsÐesð .ó vˆ	àˆ	ØÒ$Ø˜'Ô!×'7¿>ÐPYÐ]aÔPa×fvÜ˜MÓ*ˆIÙÜ×&Ñ&°·°¸2ÈØ¸VôEð 	Er   c           
     ó(  € \        VRR4      pVf   \        R4      h\        VRR4      ;'       g    \        VRR4      p\        VRR4      p\        \        VRR4      4      P                  4       ;'       g    Rp\        \        VR	R4      ;'       g#    \        VR
R4      ;'       g    \        VRR4      4      P                  4       ;'       g    Rp\        \        VRR4      4      P                  4       ;'       g    Rp\        VRR4      pV'       d,   V'       d$   Ve    \        V4      P                  4       '       g   \        R4      hV P	                  \        VRR4      \        VRR4      RJ R7      p	V P                  WyWVR\        V4      R7      # )zÃSessionSource for a ``message_reaction`` update's actor (``user`` or ``actor_chat``).

Raises ``ValueError`` when actor, chat or message identity is absent so the post-auth boundary fails closed.Úmessage_reactionNzKgateway_platform_event source extraction requires a message_reaction updater™  Ú
actor_chatr‘  rZ   r!   r“  r”  r–  Ú
message_idzLgateway_platform_event reaction requires actor, chat, and message identitiesr'   r[  rY  FTr|  )r±  rX  rk  ry  rx  r¡  )r]   rÞ   r   r  r`  Úbuild_source)
r“  ÚupdateÚmrr™  r‘  rk  ry  r±  r¡  rX  s
   &&        r   Ú_source_from_reaction_for_authÚ.TelegramAdapter._source_from_reaction_for_authŠ  s‰  € ô �VÐ/°Ó6ˆØŠ:ÜÐjÓkÐkÜ�r˜6 4Ó(×KÐK¬G°B¸ÀdÓ,KˆÜ�r˜6 4Ó(ˆÜ”g˜d D¨"Ó-Ó.×4Ñ4Ó6×>Ð>¸$ˆÜœ  j°"Ó5×uÐu¼ÀÀ{ÐTVÓ9W×uÐuÔ[bÐcgÐipÐrtÓ[uÓv×|Ñ|Ó~÷  Gð  Gð  CGˆ	Ü”g˜d D¨"Ó-Ó.×4Ñ4Ó6×>Ð>¸$ˆÜ˜R ¨tÓ4ˆ
ßŸg¨Ò);Ä3ÀzÃ?×CXÑCX×CZÒCZÜÐkÓlÐlà×-Ñ-¬g°d¸FÀDÓ.IÔT[Ð\`ÐblÐnsÓTtÐx|ÐT|Ð-Ó}ˆ	Ø× Ñ Ø¸'ÐbfÔsvð  xBó  tCð !ó Dð 	Dr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  ž  s   ø€ ÷ Bñ B©tñ Br   c                ón   € Rp\         ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # )zDReturn True when Telegram auth env vars make an early decision safe.c              3   óT   "  € T F  p\        V4      P                  4       x € K   	  R # 5irP   )rq  r  )rR   r¤   s   & r   rT   Ú@TelegramAdapter._telegram_auth_env_configured.<locals>.<genexpr>£  s"   é € ÐA¹D°SÔ# CÓ(×.Ñ.×0Ð0»Dùs   ‚&(TF)rn  ÚTELEGRAM_GROUP_ALLOWED_USERSÚTELEGRAM_GROUP_ALLOWED_CHATSÚTELEGRAM_ALLOW_ALL_USERSÚGATEWAY_ALLOWED_USERSr€  )Úany)r“  Úkeyss   & r   Ú_telegram_auth_env_configuredÚ-TelegramAdapter._telegram_auth_env_configuredž  s5   € ð\ˆ÷ ‹sÑA¹DÓA�sŒsÐAŠsÐAˆsÑA¹DÓAÓAÐAr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  ¥  s   ø€ ÷ eñ eÁ$ñ er   c                óB  € VP                   R8w  d   R# \        \        V RR4      RR4      ;'       g    \        V RR4      p\        VRR4      p\        V4      '       d?    \        VRR4      ;'       g    \        V R	R4      pV! \        P                  VR
7      R8g  # \        \        V RR4      RR4      ;'       g    / p\        VP                  RR4      4      P                  4       P                  4       R9   #   \
         d    \        P                  RRR7        L€i ; i)uö   True when an unauthorized DM must still reach the gateway for an outbound reply
(``unauthorized_dm_behavior`` resolves to anything but ``ignore`` â€” a pairing code or a
one-time decline â€” incl. an allowlist plus an explicit platform override).r[  Frc  Nrd  r8  Ú_get_unauthorized_dm_behaviorÚprofileÚ_owner_profile)r¶  Úignorez][Telegram] Failed to resolve unauthorized DM behavior; falling back to adapter-local overrideTr3   rš  r·  Úunauthorized_dm_behaviorr!   )ÚpairÚdecline)rX  r]   rf  r‹   r    r*   r7   r8   r   r  r  rø   )r“  rˆ  r;  Úbehavior_fnr¶  r·  s   &&    r   Ú(_should_pass_unauthorized_dm_for_pairingÚ8TelegramAdapter._should_pass_unauthorized_dm_for_pairing¥  s  € ð ×Ñ˜tÔ#Ùäœ Ð'9¸4Ó@À*ÈdÓS×|Ð|ÔW^Ð_cÐeuÐw{ÓW|ˆÜ˜fÐ&EÀtÓLˆÜ�K× Ò ðMÜ! &¨)°TÓ:×cÐc¼gÀdÐL\Ð^bÓ>c�Ù"¤8×#4Ñ#4¸gÔFÈ(ÑRÐRô œ  h°Ó5°wÀÓE×KÐKÈˆÜ�5—9‘9Ð7¸Ó<Ó=×CÑCÓE×KÑKÓMÐQdÑdÐdøô ô MÜ—‘Ð|ð  HL�ö  MðMús   Á C9 Á4(C9 Ã9"DÄDc                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   r%  r   ©rq   rB   )r   r…  s   "€r   r   r†  ·  s   ø€ ÷ 4Eñ 4E¹ð 4EÁDñ 4Er   c                ó‚  € V P                  V4      pVP                  pV'       g   R# RpV P                  P                  P	                  VP
                  ;'       g    RR9   d   RMR4      pVe   \        V4      pW69   ;'       g    RV9   pVf•   V P                  P	                  R4      p\        V4      '       di   \        P                  ! \        4      ;_uu_ 4        \        V! W2P                  VP
                  VP                  VP                  R7      4      pRRR4       Vf¨   V P!                  4       p\#        V R	R4      RJp	V	'       g   Ve}   V P%                  4       '       g   R# V	'       d>   V P'                  W2P
                  VP                  VP(                  VP                  R
7      MRp
V
e   T
pMVe    \        V! V4      4      pVf   V P/                  V4      pVf   R# V'       d   R# V P1                  V4      #   + '       g   i     Lñ; i  \         d    \*        P-                  RTRR7        Lni ; i)a  Intake auth prefilter, run BEFORE batching/event construction/group observation.

Only rejects when it can make the same context-aware decision the runner would; unknown DMs pass through when
there is no allowlist or pairing is the unauthorized-DM behavior.TNr!   Úgroup_allow_fromÚ
allow_fromrp  rŠ  ©r±  rX  rx  ry  r}  )rX  r±  r’  rx  z4[Telegram] Falling back to env-only auth for user %sr3   )rf  r^  Úchannel)rœ  rk  rš  r·  r  rX  rˆ   Ú__dict__rf  r%  r&  r*   rB   r±  rx  ry  rh  r]   r±  rƒ  r’  r7   r8   rv  r½  )r“  r%  rˆ  rk  Ú
authorizedÚadapter_allow_fromÚallowedÚcallback_authrg  Úhas_callbackr‰  s   &&         r   Ú _is_user_authorized_from_messageÚ0TelegramAdapter._is_user_authorized_from_message·  s  € ð
 ×3Ñ3°GÓ<ˆØ—.‘.ˆçÙØ%)ˆ
à!Ÿ[™[×.Ñ.×2Ñ2Ø#)×#3Ñ#3×#9Ð#9°rÐ>[Ô"[ÑÐamóoÐàÒ)Ü'Ð(:Ó;ˆGØ Ñ+×=Ð=¨s°g©~ˆJð ÒØ ŸM™M×-Ñ-Ð.LÓMˆMÜ˜×&Ò&Ü×(Ò(¬×3Õ3Ü!%¡mØ¯©À6×CSÑCSÐ_e×_oÑ_oØ"(×"2Ñ"2ô'4ó "5�J÷ 4ð Òð ×1Ñ1Ó3ˆGÜ" 4Ð)?ÀÓFÈdÐRˆLß˜wÒ2à×9Ñ9×;Ò;Ù÷ 4@ð  ×5Ñ5Ø×'7Ñ'7ÀÇÁÐX^×XeÑXeØ$×.Ñ.ð 6ô 0àEIð ð Ò'Ø!)‘JØÒ(ðuÜ%)©'°&«/Ó%:˜
ð ÒØ×5Ñ5°gÓ>ˆJØÒ!ÙßÙà×<Ñ<¸VÓDÐD÷= 4×3ûô* %ô uÜŸ™Ð%[Ð]dÐos˜Ötðuús   Ã>HÆ>H ÈH	È#H>È=H>c                ó\   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[ S[,          /# rN  rP  )r   r…  s   "€r   r   r†  î  s1   ø€ ÷ Añ A©8±D¹¹c¸µNÕ+Cð AÉÑQTÍñ Ar   c                ó    € T;'       g    / P                  R 4      ;'       g    T;'       g    / P                  R4      pVe   \        V4      # R# )rx  r—  N©r  r   )ÚclsrO  rx  s   && r   Ú_metadata_thread_idÚ#TelegramAdapter._metadata_thread_idí  sF   € à—^�^ ×(Ñ(¨Ó5×bÐb¸(¿.¸.Àb×9MÑ9MÐNaÓ9bˆ	Ø!*Ò!6Œs�9‹~Ð@¸DÐ@r   c                ó\   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[ S[,          /# rN  rP  )r   r…  s   "€r   r   r†  ó  s/   ø€ ÷ ?ñ ?¹(Á4ÉÉSÈÅ>Õ:Rð ?ÑW_Ñ`cÕWdñ ?r   c                ó    € T;'       g    / P                  R 4      ;'       g    T;'       g    / P                  R4      pVe   \        V4      # R# )Údirect_messages_topic_idÚ!telegram_direct_messages_topic_idNrÑ  )rÒ  rO  Útopic_ids   && r   Ú"_metadata_direct_messages_topic_idÚ2TelegramAdapter._metadata_direct_messages_topic_idò  sR   € à—N�N ×'Ñ'Ð(BÓC÷  Að  AÈÏÈÐTV×G[ÑG[Ð\ó  HAˆØ (Ò 4Œs�8‹}Ð>¸$Ð>r   c                ó\   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[ S[,          /# rN  )r   r  r   r   rÚ   )r   r…  s   "€r   r   r†  ø  s3   ø€ ÷ _ñ _±X¹dÁ3ÉÀ8½nÕ5Mð _ÑRZÑ[^ÕR_ñ _r   c                óJ   € \        T;'       g    / P                  R 4      4      # )Útelegram_reply_to_message_id)r¿   r  )rÒ  rO  s   &&r   Ú_metadata_reply_to_message_idÚ-TelegramAdapter._metadata_reply_to_message_id÷  s   € ä(¨(¯.¨.°b×)=Ñ)=Ð>\Ó)]Ó^Ð^r   c                óL   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[/# rN  )r   r  r   r   rB   )r   r…  s   "€r   r   r†  ü  s,   ø€ ÷ Sñ S¡X©d±3¹°8­nÕ%=ð SÁ$ñ Sr   c                óJ   € \        T ;'       d    V P                  R4      4      # )zPTrue for Hermes private-chat topic lanes (``telegram_dm_topic_reply_fallback``).Ú telegram_dm_topic_reply_fallback)rB   r  ©rO  s   &r   Ú_dm_topic_fallbackÚ"TelegramAdapter._dm_topic_fallbackû  s!   € ô �H×QÐQ §¡Ð.PÓ!QÓRÐRr   c          	      óh   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  rx  rO  r   ©r   r   r  r   rB   )r   r…  s   "€r   r   r†    sG   ø€ ÷ Dñ D±ð DÁÉÅð DÑYaÑbfÑgjÑloÐgoÕbpÕYqð DÑvzñ Dr   c                ó
  € V P                  V4      e-   V P                  V4      ;'       d    V P                  V4      R J# V'       d   VP                  R4      '       d   R# \	        V4      ;'       d    V P                  V4      # )NÚ"telegram_dm_topic_created_for_sendF)rÚ  rå  rß  r  rB   )rÒ  r±  rx  rO  s   &&&&r   Ú_is_private_dm_topic_sendÚ)TelegramAdapter._is_private_dm_topic_send   sp   € à×1Ñ1°(Ó;ÒGØ×)Ñ)¨(Ó3×oÐo¸×8YÑ8YÐZbÓ8cÐkoÐ8oÐoß˜Ÿ™Ð%I×JÒJÙÜ�I‹×CÐC 3×#9Ñ#9¸(Ó#CÐCr   c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  	  s   ø€ ÷ rñ r©Cñ rr   c                 ó   € R # )z`Telegram DM topic delivery requires a reply anchor; refusing to send outside the requested topicrQ   rQ   r   r   Ú_dm_topic_missing_anchor_errorÚ.TelegramAdapter._dm_topic_missing_anchor_error  s   € áqr   c          	      óˆ   <€ V ^8„  d   QhRS[ S[,          RS[ S[S[S[3,          ,          RS[ S[,          RS[ S[,          /# )r   Úreply_torO  rž  r   )r   r   r  r   rÚ   )r   r…  s   "€r   r   r†    sV   ø€ ÷ ñ Ù¡•}ðÙ08¹¹cÁ3¸h½Õ0HðÙ`hÑilÕ`mðñ zBñ  CFõ  zGñr   c                ó†   € \        V4      ;pe   V# V P                  V4      '       d   VR8w  d   V P                  V4      # R # )NÚoff)r¿   rå  rß  )rÒ  rò  rO  rž  Úanchors   &&&& r   Ú_reply_to_message_id_for_sendÚ-TelegramAdapter._reply_to_message_id_for_send  sE   € ô 0°Ó9Ð9ˆFÒFØˆMØ×!Ñ! (×+Ò+°ÀÔ0FØ×4Ñ4°XÓ>Ð>Ùr   c                óª   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[,          RS[S[ ,          RS[S[ S[3,          /# )r   r±  rx  rO  Úreply_to_message_idrž  r   )r   r   r  r   rÚ   )r   r…  s   "€r   r   r†    sk   ø€ ÷ #Qñ #QÙð#QÙ&.©s¥mð#QÙ?GÉÉSÑRUÈXÍÕ?Wð#Qá%¡c�]ð#QáBJÉ3Å-ð#Qá[_Ñ`cÑehÐ`hÕ[iñ#Qr   c                óB  € V P                  V4      pV'       dV   VR8w  dO   Vf   V P                  V4      pVf5   V P                  V4      pVe   RV/# V P                  V4      ;'       g    / # MV'       g   V P                  V4      pVe   V# RV P                  V4      /# )aØ  Telegram send kwargs for forum and direct-message topic routing.

Forum topics use ``message_thread_id``; native Bot API DM topics opt in via explicit ``direct_messages_topic_id``
metadata; Hermes private-chat topic lanes are marked ``telegram_dm_topic_reply_fallback``. Anchor-less synthetic sends
prefer the Hermes topic's ``message_thread_id`` (the native DM-topic id renders in a different chat lane).
``reply_to_mode="off"`` suppresses the anchor but keeps ``message_thread_id``.

Live replies send the private topic thread id together with a reply anchor. Synthetic/resumed sends
without an anchor (loop wakeups, background-process notifications, queued follow-ups after a gateway
restart) prefer the Hermes topic's ``message_thread_id`` so they stay in the active topic lane
(#87051); ``direct_messages_topic_id`` is only used when no topic thread resolves, since the native
DM-topic id does not match the Hermes topic lane and can render the message in a different chat
lane.
rô  r—  )rå  rß  Ú_message_thread_id_for_sendÚ_direct_topic_kwargs)	rÒ  r±  rx  rO  rù  rž  ÚfallbackÚthread_message_idÚdirect_kwargss	   &&&&&&   r   Ú_thread_kwargs_for_sendÚ'TelegramAdapter._thread_kwargs_for_send  sµ   € ð$ ×)Ñ)¨(Ó3ˆß˜¨Ô.Ø"Ò*Ø&)×&GÑ&GÈÓ&QÐ#Ø"Ò*ð %(×$CÑ$CÀIÓ$NÐ!Ø$Ò0Ø/Ð1BÐCÐCØ×/Ñ/°Ó9×?Ð?¸RÐ?ð +÷ Ø×4Ñ4°XÓ>ˆMØÒ(Ø$Ð$Ø# S×%DÑ%DÀYÓ%OÐPÐPr   c                ór   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[ S[S[S[3,          ,          /# rN  rP  )r   r…  s   "€r   r   r†  <  s>   ø€ ÷ ]ñ ]©H±T¹#¹s¸(µ^Õ,Dð ]ÉÑRVÑWZÑ\_ÐW_ÕR`ÕIañ ]r   c                óN   € V P                  V4      pVf   R# RRR\        V4      /# )zUNative Bot API DM-topic routing kwargs, or None when no ``direct_messages_topic_id``.Nr—  r×  )rÚ  rÚ   )rÒ  rO  Údirect_topic_ids   && r   rü  Ú$TelegramAdapter._direct_topic_kwargs;  s2   € ð ×@Ñ@ÀÓJˆØÒ"ÙØ# TÐ+EÄsÈ?ÓG[Ð\Ð\r   c                óh   <€ V ^8„  d   QhRS[ RS[S[S[ S[3,          ,          RS[S[ S[3,          /# )r   r±  rO  r   ©r   r   r  r   )r   r…  s   "€r   r   r†  C  sB   ø€ ÷ Bñ B±ð B¹xÉÉSÑRUÈXÍÕ?Wð BÑ\`ÑadÑfiÐaiÕ\jñ Br   c                óÞ   € V P                  WP                  V4      W P                  RV4      \        V RR4      R7      pVP	                  4        UUu/ uF  w  rEVf   K  WEbK  	  upp# u uppi )u£   Routing kwargs for ``sendMessageDraft`` / ``sendRichMessageDraft`` (integer
``message_thread_id`` for DM topics â€” Telegram rejects the raw string ``thread_id``).NrÅ  ©rù  rž  )r   rÓ  rö  r]   Úitems)r“  r±  rO  r¥   ÚkÚvs   &&&   r   Ú_thread_kwargs_for_draftÚ(TelegramAdapter._thread_kwargs_for_draftC  sv   € ð ×-Ñ-Ø×-Ñ-¨hÓ7¸×WyÑWyÐz~ð  AIó  XJÜ! $Ð(8¸$Ó?ð .ó Aˆð "(§¡¤ÔA¡™˜°1”�’¡ÒAÐAùÓAs   ÁA)ÁA)c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# ©r   rx  r   ©r   r   rÚ   )r   r…  s   "€r   r   r†  L  s#   ø€ ÷ ñ ±H¹SµMð ÁhÉsÅmñ r   c                ó`   € V'       d   \        V4      V P                  8X  d   R # \        V4      # rP   )r   Ú_GENERAL_TOPIC_THREAD_IDrÚ   ©rÒ  rx  s   &&r   rû  Ú+TelegramAdapter._message_thread_id_for_sendK  s#   € çœC 	›N¨c×.JÑ.JÔJÙÜ�9‹~Ðr   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# r  r  )r   r…  s   "€r   r   r†  R  s$   ø€ ÷ 5ñ 5±h¹sµmð 5ÉÑQTÍñ 5r   c                ó,   € V'       d   \        V4      # R # rP   )rÚ   r  s   &&r   Ú_message_thread_id_for_typingÚ-TelegramAdapter._message_thread_id_for_typingQ  s   € ÷ "+Œs�9‹~Ð4°Ð4r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   ©r*   rB   )r   r…  s   "€r   r   r†  X  s   ø€ ÷ 8ñ 8©)ð 8¹ñ 8r   c                ó:   € R \        V 4      P                  4       9   # )úthread not found)r   rø   ©r   s   &r   Ú_is_thread_not_found_errorÚ*TelegramAdapter._is_thread_not_found_errorW  s   € à!¤S¨£Z×%5Ñ%5Ó%7Ñ7Ð7r   rO  c          	      óV   <€ V ^8„  d   QhRS[ RS[ RS[S[S[S[ 3,          ,          RR/# )r   r±  rx  rO  r   N)r   r   r  r   )r   r…  s   "€r   r   r†  [  sC   ø€ ÷ Lñ L±Sð LÁSð LÑW_Ñ`dÑehÑjmÐemÕ`nÕWoð LÐ{ñ Lr   c          	     óü  € Ve   Vf   R# \        \        V RR4      RR4      pVe   \        VR4      '       g   R#  T;'       g    / P                  R4      ;'       g    \        V RR4      ;'       g    RpVP                  \	        V4      \	        V4      VR7      pT'       d$   \        P                  RT P                  Y4       R# R#   \
         d(    \        P                  R	T P                  YR
R7        R# i ; i)u°  Drop the stale ``telegram_dm_topic_bindings`` row for a topic Telegram confirmed deleted, else
``_recover_telegram_topic_thread_id`` keeps steering inbound to the dead thread. Best-effort.
Rows are namespaced by profile: the send's ``hermes_profile`` wins over the adapter's stamp.

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.
Under ``gateway.profile_routes`` the transport adapter may not be the profile that wrote the
binding, so the send's ``hermes_profile`` metadata wins over the adapter's own profile stamp;
single-profile bots fall back to ``"default"``. See #76423.
NÚ_session_storeÚ_dbÚdelete_telegram_topic_bindingÚhermes_profileÚ_hermes_profile_namerr  )r±  rx  Úprofile_nameuR   [%s] delete_telegram_topic_binding failed for chat=%s thread=%s â€” skipping pruneTr3   zY[%s] Pruned stale Telegram DM topic binding chat=%s thread=%s (Bot API: thread not found))
r]   Úhasattrr  r%  r   r*   r7   r8   r„  rç   )r“  r±  rx  rO  Údbr(  Úremoveds   &&&$   r   Ú_prune_stale_dm_topic_bindingÚ-TelegramAdapter._prune_stale_dm_topic_binding[  sû   € ð Š?˜iÒ/ÙÜ”W˜TÐ#3°TÓ:¸EÀ4ÓHˆØŠ:œW RÐ)H×IÒIÙð	Ø$ŸN˜N¨×/Ñ/Ð0@ÓA×}Ð}ÄWÈTÐSiÐkoÓEp×}Ð}Ðt}ˆLØ×6Ñ6¼sÀ7»|ÔWZÐ[dÓWeð  uAÐ6ó  BˆG÷ Ü�K‰KØkÐmq×mvÑmvÐxöLñ øô ô 	Ü�L‰LØdØ—	‘	˜7¸ð ô >ò ð		ús#   ¼C	 ÁC	 ÁC	 Á3)C	 Ã	.C;Ã:C;c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r  )r   r…  s   "€r   r   r†  {  s   ø€ ÷ ñ ¡Yð ±4ñ r   c                óÒ   € V P                   P                  P                  4       pVR 8X  g   VP                  R 4      '       d   R#  ^ RIHp \        W4      #   \         d     R# i ; i)Ú
badrequestT©Ú
BadRequestF)r  r(   rø   ÚendswithÚtelegram.errorr2  Ú
isinstancerD  )r   r„  r2  s   &  r   Ú_is_bad_request_errorÚ%TelegramAdapter._is_bad_request_errorz  sX   € à�‰×'Ñ'×-Ñ-Ó/ˆØ�<Ô 4§=¡=°×#>Ò#>Ùð	Ý1Ü˜eÓ0Ð0øÜô 	Úð	ús   ÁA ÁA&Á%A&c                óh   <€ V ^8„  d   QhRS[ RS[S[S[S[3,          ,          RS[S[,          RS[/# )r   r   rO  rù  r   )r*   r   r  r   r   rÚ   rB   )r   r…  s   "€r   r   r†  †  sF   ø€ ÷ Dñ DÙðDÙ)1±$±s¹C°xµ.Õ)AðDÙX`ÑadÕXeðDÙjnñDr   c                óZ  a€ V P                  V4      '       d   V P                  V4      '       g   R# \        V4      P                  4       oVe
   RS9   d   R# VP	                  R4      '       g   R# Rp\
        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # )uÚ  True when a DM-topic send should be retried with routing stripped: (1) stale anchor â€” reply
target deleted; (2) anchor-less synthetic send whose ``direct_messages_topic_id`` Bot API rejects.

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.
Fúmessage to be replied not foundTr×  c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irP   rQ   )rR   ÚmarkerÚ	err_lowers   & €r   rT   ÚNTelegramAdapter._should_retry_without_dm_topic_reply_anchor.<locals>.<genexpr>˜  s   øé € ÐC±]¨6˜YÖ&³]ùó   ƒ)Údirect_messages_topiczmessage thread not foundr  Útopic_closedÚtopic_deletedztopic not found)rå  r6  r   rø   r  r¯  )rÒ  r   rO  rù  Útopic_markersr=  s   &&&& @r   Ú+_should_retry_without_dm_topic_reply_anchorÚ;TelegramAdapter._should_retry_without_dm_topic_reply_anchor…  s’   ø€ ð ×%Ñ% h×/Ò/°s×7PÑ7PÐQV×7WÒ7WÙÜ˜“J×$Ñ$Ó&ˆ	ØÒ*Ð/PÐT]Ô/]ÙØ�|‰|Ð6×7Ò7ÙðIˆç‹sÔC±]ÓC�sŒsÐCŠsÐCˆsÔC±]ÓCÓCÐCr   c                ó    <€ V ^8„  d   QhRS[ RS[S[S[ 3,          RS[S[S[S[ 3,          ,          RS[S[,          RS[RS[S[ ,          RS[ /# )r   Úsend_fnÚsend_kwargsrO  rù  Úmedia_labelÚreset_mediar   )r   r  r   r   rÚ   )r   r…  s   "€r   r   r†  š  so   ø€ ÷ Dñ DÙðDÙ)-©c±3¨h­ðDÙCKÉDÑQTÑVYÐQYÍNÕC[ðDá%¡c�]ðDá9<ðDáKSÑTWÍ=ðDádgñDr   c              ƒ  óº  "  € V P                  VP                  R4      4      ;_uu_4       GRj  x€L
   \        V! R
/ VB \        RRR7      G Rj  x€L
 uuRRR4      GRj  x€L
  #  L8 L L	  \         dÃ   pT P                  YsT4      '       g   h \        P                  RT P                  T\        T4      4       Te   T! 4        \        T4      pRTR&   TP                  RR4       TP                  R	R4       \        T! R
/ TB \        RRR7      G Rj  x€L 
 u Rp?uuRRR4      GRj  x€L 
  # Rp?ii ; i  + GRj  x€L 
 '       g   i     R# ; i5i)z¶Retry stale private-topic media replies once without the topic anchor. Serialized per chat with
``send()`` so a file upload cannot land between two chunks of the text it accompanies.r±  Nztelegram-media-sendF©r?   r;   r=   zR[%s] Reply target deleted for Telegram %s, retrying without reply/topic anchor: %srù  r—  r×  rQ   )Ú_chat_send_lockr  rK   Ú_MEDIA_SEND_DEADLINEr*   rD  r7   r-  r„  r,   r  rY   )	r“  rG  rH  rO  rù  rI  rJ  Úsend_errÚretry_kwargss	   &&&&&&&  r   Ú&_send_with_dm_topic_reply_anchor_retryÚ6TelegramAdapter._send_with_dm_topic_reply_anchor_retryš  sG  é € ð
 ×'Ñ'¨¯©¸	Ó(B×C×CÕCðDÜ8ÙÑ*˜kÑ*Ô4HÐPeð  }BôC÷ C÷ D×CÔCñCñ Døô ô DØ×GÑGÈÐ\o×pÒpØÜ—‘ØhØ—I‘I˜{Ô,GÈÓ,QôSð Ò*Ù”MÜ# KÓ0�Ø6:�Ð2Ñ3Ø× Ñ Ð!4°dÔ;Ø× Ñ Ð!;¸TÔBÜ8ÙÑ+˜lÑ+Ô5IÐQfð  ~CôD÷ Dð Dô D÷! D×CÓCûðDú÷	 D×C×CÑCüs¤   ‚-E¯A(°E³D>µA.ÁA*ÁA.ÁEÁ"A,Á#EÁ*A.Á,EÁ.D;Á9BD6ÄD
ÄD6ÄD;ÄD>Ä"EÄ/D2Ä0EÄ6D;Ä;D>Ä>E	ÅEÅ
E	ÅE	Å	Ec                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   )Úlistr   )r   r…  s   "€r   r   r†  ²  s   ø€ ÷ cñ c™t¡C�yñ cr   c                ó8  € \        V P                  RR4      '       d'   V P                  P                  P                  R. 4      M. p\	        V\
        4      '       d   VP                  R4      p\        V'       d   RP                  R V 4       4      4      # R4      # )zNReturn validated fallback IPs from config (populated by _apply_env_overrides).r·  NÚfallback_ipsro  c              3   ó8   "  € T F  p\        V4      x € K  	  R # 5irP   rž   )rR   r  s   & r   rT   Ú0TelegramAdapter._fallback_ips.<locals>.<genexpr>·  s   é € Ð-I¹j¸¬c°!¯f¨f»jùs   ‚)	r]   rš  r·  r  r5  r   rr  rÅ   rh  ©r“  Ú
configureds   & r   Ú_fallback_ipsÚTelegramAdapter._fallback_ips²  sw   € äBIÈ$Ï+É+ÐW^Ð`d×BeÒBe�T—[‘[×&Ñ&×*Ñ*¨>¸2Ô>Ðkmˆ
Ü�j¤#×&Ò&Ø#×)Ñ)¨#Ó.ˆJÜ$ÏZ S§X¡XÑ-I¹jÓ-IÓ%IÓbÐbÐ]aÓbÐbr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r  )r   r…  s   "€r   r   r†  º  s   ø€ ÷ :ñ :©Ið :¹$ñ :r   c                ó¶   € \        V 4      P                  4       pV P                  P                  P                  4       R 8H  ;'       g    RV9   ;'       g    RV9   # )Úconflictz&terminated by other getupdates requestzanother bot instance is running)r   rø   r  r(   )r   r+   s   & r   Ú_looks_like_polling_conflictÚ,TelegramAdapter._looks_like_polling_conflict¹  sX   € ä�5‹z×ÑÓ!ˆà�O‰O×$Ñ$×*Ñ*Ó,°
Ñ:÷ 9ð 9Ø7¸4Ñ?÷9ð 9à0°DÑ8ð	:r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r  )r   r…  s   "€r   r   r†  Â  s   ø€ ÷ 	ñ 	¡ið 	±Dñ 	r   c                ó¨   € V P                   P                  P                  4       R9   d   R#  ^ RIHpHp \        WV34      #   \         d     R# i ; i)u®   True for terminal credential failures (InvalidToken, Forbidden) â†’ retryable=False. Type-based
only, never message text; BadRequest/RetryAfter are transient at connect time.T)Ú	ForbiddenÚInvalidTokenF>   Ú	forbiddenÚinvalidtoken)r  r(   rø   r4  rd  re  r5  rD  )r   rd  re  s   &  r   Ú_looks_like_auth_errorÚ&TelegramAdapter._looks_like_auth_errorÁ  sM   € ð �?‰?×#Ñ#×)Ñ)Ó+Ð/LÔLÙð	ß>Ü˜e°IÐ%>Ó?Ð?øÜô 	Úð	ús   ­A ÁAÁAc                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r  )r   r…  s   "€r   r   r†  Î  s   ø€ ÷ *ñ *©ð *±tñ *r   c                ó*  € V P                   P                  P                  4       pVR9   d   R# VR9   d   R#  ^ RIHpHpHpHpHpH	p \        WWCV34      '       d   R# \        WV34      '       d   R#  \        V \        4      #   \         d     Li ; i)zDReturn True for transient transport failures that warrant reconnect.FT)r2  rd  re  ÚNetworkErrorÚ
RetryAfterÚTimedOut>   rf  r0  Ú
retryafterrg  >   ÚtimedoutÚnetworkerrorÚconnectionerror)r  r(   rø   r4  r2  rd  re  rl  rm  rn  r5  rD  r'  )r   r„  r2  rd  re  rl  rm  rn  s   &       r   Ú_looks_like_network_errorÚ)TelegramAdapter._looks_like_network_errorÍ  s�   € ð �‰×'Ñ'×-Ñ-Ó/ˆØÐLÔLÙØÐBÔBÙð	ßn×nÜ˜%¨lÀzÐ!R×SÒSÙÜ˜%°Ð!9×:Ò:Ùð ;ô ˜%¤Ó)Ð)øô ô 	Ùð	ús   ¸$B ÁB ÂBÂBc                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )r   r   Úname_markerÚtext_markersr   ©r*   r   rB   )r   r…  s   "€r   r   r†  à  s+   ø€ ÷ ñ ©	ð Áð ÑTWð Ñ\`ñ r   c                ó4  a€ \        V 4       F‡  p\        V4      P                  4       oWP                  P                  P                  4       9   gC   \
        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   K†   R# 	  R# )zYTrue when any exception in ``error``'s cause/context graph matches by class name or text.c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irP   rQ   )rR   r7  r+   s   & €r   rT   Ú;TelegramAdapter._exception_graph_matches.<locals>.<genexpr>ä  s   øé € ÐCdÑWcÐRSÈÆIÓWcùr?  TF)rb   r   rø   r  r(   r¯  )r   rv  rw  r`   r+   s   &&* @r   Ú_exception_graph_matchesÚ(TelegramAdapter._exception_graph_matchesß  sg   ø€ ô )¨Ö/ˆCÜ�s“8—>‘>Ó#ˆDØŸm™m×4Ñ4×:Ñ:Ó<Ô<ÇÃÔCdÑWcÓCdÇÇÂÔCdÑWcÓCd×@dÔ@dÚñ 0ñ r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r  )r   r…  s   "€r   r   r†  é  s   ø€ ÷ mñ m±	ð m¹dñ mr   c                ó*   € V P                  VRRR4      # )z�True when a TimedOut wraps a ConnectTimeout: TCP never connected, so re-sending is safe
(a plain TimedOut may have reached Telegram and must not be re-sent).Úconnecttimeoutzconnect timeoutzconnect timed out)r|  )rÒ  r   s   &&r   Ú_looks_like_connect_timeoutÚ+TelegramAdapter._looks_like_connect_timeoutè  s   € ð ×+Ñ+¨EÐ3CÐEVÐXkÓlÐlr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r   r  )r   r…  s   "€r   r   r†  ï  s   ø€ ÷ ñ ©	ð ±dñ r   c                óæ   € \        V 4       Fa  pVP                  P                  P                  4       p\	        V4      P                  4       pRV9   g   RV9   g   RV9   g   KW  RV9   g   K`   R# 	  R# )z¡True when a TimedOut wraps ``httpx.PoolTimeout``: PTB says "Request was *not* sent", so
re-sending cannot duplicate. Matches class AND text to survive rewording.Úpooltimeoutzpool timeoutzconnection poolÚoccupiedTF)rb   r  r(   rø   r   )r   r`   r„  r+   s   &   r   Ú_looks_like_pool_timeoutÚ(TelegramAdapter._looks_like_pool_timeoutî  sd   € ô )¨Ö/ˆCØ—=‘=×)Ñ)×/Ñ/Ó1ˆDÜ�s“8—>‘>Ó#ˆDØ Ô$¨¸$Ô(>ÐCTÐX\ÖC\ÐakÐosÖasÚñ	 0ñ
 r   Fc                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r¤   rr  r   r'  )r   r…  s   "€r   r   r†  ù  s"   ø€ ÷ ñ ¡cð ±Dð ÁTñ r   c                ó<  € \        V P                  R R4      '       d&   V P                  P                  P                  V4      MRpVf   V# \	        V\
        4      '       d3   VP                  4       P                  4       pVR9   d   R# VR9   d   R# V# \        V4      # )r·  NTF>   r  Úonr�  r‚  >   Ú0Únorô  Úfalse)	r]   rš  r·  r  r5  r   r  rø   rB   )r“  r¤   rr  rH   Úlowereds   &&&  r   rÆ  Ú"TelegramAdapter._coerce_bool_extraù  sƒ   € Ü.5°d·k±kÀ7ÈD×.QÒ.Q�—‘×!Ñ!×%Ñ% cÔ*ÐW[ˆØŠ=ØˆNÜ�eœS×!Ò!Ø—k‘k“m×)Ñ)Ó+ˆGØÐ4Ô4ÙØÐ5Ô5ÙØˆNÜ�E‹{Ðr   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r�   ©r  r   r   )r   r…  s   "€r   r   r†    s   ø€ ÷ 2ñ 2¡d©3±¨8¥nñ 2r   c                ó`   € \        V R R4      '       g   / # \        e   R\        RR7      /# RR/# )rÇ  FÚlink_preview_optionsT)Úis_disabledÚdisable_web_page_preview)r]   rt   r’  s   &r   Ú_link_preview_kwargsÚ$TelegramAdapter._link_preview_kwargs  s9   € Ü�tÐ5°u×=Ò=ØˆIÜÒ)Ø*Ô,>È4Ô,PÐQÐQØ*¨DÐ1Ð1r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   Úcontentr   r'  )r   r…  s   "€r   r   r†    s   ø€ ÷ ;ñ ;±ð ;¹ñ ;r   c                ó2   € \        V4      V P                  8*  # )zXPre-check the 32,768-char cap only; other rich limits surface as BadRequest (permanent).)r+  ÚRICH_MESSAGE_MAX_CHARS©r“  r›  s   &&r   Ú_content_fits_rich_limitsÚ)TelegramAdapter._content_fits_rich_limits  s   € ä�7‹|˜t×:Ñ:Ñ:Ð:r   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†    s   ø€ ÷ Wñ W¡Dñ Wr   c                óX   € \         P                  ! \        V P                  RR4      4      # )u”   True when ``do_api_request`` is an *async* callable (real Bot or AsyncMock); plain MagicMock
and SimpleNamespace bots resolve False â†’ legacy path.Údo_api_requestN)ÚinspectÚiscoroutinefunctionr]   rÁ  r’  s   &r   Ú_bot_supports_richÚ"TelegramAdapter._bot_supports_rich  s$   € ô ×*Ò*¬7°4·9±9Ð>NÐPTÓ+UÓ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                ó&   <€ V ^8„  d   QhRS[ RS[/# rš  r'  )r   r…  s   "€r   r   r†  "  s   ø€ ÷ tñ tÁcð tÉdñ tr   c                óð   a € V'       g   R# \         ;QJ d8    V 3R lS P                  P                  V4       4       F  '       g   K   R# 	  R# ! V 3R lS P                  P                  V4       4       4      # )z’Math inside <details> crashes Telegram Desktop 6.9.1 (tdesktop#30808); the Bot API accepts
the payload, so rich delivery must be skipped up front.Fc              3   óZ   <"  € T F   pSP                   P                  V4      x € K"  	  R # 5irP   )Ú_RICH_MATH_IN_DETAILS_REÚsearch)rR   Úblockr“  s   & €r   rT   ÚQTelegramAdapter._has_telegram_desktop_details_math_crash_shape.<locals>.<genexpr>'  s'   øé € ÐsÑLrÀ5�4×0Ñ0×7Ñ7¸×>Ð>ÓLrùs   ƒ(+T)r¯  Ú_RICH_DETAILS_REÚfindallrž  s   f&r   Ú._has_telegram_desktop_details_math_crash_shapeÚ>TelegramAdapter._has_telegram_desktop_details_math_crash_shape"  sX   ø€ ÷ Ùß‹sÔsÈD×LaÑLa×LiÑLiÐjqÔLrÓs�sŒsÐsŠsÐsˆsÔsÈD×LaÑLa×LiÑLiÐjqÔLrÓsÓsÐsr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rš  r'  )r   r…  s   "€r   r   r†  )  s   ø€ ÷ Cñ CÁ3ð CÉ4ñ Cr   c                ó^   € \        T;'       d    V P                  P                  V4      4      # )aZ  True for CJK content: Telegram Mac/Desktop rich rendering leaves overlapping glyphs.

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.
)rB   Ú_RICH_CJK_REr¬  rž  s   &&r   Ú+_has_telegram_desktop_cjk_rich_garble_shapeÚ;TelegramAdapter._has_telegram_desktop_cjk_rich_garble_shape)  s(   € ô �G×AÐA × 1Ñ 1× 8Ñ 8¸Ó AÓBÐBr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rš  r'  )r   r…  s   "€r   r   r†  2  s   ø€ ÷ ñ ©Sð ±Tñ r   c                óL  € V'       g   R# \         ;QJ d*    R VP                  4        4       F  '       g   K   RM	  RM! R VP                  4        4       4      '       d   R# \        P                  ! RV4      '       d   R# \        P                  ! RV4      '       d   R# RV9   # )aÄ  True for constructs MarkdownV2 degrades: pipe tables, task lists, <details>, block math.
Ordinary replies stay on MarkdownV2 so clients render 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   óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5irP   )Ú_TABLE_SEPARATOR_REÚmatch©rR   rª   s   & r   rT   Ú8TelegramAdapter._needs_rich_rendering.<locals>.<genexpr><  s!   é € ÐPÑ;O°4Ô"×(Ò(¨×.Ð.Ó;Oùs   ‚#%Tz(?m)^\s*[-*]\s+\[[ xX]\]\s+z3(?m)^<details\b|^</details>|^<summary\b|^</summary>z$$)r¯  Ú
splitlinesrU  r¬  rž  s   &&r   Ú_needs_rich_renderingÚ%TelegramAdapter._needs_rich_rendering2  st   € ÷ Ùß‹3ÑP¸7×;MÑ;MÔ;OÓP�3�3Š3ÑP¸7×;MÑ;MÔ;OÓP×PÒPÙÜ�9Š9Ð3°W×=Ò=ÙÜ�9Š9ÐKÈW×UÒUÙØ�w‰Ðr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  D  s   ø€ ÷ Cñ C©ñ Cr   c                ó.   € \        \        V RR4      4      # )z<Whether rich delivery is allowed (``rich_messages`` opt-in).rÈ  Tr  r’  s   &r   Ú_rich_delivery_enabledÚ&TelegramAdapter._rich_delivery_enabledD  s   € ä”G˜DÐ":¸DÓAÓBÐBr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rš  r'  )r   r…  s   "€r   r   r†  H  s   ø€ ÷ +ñ +©ð +±ñ +r   c                óL  € \        T;'       d“    VP                  4       ;'       d{    V P                  V4      '       * ;'       d]    \        V RR4      ;'       g    V P	                  V4      '       * ;'       d*    V P                  V4      ;'       d    V P                  4       4      # )z€Shape checks shared by rich sends and rich drafts (non-blank, no Desktop crash/garble
shapes, under the cap, async-capable bot).rÉ  F)rB   r  r±  r]   r¶  rŸ  r¦  rž  s   &&r   Ú_rich_content_okÚ TelegramAdapter._rich_content_okH  s©   € ô Ø÷ *ð *˜Ÿ™›÷ *ð *Ø×GÑGÈÓPÔP÷*ð *ô ˜Ð8¸%Ó@÷ Qð QØ×GÑGÈÓPÔP÷	*ð *ð ×.Ñ.¨wÓ7÷*ð *ð ×'Ñ'Ó)ó+ð 	+r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rš  r'  )r   r…  s   "€r   r   r†  U  s   ø€ ÷ 0ñ 0¡cð 0©dñ 0r   c                ó  € \        V P                  4       ;'       dg    \        V RR4      '       * ;'       dM    T;'       dC    VP                  4       ;'       d+    V P	                  V4      ;'       d    V P                  V4      4      # )z\Rich eligibility ignoring ``expect_edits`` (a streamed preview's FINAL edit still upgrades).rË  F)rB   rÄ  r]   r  rÀ  rÈ  rž  s   &&r   Ú_rich_eligibleÚTelegramAdapter._rich_eligibleU  s‰   € äØ×'Ñ'Ó)÷ /ð /Ü˜DÐ"7¸Ó?Ô?÷/ð /à÷/ð /à#ŸM™M›O÷/ð /ð ×*Ñ*¨7Ó3÷/ð /ð ×%Ñ% gÓ.ó0ð 	0r   c                óR   <€ V ^8„  d   QhRS[ RS[S[S[ S[3,          ,          RS[/# ©r   r›  rO  r   rè  )r   r…  s   "€r   r   r†  ^  s5   ø€ ÷ _ñ _©Cð _¹8ÁDÉÉcÈÅNÕ;Sð _Ñ_cñ _r   c                ó†   € \        T;'       g    / P                  R 4      '       * ;'       d    V P                  V4      4      # )Úexpect_edits)rB   r  rÌ  ©r“  r›  rO  s   &&&r   Ú_should_attempt_richÚ$TelegramAdapter._should_attempt_rich^  s5   € Ü˜Ÿ˜ R×,Ñ,¨^Ó<Ô<×]Ð]À×ATÑATÐU\ÓA]Ó^Ð^r   c                óR   <€ V ^8„  d   QhRS[ RS[S[S[ S[3,          ,          RS[/# rÏ  rè  )r   r…  s   "€r   r   r†  a  s3   ø€ ÷ ,ñ ,±Sð ,ÁHÉTÑRUÑWZÐRZÍ^ÕD\ð ,Ñhlñ ,r   c                óœ   € T;'       g    / pVP                  R4      '       g   V P                  V4      '       g   R# V P                  V4      # )uæ  Replace a streamed preview with a fresh rich final â€” DM topics only. Root DMs stay off (a live
draft has no preview id); DM *topics* degrade to edit-in-place whose MarkdownV2 preview Telegram
refuses to rich-edit, so a fresh sendRichMessage + delete is the only way to keep native tables.

Root DMs keep this off (#46206 / #47048): successful draft streaming has no preview ``message_id``,
so the hook is not consulted, and in-place ``editMessageText.rich_message`` would duplicate a live
draft turn. Private DM *topics* often reject ``sendMessageDraft``; the consumer then degrades to
edit-in-place. Telegram rejects a rich edit of that plain MarkdownV2 preview, and the fallback
formatter permanently turns pipe tables into bullet lists.
rã  F)r  rÚ  rÌ  rÒ  s   &&&r   Úprefers_fresh_final_streamingÚ-TelegramAdapter.prefers_fresh_final_streaminga  sD   € ð —>�>˜rˆØ—‘Ð?×@Ò@ÀD×DkÑDkÐlt×DuÒDuÙØ×"Ñ" 7Ó+Ð+r   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  q  s   ø€ ÷ Mñ M©4ñ Mr   c                ó’   € \        \        V R R4      ;'       d+    \        V RR4      '       * ;'       d    V P                  4       4      # )rÈ  TrË  F)rB   r]   r¦  r’  s   &r   Ú_rich_transport_availableÚ)TelegramAdapter._rich_transport_availableq  s^   € ÜÜ�DÐ2°DÓ9÷  Lð  LÄ'È$ÐPeÐglÓBmÔ>m÷  Lð  LÐrv÷  sJñ  sJó  sLóMð 	Mr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   )r   rÚ   )r   r…  s   "€r   r   r†  u  s   ø€ ÷ Yñ Y©(±3­-ñ Yr   c                óJ   € V P                  4       '       d   V P                  # R# )u©   Let the stream consumer accumulate up to the rich cap so a reply that fits one sendRichMessage
isn't fragmented at 4,096. None (â†’ legacy limit) if rich is unavailable.N)rÛ  r�  r’  s   &r   Ústreaming_overflow_limitÚ(TelegramAdapter.streaming_overflow_limitu  s$   € ð /3×.LÑ.L×.NÒ.Nˆt×*Ñ*ÐXÐTXÐXr   Úskip_entity_detectionc                óB   <€ V ^8„  d   QhRS[ RS[RS[S[ S[3,          /# )r   r›  rá  r   )r   rB   r  r   )r   r…  s   "€r   r   r†  z  s/   ø€ ÷ ñ ©Sð ÉDð Ñ]aÑbeÑgjÐbjÕ]kñ r   c               ó:   € R\        V4      /pV'       d   RVR&   V# )u}   ``InputRichMessage`` from RAW markdown â€” never ``format_message(content)``, whose MarkdownV2
escaping destroys table pipes.ÚmarkdownTrá  )rj  )r“  r›  rá  Úpayloads   &&$ r   Ú_rich_message_payloadÚ%TelegramAdapter._rich_message_payloadz  s'   € ð $.Ô/IÈ'Ó/RÐ"Sˆß Ø/3ˆGÐ+Ñ,Øˆr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   Úexcr   r  )r   r…  s   "€r   r   r†  ‚  s   ø€ ÷ 
%ñ 
%©Yð 
%¹4ñ 
%r   c                ó:  € VP                   P                  P                  4       R
9   d   R# \        V\        \
        \        34      '       g   \        VRR4      R8X  d   R# \        V4      P                  4       pRV9   g   RV9   d   RV9   g   RV9   d   R# R	V9   # )u–   True â‡’ the rich endpoint itself is unavailable (old PTB/server); latches rich off.
Per-message BadRequests (parser/limit) are NOT capability errors.TÚ
error_codeNi”  ÚmethodÚendpointz	not foundzdoes not existzno such method>   rg  Úendpointnotfound)	r  r(   rø   r5  rE  rÝ   ÚNotImplementedErrorr]   r   ©r“  rê  Úss   && r   Ú_is_rich_capability_errorÚ)TelegramAdapter._is_rich_capability_error‚  s‹   € ð �=‰=×!Ñ!×'Ñ'Ó)Ð-QÔQÙÜ�cœN¬IÔ7JÐK×LÒLÔPWÐX[Ð]iÐkoÓPpÐtwÔPwÙÜ�‹H�N‰NÓˆØ˜ŒM˜Z¨1œ_°;À!Ô3CÐGWÐ[\ÔG\ÙØ 1Ñ$Ð$r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ré  r  )r   r…  s   "€r   r   r†  Ž  s   ø€ ÷ <ñ <©9ð <¹ñ <r   c                ó¸   € V P                  V4      '       g   V P                  V4      '       d   R# \        V4      P                  4       pRV9   ;'       g    RV9   # )u¿   True â‡’ permanent/capability error â‡’ safe to fall back to legacy. Conservative: anything not
clearly permanent is transient â€” the rich request may have reached Telegram (duplicate risk).TÚunsupportedznot implemented)r6  ró  r   rø   rñ  s   && r   Ú_is_rich_fallback_errorÚ'TelegramAdapter._is_rich_fallback_errorŽ  sQ   € ð ×%Ñ% c×*Ò*¨d×.LÑ.LÈS×.QÒ.QÙÜ�‹H�N‰NÓˆØ Ñ!×;Ð;Ð%6¸!Ñ%;Ð;r   c                ó„   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[ ,          RS[RS[/# )r   r±  rò  rO  rx  Úindexr   )r   r   r  r   rÚ   Útuple)r   r…  s   "€r   r   r†  –  sa   ø€ ÷ Iñ IÙðIÙ&.©s¥mðIÙ?GÉÉSÑRUÈXÍÕ?WðIÙdlÑmpÕdqðIÙz}ðIñ CHñIr   c                ó¨  € V P                  V4      pV P                  WV4      pT;'       d)    V P                  R8H  ;'       d    V P                  V4      p\	        R \        V4      V'       d   TMR3 4       R4      p	V'       d   V	RJ;'       d    V P                  R8g  p
MV P                  W•4      p
V
'       d   V	'       d   \        V	4      MRpWxV3# )u  Reply-anchor routing for chunk ``index``: ``(private_dm_topic_send, anchor_off, reply_to_id)``.
``anchor_off``: reply_to_mode="off" on the DM-topic fallback path opts into "message_thread_id
alone is enough" â€” don't fail loud because the anchor was suppressed by config.rô  c              3   óB   "  € T F  qf   K  \        V4      x € K  	  R # 5irP   rž   ©rR   Úis   & r   rT   Ú7TelegramAdapter._chunk_reply_routing.<locals>.<genexpr>ž  s#   é € ð   ^ñ  1L¨1¤¤ A§ ó  1Lùs   ‚ŒN)rß  rë  rÅ  rå  Únextr¿   Ú_should_thread_replyrÚ   )r“  r±  rò  rO  rx  rû  Úmetadata_reply_toÚprivate_dm_topic_sendÚdm_topic_reply_to_offÚreply_to_sourceÚshould_threadÚreply_to_ids   &&&&&&      r   Ú_chunk_reply_routingÚ$TelegramAdapter._chunk_reply_routing–  sâ   € ð
 !×>Ñ>¸xÓHÐØ $× >Ñ >¸wÐS[Ó \ÐØ 5× |Ð |¸$×:MÑ:MÐQVÑ:V× |Ð |Ð[_×[rÑ[rÐs{Ó[|ÐÜñ   ^Ô1JÈ8Ó1T÷  lAÑVgð  GKñ  1Ló   ^ð  `dó  eˆß Ø+°4Ð7×XÐX¸D×<OÑ<OÐSXÑ<X‰Mà ×5Ñ5°oÓMˆMß.;Ç”c˜/Ô*ÐUYˆØ$¸[ÐHÐHr   c                óŽ   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[ ,          RS[S[,          /# )r   r±  rò  rO  rx  r   )r   r   r  r   rü  )r   r…  s   "€r   r   r†  ¦  s[   ø€ ÷ *ñ *Ùð*Ù&.©s¥mð*Ù?GÉÉSÑRUÈXÍÕ?Wð*ÙdlÑmpÕdqð*Ùv~ñ  @Eõ  wFñ*r   c                óÊ   € V P                  WW4^ 4      w  rVpV P                  WW7V P                  R7      pV'       d&   Vf"   V'       g   VP                  R4      '       g   R# Wx3# )uµ   Routing for a single (rich) send â€” mirrors send()'s index-0 block. Returns ``(reply_to_id,
thread_kwargs)`` or ``None`` = skip rich, legacy owns the DM-topic fail-loud SendResult.r	  Nr×  )r
  r   rÅ  r  )	r“  r±  rò  rO  rx  r  r  r	  Úthread_kwargss	   &&&&&    r   Ú_compute_single_send_routingÚ,TelegramAdapter._compute_single_send_routing¦  sz   € ð EI×D]ÑD]Ð^eÐqyð  GHó  EIÑAÐ°kØ×4Ñ4Ø ÐY]×YlÑYlð 5ó nˆ÷ " kÒ&9×BWØ!×%Ñ%Ð&@×AÒAÙØÐ)Ð)r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ré  r  )r   r…  s   "€r   r   r†  µ  s   ø€ ÷ cñ c™9ð c©ñ cr   c                óÆ   €  ^ RI Hp \	        T;'       d    \        W4      ;'       g    R\        V 4      P                  4       9   4      #   \        \        3 d    Rp LWi ; i)z<PTB ``TimedOut`` (when importable) or a "timed out" message.©rn  Nú	timed out)r4  rn  rD  rE  rB   r5  r   rø   )rê  Ú	_TimedOuts   & r   Ú_is_timed_outÚTelegramAdapter._is_timed_out´  s\   € ð	Ý<ô �Y×=Ð=¤:¨cÓ#=×aÐaÀ+ÔQTÐUXÓQY×Q_ÑQ_ÓQaÑBaÓbÐbøô œ^Ð,ô 	ØŠIð	ús   ‚A
 Á
A ÁA rÕ   c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )r   rê  ÚwhatrÕ   r   )r*   r   r   r�   )r   r…  s   "€r   r   r†  ½  s1   ø€ ÷ wñ w©)ð w¹3ð wÑPSð wÑ_iñ wr   c               óÒ   € \        V4      p\        P                  RV P                  W$4       \	        RTV P                  V4      ;'       g    V P                  V4      '       * VR7      # )z¤SendResult for a transient/unknown rich-API failure (request may have reached Telegram, so the
caller must NOT legacy-resend); retry semantics mirror legacy send().z0[%s] %s transient failure (no legacy resend): %sF)rÔ   r   r&  rÕ   )r,   r7   r-  r„  r�   r�  r  )r“  rê  r  rÕ   Ú
safe_errors   &&&$ r   Ú_rich_transient_resultÚ&TelegramAdapter._rich_transient_result½  s`   € ô 1°Ó5ˆ
Ü�‰ÐIÈ4Ï9É9ÐVZÔgÜØ Ø×7Ñ7¸Ó<×[Ð[ÀD×DVÑDVÐWZÓD[Ô@[Ðjuôwð 	wr   c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[RR/# )r   r±  r¡  r›  r   N©r   r   )r   r…  s   "€r   r   r†  Ç  s*   ø€ ÷ ñ ©ð ¹#ð Éð ÐPTñ r   c              ƒ  óž   "  €  ^ RI Hp VP                  \        V 4      \        V4      V4      G Rj  x€L
  R#  L  \         d     R# i ; i5i)zšIndex rich content we sent: Telegram won't echo it back in reply_to_message.

Awaited so the store's read-modify-write + ``os.replace`` runs off the loop.©Úrich_sent_storeN)Úgatewayr"  Úrecord_asyncr   r*   )r±  r¡  r›  r"  s   &&& r   Ú_record_rich_sentÚ!TelegramAdapter._record_rich_sentÆ  s>   é € ð
	Ý/Ø!×.Ñ.¬s°7«|¼SÀ»_ÈgÓV×VÔVøÜô 	Úð	üs1   ‚A„.; ²9³; ·A¹; »A
ÁAÁ	A
Á
Ac                ó~   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[,          /# ©r   r±  r›  rò  rO  r   ©r   r   r  r   r�   )r   r…  s   "€r   r   r†  Ñ  sX   ø€ ÷ (hñ (hÙð(hÙ%(ð(hÙ4<¹SµMð(hÙMUÑVZÑ[^Ñ`cÐ[cÕVdÕMeð(hÙjrÑs}Õj~ñ(hr   c              ƒ  óŒ  "  € V P                  V4      pV P                  WWE4      pVf   R# Vw  rxV P                  W4      p	T	P                  VP	                  4        U
Uu/ uF  w  r«Vf   K  W«bK  	  upp
4       V	P                  V P                  V4      4       Ve   RV/V	R&    \        V P                  P                  RV	R7      \        RRR7      G Rj  x€L
 p\+        T\,        4      '       dA   TP/                  R4      pTf+   TP/                  R4      ;'       g    / P/                  R4      pM\        TRR4      pTe   T P1                  TTT4      G Rj  x€L
  \3        RTe   \        T4      R7      # RR7      # u upp
i  L­  \         d®   pT P                  TRR	4      '       d    Rp?R# \        TR
R4      pTf`   \        P                  ! R\        T4      P!                  4       \        P"                  4      pT'       d   \%        TP'                  ^4      4      pT P)                  TRTR7      u Rp?# Rp?ii ; i Lè5i)z­Attempt a single ``sendRichMessage``. Returns a SendResult (success, or a transient failure the
caller must NOT legacy-resend), or ``None`` = fall back to legacy MarkdownV2.Nr¡  Úreply_parametersÚsendRichMessage©Ú
api_kwargsútelegram-sendFrL  Ú
MarkdownV2rÕ   zretry\s+(?:in\s+)?(\d+))rÕ   rJ   T©rÔ   r¡  )rÓ  r  Ú_rich_payload_baser£  r
  rU  rK   rÁ  r£  Ú_TEXT_SEND_DEADLINEr*   Ú_rich_rejectedr]   rU  r¬  r   rø   Ú
IGNORECASErA   rf  r  r5  r  r  r%  r�   )r“  r±  r›  rò  rO  rx  Úroutingr	  r  rå  r  r  Úmsgrê  Ú_retry_afterÚ_mr¡  s   &&&&&            r   Ú_try_send_richÚTelegramAdapter._try_send_richÑ  s  é € ð ×,Ñ,¨XÓ6ˆ	Ø×3Ñ3°GÀxÓ[ˆØŠ?ÙØ%,Ñ"ˆØ×)Ñ)¨'Ó;ˆà�‰¨×)<Ñ)<Ô)>ÔPÑ)>¡ À!œ˜šÑ)>ÒPÔQØ�‰�t×0Ñ0°Ó:Ô;ØÒ"à+7¸Ð*EˆGÐ&Ñ'ð	aô 4Ø—	‘	×(Ñ(Ð):ÀwÐ(ÓOÜ+°?ÐY^ô`÷ `ˆCô �cœ4× Ò ØŸ™ Ó.ˆJØÒ!Ø!Ÿg™g hÓ/×5Ð5°2×:Ñ:¸<ÓH�
øä   l°DÓ9ˆJØÒ!Ø×(Ñ(¨°*¸gÓF×FÐFÜ $ÀjÒF\´3°z³?ÔgÐgÐbfÔgÐgùó; Qñ`øô ô 		aØ×"Ñ" 3Ð(9¸<×HÒHÝä" 3¨°tÓ<ˆLØÒ#Ü—Y’YÐ9¼3¸s»8¿>¹>Ó;KÌRÏ]É]Ó[�ßÜ#(¨¯©°!«Ó#5�LØ×.Ñ.¨sÐ4EÐS_Ð.Ó`Õ`ûð		aúñ" Gùsz   ‚AIÁE?
Á,E?
Á23IÂ&1F ÃFÃF ÃAIÄ:IÅIÅ+IÆF ÆH?ÆH:Æ+IÆ1BH:È4H?È5IÈ:H?È?Ic                óB   <€ V ^8„  d   QhRS[ RS[ RS[S[ S[3,          /# )r   r±  r›  r   ©r   r  r   )r   r…  s   "€r   r   r†  û  s*   ø€ ÷ ñ ©#ð ¹ð ÁÁSÉ#ÀXÅñ r   c                óv   € R \        V4      RV P                  V4      /p\        V RR4      '       d   RR/VR&   V# )r±  Úrich_messagerÇ  Fr•  Tr”  )r½   ræ  r]   )r“  r±  r›  rå  s   &&& r   r2  Ú"TelegramAdapter._rich_payload_baseû  sT   € Ø#,Ô.HÈÓ.QÐSaÐcg×c}Ñc}ð  Fó  dGð  #HˆÜ�4Ð1°5×9Ò9Ø/<¸dÐ.CˆGÐ*Ñ+Øˆr   c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[/# )r   rê  r  rý  r   rx  )r   r…  s   "€r   r   r†    s)   ø€ ÷ ñ ¡)ð ±3ð Á#ð É$ñ r   c                óÌ   € V P                  V4      '       g   R# V P                  V4      '       d   RV n        \        P	                  RV P
                  V\        V4      V4       R# )z™True for a permanent/capability rich-API failure (caller falls back to legacy); capability
errors latch rich off so no doomed roundtrip repeats per send.FTu,   [%s] %s rejected (%s) â€” falling back to %s)rø  ró  rË  r7   r8   r„  r,   )r“  rê  r  rý  s   &&&&r   r4  ÚTelegramAdapter._rich_rejected  s]   € ð ×+Ñ+¨C×0Ò0ÙØ×)Ñ)¨#×.Ò.Ø'+ˆDÔ$Ü�‰ÐCÀTÇYÁYÐPTÔVqÐruÓVvð  yAô  	BÙr   c                ón   <€ V ^8„  d   QhRS[ RS[ RS[ RS[S[S[ S[3,          ,          RS[S[,          /# )r   r±  r¡  r›  rO  r   r)  )r   r…  s   "€r   r   r†    sK   ø€ ÷ ?ñ ?Ùð?Ù(+ð?Ù69ð?ÙEMÉdÑSVÑX[ÐS[ÍnÕE]ð?ÙiqÑr|Õi}ñ?r   c              ƒ  ój  "  € / V P                  W4      CR\        V4      /Cp \        V P                  P	                  RVR7      \
        RRR7      G Rj  x€L
  T P                  YT4      G Rj  x€L
  \        R	TR
7      #  L+  \         d¡   pR\        T4      P                  4       9   dH   T P                  T4      '       d   T P                  T4      '       d   R	T n        \        R	TR
7      u Rp?# T P                  TRR4      '       d    Rp?R# T P                  TR4      u Rp?# Rp?ii ; i LÁ5i)z¦Edit a message in place as rich (``editMessageText`` + ``rich_message``) so a streamed preview
finalizes without send+delete. Same contract as :meth:`_try_send_rich`.r¡  ÚeditMessageTextr-  r/  FrL  Núnot modifiedTr1  zrich editMessageTextzMarkdownV2 edit)r2  rÚ   rK   rÁ  r£  r3  r*   r   rø   rø  ró  rË  r�   r4  r  r%  )r“  r±  r¡  r›  rO  rå  rê  s   &&&&&  r   Ú_try_edit_richÚTelegramAdapter._try_edit_rich  s!  é € ð
 _�T×,Ñ,¨WÓ>Ð^ÀÌcÐR\ËoÑ^ˆð	LÜ-Ø—	‘	×(Ñ(Ð):ÀwÐ(ÓOÜ+°?ÐY^ô`÷ `ð `ð ×$Ñ$ W¸'ÓB×BÐBÜ $°:Ô>Ð>ñ`øô ô 	Là¤ S£§¡Ó!1Ô1Ø×/Ñ/°×4Ò4¸×9WÑ9WÐX[×9\Ò9\Ø/3�DÔ,Ü!¨$¸:ÔFÕFØ×"Ñ" 3Ð(>Ð@Q×RÒRÝØ×.Ñ.¨sÐ4JÓKÕKûð	Lúñ 	Cùs|   ‚!D3¤1B ÁBÁB ÁD3Á/D1Á0D3ÂB ÂD.Â4D)ÃD)ÃD)Ã-D.Ã.D3Ã3D)ÄD3ÄD)Ä#D.Ä$D3Ä)D.Ä.D3c                ó&   <€ V ^8„  d   QhRS[ RS[/# rš  r'  )r   r…  s   "€r   r   r†  "  s   ø€ ÷ 0ñ 0±#ð 0¹$ñ 0r   c                óò   € \        \        V R R4      ;'       d[    \        V RR4      ;'       dF    \        V RR4      '       * ;'       d,    \        V RR4      '       * ;'       d    V P                  V4      4      # )rÈ  TrÊ  FrË  rÌ  )rB   r]   rÈ  rž  s   &&r   Ú_should_attempt_rich_draftÚ*TelegramAdapter._should_attempt_rich_draft"  sƒ   € ÜÜ�DÐ2°DÓ9÷ /ð /Ü˜Ð4°eÓ<÷/ð /ä˜DÐ"7¸Ó?Ô?÷/ð /ô ˜DÐ"8¸%Ó@Ô@÷/ð /ð ×%Ñ% gÓ.ó0ð 	0r   c                ó^   <€ V ^8„  d   QhRS[ RS[RS[ RS[S[S[ S[3,          ,          RS[/# ©r   r±  Údraft_idr›  rO  r   )r   rÚ   r   r  r   rB   )r   r…  s   "€r   r   r†  *  sD   ø€ ÷ ñ ±#ð Áð Ésð Ñ^fÑgkÑloÑqtÐltÕguÕ^vð Ñ{ñ r   c           	   ƒ  ó8  "  € R\        V4      R\        V4      RV P                  V4      /pVP                  V P	                  W4      4        \        \        V P                  P                  RVR7      \        RRR7      G R	j  x€L
 4      #  L  \         d   pT P                  T4      '       d3   R
T n        \        P                  RT P                  \!        T4      4       M*\        P                  RT P                  \!        T4      4        R	p?R# R	p?ii ; i5i)z´Emit one ``sendRichMessageDraft`` frame; True on success. Frames are ephemeral, so any failure
returns False and the caller renders the legacy draft; capability failures latch off.r±  rP  r?  ÚsendRichMessageDraftr-  r/  FrL  NTuB   [%s] sendRichMessageDraft unsupported (%s) â€” using legacy draftsuL   [%s] sendRichMessageDraft transient failure (%s) â€” legacy draft this frame)r½   rÚ   ræ  r£  r  rB   rK   rÁ  r£  r3  r*   ró  rÌ  r7   r8   r„  r,   )r“  r±  rP  r›  rO  rå  rê  s   &&&&&  r   Ú_try_send_rich_draftÚ$TelegramAdapter._try_send_rich_draft*  s#  é € ð Ô1°'Ó:¸JÌÈHËÐWeÐgk÷  hBñ  hBð  CJó  hKð#Lˆà�‰�t×4Ñ4°WÓGÔHð	ÜÔ9Ø—	‘	×(Ñ(Ð)?ÈGÐ(ÓTÜ+°?ÐY^ô`÷ `ó að añ `øô ô 		Ø×-Ñ-¨c×2Ò2Ø,0�Ô)Ü—‘ØXÐZ^×ZcÑZcô  fAð  BEó  fFõGô —‘ØbÐdh×dmÑdmÜ/°Ó4ô6õ ûð		üsC   ‚A
DÁ6B ÂBÂB ÂDÂB ÂDÂA3DÄDÄDÄDc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  ?  s   ø€ ÷ Añ A°$ñ Ar   c              ƒ  ó*  "  € V P                   '       d   V P                   P                  '       g   R#  V P                   P                  P                  ^ ,          pT P	                  TP                  4       R4      G Rj  x€L
 '       g   T P                  T4       T P	                  TP                  4       R4      G Rj  x€L
 '       d#   \        P                  RT P                  4       R# T P                  T4       R#   \         d     R# i ; i L� LS5i)u�  Reset the httpx pool used for getUpdates polling before a reconnect.

Half-closed connections (esp. via proxies) occupy pool slots until "Pool timeout: All connections in the connection pool
are occupied". Only ``_request[0]`` (getUpdates) is reset; the general request stays untouched so concurrent sends are
never interrupted. Relies on PTB 22.x's private ``(get_updates, general)`` tuple â€” review on PTB 23+.Nz5Polling request shutdown failed/timed out (non-fatal)z:Polling request re-initialize failed/timed out (non-fatal)z2[%s] Polling request pool drained before reconnect)r¸  rf   rg   r*   Ú_bounded_request_steprh   Ú"_orphan_and_rebuild_polling_clientÚ
initializer7   r8   r„  )r“  Úpolling_reqs   & r   Ú_drain_polling_connectionsÚ*TelegramAdapter._drain_polling_connections?  så   é € ð —	—	�	˜dŸi™iŸmŸm˜mÙð	ØŸ)™)Ÿ-™-×0Ñ0°Õ3ˆKð
 ×/Ñ/°×0DÑ0DÓ0FÐHó  A÷  Aö  Að ×3Ñ3°KÔ@Ø×+Ñ+¨K×,BÑ,BÓ,Dð  GCó  D÷  Dö  DÜ�L‰LÐMÈtÏyÉyÖYà×3Ñ3°KÖ@øô ô 	Úð	úñ Añ
 DùsW   ‚.D±D´'C= Á#DÁ>DÁ?	DÂ	4DÂ=DÂ>	DÃ5DÃ=DÄDÄDÄDÄDc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úfailure_msgr   r'  )r   r…  s   "€r   r   r†  W  s   ø€ ÷ ñ Á#ð É$ñ r   c              ƒ  ó¼   "  €  \        V\        R7      G Rj  x€L
  R#  L  \         d.    \        P	                  RT,           T P
                  RR7        R# i ; i5i)zbAwait a request shutdown()/initialize() under ``_DRAIN_TIMEOUT``; False (debug-logged) on failure.©r?   NTz[%s] r3   F)rK   Ú_DRAIN_TIMEOUTr*   r7   r8   r„  )r“  rI   r^  s   &&&r   rW  Ú%TelegramAdapter._bounded_request_stepW  sO   é € ð	Ü-¨iÄÔP×PÐPÙñ Qøäô 	Ü�L‰L˜ ;Õ.°·	±	ÀDˆLÔIÚð	üs1   ‚A„! ˜™! �AŸ! ¡4AÁAÁAÁAc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  `  s   ø€ ÷ #ñ #Àñ #r   c                ón  a a€ \        VRR4      o\        VRR4      pSe%   \        V4      '       d   \        SRR4      '       d   R#  V! 4       Vn        \        P                  RS P                  4       R	 TT 3R
 llp \        P                  ! T! 4       4      pS P                  P                  T4       TP                  S P                  P                  4       TP                  \        4       R#   \         d'    \        P                  RS P                  RR7        R# i ; i  \         d     R# i ; i)a¿  Replace a wedged HTTPXRequest client after a hung aclose(): swap in a fresh client and close
the old one in a detached, bounded task so it can't block the reconnect ladder.

PTB's ``HTTPXRequest.initialize()`` only calls ``_build_client()`` when the current client reports
``is_closed``. If ``shutdown()`` was abandoned on a CLOSE-WAIT socket, that flag stays false and the
next ``start_polling()`` reuses the dead getUpdates connection (#87057).
Ú_clientNÚ_build_clientÚ	is_closedTz;[%s] Failed to rebuild polling HTTP client after hung drainr3   zZ[%s] Replaced wedged getUpdates HTTP client after drain timeout (likely CLOSE-WAIT socket)c                ó   € V ^8„  d   QhRR/# rd   rQ   )r   s   "r   r   ÚHTelegramAdapter._orphan_and_rebuild_polling_client.<locals>.__annotate__s  s   € ÷ 	oñ 	o dñ 	or   c               “   óú   <"  €  \        SR R4      p \        V 4      '       g   R# \        V ! 4       \        R7      G Rj  x€L
  R#  L  \         d'    \
        P                  RSP                  RR7        R# i ; i5i)ÚacloseNr`  z4[%s] Orphan polling client aclose failed (non-fatal)Tr3   )r]   rf  rK   ra  r*   r7   r8   r„  )rk  Úoldr“  s    €€r   Ú_orphan_acloseÚJTelegramAdapter._orphan_and_rebuild_polling_client.<locals>._orphan_acloses  se   øé € ðoÜ   h°Ó5�Ü ×'Ò'Ùä1±&³(ÄNÔS×SÔSøÜô oÜ—‘ÐSÐUY×U^ÑU^Ðim�×nðoüsB   ƒA;…A £A;¥A ¾A¿A ÁA;ÁA Á-A8Á4A;Á7A8Á8A;)r]   rf  re  r*   r7   r8   r„  r-  r0   Úensure_futureÚ_background_tasksr[   Úadd_done_callbackÚdiscardr9   )r“  rZ  Úbuildrm  r.   rl  s   f&   @r   rX  Ú2TelegramAdapter._orphan_and_rebuild_polling_client`  s	  ù€ ô �k 9¨dÓ3ˆÜ˜ _°dÓ;ˆØŠ;œh uŸošo´¸¸kÈ4×1PÒ1PÙð	Ù"'£'ˆKÔô 	�‰ÐsÐuy×u~Ñu~Ô÷	oñ 	oð	Ü×(Ò(©Ó)9Ó:ˆDØ×"Ñ"×&Ñ& tÔ,Ø×"Ñ" 4×#9Ñ#9×#AÑ#AÔBØ×"Ñ"Ô#:Ö;øô' ô 	Ü�L‰LÐVÐX\×XaÑXaÐlpˆLÔqÚð	ûô( ô 	Úð	ús%   ÁC1 Á?A0D% Ã1-D"Ä!D"Ä%D4Ä3D4c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  …  s   ø€ ÷ (ñ ( ñ (r   c                ó"   € RV n         RV n        R# )z>Mark polling closed: no progress accepted, send path degraded.FTN)rí  rù  r’  s   &r   Ú_fence_pollingÚTelegramAdapter._fence_polling…  s   € à+0ˆÔ(Ø#'ˆÖ r   c                óJ   <€ V ^8„  d   QhRS[ S[S[P                  3,          /# r�   )rü  rÚ   r0   rë  )r   r…  s   "€r   r   r†  Š  s%   ø€ ÷ Fñ F©5±±g·m±mÐ1CÕ+Dñ Fr   c                ód  € V P                   '       dL   V P                  4        \        V RR4      pVf   \        P                  ! 4       ;qn        \        V R^ 4      V3# \        V RR4      pVe'   VP                  4       '       g   VP                  4        RV n        \        V R^ 4      ^,           V n	        \        P                  ! 4       V n        RV n
        RV n        \        P                  ! 4       V n        RV n        ^ ;V n        V n        ^ ;V n        V n        V P                  V P
                  3# )zAStart accepting progress for a new getUpdates polling generation.rì  Nré  rã  T)r”  rw  r]   r0   rë  rì  ÚdoneÚcancelrã  ré  rí  rù  ÚtimeÚ	monotonicrï  rð  rñ  rò  ró  rô  )r“  ÚprogressÚverifiers   &  r   Ú_begin_polling_generationÚ)TelegramAdapter._begin_polling_generationŠ  s  € à×!×!Ð!Ø×ÑÔ!Ü˜tÐ%>ÀÓEˆHØÒÜ:A¿-º-»/ÐI�Ô7Ü˜4Ð!6¸Ó:¸HÐDÐDÜ˜4Ð!BÀDÓIˆØÒ¨¯©¯ªØ�O‰OÔØ/3ˆÔ,Ü#*¨4Ð1FÈÓ#JÈQÕ#NˆÔ Ü'.§}¢}£ˆÔ$Ø+/ˆÔ(Ø#'ˆÔ ô 6:·^²^Ó5EˆÔ2Ø04ˆÔ-ð IJÐIˆÔ$ tÔ'EØKLÐLˆÔ%¨Ô(HØ×'Ñ'¨×)EÑ)EÐEÐEr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Ú
generationr   )rÚ   rB   )r   r…  s   "€r   r   r†  ¤  s   ø€ ÷ ñ ±3ð ¹4ñ r   c                óz  € V P                   '       g#   V P                  '       d   WP                  8w  d   R# V P                  P	                  4       '       g8   V P
                  '       d   RMRp\        P                  RV P                  W!4       V P                  P                  4        \        P                  ! 4       V n        ^ V n        WP                  8X  d	   RV n        M^ V n        V P                  '       d;   \!        V RR4      '       d(   V P"                  '       g   V P%                  RRRRR7       RV n        R	# )
zURecord successful getUpdates I/O for the current generation only; True when accepted.FÚ	recoveredzconfirmed healthyz@[%s] Telegram polling %s: getUpdates progressing (generation %d)NÚ_runningÚ	connected)Úplatform_staterì  Úerror_messageT)r”  rí  ré  rì  Úis_setrè  r7   rç   r„  rX   r}  r~  rð  rê  rç  rù  r]   Úhas_fatal_errorÚ_write_runtime_status_safe)r“  r„  Ústates   && r   Ú_record_polling_progressÚ(TelegramAdapter._record_polling_progress¤  s  € à×!×!Ð!¨×)I×)IÐ)IÈZ×[sÑ[sÔMsÙØ×+Ñ+×2Ñ2×4Ò4ð $(×#D×#DÐ#D‘KÐJ]ˆEÜ�K‰KÐZÐ\`×\eÑ\eÐglÔyØ×$Ñ$×(Ñ(Ô*Ü04·²Ó0@ˆÔ-Ø,-ˆÔ)Ø×CÑCÔCØ9=ˆDÕ6à+,ˆDÔ(ð ×#×#Ð#¬°°jÀ%×(HÒ(HÐQU×Qe×QeÐQeØ×+Ñ+Ø¨KÀDÐX\ð ,ô ð $)ˆÔ Ùr   c                ój  € Vw  rEVe   ^ÈTu;8:  d
   R8  g    R#  R#  VP                  V4      p\        T\        4      '       d\   TP	                  R4      RJ dE   RT9   d<   T P                  T4      '       d#   T P                  TP	                  R4      4       R# R# R# R# R#   \         d     R# i ; i)zžRecord getUpdates progress from an observed do_request result (purely observational: PTB still
parses the untouched payload and owns any resulting exception).Ni,  ÚokTrJ   )Úparse_json_payloadr*   r5  r  r  r�  Ú_record_updates_received)r“  rl   r„  rJ   Ústatus_coderå  Úenvelopes   &&&&   r   Ú_observe_polling_request_resultÚ/TelegramAdapter._observe_polling_request_result¾  s³   € ð  &ÑˆØÒ c¨[Ö&>¸3Õ&>Ùð '?Ùð	à×1Ñ1°'Ó:ˆHô �h¤×%Ò%¨(¯,©,°tÓ*<ÀÓ*DÈÐU]ÔI]Ø×,Ñ,¨Z×8Ò8Ø×-Ñ-¨h¯l©l¸8Ó.DÖEñ 9ñ J^Ñ*DÑ%øô ô 	Úð	ús   ŸB# Â#B2Â1B2c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  Í  s   ø€ ÷ 8ñ 8°$ñ 8r   c                óŽ   € \        V\        4      '       d/   V'       d%   V ;P                  \        V4      ,          un        R# R# R# )z®Count updates Telegram handed us on the getUpdates wire (#102260). Only reached for the
accepted generation, so a late response from a fenced poll cannot inflate the backlog.N)r5  rT  rñ  r+  )r“  rJ   s   &&r   r”  Ú(TelegramAdapter._record_updates_receivedÍ  s0   € ô �fœd×#Ò#¯Ø×(Ò(¬C°«KÕ7×(ñ )/Ñ#r   c                óF   a€ V o ! V3R lR\        V4      4      pW!n        V# )u¶  Instrument one dedicated PTB getUpdates request with progress tracking.

PTB request classes use ``__slots__`` (no ``__dict__`` on 3.13), so re-tag the instance to a thin ``__slots__ = ()``
subclass overriding ``do_request`` â€” identical layout makes the ``__class__`` swap legal; works for test doubles too.

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__``.
c                   ó:   <a a€ ] tR tRt oRtV V3R ltRtVtV ;t# )ÚPTelegramAdapter._instrument_polling_request.<locals>._InstrumentedPollingRequestià  c              Ÿ  ó�   <"  € \         P                  4       p\        SV `  ! V/ VB G R j  x€L
 pSP	                  WV4       V#  L5irP   )Ú_POLLING_GENERATION_CONTEXTr  rµ  Ú
do_requestr—  )r“  Úargsr¥   r„  rJ   r  Úadapters   &*,  €€r   r¡  Ú[TelegramAdapter._instrument_polling_request.<locals>._InstrumentedPollingRequest.do_requestã  sF   øé € Ü8×<Ñ<Ó>�
Ü$™wÒ1°4ÐB¸6ÑB×B�Ø×7Ñ7¸È&ÔQØ�ñ Cùs   ƒ(A«A¬ArQ   )	r(   r‚   rƒ   r„   Ú	__slots__r¡  r†   Ú__classdictcell__Ú__classcell__)r  r…  r£  s   @@€r   Ú_InstrumentedPollingRequestrž  à  s   ú‡ € ØˆI÷ö r   r¨  )r'   r  )r“  rl   r¨  r£  s   && @r   Ú_instrument_polling_requestÚ+TelegramAdapter._instrument_polling_requestÓ  s'   ø€ ð ˆ÷	¬$¨w«-ô 	ð 8ÔØˆr   Úabandon_app_on_timeoutÚschedule_verifierc          
      ó\   <€ V ^8„  d   QhRS[ RS[ RS[ RS[S[S[P                  3,          /# )r   Údrop_pending_updatesr«  r¬  r   )rB   rü  rÚ   r0   rë  )r   r…  s   "€r   r   r†  ì  s;   ø€ ÷ $$ñ $$Ù,0ð$$ÙZ^ð$$áð$$á+0±±g·m±mÐ1CÕ+Dñ$$r   c             ƒ  ó†  a aa	"  € S P                   '       d   \        R4      hS P                  4       w  o	pS P                  '       g   \        R4      hR VV	V 3R llp\        P                  S	4      p \        VP                  P                  \        P                  W'R7      \        V'       d   V3R lMRR7      G Rj  x€L
  \        P                  V4       S P                   '       d   S P                  4        \        R4      hV'       d   S P                  S	V4       S	V3#  Ld  \        P                  T4       i ; i5i)z¤Start one generation and verify real getUpdates progress. Returns this generation's
``(generation, progress_event)`` so readiness-gating callers bind to exactly it.z!Telegram polling teardown startedc                ó(   € V ^8„  d   QhR\         RR/# ©r   r   r   N©r*   )r   s   "r   r   Ú9TelegramAdapter._start_polling_once.<locals>.__annotate__÷  s   € ÷ 	Jñ 	J¬ið 	J¸Dñ 	Jr   c                 óô   <€ SP                   '       g   SSP                  8w  g   Sf   R # \        P                  R 4      p S! V 4       \        P	                  V4       R #   \        P	                  T4       i ; irP   )r”  ré  r   rX   Úreset)r   Úcallback_context_tokenÚerror_callbackr„  r“  s   & €€€r   Ú_generation_error_callbackÚGTelegramAdapter._start_polling_once.<locals>._generation_error_callback÷  sd   ø€ Ø×%×%Ð%¨°t×7OÑ7OÔ)OÐSaÒSiÙÜ%@×%DÑ%DÀTÓ%JÐ"ðJÙ˜uÔ%ä+×1Ñ1Ð2HÖIøÔ+×1Ñ1Ð2HÕIús   ÁA  Á A7)Úallowed_updatesr®  r·  c                 ó   € \        V 4      # rP   ©rm   ©rk   s   &r   Ú<lambda>Ú5TelegramAdapter._start_polling_once.<locals>.<lambda>  s
   € Ô-DÀSÔ-Ir   N)r?   r:   )r”  rt  r�  rí  r   rX   rK   ÚupdaterÚstart_pollingro   Ú	ALL_TYPESÚ_UPDATER_START_TIMEOUTrµ  rw  Ú#_schedule_polling_progress_verifier)
r“  rk   r®  r·  r«  r¬  r  r¸  Úcontext_tokenr„  s
   f&$d$$   @r   Ú_start_polling_onceÚ#TelegramAdapter._start_polling_onceì  s   úé € ð
 ×!×!Ð!Ü(Ð)LÓMÐMØ#×=Ñ=Ó?Ñˆ
�HØ×/×/Ð/Ü(Ð)LÓMÐM÷	Jò 	Jô 4×7Ñ7¸
ÓCˆð		=ô .Ø—‘×)Ñ)Ü$*×$4Ñ$4ÐK_ð *ó Lä.ßNd¨ÔIÐjnô	q÷ qð qô (×-Ñ-¨mÔ<Ø×!×!Ð!Ø×ÑÔ!Ü(Ð)LÓMÐMßØ×4Ñ4°ZÀÔJØ˜8Ð#Ð#ñqøô (×-Ñ-¨mÕ<üsC   …AEÁ+EÁ4AD' Ã D%ÃD' Ã&EÃ,"EÄEÄ%D' Ä'D>Ä>Ec                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# ©r   r„  r  r   N)rÚ   r0   rë  )r   r…  s   "€r   r   r†    s'   ø€ ÷ 9ñ 9¹cð 9ÉWÏ]É]ð 9Ð_cñ 9r   c                óœ  a € S P                   '       d   S P                  4        R# \        S RR4      pVe'   VP                  4       '       g   VP	                  4        \
        P                  ! 4       P                  S P                  W4      4      pVS n	        S P                  P                  V4       R V 3R llpVP                  V4       R# )z<Own exactly one tracked verifier for the current generation.Nrã  c                ó<   € V ^8„  d   QhR\         P                  RR/# )r   Úfinishedr   Nr/   )r   s   "r   r   ÚITelegramAdapter._schedule_polling_progress_verifier.<locals>.__annotate__  s   € ÷ 	<ñ 	<¬w¯|©|ð 	<Àñ 	<r   c                 óp   <€ SP                   P                  V 4       SP                  V J d
   R Sn        R # R # rP   )rp  rr  rã  )rÌ  r“  s   &€r   Ú_clear_finished_verifierÚUTelegramAdapter._schedule_polling_progress_verifier.<locals>._clear_finished_verifier  s3   ø€ Ø×"Ñ"×*Ñ*¨8Ô4Ø×3Ñ3°xÓ?Ø7;�Ö4ñ @r   )r”  rw  r]   r{  r|  r0   Úget_running_loopÚcreate_taskÚ_verify_polling_after_reconnectrã  rp  r[   rq  )r“  r„  r  Úpreviousr.   rÏ  s   f&&   r   rÄ  Ú3TelegramAdapter._schedule_polling_progress_verifier  s£   ø€ à×!×!Ð!Ø×ÑÔ!ÙÜ˜4Ð!BÀDÓIˆØÒ¨¯©¯ªØ�O‰OÔÜ×'Ò'Ó)×5Ñ5°d×6ZÑ6ZÐ[eÓ6pÓqˆØ/3ˆÔ,Ø×Ñ×"Ñ" 4Ô(÷	<ð 	<ð
 	×ÑÐ7Ö8r   c                ó4   <€ V ^8„  d   QhRS[ P                  /# r�   )r0   rú  )r   r…  s   "€r   r   r†  %  s   ø€ ÷ ñ ±·±ñ r   c                ó^   € \        V R R4      pVf   \        P                  ! 4       ;qn        V# )rû  N)r]   r0   rú  rû  )r“  Úlocks   & r   Ú_get_general_request_drain_lockÚ/TelegramAdapter._get_general_request_drain_lock%  s,   € Ü�tÐ:¸DÓAˆØŠ<Ü6=·l²l³nÐDˆDÔ3Øˆr   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  +  s   ø€ ÷ kñ kÀTñ kr   c              ƒ  óP  "  € \        \        V RR4      RR4      pVf   \        V RR4      pVf   R#  VP                  ^,          pT P                  4       ;_uu_4       GRj  x€L
  T P	                  TP                  4       R4      G Rj  x€L
  T P	                  TP                  4       R4      G Rj  x€L
 '       d!   \        P                  RT P                  4       RRR4      GRj  x€L
  R#   \         d     R# i ; i Lž Lx LR L  + GRj  x€L 
 '       g   i     R# ; i5i)u§   Reset the general Bot API pool (``_request[1]``) after a confirmed send pool timeout â€” PTB
guarantees the request was not sent, so resetting before retrying is safe.r¸  Nrf   rÁ  zHGeneral request shutdown failed/timed out after pool timeout (non-fatal)zMGeneral request re-initialize failed/timed out after pool timeout (non-fatal)z=[%s] General request pool drained after Telegram pool timeout)
r]   rg   r*   rÙ  rW  rh   rY  r7   r-  r„  )r“  rf   Úgeneral_reqs   &  r   Ú-_drain_general_connections_after_pool_timeoutÚ=TelegramAdapter._drain_general_connections_after_pool_timeout+  s  é € ô ”g˜d F¨DÓ1°5¸$Ó?ˆØŠ;Ü˜$ ¨Ó-ˆCØŠ;Ùð	ØŸ,™, q�/ˆKð ×7Ñ7×9×9Õ9Ø×,Ñ,Ø×$Ñ$Ó&Ð(rót÷ tð tà×/Ñ/Ø×&Ñ&Ó(Ð*yó{÷ {ö {ä—‘Ð^Ð`d×`iÑ`iÔj÷ :×9Ñ9øô ô 	Úð	úá9ñtñ{÷ :×9×9Ó9üsš   ‚0D&³C/ ÁD&Á"DÁ#D&Á&$D	Â
DÂ'D	Â2DÂ3	D	Â= D	ÃD&Ã(DÃ)D&Ã/C>Ã:D&Ã=C>Ã>D&ÄD	ÄD	ÄD&Ä	D#	ÄDÄ
D#	ÄD#	Ä	D&c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  >  s   ø€ ÷ Sñ S°Tñ Sr   c                óÚ   € VP                  V4      V n        V P                  P                  V P                  4       V P                  P	                  V P                  P
                  4       R# )zIStart ``coro`` as the tracked in-flight recovery task (reentrancy guard).N)rÒ  râ  rp  r[   rq  rr  )r“  ÚloopÚcoros   &&&r   Ú_spawn_polling_recoveryÚ'TelegramAdapter._spawn_polling_recovery>  sO   € à#'×#3Ñ#3°DÓ#9ˆÔ Ø×Ñ×"Ñ" 4×#;Ñ#;Ô<Ø× Ñ ×2Ñ2°4×3IÑ3I×3QÑ3QÖRr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  D  s   ø€ ÷ Vñ V¡Tñ Vr   c                óz   € \        V P                  ;'       d     V P                  P                  4       '       * 4      # rP   )rB   râ  r{  r’  s   &r   Ú_recovery_in_flightÚ#TelegramAdapter._recovery_in_flightD  s-   € Ü�D×,Ñ,×TÐT°T×5MÑ5M×5RÑ5RÓ5TÔ1TÓUÐUr   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   r   Úreasonr   N)r*   r   )r   r…  s   "€r   r   r†  G  s'   ø€ ÷ lñ l±	ð lÁcð lÈdñ lr   c               ón  € V P                   '       g   V P                  '       d   R# V P                  4       '       d.   \        P	                  RV P
                  V\        V4      4       R# RV n        \        V RR4      '       d   V P                  4        \        V\        4      '       d-   \        P                  RV P
                  V\        V4      4       M+\        P                  RV P
                  V\        V4      4       V P                  \        P                  ! 4       V P!                  V4      4       R# )z°Schedule background polling recovery without failing gateway startup: a transient bootstrap
failure degrades only this adapter; the reconnect ladder recovers in the background.NzA[%s] Telegram polling recovery already scheduled; ignoring %s: %sTr‡  Fzk[%s] Telegram polling stall confirmed (%s); handing off to the supervisor for an adapter rebuild. Error: %szR[%s] Telegram polling degraded (%s); gateway stays alive and will retry. Error: %s)r”  rŒ  rè  r7   r8   r„  r,   rù  r]   Ú_mark_degradedr5  rx  r-  rä  r0   rÑ  Ú_handle_polling_network_error)r“  r   rë  s   &&$r   Ú_schedule_polling_recoveryÚ*TelegramAdapter._schedule_polling_recoveryG  s  € ð ×!×!Ð! T×%9×%9Ð%9ÙØ×#Ñ#×%Ò%Ü�L‰LØSÐUY×U^ÑU^Ð`fô  iDð  EJó  iKôLáØ#'ˆÔ ô �4˜ U×+Ò+Ø×ÑÔ!Ü�eÔ/×0Ò0ô �N‰NðØ!ŸY™Y¨Ô0KÈEÓ0RõTô �N‰NØdÐfj×foÑfoÐqwÜ+¨EÓ2ô4ð 	×$Ñ$¤W×%=Ò%=Ó%?À×AcÑAcÐdiÓAjÖkr   Úrequire_successc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   rñ  r   r.  )r   r…  s   "€r   r   r†  b  s   ø€ ÷ ñ ÁDð ÑUYñ r   c             ƒ  ó¼  "  € V P                   '       g   R# \        V P                   RR4      p\        V4      '       g   R#  \        V! RR7      \        R7      G Rj  x€L
  R#  L  \
         di   pT P                  T4      '       g   h T'       d   \        R4      Th\        P                  RT P                  \        T4      4       RT n         Rp?R# Rp?ii ; i5i)	z¦Clear a stale webhook; ``require_success`` (cold start) raises so GatewayRunner disposes the
partial adapter, while reconnects recover transient errors in background.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)rÁ  r]   rf  rK   rÃ  r*   rs  r'  r7   r-  r„  r,   rù  )r“  rñ  rô  Úerrs   &$  r   Ú_delete_webhook_best_effortÚ+TelegramAdapter._delete_webhook_best_effortb  s¼   é € ð �y�yˆyÙÜ  §¡Ð,<¸dÓCˆÜ˜×'Ò'Ùð	ä-©nÐRWÔ.XÔbxÔy×yÐyÙñ zøäô 		Ø×1Ñ1°#×6Ò6ØßÜÐ^Ó_ÐehÐhÜ�N‰Nð HØ—	‘	Ô6°sÓ;ô=ð (,ˆDÔ$Ýûð		üsG   ‚?CÁA& ÁA$ÁA& Á"CÁ$A& Á&CÁ1CÂ=CÃCÃCÃCc                óX   <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[RR/# )r   r  Ústrict_error_eventÚstrict_errorr   N)r0   rë  rT  )r   r…  s   "€r   r   r†  y  s@   ø€ ÷ ]ñ ]¹'¿-¹-ð ]Ñ]d×]jÑ]jð ]Ñz~ð ]ð  DHñ ]r   c              ƒ  ó”  "  € \         P                  ! VP                  4       4      p\         P                  ! VP                  4       4      p \        \         P                  ! WE0\         P                  R7      \
        R7      G Rj  x€L
   YE3 F+  pTP                  4       '       d   K  TP                  4        K-  	  \         P                  ! YERR7      G Rj  x€L
  T'       d=   TP                  4       '       g'   \        R	\        T^ ,          4       24      T^ ,          hTP                  4       '       g   \        R
4      hR#  L¾  \         d   p\        R\
        R R24      ThRp?ii ; i L•  YE3 F+  pTP                  4       '       d   K  TP                  4        K-  	  \         P                  ! YERR7      G Rj  x€L 
  i ; i5i)z«Cold start: wait for THIS generation's first getUpdates success or the first polling error;
raises OSError so GatewayRunner disposes the partial adapter and retries fresh.)Úreturn_whenr`  Nz,Telegram getUpdates made no progress within rD   ua   s during initial connect â€” failing startup so the gateway retries with a fresh adapter (#67498)T©Úreturn_exceptionszQTelegram polling errored before first getUpdates success during initial connect: z?Telegram getUpdates did not become ready during initial connect)r0   ro  rÒ   rK   ÚFIRST_COMPLETEDÚ!_INITIAL_POLLING_PROGRESS_TIMEOUTrG   r'  r{  r|  Úgatherr‹  r,   )r“  r  rù  rú  Úprogress_waitÚ
error_waitrê  Úfuts   &&&&    r   Ú_await_cold_start_readinessÚ+TelegramAdapter._await_cold_start_readinessy  s…  é € ô  ×-Ò-¨h¯m©m«oÓ>ˆÜ×*Ò*Ð+=×+BÑ+BÓ+DÓEˆ
ð	Tä-Ü—’˜mÐ8Äg×F]ÑF]Ô^ô  iJôK÷ Kñ Kð &Ó2�Ø—x‘x—z”zØ—J‘J–Lñ 3ô —.’. ÈdÔS×SÐSß §¡× 1Ò 1ÜØcÜ.¨|¸A­Ó?Ð@ðBóð ˜q•/ð"ð �‰× Ò ÜÐ[Ó\Ð\ñ !ñ%Køäô 	ÜØ>Ü4°SÐ9ð :cðcóð ð	ûð	úñ Tøð &Ó2�Ø—x‘x—z”zØ—J‘J–Lñ 3ô —.’. ÈdÔS×SÒSüs„   ‚A	GÁ9E ÂEÂE ÂGÂ)/GÃE.ÃGÃ%GÃ;;GÄ7GÅE ÅE+ÅE&Å&E+Å+E0 Å.GÅ0GÆ/GÆ>GÆ?GÇGÚrequire_progressc                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r   r®  r  r   r.  )r   r…  s   "€r   r   r†  •  s(   ø€ ÷ <ñ <Ádð <Ñnrð <ñ  @Dñ <r   c             ƒ  óØ  aa	a
aa"  € V P                   '       d   R# V P                  '       d   V P                  P                  '       g   \        R4      h. o
\        P
                  ! 4       oRoSpV'       d%   \        P                  ! 4       o	R VV	V
VV3R llpTp V P                  V P                  WVV'       * R7      G Rj  x€L
 w  rgV'       d%   V P                  VSS
4      G Rj  x€L
  RoSV n	        R#  L4 L  \         d     R# \         dÓ   pT P                   '       d    Rp?R# T'       d   h T P                  T4      '       de   \        P                  RT P                  \!        T4      4       T P#                  \        P                  ! 4       T P%                  T4      4        Rp?R# T P'                  T4      '       d   T P)                  TR	R
7        Rp?R# h Rp?ii ; i5i)zÃStart PTB polling; ``require_progress`` (initial connect) demands real readiness. Reconnects
may recover in background; on cold start a bootstrap failure raises (see _await_cold_start_readiness).Fz,Telegram application/updater not initializedTc                ó(   € V ^8„  d   QhR\         RR/# r±  r²  )r   s   "r   r   Ú>TelegramAdapter._start_polling_resilient.<locals>.__annotate__¥  s   € ÷ 	Bñ 	B¬ið 	B¸Dñ 	Br   c                 óœ   <€ S'       g   Se	   S! V 4       R # S'       g   SP                  V 4       SP                  SP                  4       R # rP   )rd  Úcall_soon_threadsaferX   )r   r·  râ  rú  rù  Ústrict_gate_opens   &€€€€€r   Ú_strict_error_callbackÚHTelegramAdapter._start_polling_resilient.<locals>._strict_error_callback¥  s=   ø€ ç'Ø%Ò1Ù& uÔ-Ùß#Ø ×'Ñ'¨Ô.à×)Ñ)Ð*<×*@Ñ*@ÖAr   )r®  r·  r«  r¬  Nz[[%s] Telegram polling bootstrap conflict; gateway stays alive while conflict retry runs: %szpolling bootstrap©rë  )r”  r¸  rÀ  ÚRuntimeErrorr0   rë  rÑ  rÆ  r  rî  rt  r*   r`  r7   r-  r„  r,   rä  Ú_handle_polling_conflictrs  rï  )r“  r®  r·  r  Úeffective_callbackr  Ú_generationr  rõ  râ  rú  rù  r  s   &$d$     @@@@r   Ú_start_polling_resilientÚ(TelegramAdapter._start_polling_resilient•  s¨  üé € ð ×!×!Ð!ÙØ—	—	�	˜dŸi™i×/×/Ð/ÜÐMÓNÐNð -/ˆÜ$Ÿ]š]›_ÐØÐØ+ÐßÜ×+Ò+Ó-ˆD÷	Bô 	Bð "8Ðð 	ð
 +/×*BÑ*BØ—	‘	Ð0DØ'7à&6Ô"6ð	 +Có +8÷ %8Ñ!ˆK÷
  Ø×6Ñ6°xÐASÐUaÓb×bÐbà#(Ð Ø3A�Ô0Ùñ%8ñ cøô
 &ô 	ÚÜô 	Ø×%×%Ð%ÝßØØ×0Ñ0°×5Ò5Ü—‘ØqØ—I‘IÔ:¸3Ó?ôAð ×,Ñ,¬W×-EÒ-EÓ-GÈ×IfÑIfÐgjÓIkÔlÝØ×-Ñ-¨c×2Ò2Ø×/Ñ/°Ð<OÐ/ÔPÝØûð	üs§   ‡&G*®G*Á
-G*Á8$G*Â'C= ÃC9Ã$C= Ã)C;Ã*C= Ã7G*Ã9C= Ã;C= Ã=G'ÄG*ÄG'ÄG'ÄG"Ä'G*Ä-G"Ä5G"ÅAG"Æ+G*Æ1G"ÇG"ÇG*Ç!G"Ç"G'Ç'G*c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r   r%  Úlog_messager   Nrž   )r   r…  s   "€r   r   r†  Ó  s#   ø€ ÷ 2ñ 2©sð 2Áð 2ÐTXñ 2r   c              ‡  óš   "  € \         P                  ! V.VO5!   V P                  RVRR7       V P                  4       G Rj  x€L
  R#  L5i)z^Retryable ``telegram_network_error`` fatal + runner handoff (supervisor rebuilds the adapter).Útelegram_network_errorTr)  N)r7   r   r*  Ú_handoff_polling_fatal_error)r“  r%  r  Úlog_argss   &&&*r   Ú_go_fatal_networkÚ!TelegramAdapter._go_fatal_networkÓ  s>   é € ä�Š�[Ð, 8Ô,Ø×ÑÐ6¸È4ÐÔPØ×/Ñ/Ó1×1Ô1ùs   ‚A AÁA	ÁAc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   r  r   r'  )r   r…  s   "€r   r   r†  Ù  s   ø€ ÷ ñ ¹ð Áñ r   c              ƒ  óŠ  "  €  V'       dc   VP                   '       dQ   VP                   P                  '       d5    \        VP                   P                  4       \        R7      G Rj  x€L
  R# R#  L  \
         d2    RT R2pT P                  TRT P                  T4      G Rj  x€L 
   R# i ; i  \         d     R# i ; i5i)a:  Bounded ``updater.stop()`` before a recovery restart; False = went fatal, caller returns.

Wall-clock deadline, not asyncio.wait_for: a CLOSE-WAIT socket wedges stop() on epoll and PTB/AnyIO shielded cleanup
hangs wait_for. On timeout the Updater's lifecycle lock may still be held, so rebuild the adapter instead.r`  Nz2Telegram updater.stop() did not finish before the zg deadline; rebuilding the adapter instead of reusing an Updater whose lifecycle lock may still be held.z"[%s] %s (likely CLOSE-WAIT socket)FT)	rÀ  ÚrunningrK   ÚstopÚ_UPDATER_STOP_TIMEOUTrG   r  r„  r*   )r“  rk   r  r%  s   &&& r   Ú_stop_updater_or_go_fatalÚ)TelegramAdapter._stop_updater_or_go_fatalÙ  s·   é € ð
	ß�s—{—{�{ s§{¡{×':×':Ð':ð!Ü5°c·k±k×6FÑ6FÓ6HÔRgÔh×hÐhó ñ iøÜ#ô !àLÈTÈFð Swð wð ð ×0Ñ0°Ð:^Ð`d×`iÑ`iÐkrÓs×sÑsÚ ð!ûô ô 	ØÙð	üsn   ‚C„B1 žB1 »,A2 Á'A0Á(A2 Á,CÁ0A2 Á22B.Â$B'Â%B.Â*B1 Â+CÂ-B.Â.B1 Â1C Â<CÂ?C Ã Cc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  ì  s   ø€ ÷ Pñ P°ñ Pr   c                óX   € \         P                  ! 4       P                  V4      V n        R# )zJRun a recovery coroutine as the tracked in-flight ``_polling_error_task``.N)r0   rÑ  rÒ  râ  )r“  rã  s   &&r   Ú_restart_polling_in_taskÚ(TelegramAdapter._restart_polling_in_taskì  s   € ä#*×#;Ò#;Ó#=×#IÑ#IÈ$Ó#OˆÖ r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r±  r²  )r   r…  s   "€r   r   r†  ð  s   ø€ ÷ F0ñ F0¹ð F0Àtñ F0r   c           
   ƒ  ó  "  € V P                   '       g   V P                  '       d   R# \        V\        4      '       d8   R\	        V4       R2pV P                  VRV P                  V4      G Rj  x€L
  R# ^
p^p^<pV ;P                  ^,          un        RV n        V P                  pWc8”  d:   RVR R2pV P                  VR	V P                  V\	        V4      4      G Rj  x€L
  R# \        V^V^,
          ,          ,          V4      p\        P                  R
V P                  VW7\	        V4      4       \        P                  ! V4      G Rj  x€L
  V P                   '       d   R# V P                  pV P                  VR4      G Rj  x€L
 '       d   V P                   '       d   R# V P!                  V4      '       d   V P#                  4       G Rj  x€L
  V P                   '       d   R# V P%                  4       G Rj  x€L
  V P                   '       d   R#  V'       g   \'        R4      hV P)                  VRV P*                  R7      G Rj  x€L
  \        P-                  RV P                  V4       R#  EL EL• EL+ Ló L¬ L‚ L6  \.         d     R# \0         dé   p	T P                   '       d    Rp	?	R# \        P                  RT P                  \	        T	4      4       T P                  '       gŠ   T P                   '       gr   \        P2                  ! T P5                  T	4      4      p
T P6                  P9                  T
4       T
P;                  T P6                  P<                  4       Y n         Rp	?	R#  Rp	?	R#  Rp	?	R# Rp	?	ii ; i5i)uß  Reconnect polling after a transient network interruption (NetworkError/TimedOut).

Host connectivity loss (sleep, WiFi switch, VPN) kills the long-poll silently. Exponential back-off (5sâ†’60s
cap) up to MAX_NETWORK_RETRIES, then retryable-fatal so the supervisor restarts the gateway.

A confirmed polling stall (``_PollingStallError``) skips the ladder entirely: the Updater's long-poll
action never quiesced, so it is handed to the supervisor for a rebuild before any backoff.Nz"Telegram polling stall confirmed (zR); rebuilding the adapter instead of reusing a wedged Updater/dispatcher in place.z+[%s] %s (rebuilding adapter via supervisor)Tz+Telegram polling could not reconnect after Údz7 network error retries. Escalating to gateway recovery.z[%s] %s Last error: %szK[%s] Telegram network error (attempt %d/%d), reconnecting in %ds. Error: %sznetwork-recoveryz3Telegram application was torn down during reconnectF©r®  r·  zd[%s] Telegram polling restarted after network error (attempt %d); health pending getUpdates progressz*[%s] Telegram polling reconnect failed: %s) r”  rŒ  r5  rx  r,   r  r„  rè  rù  r‹  r7   r-  r0   rC  r¸  r%  r‡  rÞ  r[  r  rÆ  rî  rç   rt  r*   ro  rî  rp  r[   rq  rr  râ  )r“  r   r%  ÚMAX_NETWORK_RETRIESÚ
BASE_DELAYÚ	MAX_DELAYÚattemptÚdelayrk   Ú	retry_errr.   s   &&         r   rî  Ú-TelegramAdapter._handle_polling_network_errorð  s8  é € ð ×!×!Ð! T×%9×%9Ð%9ÙÜ�eÔ/×0Ò0ð 5Ô5PÐQVÓ5WÐ4Xð Y8ð 8ð ð ×(Ñ(¨Ð2_Ðae×ajÑajÐlsÓt×tÐtÙØ ÐØˆ
Øˆ	Ø×)Ò)¨QÕ.Õ)Ø#'ˆÔ Ø×3Ñ3ˆØÔ(à=Ð>QÐRSÐ=Tð  ULð  Mð à×(Ñ(¨Ð2JÈDÏIÉIÐW^Ô`{ð  }Bó  aCó  D÷  Dð  DÙÜ�J !¨°!­Õ"4Õ5°yÓAˆÜ�‰ØYÐ[_×[dÑ[dÐfmØÔ(CÀEÓ(Jô	Lô �mŠm˜EÓ"×"Ð"Ø×!×!Ð!Ùà�i‰iˆð ×3Ñ3°CÐ9KÓL×LÖLÐPT×Pf×PfÐPfÙð ×(Ñ(¨×/Ò/Ø×DÑDÓF×FÐFØ×!×!Ð!ÙØ×-Ñ-Ó/×/Ð/Ø×!×!Ð!Ùð	0ßÜ"Ð#XÓYÐYØ×*Ñ*¨3ÀUÐ[_×[{Ñ[{Ð*Ó|×|Ð|Ü�K‰KØvÐx|÷  yBñ  yBð  DKöLòO uò Dò 	#ñ Mñ
 Gñ 	0ñ }øô &ô 	ÚÜô 
	0Ø×%×%Ð%ÝÜ�N‰NÐGÈÏÉÔToÐpyÓTzÔ{à×'×'Ð'°×0F×0FÐ0FÜ×,Ò,¨T×-OÑ-OÐPYÓ-ZÓ[�Ø×&Ñ&×*Ñ*¨4Ô0Ø×&Ñ& t×'=Ñ'=×'EÑ'EÔFà+/×(Ò(õ 1GÕ'ûð
	0üsÿ   ‚$N§ANÁ/I2Á0A0NÃ I5Ã!A,NÅI8ÅNÅ$#NÆI;Æ	NÆNÆ$NÆ=NÇI=ÇNÇ'NÇ<I?Ç=NÈNÈJ È,J É
JÉ%J É0NÉ5NÉ8NÉ;NÉ=NÉ?NÊJ ÊNÊNÊNÊNÊM>Ê-NÊ3AM>ÌA+M>Í,NÍ>NÎNc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  8  s   ø€ ÷ RYñ RY¨tñ RYr   c              ƒ  óÒ  "  € ^Zp^pRpRp  \         P                  ! V4      G Rj  x€L
  V P                  '       g   V P                  '       d   R# V P                  pVeß   VP                  4       '       gÉ   \        P                  ! 4       pWSJd   TpTpM«Wd,
          \        8”  d˜   Wd,
          p\        P                  RV P                  V4       \        P                  ! \        4      ;_uu_ 4        VP                  4        RRR4       V P!                  RRVR R2RR	7       V P#                  4       G Rj  x€L
  R# MRpV P$                  '       d   V P$                  P&                  MRpVf   EKg  \)        \+        VR
R4      4      '       g   R# \         P,                  ! VP/                  4       V4      G Rj  x€L
  \        P                  ! 4       V n        V P3                  \+        VRR4      4       V P5                  W‚4      G Rj  x€L
  V P7                  4       G Rj  x€L
  V P9                  4        EK,   EL  + '       g   i     EL@; i EL L˜ LK L5  \         P:                   d     R# \<        \>        3 d    p	T PA                  T	RR7        Rp	?	EKŽ  Rp	?	i\         d>   p	T PC                  T	4      '       d   T PA                  T	RR7        Rp	?	EKÍ   Rp	?	EKÔ  Rp	?	ii ; i5i)a£  Detect dead Telegram TCP sockets (CLOSE-WAIT) by periodic probing.

In CLOSE-WAIT epoll still reports the long-poll socket readable and nothing raises, so PTB's
``error_callback`` never fires. Probe ``get_me()`` on the *general* path (never the getUpdates pool);
connect-level failures feed ``_handle_polling_network_error``. Runs for the connection's lifetime, catching
steady-state wedges the one-shot verifier can't.Nr¦  Tzš[%s] Telegram reconnect task wedged for %.0fs with no ladder progress; forcing retryable-fatal so the gateway reconnects instead of staying silently deaf.r  z#Telegram reconnect task wedged for rD   zs; forcing gateway reconnect.r)  Úget_mer“  zheartbeat prober  )"r0   rC  r”  rŒ  râ  r{  r}  r~  Ú!_POLLING_ERROR_TASK_STUCK_TIMEOUTr7   r   r„  r%  r&  r*   r|  r*  r  r¸  rf   rf  r]   Úwait_forr8  rö  Ú_note_bot_usernameÚ_probe_pending_updatesÚ_check_polling_stallÚ_check_ingress_dispatch_stallr6   rG   r'  rï  rs  )
r“  ÚHEARTBEAT_INTERVALÚPROBE_TIMEOUTÚstuck_task_refÚstuck_task_sinceÚrecovery_taskÚnowÚ	stuck_forrf   Ú	probe_errs
   &         r   Ú_polling_heartbeat_loopÚ'TelegramAdapter._polling_heartbeat_loop8  s€  é € ð  ÐØˆð 26ˆØÐØð?YÜ—m’mÐ$6Ó7×7Ð7Ø×)×)Ð)¨T×-A×-AÐ-AÙð !%× 8Ñ 8�Ø Ò,°]×5GÑ5G×5IÒ5IÜŸ.š.Ó*�CØ$Ó:Ø)6˜Ø+.Ñ(ØÕ/Ô2SÔSØ$'Õ$:˜	ÜŸ™ðKà ŸI™I yô2ô (×0Ò0´×;Õ;Ø)×0Ñ0Ô2÷ <à×-Ñ-Ø4ØAÀ)ÈCÀÐPmÐnØ&*ð .ô ,ð #×?Ñ?ÓA×AÐAÙð Tð &*�NØ'+§y§y y�d—i‘i—m’m°d�Ø’;Úä¤¨¨X°tÓ <×=Ò=ÙÜ×&Ò& s§z¡z£|°]ÓC×CÐCä04·²Ó0@�Ô-Ø×'Ñ'¬°°ZÀÓ(FÔGð ×1Ñ1°#ÓE×EÐEð
 ×/Ñ/Ó1×1Ð1à×2Ñ2×4òm 8÷( <×;Ð;úò Bñ Dñ Fñ
 2øô ×)Ñ)ô ÚÜ ¤'Ð*ô UØ×/Ñ/°	ÐBSÐ/×TÓTûÜô Yà×1Ñ1°)×<Ò<Ø×3Ñ3°IÐFWÐ3×XÓXö =ûðYüs  ‚
K'�I ¦H7§I ½I ÁK'Á%I Á7A;I Ã2H:Ä4I Ä7IÄ8I Ä<K'Ä>I ÅI Å/K'Å2I ÆK'Æ(I Æ8IÆ9AI ÈIÈI ÈIÈ I È4K'È7I È:I	É
I ÉI ÉI ÉI ÉK$É,K'É/K$É>K$É?JÊK'ÊK$Ê&K$Ê'*KËK'ËK$Ë$K'c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úprobe_timeoutr   N)rA   )r   r…  s   "€r   r   r†  Œ  s#   ø€ ÷ @Lñ @L¹uð @LÈñ @Lr   c              ƒ  ó(  "  € V P                   '       g   V P                  '       d   R# V P                  4       '       d
   ^ V n        R# V P                  '       d   \        V P                  RR4      MRpVf
   ^ V n        R# \        VRR4      '       gx   ^ V n        V ;P                  ^,          un        \        P                  RV P                  V P                  4       V P                  ^8¼  d   ^ V n        V P                  RR4       R# ^ V n        \        VRR4      p\        V4      '       g   R#  \        P                  ! V! 4       V4      G Rj  x€L
 p\!        \        TR	^ 4      ;'       g    ^ 4      pT^ 8:  d
   ^ T n        R# T ;P                  ^,          un        \        P                  R
T P                  Y`P                  4       T P                  ^8¼  d   ^ T n        T P                  RR4       R# R#  L¦  \        \        3 d     R# i ; i5i)ué  Detect a wedged or stopped getUpdates consumer via pending_update_count.

PTB can report ``updater.running`` while the long-poll is stuck; get_me() stays healthy yet DMs queue in the
Bot API. A stuck queue over two consecutive probes â‡’ dead consumer. Also covers the updater having stopped
entirely (``running=False``, no reconnect in flight).

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).
We detect the stopped updater directly and feed the same ladder (#55769).
NrÀ  r"  FzY[%s] Telegram polling heartbeat: updater stopped while in polling mode (stuck probe %d/2)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)r”  rÂ  rè  rø  r¸  r]   r÷  r7   r-  r„  Ú_escalate_stuck_consumerrf  r0   r:  rG   r'  rÚ   )r“  rf   rJ  rÀ  rL  rç   Úpendings   &&&    r   r<  Ú&TelegramAdapter._probe_pending_updatesŒ  sÝ  é € ð ×!×!Ð! T×%7×%7Ð%7Ùð ×#Ñ#×%Ò%Ø./ˆDÔ+ÙØ9=¿¿¸”'˜$Ÿ)™) Y°Ô5ÈˆØŠ?Ø01ˆDÔ-ÙÜ�w 	¨5×1Ò1ð 12ˆDÔ-ð ×+Ò+¨qÕ0Õ+Ü�N‰NØkÐmq×mvÑmvØ×/Ñ/ô1ð ×.Ñ.°!Ô3Ø23�Ô/Ø×-Ñ-ØlØDôFñ Ø*+ˆÔ'Ü" 3Ð(:¸DÓAÐÜÐ(×)Ò)Ùð	Ü ×)Ò)Ñ*:Ó*<¸mÓL×LˆDô ”g˜dÐ$:¸AÓ>×CÐCÀ!ÓDˆØ�aŒ<Ø01ˆDÔ-ÙØ×)Ò)¨QÕ.Õ)Ü�‰ØfÐhl×hqÑhqØ×6Ñ6ô	8ð ×,Ñ,°Ô1Ø01ˆDÔ-Ø×)Ñ)ØjØJöLñ 2ñ MøÜœgÐ&ô 	Úð	üsS   ‚$H§H¿HÁCHÄ2G: ÅG8ÅG: ÅHÅ/B	HÇ8G: Ç:HÈHÈHÈHc                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r   r  rë  r   Nrž   )r   r…  s   "€r   r   r†  Î  s'   ø€ ÷ Dñ D±Cð DÁð DÈñ Dr   c                óî   € V P                   '       d   R# \        P                  WP                  4       \        P
                  ! 4       P                  V P                  \        V4      4      4      V n	        R# )zcSecond consecutive stuck probe: restart polling via the network-error ladder (unless tearing down).N)
r”  r7   r-  r„  r0   rÑ  rÒ  rî  r  râ  )r“  r  rë  s   &&&r   rN  Ú(TelegramAdapter._escalate_stuck_consumerÎ  s^   € à×!×!Ð!ÙÜ�‰�{§I¡IÔ.Ü#*×#;Ò#;Ó#=×#IÑ#IÈ$×JlÑJlÔmyð  {Aó  nBó  KCó  $DˆÖ r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  Õ  s   ø€ ÷ 6ñ 6¨tñ 6r   c                ó"  € V P                   '       g;   V P                  '       g)   V P                  '       g   V P                  4       '       d   R# \	        V R^ 4      p\	        V R^ 4      pW8:  g   V\	        V R^ 4      8w  d   W n        ^ V n        R# \	        V R^ 4      pV\        8¼  d   R# V^,           V n        V^,           \        8  d   R# \	        V R^ 4      pV P                  \        R\         RW,
           R	V R
V RV R24      RR7       R# )aB  Escalate fetched updates PTB's dispatcher is not handing to handlers (#102260, #130407).

``received`` and ``dispatched`` count the same population (every fetched update reaches the
group-99 catch-all: no handler raises ApplicationHandlerStop, no error handler is registered),
so a backlog with no dispatch progress across ``_INGRESS_DISPATCH_STALL_HEARTBEATS`` heartbeats
is a wedged dispatcher at any traffic rate. Hands the adapter to the supervisor for a rebuild once
per stall (``_PollingStallError``: an in-place restart keeps the wedged dispatcher); re-arms on progress.
Nrñ  rò  ró  rô  ré  z>ingress healthy but deaf: PTB dispatcher made no progress for z heartbeats with z' update(s) fetched but not dispatched (z received, z dispatched, generation rE   zingress dispatch stall watchdogr  )
rÂ  r”  rŒ  rè  r]   ró  rô  Ú"_INGRESS_DISPATCH_STALL_HEARTBEATSrï  rx  )r“  ÚreceivedÚ
dispatchedÚstalledr„  s   &    r   r>  Ú-TelegramAdapter._check_ingress_dispatch_stallÕ  s  € ð ××Ð ×!7×!7Ð!7¸4×;O×;OÐ;OÐSW×SkÑSk×SmÒSmÙÜ˜4Ð!:¸AÓ>ˆÜ˜TÐ#>ÀÓBˆ
ØÔ! Z´7¸4ÐA[Ð]^Ó3_Ô%_Ø,6Ô)Ø/0ˆDÔ,ÙÜ˜$Ð =¸qÓAˆØÔ8Ô8ÙØ+2°Q­;ˆÔ(Ø�Q�;Ô;Ô;Ùä˜TÐ#8¸!Ó<ˆ
Ø×'Ñ'ÜØPÔQsÐPtð u#Ø#+Õ#8Ð"9ð :Ø�:˜[¨¨Ð4LÈZÈLÐXYð[ó\ð 5ð 	(ö 	6r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  õ  s   ø€ ÷ -ñ -¨Dñ -r   c              ƒ  ó¸  "  € V P                   '       g;   V P                  '       g)   V P                  '       g   V P                  4       '       d   R# \        P
                  ! 4       p\        V RR4      p\        V RR4      pVe
   W,
          pMVe
   W,
          pMR# V\        8:  d   R# V P                  \        RVR R\        V R^ 4       R24      R	R
7       R# 5i)uq  Watchdog the last successful getUpdates round-trip: a long-poll can wedge without raising
(CLOSE-WAIT after a route flip) while every other probe stays blind; no round-trip for
``_POLLING_STALL_TIMEOUT`` â‡’ raise ``_PollingStallError`` so the recovery path hands the
adapter to the supervisor for a rebuild instead of reusing the wedged Updater.

See #92991, #113618.
Nrð  rï  z getUpdates made no progress for rD   zs (generation ré  z; polling stall watchdog)zpolling stall watchdogr  )
rÂ  r”  rŒ  rè  r}  r~  r]   Ú_POLLING_STALL_TIMEOUTrï  rx  )r“  rD  Úlast_progressÚgeneration_startedÚstalled_fors   &    r   r=  Ú$TelegramAdapter._check_polling_stallõ  sÞ   é € ð ××Ð ×!7×!7Ð!7¸4×;O×;OÐ;OÐSW×SkÑSk×SmÒSmÙÜ�nŠnÓˆÜ Ð&HÈ$ÓOˆÜ$ TÐ+RÐTXÓYÐØÒ$ØÕ-‰KØÒ+àÕ2‰KáØÔ0Ô0Ùð 	×'Ñ'ÜØ2°;¸sÐ2CÀ>ÔRYÐZ^Ð`uÐwxÓRyÐQzð  {Tð  UóVà+ð 	(ö 	-ùs   ‚$C§C¹CÁBCc                ó@   <€ V ^8„  d   QhRS[ RS[P                  RS[/# )r   r„  r  r   )rÚ   r0   rë  rB   )r   r…  s   "€r   r   r†  	  s&   ø€ ÷ =ñ =©#ð =¹¿¹ð =É4ñ =r   c                óú   € V P                   ;'       gi    VP                  4       ;'       gQ    V P                  ;'       g=    V P                  '       * ;'       g$    WP                  8g  ;'       g    W P
                  J# )z]True when a verifier's generation no longer matters (progressed, fatal, replaced, torn down).)r”  r‹  rŒ  rí  ré  rì  )r“  r„  r  s   &&&r   Ú_verifier_staleÚTelegramAdapter._verifier_stale	  sy   € ð ×"Ñ"÷ <ð < h§o¡oÓ&7÷ <ð <¸4×;OÑ;O÷ <ð <Ø×3Ñ3Ô3÷<ð <Ø7A×E]ÑE]Ñ7]÷<ð <à×;Ñ;Ð;ð	=r   c                ó^   <€ V ^8„  d   QhRS[ S[,          RS[ S[P                  ,          RR/# rÉ  )r   rÚ   r0   rë  )r   r…  s   "€r   r   r†  	  s=   ø€ ÷ ']ñ ']ÁÉÅð ']Ñ`hÑip×ivÑivÕ`wð ']ð  DHñ ']r   c              ƒ  óú  "  € ^
pV P                   '       d   R# Vf   V P                  pVf   V P                  p\        P                  ! \
        P                  4      ;_uu_ 4        \
        P                  ! VP                  4       \        R7      G Rj  x€L
  RRR4       V P                  W4      '       d   R# V P                  pV'       d/   VP                  '       d   VP                  P                  '       g?   \        P                  RV P                   4       V P#                  \%        R4      RR7       R#  \
        P                  ! VP&                  P)                  4       V4      G Rj  x€L
  T P                  Y4      '       d   R# T P#                  \1        R
4      RR7       R#  EL  + '       g   i     EL; i LR  \*         d­   pT P                  Y4      '       d    Rp?R# T P-                  T4      '       g1   \        P                  RT P                   \/        T4      4        Rp?R# \        P                  RT P                   \/        T4      4       T P#                  TR	R7        Rp?R# Rp?ii ; i5i)z´Require getUpdates progress, using getMe only to classify failure: a general-path getMe
success cannot heal polling health. Connectivity failures enter the guarded recovery ladder.Nr`  z;[%s] Updater made no getUpdates progress and is not runningz3Updater not running after polling progress deadlinez.polling progress verifier: updater not runningr  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)r”  ré  rì  r%  r&  r0   rG   r:  rÒ   Ú_POLLING_PROGRESS_TIMEOUTrd  r¸  rÀ  r"  r7   r-  r„  rï  r  rf   r8  r*   rs  r,   rx  )r“  r„  r  r@  rk   rF  s   &&&   r   rÓ  Ú/TelegramAdapter._verify_polling_after_reconnect	  sö  é € ð ˆØ×!×!Ð!ÙØÒØ×1Ñ1ˆJØÒØ×3Ñ3ˆHÜ× Ò ¤×!5Ñ!5×6Õ6Ü×"Ò" 8§=¡=£?Ô<UÔV×VÐV÷ 7à×Ñ 
×5Ò5ÙØ�i‰iˆß˜ŸŸ˜¨¯©×(;×(;Ð(;Ü�N‰NÐXÐZ^×ZcÑZcÔdØ×+Ñ+ÜÐRÓSØGð ,ô Iñ ð	Ü×"Ò" 3§7¡7§>¡>Ó#3°]ÓC×CÐCð ×Ñ 
×5Ò5ÙØ×'Ñ'ÜÐUÓVØ[ð 	(ö 	]ò5 W÷ 7×6Ð6úñ DøÜô 	Ø×#Ñ# J×9Ò9ÝØ×1Ñ1°)×<Ò<Ü—‘ØdÐfj×foÑfoÜ/°	Ó:ô<õ Ü�N‰NØNÐPT×PYÑPYÔ[vð  xAó  \BôCà×+Ñ+¨IÐ>nÐ+ÔoÝûð	üsœ   ‚A#I;Á%.F+ÂF(ÂF+Â4I;ÃI;ÃI;Ã;>I;Ä:2G Å,F?Å-G Å17I;Æ(F+Æ+F<	Æ6	I;Æ?G ÇI8ÇI3Ç#I;Ç)I3È *I3È*I;È0=I3É-I;É3I8É8I;c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  B	  s   ø€ ÷ ñ ¨ñ r   c                ó¦  € V P                   '       d   \        V P                   RR4      MRpVf   R# R Fy  p\        WR4      p\        V\        P                  4      '       g   K1  VP                  4       '       g2   VP                  4        \        P                  RV P                  V4        R# 	  \        P                  RV P                  4       R# )aS  Synchronously stop PTB's internal polling retry loop.

PTB's ``network_retry_loop`` calls our ``error_callback`` *synchronously* on a 409 Conflict then polls again; our
callback only schedules async recovery, so two sessions overlap and Telegram 409s on a ~31s cadence. Setting PTB's
private ``stop_event`` makes its loop exit on the next tick; ``updater.stop()`` + drain + ``start_polling()`` then build
a fresh one. Best-effort across PTB spellings. Deliberately NOT flipping ``updater._running``: stop() raises when
already False, which would skip the real teardown and poison the next start.rÀ  Nz+[%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())Ú!_Updater__polling_task_stop_eventÚ_polling_task_stop_event)
r¸  r]   r5  r0   rë  r‹  rX   r7   r8   r„  )r“  rÀ  ÚattrÚ
stop_events   &   r   Ú_disarm_ptb_retry_loopÚ&TelegramAdapter._disarm_ptb_retry_loopB	  s    € ð :>¿¿¸”'˜$Ÿ)™) Y°Ô5ÈˆØŠ?ÙÛUˆDÜ  °Ó5ˆJÜ˜*¤g§m¡m×4Ô4Ø!×(Ñ(×*Ò*Ø—N‘NÔ$Ü—L‘LÐ!NÐPT×PYÑPYÐ[_Ô`Úñ Vô 	�‰ð DØ�I‰Iö	r   c                ó$   <€ V ^8„  d   QhRS[ RR/# r±  r²  )r   r…  s   "€r   r   r†  X	  s   ø€ ÷ \6ñ \6±Ið \6À$ñ \6r   c              ƒ  ó²	  "  € V P                   '       d   R# V P                  '       d   V P                  R8X  d   R# V ;P                  ^,          un        ^p^
V P                  ^
,          ,           pV P                  V8:  Edj   \        P                  RV P                  V P                  VV\        V4      4       V P                  V P                  R4      G Rj  x€L
 '       g   R# \        P                  ! V4      G Rj  x€L
  V P                   '       d   R# V P                  4       G Rj  x€L
  V P                   '       d   R# V P                  pV P                  ^,           pV'       g   \        R4      hWPn         V P!                  VRV P"                  R7      G Rj  x€L
  \        P%                  RV P                  V P                  V4        V P                  V8X  d
   RV n        R# R# V P                   '       d   R# R
V R\/        R \1        ^V^,           4       4       4       R2p\        P3                  RV P                  V\        V4      4       V P                  ;'       d    V P                  R8H  pV P5                  RVRR7        V P                  '       dX   V P                  P6                  '       d<   \9        V P                  P6                  P;                  4       \<        R7      G Rj  x€L
  T'       g   T PA                  4       G Rj  x€L
  R# R#  ELA EL ELõ EL…  \&         d     T P                  T8X  d
   RT n        R# R# \(         dÖ   pT P                   '       d!    Rp?T P                  T8X  d
   RT n        R# R# \        P                  R	T P                  T P                  T\        T4      4       T P                  T8  dS   T P                   '       gA   T P+                  T P-                  T4      4        Rp?T P                  T8X  d
   RT n        R# R#  Rp?MRp?ii ; iT P                  T8X  d   RT n        EL^  T P                  T8X  d	   RT n        i i ; i ELw  \>         d%    \        P                  RT P                  4        EL£\(         d/   p	\        P                  RT P                  T	RR7        Rp	?	ELÖRp	?	ii ; i ELÃ5i)u   Recover a 409 Conflict: the previous gateway process was killed but Telegram holds its
getUpdates session ~30s. Stop, wait (growing delay), drain, restart â€” MAX_CONFLICT_RETRIES
times before going fatal; a failed retry must never return silently (limbo).NÚtelegram_polling_conflictuŠ   [%s] Telegram polling conflict (%d/%d) â€” previous session still held open on Telegram's servers. Waiting %ds for it to expire. Error: %szconflict-retryz<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.z)Telegram polling could not recover after z
 retries (c              3   óB   "  € T F  p^
V^
,          ,           x € K  	  R# 5i)é
   NrQ   rÿ  s   & r   rT   Ú;TelegramAdapter._handle_polling_conflict.<locals>.<genexpr> 	  s   é € ÐLÑ)K A�B˜˜R�—K’KÓ)Kùó   ‚a  s 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'.z[%s] %s Original error: %sFr)  r`  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: %sr3   )!r”  rŒ  Úfatal_error_coderç  r7   r-  r„  r,   r%  r¸  r0   rC  r[  ré  r  rê  rÆ  rî  rç   rt  r*   r)  r  ÚsumÚranger   r*  rÀ  rK   r#  r$  rG   r  )
r“  r   ÚMAX_CONFLICT_RETRIESÚRETRY_DELAYrk   Úexpected_generationr4  r%  Ú_already_fatalÚ
stop_errors
   &&        r   r  Ú(TelegramAdapter._handle_polling_conflictX	  s^  é € ð ×!×!Ð!ÙØ××Ð D×$9Ñ$9Ð=XÔ$XÙØ×$Ò$¨Õ)Õ$Ø Ðà˜D×8Ñ8¸2Õ=Õ>ˆØ×'Ñ'Ð+?Õ?Ü�N‰Nð[à—	‘	˜4×7Ñ7Ð9MØÔ8¸Ó?ô	Að ×7Ñ7¸¿	¹	ÐCSÓT×TÖTÙÜ—-’- Ó,×,Ð,Ø×%×%Ð%ÙØ×1Ñ1Ó3×3Ð3Ø×%×%Ð%Ùà—)‘)ˆCð #'×":Ñ":¸QÕ">ÐßÜ"Ð#aÓbÐbð :MÔ6ðFØ×.Ñ.¨sÈÐ^b×^~Ñ^~Ð.Ó×ÐÜ—‘ØtØ—I‘I˜t×;Ñ;Ð=QôSð ð  ×=Ñ=ÐATÔTØAE�DÖ>ñ Uà×!×!Ð!Ùð 8Ð8LÐ7Mð NÜÑL¬¨qÐ2FÈÕ2JÔ)KÓLÓLÐMð NWðWð 	ô 	�‰Ð1°4·9±9¸gÔGbÐchÓGiÔjð ×-Ñ-×fÐf°$×2GÑ2GÐKfÑ2fˆØ×ÑÐ9¸7ÈeÐÔTð		Ø�y�yˆy˜TŸY™Y×.×.Ð.Ü1°$·)±)×2CÑ2C×2HÑ2HÓ2JÔTiÔj×jÐj÷ Ø×3Ñ3Ó5×5Ò5ñ òQ Uâ,ò 4ò* @øô
 *ô Øð ×=Ñ=ÐATÔTØAE�DÖ>ñ Uô ô 
Ø×)×)Ð)Ûð ×=Ñ=ÐATÔTØAE�DÖ>ñ Uô —‘Ø\Ð^b×^gÑ^gØ×0Ñ0Ð2FÔHcÐdmÓHnôpð ×/Ñ/Ð2FÔFÈt×Oe×OeÐOeà×1Ñ1°$×2OÑ2OÐPYÓ2ZÔ[Ûð ×=Ñ=ÐATÔTØAE�DÖ>ñ Uÿøð
úð ×=Ñ=ÐATÔTØAE�DÔ>úð ×=Ñ=ÐATÔTØAE�DÕ>ð Uúò$ køÜô 	`Ü�N‰Nð  Tð  VZ÷  V_ñ  V_÷  `Üô 	Ü�N‰NØ]Ð_c×_hÑ_hÐjtØð ÷ ò ûð	úò 6ùsQ  ‚&S©B0SÃLÃ	SÃ$SÃ?LÄ SÄSÄ+L Ä,SÅ(SÅ+SÅ=!L& ÆL#Æ0L& Ç-SÇ>BSÊQ+ ÊQ+ Ê;6Q+ Ë1Q(Ë2Q+ Ë6SË>SÌSÌ	SÌSÌ SÌ#L& Ì&P-Ì1Q
 Ì2SÍP-ÍP-ÍP(Í*Q
 Í.SÎ
AP(Ï# P(ÐQ
 ÐSÐ#Q
 Ð(P-Ð-Q
 Ð0SÑ
Q%Ñ%SÑ(Q+ Ñ++SÒSÒSÒ"SÒ##SÓSÓSÓSc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  ¶	  s   ø€ ÷ )ñ )°Dñ )r   c              ƒ  óÊ   "  € \         P                  ! 4       pV P                  VJ d   RV n        \        V RR4      VJ d   RV n        V P                  4       G Rj  x€L
  R#  L5i)z´Notify the runner without letting child teardown cancel this owner: ``disconnect()`` cancels
the tracked recovery/heartbeat tasks, so release only the current owner from its field.Nrä  )r0   Úcurrent_taskrâ  r]   rä  Ú_notify_fatal_error)r“  r„  s   & r   r  Ú,TelegramAdapter._handoff_polling_fatal_error¶	  sW   é € ô ×+Ò+Ó-ˆØ×#Ñ# |Ó3Ø'+ˆDÔ$Ü�4Ð2°DÓ9¸\ÓIØ+/ˆDÔ(Ø×&Ñ&Ó(×(Ô(ùs   ‚AA#ÁA!ÁA#c                óh   <€ V ^8„  d   QhRS[ RS[RS[S[ ,          RS[S[,          RS[S[ ,          /# )r   r±  r„  Ú
icon_colorÚicon_custom_emoji_idr   )rÚ   r   r   )r   r…  s   "€r   r   r†  À	  sQ   ø€ ÷  ñ  Ùð Ù"%ð Ù3;¹Cµ=ð Ù_gÑhkÕ_lð ñ yAñ  BEõ  yFñ r   c           
   ƒ  óŽ  "  € V P                   '       g   R#  RVRV/pVe   W5R&   V'       d   WER&   V P                   P                  ! R/ VB G Rj  x€L
 pVP                  p\        P	                  RV P
                  W!V4       V#  L4  \         d°   p\        T4      P                  4       p	RT	9   g   RT	9   d#   \        P	                  R	T P
                  Y!4       M[R
T	9   g   RT	9   d#   \        P                  RT P
                  Y!4       M+\        P                  RT P
                  Y!\        T4      4        Rp?R# Rp?ii ; i5i)zVCreate a forum topic in a private (DM) chat (Bot API 9.4+); message_thread_id or None.Nr±  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_disableda`  [%s] Cannot create DM topic '%s' in chat %s: Threaded Mode is not enabled. The bot owner must open the BotFather Mini App (search 'botfather' in Telegram, tap Open on the search result) -> My bots -> this bot -> Bot Settings -> Threads Settings -> enable Threaded Mode. This cannot be enabled from the DM chat, nor from the BotFather /mybots text menu.z2[%s] Failed to create DM topic '%s' in chat %s: %srQ   )rÁ  Úcreate_forum_topicr—  r7   rç   r„  r*   r   rø   r-  r,   )
r“  r±  r„  rˆ  r‰  r¥   Útopicrx  r  Ú
error_texts
   &&&&&     r   Ú_create_dm_topicÚ TelegramAdapter._create_dm_topicÀ	  s4  é € ð �y�yˆyÙð	Ø&/°¸&À$Ð%GˆFØÒ%Ø'1�|Ñ$ß#Ø1EÐ-Ñ.ØŸ)™)×6Ò6Ñ@¸Ñ@×@ˆEØ×/Ñ/ˆIÜ�K‰KÐOÐQU×QZÑQZÐ\`ÐktÔuØÐñ Aøô ô 	Ü˜Q›Ÿ™›ˆJà%¨Ô3°yÀJÔ7NÜ—‘ØjÐlp×luÑluÐw{õFà *Ô,Ð0AÀZÔ0OÜ—‘ðRð
 —I‘I˜tõ.ô —‘ØHÈ$Ï)É)ÐUYÔdð  ABó  eCôDåûð#	üsF   ‚E˜B ®#B ÁBÁ3B ÂEÂB ÂEÂB$D=Ä7EÄ=EÅEc                ó<   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          /# )r   Úparent_chat_idr„  r   ©r   r   )r   r…  s   "€r   r   r†  â	  s'   ø€ ÷ 5ñ 5¹#ð 5ÁSð 5ÉXÑVYÍ]ñ 5r   c              ƒ  ó´   "  €  \        V4      pT P                  Y2R7      G Rj  x€L
 pT'       d   \	        T4      # R#   \        \        3 d     R# i ; i L15i)zRCreate a forum topic for a session handoff; ``message_thread_id`` as str, or None.N©r„  )rÚ   rÝ   rÞ   r‘  r   )r“  r”  r„  Úchat_id_intrx  s   &&&  r   Úcreate_handoff_threadÚ%TelegramAdapter.create_handoff_threadâ	  sY   é € ð	Ü˜nÓ-ˆKð ×/Ñ/°Ð/ÓG×Gˆ	ß!*Œs�9‹~Ð4°Ð4øô œ:Ð&ô 	Úð	úáGùs4   ‚A„> �A¤A¥A±A¾AÁAÁAÁAc          	      óB   <€ V ^8„  d   QhRS[ RS[ RS[RS[S[ ,          /# )r   r±  Ú
topic_nameÚforce_creater   )r   rB   r   )r   r…  s   "€r   r   r†  ë	  s1   ø€ ÷ &ñ &©Sð &¹cð &ÑQUð &ÑbjÑknÕboñ &r   c              ƒ  óR  a"  € \        T;'       g    R4      P                  4       oS'       g   R#  \        V4      pT RS 2pT P
                  P                  T4      pT'       d   T'       g   \        T4      # RpRpT P                   FU  p	\        T	P                  R4      4      \        T4      8w  d   K-  T	p\        T3R lT	P                  R. 4       4       R4      p M	  T'       dK   TP                  R4      '       d4   T'       g,   \        TR,          4      p
Y P
                  T&   \        T
4      # Tf"   RTR. /pT P                  P                  T4       Tf&   RS/pTP                  R. 4      P                  T4       T P                  TSTP                  R	4      TP                  R
4      R7      G Rj  x€L
 p
T
'       g   R# Y§R&   \        T
4      T P
                  T&   T P                  TS\        T
4      TR7       \        T
4      #   \        \        3 d     R# i ; i Lk5i)zJReturn a private DM topic thread id, creating and persisting it if needed.r!   Nr¬   r±  c              3   óV   <"  € T F  qP                  R 4      S8X  g   K  Vx € K   	  R# 5i©r„  N©r  )rR   Úcr„  s   & €r   rT   Ú2TelegramAdapter.ensure_dm_topic.<locals>.<genexpr>þ	  s#   øé € Ð[Ñ*A QÇUÁUÈ6Ã]ÐVZÑEZŸqšqÓ*Aùs   ƒ)Ÿ
)Útopicsrx  r„  rˆ  r‰  )r„  rˆ  r‰  )Úreplace_existing)r   r  rÚ   rÝ   rÞ   rü  r  r  r  rd  Ú
setdefaultr‘  Ú_persist_dm_topic_thread_id)r“  r±  rœ  r�  r˜  Ú	cache_keyÚcachedÚ
topic_confÚ
chat_entryÚentryrx  r„  s   &&&&       @r   Úensure_dm_topicÚTelegramAdapter.ensure_dm_topicë	  sü  øé € ä�:×#Ð# Ó$×*Ñ*Ó,ˆßÙð	Ü˜g›,ˆKð #�m 1 T FÐ+ˆ	Ø—‘×$Ñ$ YÓ/ˆßŸ,Ü�v“;ÐØ/3ˆ
Ø/3ˆ
Ø×+Ô+ˆEÜ�5—9‘9˜YÓ'Ó(¬C°Ó,<Ô<ÙØˆJÜÔ[¨%¯)©)°H¸bÔ*AÓ[Ð]aÓbˆJÙñ ,÷ ˜*Ÿ.™.¨×5Ò5¿lÜ˜J {Õ3Ó4ˆIØ)2�O‰O˜IÑ&Ü�y“>Ð!ØÒØ# [°(¸BÐ?ˆJØ×"Ñ"×)Ñ)¨*Ô5ØÒØ  $˜ˆJØ×!Ñ! (¨BÓ/×6Ñ6°zÔBØ×/Ñ/Ø˜d¨z¯~©~¸lÓ/KÐbl×bpÑbpð  rHó  cIð 0ó J÷ Jˆ	çÙØ"+�;ÑÜ%(¨£^ˆ�‰˜	Ñ"Ø×(Ñ(¨°d¼CÀ	»NÐ]iÐ(ÔjÜ�9‹~Ðøô? œ:Ð&ô 	Úð	úñ0Jùs_   ƒ+H'¯H'²H ½)H'Á'H'Á/A;H'Ã+H'ÄH'Ä
B/H'Æ9H%Æ:H'ÇAH'ÈH"ÈH'È!H"È"H'c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[RR/# )r   r±  rx  r„  r   N)rÚ   r   )r   r…  s   "€r   r   r†  
  s0   ø€ ÷ 	rñ 	r©Sð 	r¹Sð 	rÉð 	rÐPTñ 	rr   c              ƒ  ó&  "  € V P                   '       g   R#  \        V4      pV P                   P	                  V\        V4      VR7      G Rj  x€L
  \
        P                  RV P                  WV4       R#   \        \        3 d    Tp Lhi ; i LA5i)z,Rename a forum topic in a private (DM) chat.N)r±  r—  r„  z5[%s] Renamed DM topic in chat %s thread_id=%s -> '%s')rÁ  rÚ   rÝ   rÞ   Úedit_forum_topicr7   rç   r„  )r“  r±  rx  r„  Úchat_id_args   &&&& r   Úrename_dm_topicÚTelegramAdapter.rename_dm_topic
  s   é € à�y�yˆyÙð	"Ü˜g›,ˆKð �i‰i×(Ñ(°ÔPSÐT]ÓP^ÐeiÐ(Ój×jÐjÜ�‰ÐKÈTÏYÉYÐX_ÐlpÖqøô œ:Ð&ô 	"Ø!ŠKð	"úájùs3   ‚B˜A6 £*BÁBÁ(BÁ6BÂ	BÂBÂBc          
      ó6   <€ V ^8„  d   QhRS[ RS[RS[ RS[RR/# )r   r±  rœ  rx  r¥  r   N)rÚ   r   rB   )r   r…  s   "€r   r   r†  
  s>   ø€ ÷ %jñ %j±3ð %jÁCð %jÑTWð %jÑkoð %jð  }Añ %jr   c           	     ó  a€  ^ RI Hp V! 4       R,          pVP                  4       '       g$   \        P	                  RV P
                  V4       R# ^ RIHpHp V! V4      p	V	P                  R/ 4      P                  R/ 4      P                  R/ 4      P                  R	. 4      p
R
pRpV
 F³  p \        VP                  R^ 4      4      \        V4      8w  d   K/   TpTP                  R. 4      p\        T3R lT 4       R4      pTf   TP                  RSRT/4       RpM=T'       g   TP                  ! R4      '       g   TP                  ! R4      T8w  d   Y?R&   Rp M	  Vf   V
P                  RVRRSRV/./4       RpV'       d-   V! Wi4       \        P!                  RV P
                  VS4       R# R#   \        \        3 d     EK"  i ; i  \"         d/   p\        P	                  RT P
                  TRR7        Rp?R# Rp?ii ; i)zMSave a newly created thread_id back into config.yaml so it survives restarts.rœ  zconfig.yamlz:[%s] Config file not found at %s, cannot persist thread_idN)Úatomic_config_writeÚread_user_config_rawÚ	platformsr<   r·  r°  Fr±  r¤  c              3   óX   <"  € T F  qP                   ! R 4      S8X  g   K  Vx € K!  	  R# 5ir   r¡  )rR   rŠ   rœ  s   & €r   rT   Ú>TelegramAdapter._persist_dm_topic_thread_id.<locals>.<genexpr>4
  s    øé € ÐK¡V ¯uªu°V«}À
Ñ/JŸ!š!£Vùs   ƒ* 
*r„  rx  Tz9[%s] Persisted thread_id=%s for topic '%s' in config.yamlz.[%s] Failed to persist thread_id to config: %sr3   )r¼  r�  Úexistsr7   r-  r„  Úhermes_cli.configr·  r¸  r¦  rÚ   r  rÝ   rÞ   r  rd  rç   r*   )r“  r±  rœ  rx  r¥  r�  Úconfig_pathr·  r¸  rš  r°  ÚchangedÚmatching_chat_entryr«  r¤  rŠ   r  s   &&f&&            r   r§  Ú+TelegramAdapter._persist_dm_topic_thread_id
  sý  ø€ ð#	jÝ8Ù)Ó+¨mÕ;ˆKØ×%Ñ%×'Ò'Ü—‘Ð[Ð]a×]fÑ]fÐhsÔtÙßSÙ)¨+Ó6ˆFà×)Ñ)¨+°rÓ:×EÑEÀjÐRTÓU×`Ñ`ÐahÐjlÓm×xÑxð  zEð  GIó  JˆIØˆGØ"&ÐÛ'�
ðÜ˜:Ÿ>™>¨)°QÓ7Ó8¼CÀ»LÔHÙ ð Ið '1Ð#Ø#×.Ñ.¨x¸Ó<�ÜÔK¡VÓKÈTÓR�Ø’9Ø—M‘M 6¨:°{ÀIÐ"NÔOØ"‘Gß&¨a¯eªe°K×.@Ò.@ÀaÇeÂeÈKÓFXÐ\eÔFeØ%.�k‘NØ"�GÙñ (ð  #Ò*Ø× Ñ  )¨W°hÀ&È*ÐVaÐclÐAmÐ@nÐ!oÔpØ�ßÙ# KÔ8Ü—‘ÐWÐY]×YbÑYbÐdmÐoyÖzñ øô "¤:Ð.ô Ûðûô$ ô 	jÜ�N‰NÐKÈTÏYÉYÐXYÐdhˆN×iÒiûð	jús[   ƒ)G ­!G ÁAG Â,)F5ÃAG Ä&G Ä>AG Æ*G Æ5GÇG Ç
GÇG ÇHÇ#HÈHc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  E
  s   ø€ ÷ "xñ "x¨ñ "xr   c           
   ƒ  óB  "  € V P                   ;'       g    R EFÀ  pVP                  R4      pVP                  R. 4      pV'       d	   V'       g   K9  \        P                  RV P                  \        V4      V4       V EFU  pVP                  R4      pV'       g   K  V RV 2pVP                  R4      pV'       d<   \        V4      V P                  V&   \        P                  RV P                  Wg4       Kz  V P                  \        V4      WTP                  R4      VP                  R	4      R
7      G Rj  x€L
 pV'       g   KÇ  W€P                  V&   \        P                  RV P                  Wh4       V P                  \        V4      WX4        \        V P                  P                  \        V4      VRV 2R7      \        RRR7      G Rj  x€L
  EKX  	  EKÃ  	  R#  L¨ L  \         d.   p	\        P!                  RT P                  YY4        Rp	?	EK˜  Rp	?	ii ; i5i)zÂLoad or create configured DM topics: ``extra['dm_topics']`` is ``[{"chat_id", "topics": [{"name",
"icon_color", "thread_id"?, "skill"?}]}]``; persisted thread_ids are cached without an API call.r±  r¤  z*[%s] Setting up %d DM topic(s) for chat %sr„  r¬   rx  z4[%s] DM topic loaded from config: %s -> thread_id=%srˆ  r‰  )r±  r„  rˆ  r‰  Nz([%s] DM topic cached: %s -> thread_id=%su   ðŸ“Œ )r±  r—  r+   r/  FrL  z2[%s] Could not send seed message to topic '%s': %srQ   )r  r  r7   rç   r„  r+  rÚ   rü  r‘  r½   r§  rK   rÁ  Úsend_messager3  r*   r8   )
r“  r«  r±  r¤  rª  rœ  r¨  Úexisting_thread_idrx  Úseed_errs
   &         r   Ú_setup_dm_topicsÚ TelegramAdapter._setup_dm_topicsE
  sð  é € ð ×0Ñ0×6Ð6°BÓ6ˆJØ —n‘n YÓ/ˆGØ—^‘^ H¨bÓ1ˆFß§&ÙÜ�K‰KÐDÀdÇiÁiÔQTÐU[ÓQ\Ð^eÔfÜ$�
Ø'Ÿ^™^¨FÓ3�
ß!ÙØ&˜i q¨¨Ð5�	Ø%/§^¡^°KÓ%@Ð"ß%Ü14Ð5GÓ1H�D—O‘O IÑ.Ü—K‘KÐ VÐX\×XaÑXaÐclô  BÙØ"&×"7Ñ"7Ü6°wÓ?Àj×]kÑ]kÐlxÓ]yØ)3¯©Ð8NÓ)Oð #8ó #Q÷ Q�	÷ !ÙØ-6—‘ 	Ñ*Ü—‘ÐFÈÏ	É	ÐS\ÔhØ×0Ñ0´°W³¸zÔUðxÜ5ØŸ	™	×.Ñ.Ü$>¸wÓ$GÐ[dÐmxð  zDð  yEð  lFð /ó Gä 3¸?Ðafôh÷ hó hô) %ó 7ñ Qñhøô !ô xÜ—L‘LÐ!UÐW[×W`ÑW`Ðbl×wÓwûðxüsc   ‚AHÁA-HÂ>A9HÄ7G Ä8HÅAHÆ>G$ÇG"ÇG$ÇHÇ"G$Ç$HÇ/!HÈHÈHÈHc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  i
  s   ø€ ÷ oñ o°$ñ or   c              ƒ  ó€  "  €   \         P                  ! V P                  4      G Rj  x€L
  V P                  '       g   V P                  '       d   R# V P                  RR7      G Rj  x€L
  Kl   LF L  \         P                   d     R# \         d'    \        P                  RT P                  RR7        K·  i ; i5i)zXKeep the cached @username fresh in webhook mode (no heartbeat calls ``get_me()`` there).TNr%   z4[%s] Telegram identity refresh loop iteration failedr3   )r0   rC  Ú_BOT_IDENTITY_TTL_SECONDSr”  rŒ  Ú_refresh_bot_identityr6   r*   r7   r8   r„  r’  s   &r   Ú_bot_identity_refresh_loopÚ*TelegramAdapter._bot_identity_refresh_loopi
  sž   é € àðoÜ—m’m D×$BÑ$BÓC×CÐCØ×)×)Ð)¨T×-A×-AÐ-AÙØ×0Ñ0°tÐ0Ó<×<Ò<ñ Dñ =øÜ×)Ñ)ô ÚÜô oÜ—‘ÐSÐUY×U^ÑU^Ðim�×nðoüsm   ‚B>…#A3 ¨A/©A3 ¿A3 ÁB>ÁA3 Á(A1Á)A3 Á-B>Á/A3 Á1A3 Á3B;ÂB>ÂB;Â#B;Â7B>Â:B;Â;B>c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  v
  s   ø€ ÷ _ñ _°$ñ _r   c                ó°   € V P                   pV'       d   VP                  4       '       g   R# \        P                  ! V P	                  4       4      V n         R# )zVKick off deferred post-connect housekeeping; idempotent while a task is still running.N)ræ  r{  r0   ro  Ú_run_post_connect_housekeeping)r“  r.   s   & r   Ú _start_post_connect_housekeepingÚ0TelegramAdapter._start_post_connect_housekeepingv
  s9   € à×&Ñ&ˆß˜Ÿ	™	ŸšÙÜ")×"7Ò"7¸×8[Ñ8[Ó8]Ó"^ˆÖr   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  }
  s   ø€ ÷ Kñ K¨dñ Kr   c           	   ƒ  ó*  "  € ^ RI HpHpHpHp ^ RIHpHp V P                  '       g   R# V! 4       p\        P                  ! WWR7      G Rj  x€L
 w  r‰V P                  V4      p
V P                  V4      pV\        V RR4      8w  d!   V P                  P                  4        W°n        WBV3 Fn  p\        VR\#        V4      4      p V P                  P%                  W¬! 4       R7      G Rj  x€L
  \&        P)                  R	V P*                  V\-        V
4      4       Kp  	  V	'       d.   \&        P)                  RV P*                  \-        V4      W—4       R# R#  EL Lm  \.         d-   p\&        P1                  R
T P*                  YÞ4        Rp?Kà  Rp?ii ; i5i)u¸   Register the command menu (from COMMAND_REGISTRY) in every scope â€” Telegram picks the
narrowest matching one per chat type; forum topics are handled lazily by _ensure_forum_commands.)Ú
BotCommandÚBotCommandScopeAllPrivateChatsÚBotCommandScopeAllGroupChatsÚBotCommandScopeDefault©Útelegram_menu_commandsÚtelegram_menu_max_commandsN©Úmax_commandsrÿ  r!   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.)r<   rÖ  r×  rØ  rÙ  Úhermes_cli.commands_platformsrÛ  rÜ  rÁ  r0   Ú	to_threadÚ_bot_commandsÚ_menu_fingerprintr]   rþ  r,  rÿ  r   Úset_my_commandsr7   rç   r„  r+  r*   r-  )r“  rÖ  r×  rØ  rÙ  rÛ  rÜ  rÞ  Úmenu_commandsÚhidden_countÚbot_commandsÚfingerprintÚ	scope_clsÚ
scope_nameÚ	scope_errs   &              r   Ú_register_command_menuÚ&TelegramAdapter._register_command_menu}
  sQ  é € ÷ 	~Ó}ßdØ�y�yˆyÙá1Ó3ˆô -4×,=Ò,=Ð>TÔ,p×&pÑ#ˆØ×)Ñ)¨-Ó8ˆð ×,Ñ,¨]Ó;ˆØœ' $Ð(CÀRÓHÔHØ×*Ñ*×0Ñ0Ô2Ø-8Ô*Ø0ÐRnÓoˆIÜ  ¨J¼¸I»ÓGˆJðqØ—i‘i×/Ñ/°ÀIÃKÐ/ÓP×PÐPÜ—‘ÐLÈdÏiÉiÐYcÔehÐiuÓevÖwñ	 p÷ Ü�K‰KØuØ—	‘	œ3˜}Ó-¨|öKñ ò 'qñ Qøäô qÜ—‘ÐMÈtÏyÉyÐZd×pÒpûðqüsU   ‚A
FÁEÁA7FÃ$EÃ)EÃ*/EÄFÄ%0FÅEÅFÅ$!FÆFÆFÆFc                ó    <€ V ^8„  d   QhRS[ /# r�   ©rT  )r   r…  s   "€r   r   r†  �
  s   ø€ ÷ tñ t©ñ tr   c                óˆ   € ^ RI Hp V  UUu. uF(  w  r#T! T\        T;'       g    R4      R\         4      NK*  	  upp# u uppi )zW``BotCommand`` rows; Telegram caps a description at 256 chars (longer locales get cut).)rÖ  r!   N)r<   rÖ  r   Ú_BOT_COMMAND_DESCRIPTION_LIMIT)ræ  rÖ  r„  Údescs   &   r   rã  ÚTelegramAdapter._bot_commandsœ
  s?   € õ 	(ÙerÔsÑerÑWaÐW[‘
˜4¤ T§Z Z¨R£Ð1PÔ2PÐ!QÖRÑerÒsÐsùÓss   Œ>¤>c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  £
  s   ø€ ÷ Cñ C©Cñ Cr   c           	     óÎ   € ^ RI p\        \        4       V  Uu. uF  p\        V4      NK  	  up.4      pVP                  ! VP                  R4      4      P                  4       # u upi )é    Nrî   )ÚhashlibÚreprr‰   rü  Úsha256ÚencodeÚ	hexdigest)ræ  rø  Úrowrå  s   &   r   rä  Ú!TelegramAdapter._menu_fingerprint¢
  sP   € ãÜœ›¹}Ó(M¹}¸¬¨s®¹}Ñ(MÐNÓOˆØ�~Š~˜gŸn™n¨WÓ5Ó6×@Ñ@ÓBÐBùò )Ns   —A"
c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  ¨
  s   ø€ ÷ /ñ /°dñ /r   c              ƒ  ó  "  €   V P                  4       G Rj  x€L
  \        P                  ! \        4      ;_uu_ 4        V P                  RR7      G Rj  x€L
  RRR4        V P                  4       G Rj  x€L
  T P                  \        P                  ! 4       J d
   RT n        R# R#  L�  \         d7   p\        P                  RT P                  \        T4      RR7        Rp?LÊRp?ii ; i L™  + '       g   i     LŸ; i L�  \         d.   p\        P                  RT P                  TRR7        Rp?L¾Rp?ii ; i  \        P                   d    h i ; i  T P                  \        P                  ! 4       J d	   RT n        i i ; i5i)uÍ   Command menu, status indicator and DM topics off the connect path; every step is non-fatal.

DM topics â€” all off the connect path so a slow Bot API call cannot blow the gateway connect timeout
(#46298).
Nz1[%s] Could not register Telegram command menu: %sTr3   ©Úonlinez+[%s] DM topics setup failed (non-fatal): %s)rí  r*   r7   r-  r„  r,   r%  r&  Ú_set_status_indicatorrÇ  r0   r6   ræ  r„  )r“  r  Ú
topics_errs   &  r   rÑ  Ú.TelegramAdapter._run_post_connect_housekeeping¨
  sY  é € ð	/ðCØ×1Ñ1Ó3×3Ð3ô ×$Ò$¤Y×/Õ/Ø×0Ñ0¸Ð0Ó=×=Ð=÷ 0ðtØ×+Ñ+Ó-×-Ð-ð ×&Ñ&¬'×*>Ò*>Ó*@Ó@Ø*.�Ö'ñ Añ 4øÜô CÜ—‘ØGÈÏÉÔToÐpqÓTrð  ~Bð ÷ Cñ CûðCúñ >÷ 0×/úñ .øÜô tÜ—‘ÐLÈdÏiÉiÐYcÐnr�×sÑsûðtûä×%Ñ%ô 	Øð	ûð ×&Ñ&¬'×*>Ò*>Ó*@Ó@Ø*.�Õ'ð AüsÀ   ‚F…B+ ˜B)™B+ �"E ¿C1ÁC/ÁC1ÁE Á#D Á6DÁ7D Á;.FÂ)B+ Â+C,Â6,C'Ã"E Ã'C,Ã,E Ã/C1Ã1D	Ã<E ÄD ÄD>Ä#D9Ä4E Ä8E Ä9D>Ä>E ÅEÅE Å-FÆFc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  À
  s   ø€ ÷ añ a¸Dñ ar   c              ƒ  ó€  "  € \        V RR4      pVe   VP                  4       f   \        V R^ 4      ^,           V n        \        V RR4      pVf   R#  ^ RIHp V! R4      '       g   R# V P                  V4      pTf   R#  T P                  T4      pT P                  4        T! Yg4      G Rj  x€L
  R#   \         d7    T P                  4        \        P                  RT P                  RR	7        R# i ; i LJ  \         d7    T P                  4        \        P                  R
T P                  RR	7        R# i ; i5i)zµCatch-all PTB handler (group 99) firing ``gateway_platform_event`` per inbound update with a
stable envelope (no raw SDK objects) and an internal auth source. Never raises into PTB.r»  Nrò  Ú_platform_event_handler)Úhas_hookÚgateway_platform_eventz+[%s] gateway_platform_event normalize errorTr3   z*[%s] gateway_platform_event dispatch error)r]   r  rò  Úhermes_cli.lifecycler	  Ú_normalize_platform_eventr*   Ú_fail_update_preparationr7   r8   r„  Ú_source_for_platform_event_authÚ_accept_update)r“  r£  ÚcontextÚ	admissionÚhandlerr	  Úeventrˆ  s   &&&     r   Ú_on_platform_updateÚ#TelegramAdapter._on_platform_updateÀ
  s+  é € ô
 ˜DÐ"5°tÓ<ˆ	ØÒ 	§¡£Ò 7Ü-4°TÐ;VÐXYÓ-ZÐ]^Õ-^ˆDÔ*ÜNUÐVZÐ\uÐw{ÓN|ˆØŠ?Ùð	Ý5ÙÐ4×5Ò5ÙØ×2Ñ2°6Ó:ˆEð
 Š=Ùð	aØ×9Ñ9¸&ÓAˆFØ×ÑÔ!Ù˜%Ó(×(Ò(øô ô 	Ø×)Ñ)Ô+Ü�L‰LÐFÈÏ	É	Ð\`ˆLÔaÚð	úñ )øÜô 	aØ×)Ñ)Ô+Ü�L‰LÐEÀtÇyÁyÐ[_ˆL×`ð	aüsl   ‚AD>ÁB4 Á'D>Á)B4 Á:D>Â,C: Â-C8Â.C: Â2D>Â4=C5Ã1D>Ã4C5Ã5D>Ã8C: Ã:=D;Ä7D>Ä:D;Ä;D>c                óþ   € \        VRR4      e   V P                  V4      # \        VRR4      pVeC   V P                  V4      pVP                  '       d   VP                  '       g   \        R4      hV# \        R4      h)z¤Route a supported update to its event-specific auth-source extractor (reactor / editor);
raises ``ValueError`` for updates without one so the boundary fails closed.rŸ  NÚedited_messagezIgateway_platform_event message_edited requires editor and chat identitieszNgateway_platform_event source extraction has no extractor for this update type)r]   r¥  rœ  rk  r±  rÞ   )r“  r£  Úeditedrˆ  s   &&  r   r  Ú/TelegramAdapter._source_for_platform_event_authß
  sx   € ô �6Ð-¨tÓ4Ò@Ø×6Ñ6°vÓ>Ð>Ü˜Ð!1°4Ó8ˆØÒØ×7Ñ7¸Ó?ˆFà—>—>�>¨¯¯¨Ü Ð!lÓmÐmØˆMÜÐiÓjÐjr   c                óF   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          /# r�   rP  )r   r…  s   "€r   r   r†  í
  s!   ø€ ÷ ñ ±8¹DÁÁcÀ½NÕ3Kñ r   c                ó†   € \        VRR4      e   V P                  V4      # \        VRR4      e   V P                  V4      # R# )z{Map a PTB update to a ``{platform, event_type, payload}`` envelope (hooks.md contracts), or
``None`` for types without one.rŸ  Nr  )r]   Ú_normalize_reaction_eventÚ_normalize_message_edited_event©r“  r£  s   &&r   r  Ú)TelegramAdapter._normalize_platform_eventí
  sI   € ô �6Ð-¨tÓ4Ò@Ø×1Ñ1°&Ó9Ð9Ü�6Ð+¨TÓ2Ò>Ø×7Ñ7¸Ó?Ð?Ùr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÙ   )r   rB   )r   r…  s   "€r   r   r†  ÷
  s   ø€ ÷ Mñ M™3ð M¡4ñ Mr   c                óh   € \        V \        4      '       * ;'       d    \        V \        \        34      # rP   )r5  rB   r   rÚ   ©rH   s   &r   Ú_is_id_likeÚTelegramAdapter._is_id_likeö
  s%   € ä˜e¤TÓ*Ô*×LÐL¬z¸%Ä#ÄsÀÓ/LÐLr   c                óF   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          /# r�   rP  )r   r…  s   "€r   r   r†  ú
  s!   ø€ ÷ 
ñ 
±8¹DÁÁcÀ½NÕ3Kñ 
r   c                óì  € \        VRR4      pVf   R# \        VRR4      p\        VRR4      ;'       g    . p\        V\        \        34      '       g   R# Ve   \        VRR4      MRp\        VRR4      pV P	                  V4      '       d   V P	                  V4      '       g   R# . p. pVR,           F�  p	\        V	RR4      p
\        V
\
        4      '       d!   V
'       d   VP                  V
R,          4       \        V	R	R4      pV P	                  V4      '       g   Kl  VP                  \        V4      R
,          4       K�  	  RRRRRRVRVR\        V4      R
,          R\        V4      R
,          RR//# )u—   ``message_reaction`` â†’ ``reaction`` event: emojis (unicode), custom_emoji_ids, chat_id,
message_id, thread_id (always None â€” reactions carry none).rŸ  Nr‘  Únew_reactionrZ   r¡  ºNé@   NÚemojiÚcustom_emoji_idºNé€   Nr:  r<   Ú
event_typeÚreactionrå  ÚemojisÚcustom_emoji_idsr±  rx  )r]   r5  rT  rü  r#  r   rd  )r“  r£  r¤  r‘  r'  r±  r¡  r0  r1  Úrr*  Ú	custom_ids   &&          r   r  Ú)TelegramAdapter._normalize_reaction_eventú
  sh  € ô �VÐ/°Ó6ˆØŠ:ÙÜ�r˜6 4Ó(ˆÜ˜r >°4Ó8×>Ð>¸BˆÜ˜,¬¬u¨×6Ò6ÙØ/3Ò/?”'˜$  dÔ+ÀTˆÜ˜R ¨tÓ4ˆ
Ø×Ñ ×(Ò(°×0@Ñ0@À×0LÒ0LÙØˆØ&(ÐØ˜c×"Ð"ˆAÜ˜A˜w¨Ó-ˆEÜ˜%¤×%Ò%¯%Ø—‘˜e C�jÔ)Ü Ð#4°dÓ;ˆIØ×Ñ 	×*Ô*Ø ×'Ñ'¬¨I«°tÕ(<Ö=ñ #ð ˜
Ø˜*ØØ˜&Ð"4Ð6FÈ	ÔSVÐW^ÓS_Ð`dÕSeØœc *›o¨dÕ3°[À$ðHð
ð 	
r   c                óF   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          /# r�   rP  )r   r…  s   "€r   r   r†    s!   ø€ ÷ 
ñ 
¹Á$ÁsÉCÀxÅ.Õ9Qñ 
r   c                ó.  € \        VRR4      pVf   R# \        VRR4      pVe   \        VRR4      MRp\        VRR4      pV P                  V4      '       d   V P                  V4      '       g   R# \        VRR4      ;'       g    \        VRR4      p\        V\        4      '       g   RpRp\        VRR4      pV P                  V4      '       d/   \	        \        VR	R
4      4      '       d   \        V4      R,          pRp	\        VRR4      p
 V
e3   \        V
R4      '       d!   \        V
P                  4       4      R,          p	RRRRRR\        T4      R,          R\        T4      R,          RTRTe
   TR,          MRRT	//#   \         d    Rp	 LNi ; i)u·   ``edited_message`` â†’ ``message_edited`` event (v1, additive): chat_id, message_id, thread_id
(forum topic), text (edited text or caption, bounded), edited_at (ISO 8601 UTC or None).r  Nr‘  rZ   r¡  r+   Úcaptionr—  r˜  Fr,  Ú	edit_dateÚ	isoformatr(  r:  r<   r.  Úmessage_editedrå  r±  rx  :Ni    NÚ	edited_at)r]   r#  r5  r   rB   r)  r9  r*   )r“  r£  r%  r‘  r±  r¡  r+   rx  rš  r;  r8  s   &&         r   r  Ú/TelegramAdapter._normalize_message_edited_event  s˜  € ô ˜&Ð"2°DÓ9ˆØŠ?ÙÜ�w ¨Ó-ˆØ/3Ò/?”'˜$  dÔ+ÀTˆÜ˜W l°DÓ9ˆ
Ø×Ñ ×(Ò(°×0@Ñ0@À×0LÒ0LÙÜ�w ¨Ó-×RÐR´¸À)ÈTÓ1RˆÜ˜$¤×$Ò$ØˆDØˆ	Ü Ð)<¸dÓCˆØ×Ñ˜M×*Ò*¬t´G¸GÐEWÐY^Ó4_×/`Ò/`Ü˜MÓ*¨4Õ0ˆIØˆ	Ü˜G [°$Ó7ˆ	ð	ØÒ$¬°¸K×)HÒ)HÜ 	× 3Ñ 3Ó 5Ó6°sÕ;�	ð ˜
ØÐ*ØØœ3˜w›<¨Õ-¨|¼SÀ»_ÈTÕ=RÐT_ÐajØ tÒ'7˜˜Už¸TÀ;ÐPYð[ð
ð 	
øô ô 	ØŠIð	ús   Ä6F ÆFÆFc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  :  s   ø€ ÷ "ñ " ñ "r   c                óf   € \        V RR4      pVe   VP                  4       MRpVe
   RVn        R# R# )zOHandoff is irreversible for replay purposes, even if later work raises/cancels.r»  NT)r]   r  Úaccepted©r“  r  Úclaims   &  r   r  ÚTelegramAdapter._accept_update:  s5   € ä˜DÐ"5°tÓ<ˆ	Ø#,Ò#8�	—‘”¸dˆØÒØ!ˆEŽNñ r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  A  s   ø€ ÷  ñ  ¨$ñ  r   c                óf   € \        V RR4      pVe   VP                  4       MRpVe
   RVn        R# R# )zHA caught preparation error is not a successful no-op or an auth refusal.r»  NT)r]   r  Úfailedr@  s   &  r   r  Ú(TelegramAdapter._fail_update_preparationA  s5   € ä˜DÐ"5°tÓ<ˆ	Ø#,Ò#8�	—‘”¸dˆØÒØˆEŽLñ r   c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r   r  r   N©r¸   )r   r…  s   "€r   r   r†  H  s   ø€ ÷ ,ñ ,©,ð ,¸4ñ ,r   c              ƒ  óŒ   <"  € V P                  4        \        W4      G R j  x€L
  \        SV `  V4      G R j  x€L
  R #  L L5irP   )r  rÁ   rµ  Úhandle_message©r“  r  r  s   &&€r   rK  ÚTelegramAdapter.handle_messageH  s;   øé € Ø×ÑÔÜ*¨4Ó7×7Ð7Ü‰gÑ$ UÓ+×+Ò+ñ 	8Ù+ùs   ƒA¢A £A¹AºAÁAc                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Úfnr   N)r   rÀ   )r   r…  s   "€r   r   r†  M  s    ø€ ÷ %ñ %©±Õ(Að %Àdñ %r   c                ó   € Wn         R# )z[Install the runner's root-DM topic-transfer hook (``dm_topic_auto_transfer``); None clears.N)Ú_topic_transfer_fn)r“  rO  s   &&r   Úset_topic_transfer_fnÚ%TelegramAdapter.set_topic_transfer_fnM  s   € à"$Ör   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  Q  s   ø€ ÷ lñ l¨ñ lr   c           
     ó  € \        VRR4      p\        V\        4      '       d/   VP                  4        UUu/ uF  w  r4V\	        V4      bK  	  uppM/ pVP                  \        \        P                  \        P                  ( ,          V P                  4      4       VP                  \        \        P                  V P                  4      4       VP                  \        \        P                  \        \        R\        P                  4      ,          V P                  4      4       VP                  \        \        P                  \        P                  ,          \        P                   ,          \        P"                  ,          \        P$                  P&                  ,          \        P(                  P&                  ,          V P*                  4      4       \        \        \        RR4      RR4      pVe%   VP                  \        W`P,                  4      4       VP                  \/        V P0                  4      4       VP                  \3        V P4                  4      4       VP                  \7        \8        V P:                  4      ^cR7       \        V\        4      '       dR   VP                  4        UUUu0 uF+  w  r4WEP=                  V^ 4      R  F  p\?        V4      kK  	  K-  	  upppV n         R# R# u uppi u upppi )zWRegister every PTB handler on ``app`` (initial connect and the transient-init rebuild).ÚhandlersNÚVENUEÚStatusUpdateÚFORUM_TOPIC_CREATED)rf  )!r]   r5  r  r
  r+  Úadd_handlerrC  r|   ÚTEXTÚCOMMANDÚ_handle_text_messageÚ_handle_commandÚLOCATIONÚ_handle_location_messageÚPHOTOÚVIDEOÚAUDIOÚVOICEÚDocumentÚALLÚStickerÚ_handle_media_messageÚ_handle_forum_topic_createdrw   Ú_handle_callback_queryrx   Ú_handle_inline_queryr{   ro   r  r  rZ   Ú_core_handler_ids)r“  rk   ÚtableÚgÚhsÚcore_beforeÚcreated_filterÚhs   &&      r   Ú_register_handlersÚ"TelegramAdapter._register_handlersQ  s  € ä˜˜Z¨Ó.ˆÜAKÈEÔSW×AXÒAX¨u¯{©{¬}Ô=©}¡e a�qœ#˜b›'’z©}Ó=Ð^`ˆØ�‰Ô.¬w¯|©|¼w¿¹Ð>NÕ/NÐPT×PiÑPiÓjÔkØ�‰Ô.¬w¯©À×@TÑ@TÓUÔVØ�‰Ô.Ü×Ñœw¤w°¼×9IÑ9IÓJÕJÈD×LiÑLiókô 	là�‰Ô.Ü�M‰MœGŸM™MÕ)¬G¯M©MÕ9¼G¿M¹MÕIÌG×L\ÑL\×L`ÑL`Õ`Ôcj×crÑcr×cvÑcvÕvØ×&Ñ&ó(ô 	)ô
 !¤¬°.À$Ó!GÐI^Ð`dÓeˆØÒ%Ø�O‰OÔ2°>×CcÑCcÓdÔeØ�‰Ô,¨T×-HÑ-HÓIÔJà�‰Ô*¨4×+DÑ+DÓEÔFà�‰œ¤F¨D×,DÑ,DÓEÈRˆÔPä�eœT×"Ò"Ø9>¿¹¼Õ%k¹±°ÐPR×SbÑSbÐcdÐfgÓShÐSiÓPjÈ1¤b¨¦eÑPj¡e¹Ó%kˆDÖ"ñ #ùó' >ùô( &ls   ·K7Ê81K=c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Únativer   N©r   )r   r…  s   "€r   r   r†  j  s   ø€ ÷ Iñ I©Cð I¸4ñ Ir   c                óŽ  <a€ \        VRR4      p\        V RR4      o\        V\        4      '       d	   S'       g   \        SV `  V4       R# VP                  4        UUu/ uF  w  r4V\        V4      bK  	  ppp\        SV `  V4       VP                  4        F™  w  rgVP                  V. 4      pV U	u0 uF  p	\        V	4      kK  	  p
p	V U	u. uF  p	\        V	4      V
9  g   K  V	NK  	  pp	\        V3R l\        V4       4       R4      pV'       d   Vf   K�  VRV V,           WŒR ,           VR&   K›  	  R# u uppi u up	i u up	i )aA  PTB dispatches the FIRST matching handler per group and core registers catch-alls
(``filters.COMMAND``, ``CallbackQueryHandler``), so a plugin handler appended after connect
would never fire. Move whatever a late factory added ahead of the first core handler of its
group, keeping the plugin handlers' own relative order.rV  Nrl  c              3   óP   <"  € T F  w  r\        V4      S9   g   K  Vx € K  	  R # 5irP   )rZ   )rR   r   rr  Úcore_idss   &  €r   rT   Ú8TelegramAdapter._wire_plugin_handlers.<locals>.<genexpr>z  s"   øé € ÐSÑ-=¡T QÄÀAÃÈ(ÑARŸqšqÓ-=ùs   ƒ&œ
&:NNN)r]   r5  r  rµ  Ú_wire_plugin_handlersr
  rT  r  rZ   r  Ú	enumerate)r“  rv  rV  rn  ro  Úbeforerf  ÚcurrentÚpriorrr  Ú	prior_idsÚaddedÚ
first_corerz  r  s   &&           @€r   r|  Ú%TelegramAdapter._wire_plugin_handlersj  s   ù€ ô
 ˜6 :¨tÓ4ˆÜ˜4Ð!4°dÓ;ˆÜ˜(¤D×)Ò)·Ü‰GÑ)¨&Ô1ÙØ+3¯>©>Ô+;Ô<Ñ+;¡% !�!”T˜"“X’+Ñ+;ˆÑ<Ü‰Ñ% fÔ-Ø&Ÿn™nÖ.‰NˆEØ—J‘J˜u bÓ)ˆEÙ(-Ó.© 1œ˜Až©ˆIÐ.Ù 'ÓB¡˜1¬2¨a«5¸	Ñ+A—Q�Q¡ˆEÐBÜÔS¬Y°uÔ-=ÓSÐUYÓZˆJß˜JÒ.ÙØ˜{ 
Ð+¨eÕ3°e¸KÐ6HÕHˆG�A‹Jó /ùó =ùò /ùÚBs   ÁD7Â3D=ÃEÃ$Ec                ó    <€ V ^8„  d   QhRS[ /# r�   ©rü  )r   r…  s   "€r   r   r†    s   ø€ ÷ [Nñ [N©5ñ [Nr   c              ƒ  óº  aa"  € R\        RR4      R\        RR4      R\        RR	4      R
\        RR4      R\        RR4      RR/o^ RIHp V! 4       pVeZ   ^ RIpVP                  SR,          VP                  VP                  R7      oVP                  SR,          ^ VP                  R7      pMR;opR/R V3R lllp\        P                  ! RR4      P                  4       P                  4       R09   pV'       d   . MV P                  4       pV'       g‹   V'       gƒ   V P                  RRRR7      p\        P                  RV P                   4        \#        \%        4       VR7      G Rj  x€L
 p\        P'                  RV P                   RP)                  V4      4       \3        R!R".VOV P4                  P6                  P9                  R#4      R$7      p
R% V3R& llpV'       d—   V
'       g�   V'       g‡   \        P'                  R'V P                   RP)                  V4      4       R(\;        4       R)\=        4       /pSe   SVR*&   \?        V4      pVe   WMR*&   V! R+\A        V3/ VB /R+\A        V3/ VB /4      w  rïMxV
'       d7   \        P'                  R,V P                   V
4       V! V! 4       R*V/V
R-7      w  rïM:V'       d!   \        P'                  R.V P                   4       V! V! 4       R*V/4      w  rïWàPC                  V4      3#  ELš  \*         dF   p	\        P                  R T P                   T\-        T	4      4       \/        \0        4      p Rp	?	EL³Rp	?	ii ; i5i)1z®Build the (general, getUpdates) HTTPXRequest pair: fallback-IP transport, explicit proxy, or
direct DNS; the getUpdates request is instrumented for polling-progress tracking.Úconnection_pool_sizeÚHERMES_TELEGRAM_HTTP_POOL_SIZEi   Úpool_timeoutÚ!HERMES_TELEGRAM_HTTP_POOL_TIMEOUTg       @Úconnect_timeoutÚ$HERMES_TELEGRAM_HTTP_CONNECT_TIMEOUTg      $@Úread_timeoutÚ!HERMES_TELEGRAM_HTTP_READ_TIMEOUTg      4@Úwrite_timeoutÚ"HERMES_TELEGRAM_HTTP_WRITE_TIMEOUTÚmedia_write_timeoutrn  )Úplatform_httpx_limitsN)Úmax_connectionsÚmax_keepalive_connectionsÚkeepalive_expiryc                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r   Úhttpx_kwargsr   )r   r  )r   s   "r   r   Ú9TelegramAdapter._build_ptb_requests.<locals>.__annotate__£  s   € ÷ 	ñ 	¤x´¥~ð 	Äñ 	r   c                óR   <€ \        T ;'       g    / 4      pSe   RV9  d   SVR&   V# )uµ   Merge tuned limits into httpx client kwargs (proxy/direct branches only; the fallback-IP
branch must pass limits straight into the transport â€” httpx ignores client `limits` then).Úlimits©r  )r˜  r¥   Ú_pool_limitss   & €r   Ú_with_limitsÚ9TelegramAdapter._build_ptb_requests.<locals>._with_limits£  s3   ø€ ô ˜,×,Ð,¨"Ó-ˆFØÒ'¨H¸FÔ,BØ#/��xÑ ØˆMr   Ú$HERMES_TELEGRAM_DISABLE_FALLBACK_IPSr!   Ú*HERMES_TELEGRAM_FALLBACK_DISCOVERY_TIMEOUTrÏ   r¦  )r�  u@   [%s] Discovering Telegram API fallback IPs via DNS-over-HTTPSâ€¦r`  z.[%s] Auto-discovered Telegram fallback IPs: %sz, z¡[%s] Telegram fallback-IP discovery failed after %.0fs; using seed IPv4 Telegram API IPs so a blackholed IPv6 hostname path cannot hang initialize() (#87015): %sÚTELEGRAM_PROXYzapi.telegram.orgÚ	proxy_url)Útarget_hostsrZ  c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   Úgeneral_httpxÚupdates_httpxr   )r  rü  )r   s   "r   r   r™  ¾  s&   € ÷ 	ñ 	¤ð 	´dð 	Ìñ 	r   c           	      óx   <€ \        R/ SBVBR R\        4       /V C/B \        R/ SBVBR R\        4       /VC/B 3# )r˜  ÚverifyrQ   )r   r   )r¦  r§  r·  Úrequest_kwargss   &&,€r   Ú_pairÚ2TelegramAdapter._build_ptb_requests.<locals>._pair¾  sW   ø€ Ü Ñ} >Ð}°UÑ}È(ÔThÓTjÐI|Ðn{ÐI|Ò}Ü Ñ} >Ð}°UÑ}È(ÔThÓTjÐI|Ðn{ÐI|Ò}ðð r   z%[%s] Telegram fallback IPs active: %sÚsocket_optionsr©  r›  Ú	transportz;[%s] Proxy detected; passing explicitly to HTTPXRequest: %s)Úproxyz4[%s] Telegram fallback-IP transport disabled via envrP   >   r  r‹  r�  r‚  )"rÉ   rÈ   Ú%gateway.platforms._http_client_limitsr“  ÚhttpxÚLimitsr•  r–  rö   r‰  r  rø   r[  r�  r7   r-  r„  rK   rÄ   rç   rh  r*   r,   rT  rÂ   r•   rš  r·  r  rÆ   r   r  rÃ   r©  )r“  r“  Ú_base_limitsÚ_httpxÚ_updates_limitsrž  Údisable_fallbackrV  Údiscovery_timeoutrê  r£  r«  Ú_transport_kwargsÚ_updates_transport_kwargsrl   Úget_updates_requestr�  rª  s   &               @@r   Ú_build_ptb_requestsÚ#TelegramAdapter._build_ptb_requests  sC  ùé € ð
 #¤GÐ,LÈcÓ$RØœIÐ&IÈ3ÓOØœyÐ)OÐQUÓVØœIÐ&IÈ4ÓPØœYÐ'KÈTÓRð " 4ð	
ˆõ" 	PÙ,Ó.ˆØÒ#Û"Ø!Ÿ=™=Ø .Ð/EÕ FØ*6×*PÑ*PÐco÷  dAñ  dAð )ó BˆLð
 %Ÿm™mØ .Ð/EÕ FÐbcØ!-×!>Ñ!>ð ,ó @‰Oð .2Ð1ˆL˜?÷	ò 	ô Ÿ9š9Ð%KÈRÓP×VÑVÓX×^Ñ^Ó`Ðd~Ñ~Ðß-‘r°4×3EÑ3EÓ3Gˆß×$4Ø $× 7Ñ 7Ð8dÐfiÐuxÐ 7Ó yÐÜ�N‰NÐ]Ð_c×_hÑ_hÔið	rÜ%@ÔAVÓAXÐbsÔ%t×t�ô —‘ÐLÈdÏiÉiÐY]×YbÑYbÐcoÓYpÔqÜ%ØÐ,>Ð+NÀÐ+NØ—{‘{×(Ñ(×,Ñ,¨[Ó9ô;ˆ	÷	ð 	÷ §	×2BÜ�K‰KÐ?ÀÇÁÈDÏIÉIÐVbÓLcÔdØ'7Ô9UÓ9WÐYaÔcwÓcyÐ&zÐð Ò'Ø.:Ð! (Ñ+Ü(,Ð->Ó(?Ð%ØÒ*Ø6E¨(Ñ3Ù+0ØÔ7¸ÑZÐHYÑZÐ[ØÔ7¸ÑbÐHaÑbÐcó,eÑ(ˆGÐ(÷ Ü�K‰KÐUÐW[×W`ÑW`ÐbkÔlÙ+0±³À(ÈOÐA\ÐdmÔ+nÑ(ˆGÐ(çÜ—‘ÐRÐTX×T]ÑT]Ô^Ù+0±³À(ÈOÐA\Ó+]Ñ(ˆGØ×8Ñ8Ð9LÓMÐMÐMòS  uøÜô 7Ü—‘ð@à—I‘IÐ0Ô2MÈcÓ2RôTô  $Ô$5Ó6–ûð7üsi   „DMÄMÄ4MÅL Å+LÅ,L Å0A<MÇ-MÇ5BMÊ=MËAMÌL ÌMÌ:MÍMÍMÍMc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  Ü  s   ø€ ÷ =?ñ =?¸Tñ =?r   c              ƒ  ó8  "  € ^p\        RR4      p\        P                  ! 4       P                  4       W2,          ,           R,           pRV RVR R2p\	        V4       EF  pRp \        P                  ! 4       P                  4       V8¼  d    \        V R	W2,          R,           R R
24      h\        P                  RV P                  V^,           V4       \        V P                  P                  4       W0P                  3R lRR7      G Rj  x€L
   V'       dÄ   Wb^,
          8  d´   V P                  pVP                  4       V n
        V P                  P                  V n        V P                  V P                  4       V P!                  V P                  4       \"        P$                  ! \&        4      ;_uu_ 4        \)        V4      G Rj  x€L
  RRR4        R#  R#  R# 	  R#  L× L  + '       g   i      R# ; i  \*         d~    RpYb^,
          8¼  d   \        T R24      h\-        ^T,          ^4      p	\        P                  RT P                  T^,           Y#T	4       \        P.                  ! T	4      G Rj  x€L 
   EMS\&         d¤   p
Rp\1        T
\
        4      '       g   T P3                  T
4      '       d   Yb^,
          8¼  d   h \-        ^T,          ^4      p	\        P                  RT P                  T^,           Y*T	4       \        P.                  ! T	4      G Rj  x€L 
   Rp
?
M«Rp
?
i\4         d›    \        P                  RT P                  T^,           T\1        \6        P8                  ! 4       ^,          \        P:                  4      '       d   R4       h \=        \6        P8                  ! 4       ^,          4      P>                  4       h i ; iT'       dÚ   Yb^,
          8  dÊ   T P                  pTP                  4       T n
        T P                  P                  T n        T P                  T P                  4       T P!                  T P                  4       \"        P$                  ! \&        4      ;_uu_ 4        \)        T4      G Rj  x€L 
  RRR4       EKB    + '       g   i     EKT  ; iEKZ  EK]    T'       dÔ   Yb^,
          8  dÆ   T P                  pTP                  4       T n
        T P                  P                  T n        T P                  T P                  4       T P!                  T P                  4       \"        P$                  ! \&        4      ;_uu_ 4        \)        T4      G Rj  x€L 
  RRR4       i   + '       g   i     i ; ii i ; i5i)zº``app.initialize()`` with a bounded retry ladder; rebuilds ``self._app``/``self._bot`` from
``builder`` after each failed attempt; OSError when the per-attempt or total watchdog expires.ÚHERMES_TELEGRAM_INIT_TIMEOUTrm  g      ^@z(Telegram initialization timed out after z attempts (rD   zs each)Fu&    â€” 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)â€¦c                 ó   € \        V 4      # rP   r¼  r½  s   &r   r¾  Ú>TelegramAdapter._initialize_app_with_retries.<locals>.<lambda>ð  s   € Ôd{Ð|ô  eAr   ztelegram-init)r?   r:   r;   NTzn. Check network connectivity to api.telegram.org or set HERMES_TELEGRAM_HTTP_CONNECT_TIMEOUT to a lower value.uD   [%s] Connect attempt %d/%d timed out after %.0fs â€” retrying in %dsu9   [%s] Connect attempt %d/%d failed: %s â€” retrying in %dsu<   [%s] Connect attempt %d/%d interrupted by %s â€” propagatingr6   ) rÈ   r0   rÑ  r}  r{  r'  r7   r-  r„  rK   r¸  rY  rs  rf   rÁ  r|  rs  r%  r&  r*   rm   rG   r‹  rC  r5  rs  rM   Úsysr4   r6   r'   r(   )r“  ÚbuilderÚ_max_connectÚ_init_timeoutÚ_total_deadlineÚ
_timed_outÚ_attemptÚrebuild_appÚold_apprÒ   Úinit_errs   &&         r   Ú_initialize_app_with_retriesÚ,TelegramAdapter._initialize_app_with_retriesÜ  s…  é € ð ˆÜ!Ð"@À$ÓGˆä!×2Ò2Ó4×9Ñ9Ó;¸mÕ>ZÕZÐ]bÕbˆØ?À¸~È[ÐYfÐgjÐXkÐkrÐsˆ
Ü˜l×+ˆHØˆKð3?Ü×+Ò+Ó-×2Ñ2Ó4¸ÔGÜ!Ø%˜,Ð&LÈ]ÕMiÐlqÕMqÐruÐLvð wIð JóKð Kô —‘ÐOÐQU×QZÑQZÐ\dÐghÕ\hÐjvÔwô 2Ø—I‘I×(Ñ(Ó*°M×YbÑYbó  OAØ)ô+÷ +ð +ð ÷<  8¸QÕ.>Ô#>Ø"Ÿi™i�GØ '§¡£�D”IØ $§	¡	§¡�D”Ið ×.Ñ.¨t¯y©yÔ9Ø×+Ñ+¨D¯I©IÔ6Ü#×,Ò,¬Y×7Õ7Ü5°gÓ>×>Ð>÷ 8Ò7ò $?’;óY ,ñ+ñT ?÷ 8×7Ñ7ûôK  ô 
*Ø"�Ø¨aÕ/Ô/Ü!Ø%˜,ð 'Xð YóZð Zô ˜1 �=¨"Ó-�Ü—‘ØZÐ\`×\eÑ\eÐgoÐrsÕgsØ °ô7ô —m’m DÓ)×)Ô)Üô *à"�Ü" 8¬W×5Ò5¸d×>\Ñ>\Ð]e×>fÒ>fÐksð  GHõ  xHô  lHØÜ˜1 �=¨"Ó-�Ü—‘ØOÐQU×QZÑQZÐ\dÐghÕ\hÐjvð  CGôHä—m’m DÓ)×)Ö)ûÜ ô ä—‘ØRÐTX×T]ÑT]Ð_gÐjkÕ_kÐmyÜ(2´3·<²<³>À!Õ3DÄg×F\ÑF\×(]Ò(]Ð$ôEð ô dhÔhk×htÒhtÓhvÐwxÕhyÓcz÷  dDñ  dDôEð ðú÷  8¸QÕ.>Ô#>Ø"Ÿi™i�GØ '§¡£�D”IØ $§	¡	§¡�D”Ið ×.Ñ.¨t¯y©yÔ9Ø×+Ñ+¨D¯I©IÔ6Ü#×,Ò,¬Y×7Õ7Ü5°gÓ>×>Ñ>÷ 8×7×7Ô7úò $?’;ø—; 8¸QÕ.>Ô#>Ø"Ÿi™i�GØ '§¡£�D”IØ $§	¡	§¡�D”Ið ×.Ñ.¨t¯y©yÔ9Ø×+Ñ+¨D¯I©IÔ6Ü#×,Ò,¬Y×7Õ7Ü5°gÓ>×>Ñ>÷ 8×7×7Ð7úð $?�;üs  ‚A!VÁ$B'G<ÄG#ÄG<ÄB)VÆ:G'Ç	G%
Ç
G'ÇVÇ#G<Ç%G'Ç'G9Ç2
VÇ<A>OÉ:I=É;OÊ R:ÊOÊOÊ.L+Ê<A$L+Ì L#Ì!L+Ì&R:Ì+OÌ8BOÏR:ÏB)VÑ?RÒR
ÒRÒVÒR1Ò*VÒ:B*VÕ$VÕ3U6Õ4VÕ9	VÖVÖ
VÖVc                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r   Úis_reconnectr   r.  )r   r…  s   "€r   r   r†    s   ø€ ÷ ñ ±tð Áñ r   c               óÂ   € V'       g   V P                   MRpV'       gA   \        P                  RV P                  V'       d   RMRV P                   '       d   RMR4       V# )u<  Whether THIS connection asks Telegram to discard its queued updates.

A watcher reconnect always preserves them (#46621); a cold boot follows
``platforms.telegram.extra.drop_pending_on_cold_boot`` (default true). The decision is logged
on every cold boot â€” a command that never ran is otherwise invisible (#71811).Fzq[%s] Cold boot: %s Telegram updates queued while offline (platforms.telegram.extra.drop_pending_on_cold_boot: %s)ÚdroppingÚ
preservingr‚  rŽ  )r  r7   rç   r„  )r“  rÐ  Údrop_pendings   &$ r   Ú_cold_boot_drop_pendingÚ'TelegramAdapter._cold_boot_drop_pending  sP   € ÷ ?K�t×6Ò6ÐPUˆßÜ�K‰KðKà—	‘	¯™:¸<Ø×9×9Ð9‘¸wô	Hð
 Ðr   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   Úwebhook_urlrÐ  r   Nr'  )r   r…  s   "€r   r   r†  *  s#   ø€ ÷ (ñ (±Sð (É4ð (ÐTXñ (r   c             ƒ  óö  "  € \        RR4      p\        P                  ! RR4      P                  4       ;'       gQ    \	        V P
                  P                  ;'       g    / P                  R4      ;'       g    R4      P                  4       p\        R4      ;'       g    RP                  4       pV'       g   \        R4      h^ RI
Hp V! V4      P                  ;'       g    R	pV P                  P                  P                  WCWqV\         P"                  V P%                  VR
7      R7      G Rj  x€L
  RV n        RV n        RV n        \,        P/                  RV P0                  T;'       g    RW74       R#  LG5i)u  Start PTB's webhook server (Telegram pushes updates; lets cloud platforms auto-wake suspended
machines). SECURITY: TELEGRAM_WEBHOOK_SECRET is REQUIRED â€” without it the endpoint accepts forged
updates (GHSA-3vpc-7q5r-276h); refuse to start rather than run fail-open.ÚTELEGRAM_WEBHOOK_PORTiû   ÚTELEGRAM_WEBHOOK_HOSTr!   Úwebhook_hostÚ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©rÐ  )ÚlistenÚportÚurl_pathrØ  Úsecret_tokenrº  r®  NTFz([%s] Webhook server listening on %s:%d%sz* (all interfaces, IPv4+IPv6))rÉ   rö   r‰  r  r   rš  r·  r  Ú_get_scoped_secretr  Úurllib.parserÞ  rã   r¸  rÀ  Ústart_webhookro   rÂ  rÕ  rÂ  rí  rù  r7   rç   r„  )r“  rØ  rÐ  Úwebhook_portrÜ  Úwebhook_secretrÞ  Úwebhook_paths   &&$     r   Ú_start_webhook_modeÚ#TelegramAdapter._start_webhook_mode*  si  é € ô Ð6¸Ó=ˆäŸ	š	Ð"9¸2Ó>×DÑDÓF÷  Kð  KÌ#ÈtÏ{É{×O`ÑO`×OfÐOfÐdf×NkÑNkÐlzÓN{÷  OBð  OBð  @Bó  KC÷  KIñ  KIó  KKˆÜ,Ð-FÓG×MÐMÈ2×TÑTÓVˆßÜðsótð tõ 	*Ù Ó,×1Ñ1×@Ð@°[ˆØ�i‰i×Ñ×-Ñ-Ø¸\Ø'¼×9IÑ9IØ!%×!=Ñ!=È<Ð!=Ó!Xð .ó 	÷ 		ð 		ð
 "ˆÔØ+0ˆÔ(Ø#(ˆÔ Ü�‰Ø6¸¿	¹	À<×CrÐCrÐSrØö	(ñ		ùs7   ‚AE9ÁE9Á7&E9ÂE9Â7)E9Ã!AE9Ä/E7Ä0<E9Å-E9c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rÐ  r   Nr.  )r   r…  s   "€r   r   r†  G  s   ø€ ÷ Dñ D¹ð DÀ$ñ Dr   c             ƒ  ó\  a a"  € S P                  V'       * R7      G Rj  x€L
  \        P                  ! 4       oR VV 3R llpVS n        S P	                  VR7      pS P                  W2V'       * R7      G Rj  x€L
 pV'       g#   \        P                  RS P                  4       R# R#  Lˆ L25i)z9Clear any stale webhook and start resilient long polling.)rñ  Nc                ó(   € V ^8„  d   QhR\         RR/# r±  r²  )r   s   "r   r   Ú9TelegramAdapter._start_polling_mode.<locals>.__annotate__M  s   € ÷ 	~ñ 	~¬9ð 	~¸ñ 	~r   c                 ó  <€ SP                   '       g   SP                  4       '       d   R # SP                  V 4      '       d4   SP                  4        SP	                  SSP                  V 4      4       R # SP                  V 4      '       dN   \        P                  RSP                  \        V 4      4       SP	                  SSP                  V 4      4       R # \        P                  RSP                  \        V 4      RR7       R # )Nz5[%s] Telegram network error, scheduling reconnect: %sz[%s] Telegram polling error: %sTr3   )r”  rè  r`  rp  rä  r  rs  r7   r-  r„  r,   rî  r   )r   râ  r“  s   &€€r   Ú_polling_error_callbackÚDTelegramAdapter._start_polling_mode.<locals>._polling_error_callbackM  sÈ   ø€ Ø×%×%Ð%¨×)AÑ)A×)CÒ)CÙØ×0Ñ0°×7Ò7ð ×+Ñ+Ô-Ø×,Ñ,¨T°4×3PÑ3PÐQVÓ3WÖXØ×/Ñ/°×6Ò6Ü—‘ØKÈTÏYÉYÔXsÐtyÓXzô|à×,Ñ,¨T°4×3UÑ3UÐV[Ó3\Ö]ä—‘Ð>ÀÇ	Á	ÔKfÐglÓKmÐx|�Ö}r   rß  )r®  r·  r  ze[%s] Connected in degraded Telegram mode: gateway is alive, polling will be retried in the background)	rö  r0   rÑ  rî  rÕ  r  r7   r-  r„  )r“  rÐ  rñ  rÔ  Úpolling_startedrâ  s   f$   @r   Ú_start_polling_modeÚ#TelegramAdapter._start_polling_modeG  s´   ùé € ð ×.Ñ.À<Ô?OÐ.ÓP×PÐPÜ×'Ò'Ó)ˆ÷	~ñ 	~ð ,CˆÔ(Ø×3Ñ3ÀÐ3ÓNˆØ $× =Ñ =Ø!-ÐlxÔhxð !>ó !z÷ zˆçÜ�N‰NØwÐy}÷  zCñ  zCöDñ ñ- 	Qñ(zùs(   „B,ŸB( AB,Á7B*Á8B,Â%B,Â*B,rÐ  c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rÏ  r.  )r   r…  s   "€r   r   r†  d  s   ø€ ÷ añ a©Tð a¹dñ ar   c             ƒ  óh
  "  € RV n         RV n        \        '       g7   \        P	                  RV P
                  4       V P                  RRRR7       R# V P                  P                  '       g7   \        P	                  RV P
                  4       V P                  RRRR7       R#  V P                  R	V P                  P                  R
4      '       g   R# ^ RI
HpHp \        P                  ! 4       P                  V P                  P                  4      pVP                  VRV /4       V P                  P                   P#                  R4      pV'       dh   VP%                  V4      pVP'                  V P                  P                   P#                  RV4      4      p\        P)                  RV P
                  V4       V P                  P                   P#                  R4      '       d2   VP+                  R4      p\        P)                  RV P
                  4       V P-                  4       G Rj  x€L
 w  rgVP/                  V4      P1                  V4      pVP3                  V! V P                  P                   V P
                  4      4      pVP5                  4       V n        V P6                  P8                  V n        V P=                  V P6                  4       V P?                  V P6                  4       V PA                  V4      G Rj  x€L
  V P6                  PC                  4       G Rj  x€L
  \E        R4      ;'       g    RPG                  4       pV'       d   V PI                  W�R7      G Rj  x€L
  MV PK                  VR7      G Rj  x€L
  V PM                  4        \        PO                  RV P
                  V P                  '       d   RMR4       V P                  '       g!   V PQ                  RV PS                  4       4       V PU                  \W        V P:                  RR4      4       \X        PZ                  ! 4       V n.        V P                  '       d!   V PQ                  RV P_                  4       4       V Pa                  4        R#  ELY EL… ELf EL$ EL  \b         d‘   p	T Pe                  4        \g        T	4      p
T Pi                  T	4      '       d   RT
 R2pT P                  RTRR7       MT P                  R R!T
 2RR7       \        P	                  R"T P
                  T
4        Rp	?	R# Rp	?	ii ; i5i)#aœ  Connect via long polling, or a webhook server if ``TELEGRAM_WEBHOOK_URL`` is set.

``is_reconnect``: False = cold boot (drop the Bot API queue unless
``extra.drop_pending_on_cold_boot`` is false); True = watcher reconnect (preserve
queued updates, else every message sent during the outage is lost). Webhook env:
TELEGRAM_WEBHOOK_URL, TELEGRAM_WEBHOOK_PORT (8443), TELEGRAM_WEBHOOK_HOST,
TELEGRAM_WEBHOOK_SECRET.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 token)ÚTelegramApplicationÚbuild_update_processorr£  r²  Úbase_file_urlz'[%s] Using custom Telegram base_url: %sÚ
local_modeTz5[%s] Using Telegram local_mode (read files from disk)NÚTELEGRAM_WEBHOOK_URLr!   rß  z$[%s] Connected to Telegram (%s mode)ÚwebhookÚpollingrä  r“  rå  zTelegram bot token rejected: uk   . The token is invalid or was revoked â€” generate a new one with @BotFather and update TELEGRAM_BOT_TOKEN.Útelegram_auth_errorÚtelegram_connect_errorzTelegram startup failed: z&[%s] Failed to connect to Telegram: %s)5r‘  rÂ  r0  r7   r   r„  r*  rš  ÚtokenÚ_acquire_platform_lockÚ+plugins.platforms.telegram.update_admissionrú  rû  ru   rÃ  Úapplication_classr·  r  r²  rü  rç   rý  r»  rl   rº  Úconcurrent_updatesrs  r¸  rf   rÁ  r|  rs  rÌ  re  rä  r  rê  rô  r  r-  Ú_restart_task_attrrG  r;  r]   r}  r~  rö  rÍ  rÒ  r*   Ú_release_platform_lockr,   rh  )r“  rÐ  rú  rû  rÃ  Úcustom_base_urlrl   rº  rØ  r  r  r%  s   &$          r   ÚconnectÚTelegramAdapter.connectd  s*  é € ð */ˆÔ&Ø"ˆÔß!Ó!Ü�L‰LÐgÐim×irÑirÔsØ×!Ñ!Ð"6Ð8[ÐglÐ!ÔmÙØ�{‰{× × Ð Ü�L‰LÐ7¸¿¹ÔCØ×!Ñ!Ð"7Ð9RÐ^cÐ!ÔdÙðN	Ø×.Ñ.Ð/CÀTÇ[Á[×EVÑEVÐXl×mÒmÙßoÜ!×)Ò)Ó+×1Ñ1°$·+±+×2CÑ2CÓDˆGØ×%Ñ%Ð&9¸IÀtÐ;LÔMØ"Ÿk™k×/Ñ/×3Ñ3°JÓ?ˆOßØ!×*Ñ*¨?Ó;�Ø!×/Ñ/°·±×0AÑ0A×0EÑ0EÀoÐWfÓ0gÓh�Ü—‘ÐEÀtÇyÁyÐRaÔbð �{‰{× Ñ ×$Ñ$ \×2Ò2Ø!×,Ñ,¨TÓ2�Ü—‘ÐSÐUY×U^ÑU^Ô_Ø15×1IÑ1IÓ1K×+KÑ(ˆGØ—o‘o gÓ.×BÑBÐCVÓWˆGð ×0Ñ0Ñ1GÈÏÉ×HYÑHYÐ[_×[dÑ[dÓ1eÓfˆGØŸ™›ˆDŒIØŸ	™	Ÿ™ˆDŒIà×&Ñ& t§y¡yÔ1Ø×#Ñ# D§I¡IÔ.Ø×3Ñ3°GÓ<×<Ð<Ø—)‘)—/‘/Ó#×#Ð#ô .Ð.DÓE×KÐKÈ×RÑRÓTˆKßØ×.Ñ.¨{Ð.ÓV×VÑVà×.Ñ.¸LÐ.ÓI×IÐIØ× Ñ Ô"ô �N‰NÐAÀ4Ç9Á9Ð[_×[m×[mÐ[mÉiÐs|Ô}ð ×%×%Ð%Ø×'Ñ'Ð(AÀ4×C_ÑC_ÓCaÔbð ×#Ñ#¤G¨D¯I©I°zÀ4Ó$HÔIÜ,0¯NªNÓ,<ˆDÔ)Ø×!×!Ð!Ø×'Ñ'Ð(DÀd×FeÑFeÓFgÔhð ×1Ñ1Ô3Ùò_ ,Lò =Ú#ò WâIøô8 ô 	Ø×'Ñ'Ô)Ü4°QÓ7ˆJð ×*Ñ*¨1×-Ò-à3°J°<ð @Eð Eð ð ×%Ñ%Ð&;¸WÐPUÐ%ÕVà×%Ñ%Ð&>ÐB[Ð\fÐ[gÐ@hÐtxÐ%ÔyÜ�L‰LÐAÀ4Ç9Á9ÈjÔYÝûð	üsÇ   ‚A,T2Á/6T2Â&,R ÃT2ÃB R ÅBR Ç(AR È,RÈ-CR ÌRÌ!R Ì%RÌ&R Ì<R ÍR Í*RÍ+R ÎRÎA R ÏR Ï!B"R ÒT2ÒR ÒR ÒR ÒR ÒR ÒT/ÒBT*Ô$T2Ô*T/Ô/T2c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r  r   Nr.  )r   r…  s   "€r   r   r†  Ç  s   ø€ ÷ ñ ±$ð ¸4ñ r   c           	   ƒ  ó®  "  € \        V RR4      '       g   R# V P                  pVf   R# V'       d   V P                  MV P                  R,          p VP	                  VR7      G Rj  x€L
  \
        P                  RV P                  V4       R#  L'  \         d7   p\
        P                  RT P                  T\        T4      4        Rp?R# Rp?ii ; i5i)z¥Set the bot's short description to the online/offline text (closest Bot API surface to
presence). No-op unless ``extra.status_indicator``; failures are debug-logged.r  FN:Néx   N)Úshort_descriptionz#[%s] Set bot status indicator to %rz1[%s] Failed to set bot status indicator to %r: %s)r]   rÁ  r  r  Úset_my_short_descriptionr7   rç   r„  r*   r8   r,   )r“  r  rf   r+   r  s   &&   r   r  Ú%TelegramAdapter._set_status_indicatorÇ  s±   é € ô �tÐ8¸%×@Ò@ÙØ�i‰iˆØŠ;Ùß,2�×(Ò(¸×8QÑ8QÐSWÕXˆð	Ø×.Ñ.ÀÐ.ÓF×FÐFÜ�K‰KÐ=¸t¿y¹yÈ$ÖOñ Gøäô 	Ü�L‰LÐLÈdÏiÉiÐY]Ô_zÐ{|Ó_}×~Ò~ûð	üsF   ‚/C²CÁB Á'BÁ(%B ÂCÂB ÂCÂ+CÃCÃCÃCc                ó    <€ V ^8„  d   QhRS[ /# r�   rð  )r   r…  s   "€r   r   r†  ×  s   ø€ ÷ 	ñ 	¹ñ 	r   c                óð   € \        4       p. pV  Fc  pV'       d,   VP                  4       '       g   WAJ g   \        V4      V9   d   K8  VP                  \        V4      4       VP	                  V4       Ke  	  V# )zkUnique, unfinished tasks from ``candidates`` excluding ``current_task`` (so teardown never cancels itself).)rX   r{  rZ   r[   rd  )Ú
candidatesr„  r^   r)  r.   s   &&   r   Ú_collect_live_tasksÚ#TelegramAdapter._collect_live_tasksÖ  s]   € ô ›ˆØ"$ˆÛˆDß˜4Ÿ9™9Ÿ;š;¨$Ó*>Ä"ÀTÃ(ÈdÔBRÙØ�H‰H”R˜“XÔØ�J‰J�tÖñ	 ð
 ˆ
r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úattrsr   Nrž   )r   r…  s   "€r   r   r†  â  s   ø€ ÷ *ñ *¹Sð *ÀTñ *r   c                óT   € V F!  p\        WR 4      VJg   K  \        WR 4       K#  	  R # rP   )r]   Úsetattr)r“  r„  r  rn  s   &&* r   Ú_clear_task_attrs_exceptÚ(TelegramAdapter._clear_task_attrs_exceptâ  s%   € ÛˆDÜ�t 4Ó(°Õ<Ü˜ DÖ)ó r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  ç  s   ø€ ÷ &uñ &u°dñ &ur   c              ƒ  óB  "  € \         P                  ! 4       pV P                  . V P                  P	                  4       OV P
                  P	                  4       OV P                  P	                  4       O\        V R/ 4      P	                  4       O\        V RR4      N\        V RR4      N\        V RR4      NV4      pV Uu. uF?  p\         P                  ! V4      '       g   \         P                  ! V4      '       g   K=  VNKA  	  ppV F  pVP                  4        K  	  V'       d   \         P                  ! VRR/ G Rj  x€L
  V P                  4       '       di   \        V P                  4      \        V P                  4      ,           \        V P                   4      ,           pV'       d   \"        P%                  RV4       MdV P                  R	3V P                  R
3V P                   R33 F7  w  rx\'        VP	                  4       4       F  p	V P)                  W˜R7       K  	  K9  	  V P                  V P                   V P
                  V P                  V P                  V P                  3 F  p
V
P+                  4        K  	  V P-                  VRRR4       R# u upi  EL]5i)zíCancel every delayed-delivery task family before disconnect completes (media-group, photo-batch, text-batch flushes plus
polling recovery all sit behind ``asyncio.sleep()`` and would dispatch ``handle_message`` into a torn-down session).rØ  râ  Nrã  rá  rþ  TzP[Telegram] Non-retryable fatal teardown; discarding %d pending inbound batch(es)ztext-batch-teardownzphoto-batch-teardownzmedia-group-teardown©Úwhere)r0   r„  r  r×  ÚvaluesrÕ  Ú_pending_text_batch_tasksr]   rj   ri   r|  r  r4  r+  Ú_pending_text_batchesrÔ  rÖ  r7   r-  rT  Ú_hold_inbound_eventr,  r  )r“  r„  Úpending_tasksrŠ   Úawaitable_tasksr.   Ú	n_pendingÚeventsr!  r  r-  s   &          r   Ú_cancel_pending_delivery_tasksÚ.TelegramAdapter._cancel_pending_delivery_tasksç  sq  é € ô ×+Ò+Ó-ˆØ×0Ñ0ðØ×(Ñ(×/Ñ/Ó1ðØ48×4SÑ4S×4ZÑ4ZÓ4\ðØ_c×_}Ñ_}÷  `Eñ  `Eó  `Gðä˜Ð7¸Ó<×CÑCÓEðô ˜Ð3°TÓ:ðô =DÀDÐJkÐmqÓ<rðô
 ˜Ð=¸tÓDðð óˆñ '4Óe¡m ´w×7GÒ7GÈ×7JÒ7JÌg×NaÒNaÐbc×NdŸ1˜1¡mˆÐeó "ˆDØ�K‰KŽMñ "çÜ—.’. /ÐJÀTÑJ×JÐJð ×#Ñ#×%Ò%Ü˜D×6Ñ6Ó7¼#¸d×>YÑ>YÓ:ZÕZÔ]`Ðae×ayÑayÓ]zÕzˆIßÜ—‘ÐqÐs|Ô}øð ×+Ñ+Ð-BÐCÀd×FaÑFaÐcyÐEzØ×)Ñ)Ð+AÐBó"D‘�ô " &§-¡-£/Ö2�EØ×,Ñ,¨UÐ,Ö@ó 3ñ"Dð ×#Ñ# T×%=Ñ%=¸t×?^Ñ?^Ø×'Ñ'¨×)GÑ)GÈ×IcÑIcóeˆAð �G‰GŽIñeð 	×%Ñ%ØÐ/Ð1RÐTsö	uùò1 fò Kùs7   ‚B<JÂ> JÃJÃ=JÄ"JÄ&JÄ?JÅ JÅEJc                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r?   Ústepr   r@   )r   r…  s   "€r   r   r†    s#   ø€ ÷ ñ ¹uð ÉCð ÑTXñ r   c              ƒ  ó\  "  € \         P                  ! V4      p \         P                  ! V0V^ 8”  d   TMRR7      G Rj  x€L
 w  rVYE9   dB   \        P                  ! \         P                  4      ;_uu_ 4        TG Rj  x€L
  RRR4       R# TP	                  4        TP                  \        4       \        P                  RT P                  Y24       R#  L•  \         P                   d(    TP	                  4        TP                  \        4       h i ; i L—  + '       g   i     R# ; i5i)u„  Await one disconnect step; detach on timeout so teardown advances (``wait_for`` would wait for a
PTB close that swallows ``CancelledError`` on a half-dead socket). Abandoned tasks are observed.

``asyncio.wait_for`` cancels an overdue child but then waits for it to exit. Detach at the deadline
and continue â€” the abandoned task is observed via ``_consume_abandoned_task``. See #80598.
Nr`  TzD[%s] %s timed out after %.1fs during disconnect; continuing teardownF)r0   ro  rÒ   r6   r|  rq  r9   r%  r&  r7   r-  r„  )r“  rI   r?   r-  r.   r{  Ú_pendings   &&&&   r   Ú_await_disconnect_stepÚ&TelegramAdapter._await_disconnect_step  sä   é € ô ×$Ò$ YÓ/ˆð	Ü#*§<¢<°°È7ÐUVÌ;ÁÐ\`Ô#a×a‰NˆDð Œ<Ü×$Ò$¤W×%;Ñ%;×<Õ<Ø—
�
÷ =áØ�‰ŒØ×ÑÔ6Ô7Ü�‰Ð]Ð_c×_hÑ_hÐjnÔxÙñ bøÜ×%Ñ%ô 	à�K‰KŒMà×"Ñ"Ô#:Ô;Øð	úñ ÷ =Ö<áüsX   ‚D,š%C ¿CÁ C Á2D,Á8DÁ>DÁ?DÂAD,ÃC Ã<DÄD,ÄDÄD)	Ä#	D,c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rn  r   Nrž   )r   r…  s   "€r   r   r†  (  s   ø€ ÷ 9ñ 9¡sð 9°Tñ 9r   c                óº   € \        WR4      pV'       d'   VP                  4       '       g   VP                  4        \        W\        P
                  ! V4      4       R# )zOCancel any live task stored at ``self.<attr>`` and start ``coro`` in its place.N)r]   r{  r|  r  r0   ro  )r“  rn  rã  r€  s   &&& r   r  Ú"TelegramAdapter._restart_task_attr(  s9   € ä˜ DÓ)ˆß˜Ÿ™ŸšØ�L‰LŒNÜ�œG×1Ò1°$Ó7Ö8r   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r   rn  r;   r   Nrž   )r   r…  s   "€r   r   r†  /  s"   ø€ ÷ "ñ "©Cð "¹ð "Àñ "r   c              ƒ  óÜ   "  € \        WR4      pV'       dF   VP                  4       '       g0   VP                  4        V P                  V\        V4      G Rj  x€L
  \        WR4       R#  L5i)zpCancel + bounded-await the task stored at ``self.<attr>`` (may be missing: object.__new__ tests), then clear it.N)r]   r{  r|  r0  Ú_DISCONNECT_STEP_TIMEOUTr  )r“  rn  r;   r.   s   &&& r   Ú_cancel_task_attrÚ!TelegramAdapter._cancel_task_attr/  sP   é € ä�t 4Ó(ˆß˜Ÿ	™	ŸšØ�K‰KŒMØ×-Ñ-¨dÔ4LÈeÓT×TÐTÜ�˜DÖ!ñ Uùs   ‚*A,­*A,ÁA*ÁA,c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  7  s   ø€ ÷ BBñ BB $ñ BBr   c              ƒ  ó
  "  € V P                  4        RV n        RV n        \        V R^ 4      ^,           V n        \
        P                  ! 4       V n        RV n        V P                  4        \
        P                  ! 4       pV P                  \        V RR4      \        V RR4      .V4      pV F  pVP                  4        K  	  V Uu. uF?  p\
        P                  ! V4      '       g   \
        P                  ! V4      '       g   K=  VNKA  	  ppV'       d4   V P                  \
        P                   ! VRR/ \"        R4      G Rj  x€L
  V P%                  VRR4       RV n        RV n        \        V R	R4      pV'       d\   VP'                  4       '       gF   VP                  4        V P                  \
        P                   ! VRR
7      \"        R4      G Rj  x€L
  RV n        V P+                  RR4      G Rj  x€L
  V P+                  RR4      G Rj  x€L
  \,        P.                  ! \0        4      ;_uu_ 4        V P                  V P3                  RR7      \"        R4      G Rj  x€L
  RRR4       V P                  V P5                  4       \"        R4      G Rj  x€L
  V P6                  '       Ed    V P6                  P8                  '       di   V P6                  P8                  P:                  '       dC    V P                  V P6                  P8                  P=                  4       \>        R4      G Rj  x€L
  V P6                  P:                  '       d8   V P                  V P6                  P=                  4       \"        R4      G Rj  x€L
  V P                  V P6                  PI                  4       \"        R4      G Rj  x€L
  RV n        RV n%        \        V RR4      pVeJ   VP'                  4       '       g4   V P                  \
        PL                  ! V4      \"        R4      G Rj  x€L
  \@        PO                  RV PD                  4       R# u upi  EL	 EL{ EL] ELF EL÷  + '       g   i     ELþ; i ELÙ ELD  \0         d6   p\@        PC                  RT PD                  \G        T4      4        Rp?EL}Rp?ii ; i EL7 EL  \0         d6   p\@        PC                  RT PD                  \G        T4      4        Rp?EL<Rp?ii ; i Là5i)zHStop polling/webhook, cancel pending delayed deliveries, and disconnect.TFré  râ  Nrã  rþ  zlifecycle-task cancelræ  rý  zpost-connect cancelrä  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: %srÀ  zupdate-receipt flushz[%s] Disconnected from Telegram)(r!  r‘  rí  r]   ré  r0   rë  rì  rù  r	  r„  r  r|  rj   ri   r0  r  r7  r  r{  ræ  r8  r%  r&  r*   r  r*  r¸  rÀ  r"  r#  r$  r7   r-  r„  r,   rh   rÁ  Úshieldrç   )	r“  r„  Úlifecycle_tasksr.   rŠ   Úpost_connect_taskr€  r  Úflushs	   &        r   Ú
disconnectÚTelegramAdapter.disconnect7  s:  é € ð 	×ÑÔ!Ø)-ˆÔ&Ø+0ˆÔ(Ü#*¨4Ð1FÈÓ#JÈQÕ#NˆÔ Ü'.§}¢}£ˆÔ$Ø#'ˆÔ ð 	×#Ñ#Ô%ô ×+Ò+Ó-ˆØ×2Ñ2Ü�TÐ0°$Ó7¼ÀÐGhÐjnÓ9oÐpÐr~ó@ˆã#ˆDØ�K‰KŽMñ $á&5Óg¡o ¼×9IÒ9IÈ!×9LÒ9LÔPW×PcÒPcÐde×PfŸ1˜1¡oˆÐgßØ×-Ñ-Ü—’ ÐHÀ4ÑHÔJbÐd{ó}÷ }ð }à×%Ñ% lÐ4IÐKlÔmà+0ˆÔ(Ø#'ˆÔ ô
 $ DÐ*>ÀÓEÐßÐ%6×%;Ñ%;×%=Ò%=Ø×$Ñ$Ô&Ø×-Ñ-Ü—’Ð0ÀDÔIÔKcÐezó|÷ |ð |à"&ˆÔà×$Ñ$Ð%>Ð@RÓS×SÐSØ×$Ñ$Ð%AÐC\Ó]×]Ð]ä× Ò ¤×+Õ+Ø×-Ñ-¨d×.HÑ.HÐPUÐ.HÓ.VÔXpð  sLó  M÷  Mð  M÷ ,à×)Ñ)¨$×*MÑ*MÓ*OÔQið  lEó  F÷  	Fð  	FØ�9�9‰9ðwà—9‘9×$×$Ð$¨¯©×):Ñ):×)B×)BÐ)BðDØ"×9Ñ9¸$¿)¹)×:KÑ:K×:PÑ:PÓ:RÔTiÐk{Ó|×|Ð|ð —9‘9×$×$Ð$Ø×5Ñ5°d·i±i·n±nÓ6FÔH`ÐbnÓo×oÐoØ×1Ñ1°$·)±)×2DÑ2DÓ2FÔH`ÐbrÓs×sÐsð ˆŒ	ØˆŒ	ä˜Ð5°tÓ<ˆØÒ U§Z¡Z§\¢\Ø×-Ñ-¬g¯nªn¸UÓ.CÔE]Ð_uÓv×vÐvÜ�‰Ð5°t·y±yÖAùò_ hò}ò|ò 	TÚ]ò M÷ ,×+Ð+úò 	Fò }øÜ$ô DÜŸ™ØNÐPT×PYÑPYÔ[vð  xBó  \C÷Dò DûðDúò pÚsøÜô wÜ—‘ÐJÈDÏIÉIÔWrÐstÓWu×vÒvûðwúñ wùs@  ‚CTÃ QÃ(QÄQÄ8TÅQÅATÆA TÇQÇ TÇ6QÇ7TÈQÈ&TÈ7+QÉ"QÉ#QÉ'0TÊQ0ÊTÊ0R? Ë%R? Ë3<Q6 Ì/Q3Ì0Q6 Ì4R? Í2R? ÎR9Î6R? Î9R<Î:R? Î>4TÏ3.TÐ!TÐ",TÑTÑTÑTÑQÑQ-	Ñ'
TÑ3Q6 Ñ6R6Ò*R1Ò+R? Ò1R6Ò6R? Ò<R? Ò?S?Ó
*S:Ó4TÓ:S?Ó?Tc                ó<   <€ V ^8„  d   QhRS[ S[,          RS[RS[/# )r   rò  Úchunk_indexr   )r   r   rÚ   rB   )r   r…  s   "€r   r   r†  {  s'   ø€ ÷ 	 ñ 	 ©X±c­]ð 	 Éð 	 ÑQUñ 	 r   c                ó\   € V'       g   R# V P                   pVR8X  d   R# VR8X  d   R# V^ 8H  # )zVWhether this chunk (0 = first) should reply-thread to ``reply_to``, per reply_to_mode.Frô  ÚallT)rÅ  )r“  rò  rC  Úmodes   &&& r   r  Ú$TelegramAdapter._should_thread_reply{  s2   € çÙØ×"Ñ"ˆØ�5Œ=ÙØ�5Œ=ÙØ˜aÑÐr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r†  )r   r…  s   "€r   r   r†  ‡  s   ø€ ÷ +ñ +¡5ñ +r   c                 óº   €  ^ RI Hp   ^ RI Hp  ^ RI Hp WV3#   \         d
    \        p  L%i ; i  \         d    Rp L1i ; i  \        \        3 d    Rp LCi ; i)zž``(NetworkError, BadRequest, TimedOut)`` from PTB, with import-failure fallbacks
(``OSError``, ``None``, ``None``) so send() still classifies without the SDK.)rl  r1  Nr  )r4  rl  rD  r'  r2  rn  rE  )Ú_NetErrÚ_BadReqr  s      r   Ú_telegram_error_typesÚ%TelegramAdapter._telegram_error_types†  sl   € ð	Ý>ð	Ý<ð	Ý<ð  Ð*Ð*øô ô 	ÜŠGð	ûô ô 	ØŠGð	ûô œ^Ð,ô 	ØŠIð	ús,   ‚ ‰1 �A š.­.±AÁ AÁAÁAc                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[3,          /# )r   ÚchunkrH  r=  )r   r…  s   "€r   r   r†  ˜  s&   ø€ ÷ ñ ¹ð É4ÑPSÑUXÐPXÍ>ñ r   c           
   ƒ  ó  "  €  \        V P                  P                  ! R
RVR\        P                  /VB \
        RRR7      G Rj  x€L
 #  L  \         d¬   pR\        T4      P                  4       9   g   R\        T4      P                  4       9   dj   \        P                  R	T P                  T4       \        T P                  P                  ! R
R\        T4      RR/TB \
        RRR7      G Rj  x€L 
 u Rp?# h Rp?ii ; i5i)zNMarkdownV2 first; on a parse/markdown rejection resend as stripped plain text.r+   Ú
parse_moder/  FrL  NÚparserä  z<[%s] MarkdownV2 parse failed, falling back to plain text: %srQ   )rK   rÁ  rÄ  r}   ÚMARKDOWN_V2r3  r*   r   rø   r7   r-  r„  rW  )r“  rO  rH  Úmd_errors   &&& r   Ú_send_chunk_markdown_or_plainÚ-TelegramAdapter._send_chunk_markdown_or_plain˜  só   é € ð
	Ü4Ø—	‘	×&Ò&Ñc¨EÐc¼i×>SÑ>SÐcÐWbÑcÜ+°?ÐY^ô`÷ `ð `ñ `øô ô 	Øœ#˜h›-×-Ñ-Ó/Ô/°:ÄÀXÃ×ATÑATÓAVÔ3VÜ—‘Ð]Ð_c×_hÑ_hÐjrÔsÜ8Ø—I‘I×*Ò*Ñc´¸EÓ0BÐcÈtÐcÐWbÑcÜ/°Ð]bôd÷ dð dõ dð ûð	üsZ   ‚D„AA ÁAÁA Á
DÁA ÁDÁBC>Ã2C5Ã3C>Ã7DÃ8DÃ=C>Ã>DÄDc                ó�   <€ V ^8„  d   QhRS[ RS[ RS[RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[ ,          RS[RS[/# )	r   r±  rO  rû  rò  rO  rx  Úused_thread_fallbackÚerror_types)r   rÚ   r   r  r   rB   rü  )r   r…  s   "€r   r   r†  ¦  sq   ø€ ÷ fñ fÙðfÙ#&ðfÙ/2ðfÙ>FÁs½mðfÙW_Ñ`dÑehÑjmÐemÕ`nÕWoðfá™C•=ðfá8<ðfáKPñfr   c	              ƒ  óÎ	  "  € Vw  ršpRpV P                  WWVV4      w  rÞpV'       d)   Vf%   V'       g   \        RV P                  4       RR7      # V P                  WW_V P                  R7      pV'       d$   VP                  R4      e   \        V4      pRVR&   VP                  R4      p\        ^4       FR  p R\        V4      RV/VCV P                  4       CV P                  V4      CpV P                  VV4      G Rj  x€L
 V3u # 	  R#  L  T	 EdŒ   pT
'       Ed¨   \        TT
4      '       Ed•   T P                  T4      '       dÀ   Te¼   T'       g    T'       d6   TP                  R4      '       d   \        R\        T4      RR7      u Rp?u # T'       g+   R	p\        P!                  R
T P"                  T4        Rp?EK  \        P!                  RT P"                  T4       T P%                  TTTR7       R	pRpRR/p Rp?EKT  R\        T4      P'                  4       9   d    Teœ   \)        T4      pT'       d   \        RTRR7      u Rp?u # \        P!                  RT P"                  T4       RpT P+                  T4      '       d   / pMT P                  YY_T P                  R7      pTP                  R4      p Rp?EK  h T P-                  T4      pT'       d3   \        TT4      '       d!   T P/                  T4      '       g
   T'       g   h T'       d   T P1                  4       G Rj  x€L 
  T^8¼  d   h ^T,          p\        P!                  RT P"                  T^,           T\)        T4      4       \2        P4                  ! T4      G Rj  x€L 
   Rp?EKè  Rp?i\6         Ed7   p\9        TRR4      pTf    R\        T4      P'                  4       9   Ed   Te   \;        T4      MRp\)        T4      pT\<        8”  dA   \        P!                  RT P"                  T\<        T4       T P?                  TT4      u Rp?u # T^8  dQ   \        P!                  RT P"                  T^,           TT4       \2        P4                  ! T4      G Rj  x€L 
   Rp?EKå  \        P!                  RT P"                  T^,           T4       T P?                  TT4      u Rp?u # h Rp?ii ; i5i)a  Deliver one chunk: routing, up to 3 attempts, thread-not-found / deleted-anchor / flood handling.

Returns ``(msg, used_thread_fallback)`` on success or a ``SendResult`` to return verbatim (fail-loud DM-topic
cases, flood cap); raises anything the caller's classifier should see.FN©rÔ   r   r&  r	  r—  r±  rù  rê  Tz;[%s] Thread %s not found, retrying once with same thread_idz<[%s] Thread %s not found, retrying without message_thread_idrä  r:  z8[%s] Reply target deleted, retrying without reply_to: %sz>[%s] Network error on send (attempt %d/3), retrying in %ds: %srÕ   úretry afterrÐ   zg[%s] Telegram flood control on send (retry_after=%.1fs > %.0fs); failing closed instead of sleeping: %szI[%s] Telegram flood control on send (attempt %d/3), retrying in %.1fs: %szy[%s] Telegram flood control on send persisted across %d attempts; failing closed so the delivery ledger owns the wait: %s) r
  r�   rï  r   rÅ  r  r  r{  r½   r—  rU  rU  r5  r  r   r7   r-  r„  r,  rø   r,   rå  r‡  r�  rÞ  r0   rC  r*   r]   rA   Ú_FLOOD_INLINE_WAIT_CAP_SECSÚ_record_send_flood_cooldown)r“  r±  rO  rû  rò  rO  rx  rX  rY  rJ  rK  r  Úretried_thread_not_foundr  r  r	  r  Úeffective_thread_idÚ_send_attemptrH  rO  Úsafe_send_errorÚis_pool_timeoutrÒ   rÕ   s   &&&&&&&&&                r   Ú_send_chunk_with_retriesÚ(TelegramAdapter._send_chunk_with_retries¦  sx  é € ð '2Ñ#ˆ˜)Ø#(Ð ØDH×D]ÑD]Ð^eÐqyð  GLó  EMÑAÐ°kß  [Ò%8×AVÜ e°4×3VÑ3VÓ3XÐdiÔjÐjØ×4Ñ4Ø ÐY]×YlÑYlð 5ó nˆç M×$5Ñ$5Ð6IÓ$JÒ$VÜ  Ó/ˆMØ15ˆMÐ-Ñ.Ø+×/Ñ/Ð0CÓDÐÜ" 1žXˆMðSàÔ9¸'ÓBÐDYÐ[fðZØjwðZà×/Ñ/Ó1ðZà59×5NÑ5NÈxÓ5XðZ�ð "×?Ñ?ÀÀ{ÓS×SÐUiÐiÒió &ñ
 TøØõ /*ç�7œz¨(°G×<Ó<Ø×6Ñ6°x×@Ò@ÐEXÒEdß0·XÀ(Ç,Á,ÐOs×BtÒBtÜ#-°eÄ3ÀxÃ=Ð\aÔ#b×bç7Ø7;Ð4Ü"ŸN™NÐ+hÐjn×jsÑjsð  vIô  JÞ$äŸ™Ð'eÐgk×gpÑgpð  sFô  GØ×:Ñ:¸7ÐDWÐbjÐ:ÔkØ/3Ð,Ø.2Ð+Ø)<¸dÐ(C˜Þ Ø8¼CÀ»M×<OÑ<OÓ<QÔQÐVaÒVmÜ*EÀhÓ*O˜ß0Ü#-°eÀ?Ð^cÔ#d×däŸ™Ð'aÐcg×clÑclÐn}Ô~Ø&*˜Ø×2Ñ2°8×<Ò<Ø,.™Mà,0×,HÑ,HØ '°HÐmq÷  nAñ  nAð -Ió -B˜Mà.;×.?Ñ.?Ð@SÓ.TÐ+Þ Øð #'×"?Ñ"?ÀÓ"I�ç¤*¨X°y×"AÒ"AØ ×<Ñ<¸X×FÒFÏØß"Ø×LÑLÓN×NÑNØ  AÔ%ØØ˜MÕ)�Ü—‘Ð_Ø#Ÿy™y¨-¸!Õ*;¸TÔC^Ð_gÓChôjä—m’m DÓ)×)×)Ð)ûÜõ Ü% h°¸tÓD�ØÒ*¨m¼sÀ8»}×?RÑ?RÓ?TÕ.TØ1<Ò1Hœ5 Ô-Èc�DÜ&AÀ(Ó&K�Oð Ô9Ô9ÜŸ™ð FØ ŸI™I tÔ-HÈ/ô[ð  $×?Ñ?ÀÈÓN×NØ$ qÔ(ÜŸ™ØgÐim×irÑirØ)¨AÕ-¨t°_ôFô &Ÿmšm¨DÓ1×1Ñ1Þ ô
 —N‘NðJàŸ	™	 =°1Õ#4°oôGð  ×;Ñ;¸GÀTÓJ×JØûð=üs6  ‚1S%´BS%Â9ADÄ DÄDÄS%ÄDÄS"Ä2NÅ
NÅNÅNÅ5NÆS"ÆS%ÆNÆ#NÆ>S%Ç=NÈS%È	ANÉS"ÉS%É9NÊ2NÊ?S%ËNË (NÌ	NÌNÌNÌ-L0Ì.A"NÎNÎNÎS%ÎS"Î+S"Î,BSÐ;S"Ð<S%ÑA
SÒRÒSÒS%Ò:SÓS"ÓS%ÓSÓS"Ó"S%c                óP   <€ V ^8„  d   QhRS[ RS[S[S[ S[3,          ,          RR/# ©r   r±  rO  r   Nr  )r   r…  s   "€r   r   r†    s1   ø€ ÷ %4ñ %4©sð %4¹hÁtÉCÑQTÈHÅ~Õ>Vð %4Ð[_ñ %4r   c              ƒ  óL  a aaa
a"  € S;'       g    / P                  R4      '       g   \        \        S RR4      RR4      '       g   R# S P                  P                  R/ 4      oS P                  P                  R/ 4      p\	        S4      o
SP                  S
4      pVe   VP                  4       '       g   R# \        P                  ! 4       pVP                  4       pWcP                  S
\        R4      4      ,
          \        S R	R
4      8  d   R# WcS
&   R VVV 3R llpVP                  V! 4       4      pVSS
&   VP                  V
V3R l4       \        S RR4      p	\        V	\        4      '       d/   V	P                  V4       VP                  V	P                  4       R# R# 5i)a   Re-arm typing after an intermediate send (Telegram clears it when a message lands). Skipped on
the FINAL reply (``metadata["notify"]``): the refresh loop is gone and no API cancels the bubble.

Scheduled, never awaited: ``sendChatAction`` is a fire-and-forget UI hint, and awaiting its TLS
round-trip on the send path after *every* streamed chunk pinned the event loop the ``getUpdates``
long-polls live on until they rotted into CLOSE-WAIT while the adapter still reported connected
(#111727). ``_keep_typing`` already refreshes every 2s, so one in-flight re-arm per chat, at most
one per ``typing_retrigger_min_interval_seconds``, covers the gap a landed message leaves.rR  rš  NÚtyping_indicatorTrÐ  rÑ  z-infrÒ  rl  c                ó   € V ^8„  d   QhRR/# rd   rQ   )r   s   "r   r   Ú7TelegramAdapter._retrigger_typing.<locals>.__annotate__(  s   € ÷ 	Cñ 	C˜dñ 	Cr   c               “   óÈ   <"  € \         P                  ! \        4      ;_uu_ 4        SP                  S SR 7      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)rä  N)r%  r&  r*   Úsend_typing)r±  rO  r“  s   €€€r   Ú_quietÚ1TelegramAdapter._retrigger_typing.<locals>._quiet(  sF   øé € Ü×$Ò$¤Y×/Õ/Ø×&Ñ& w¸Ð&ÓB×BÐB÷ 0Ñ/ÙB÷ 0×/Ð/üs,   ƒ#A"¦A½A¾AÁ
A"ÁAÁA	Á	A"c                 ó^   <€ SP                  S4      V J ;'       d    SP                  SR 4      # rP   )r  rY   )r{  r¤   Útaskss   &€€r   r¾  Ú3TelegramAdapter._retrigger_typing.<locals>.<lambda>.  s*   ø€ ¨E¯I©I°c«N¸dÐ,B×,[Ð,[ÀuÇyÁyÐQTÐVZÓG[Ð,[r   rp  )r  r]   rÇ  r¦  r   r{  r0   rÑ  r}  rA   rÒ  rq  r5  rX   r[   rr  )r“  r±  rO  Úsent_atÚ	in_flightrâ  rD  rn  r.   Útrackedr¤   rq  s   fff       @@r   Ú_retrigger_typingÚ!TelegramAdapter._retrigger_typing  sX  üé € ð �NˆN˜×Ñ ×)Ò)´¼ÀÀxÐQUÓ9VÐXjÐlp×1qÒ1qÙà)-¯©×)AÑ)AÐBdÐfhÓ)iˆØ$(§M¡M×$<Ñ$<Ð=\Ð^`Ó$aˆÜ�'‹lˆØ—I‘I˜c“Nˆ	ØÒ ¨¯©×)9Ò)9ÙÜ×'Ò'Ó)ˆØ�i‰i‹kˆð —‘˜S¤%¨£-Ó0Õ0´7¸4ÐAfÐhkÓ3lÔlÙØ�‰÷	Cò 	Cð ×Ñ¡£Ó)ˆØˆˆc‰
Ø×ÑÕ[Ô\ä˜$Ð 3°TÓ:ˆÜ�gœs×#Ò#Ø�K‰K˜ÔØ×"Ñ" 7§?¡?Ö3ñ $ùs   ‡!F$©BF$Â7C-F$c                ón   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# r(  r)  )r   r…  s   "€r   r   r†  5  sV   ø€ ÷ Vñ VÙðVÙ%(ðVÙ4<¹SµMðVÙT\Ñ]aÑbeÑgjÐbjÕ]kÕTlðVñ yCñVr   c              ƒ  ó~  "  € V P                   '       gä   V P                  4       pVe   VP                  WW44      G Rj  x€L
 # V P                  4       '       g   V P	                  4       G Rj  x€L
 '       g"   \        RRV P                  4       '       * R7      # V P                  4       pV P                   '       g   Ve   VP                  WW44      G Rj  x€L
 # V P                   '       g   \        RRRR7      # \        V RR4      '       d   \        RRRR7      # V'       d   VP                  4       '       g   \        RRR7      # V P                  V4      ;_uu_4       GRj  x€L
  V P                  WW44      G Rj  x€L
 uuRRR4      GRj  x€L
  #  ELT EL) LÄ L8 L  L  + GRj  x€L 
 '       g   i     R# ; i5i)	z"Send a message to a Telegram chat.NFúNot connectedr[  Trù  r  r1  )
rÁ  r=  Úsendr4  rG  r�   r]   r  rM  Ú_send_text_locked)r“  r±  r›  rò  rO  r<  s   &&&&& r   r{  ÚTelegramAdapter.send5  sQ  é € ð �y�yˆyØ×5Ñ5Ó7ˆDØÒØ!ŸY™Y w¸ÓL×LÐLØ×'Ñ'×)Ò)°t×7RÑ7RÓ7T×1TÖ1TÜ!¨%°ÐVZ×VnÑVnÓVpÔRpÔqÐqØ×5Ñ5Ó7ˆDØ—9—9�9 Ò!1Ø!ŸY™Y w¸ÓL×LÐLØ—9—9�9Ü!¨%°ÐRVÔWÐWä�4Ð.°×6Ò6Ü eÐ3GÐSWÔXÐXç˜gŸm™mŸošoÜ d°tÔ<Ð<ð ×'Ñ'¨×0×0Õ0Ø×/Ñ/°À(ÓU×U÷ 1×0Ò0ò! MÚ1Tñ Mñ 1ÙU÷ 1×0×0Ó0üs¸   ‚<F=¾F¿F=ÁF=Á,FÁ-	F=Á7AF=Â:F=ÃFÃF=Ã*6F=Ä!F=Ä7*F=Å!FÅ"F=Å%F Å;FÅ<F Å?F=ÆFÆF=ÆF=ÆF=ÆF=ÆF ÆF=Æ F:	Æ&F)Æ'
F:	Æ2F:	Æ4	F=c                ón   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# r(  r)  )r   r…  s   "€r   r   r†  N  sR   ø€ ÷ )~ñ )~Ùð)~Ù%(ð)~Ù4<¹SµMð)~ÙMUÑVZÑ[^Ñ`cÐ[cÕVdÕMeð)~Ùjtñ)~r   c           
   ƒ  ó$  "  € V P                  V4      pVe-   \        P                  RV P                  W4       \	        V4      # V P                  V4      pV^ 8”  d@   \        P                  RV P                  W4       \        P                  ! V4      G Rj  x€L
  V P                  V4       V P                  4       p. p. p	 V P                  W$R7      '       dL   V P                  WW44      G Rj  x€L
 p
V
e.   V
P                  '       d   V P                  W4      G Rj  x€L
  V
# V P                  V P!                  V4      V P"                  \$        R7      p\'        V4      ^8”  d1   V Uu. uF$  p\)        \*        P,                  ! RRV4      4      NK&  	  ppV P/                  WW“WG4      G Rj  x€L
 #  EL LÄ L—u upi  L  \0         dE   pT P3                  YÇ4      pT P5                  YØ\'        T	4      R Y�P6                  R7      u Rp?# Rp?ii ; i5i)	zP``send()`` body under the per-chat lock: rich fast-path, else MarkdownV2 chunks.Nzg[%s] Telegram flood control still active for chat %s (%.0fs left); refusing locally without an API callzE[%s] pacing send for chat %s (shared send+edit budget: slot in %.1fs)rä  ©Úlen_fnz \((\d+)/(\d+)\)$z \\(\1/\2\\)©Útail_certain)Ú_send_flood_cooldown_remainingr7   r-  r„  rÖ   Ú_chat_outbound_slot_remainingr8   r0   rC  Ú_hold_chat_outbound_slotrL  rÓ  r:  rÔ   rv  Útruncate_messageÚformat_messageÚMAX_MESSAGE_LENGTHrš   r+  r[  rU  rN  Ú_send_chunksr*   Ú_classify_send_exceptionÚ_with_partial_sendr&  )r“  r±  r›  rò  rO  ÚcooldownÚslot_remainingrY  ÚchunksÚ	deliveredÚrich_resultrO  r  Ú
classifieds   &&&&&         r   r|  Ú!TelegramAdapter._send_text_lockedN  sö  é € ð ×6Ñ6°wÓ?ˆØÒÜ�N‰NØyØ—	‘	˜7ô.ô % XÓ.Ð.ð ×;Ñ;¸GÓDˆØ˜AÔÜ�L‰LØWØ—	‘	˜7ô4ô —-’- Ó/×/Ð/Ø×%Ñ% gÔ.Ø×0Ñ0Ó2ˆØˆØ!ˆ	ð	~ð ×(Ñ(¨Ð(×DÒDØ$(×$7Ñ$7¸È(Ó$]×]�ØÒ*Ø"×*×*Ð*Ø"×4Ñ4°WÓG×GÐGØ&Ð&Ø×*Ñ*¨4×+>Ñ+>¸wÓ+GÈ×I`ÑI`ÔirÐ*ÓsˆFÜ�6‹{˜QŒñ "(óá!'˜ô 9¼¿ºÐ@TÐVeÐglÓ9mÖnÙ!'ð ð ð ×*Ñ*¨7¸IÐQYÓg×gÐgò+ 0ñ ^ñ Hùò
ñ høÜô 	~Ø×6Ñ6°qÓFˆJØ×*Ñ*¨:¼cÀ)»n¸oÐ7NÐPY×h|Ñh|Ð*Ó}Õ}ûð	~üs—   ‚BHÂF0Â)HÃ-F> Ã.F3Ã/F> Ä	F> ÄF5ÄF> Ä#HÄ$AF> Å)*F7ÆF> Æ+F<Æ,F> Æ/HÆ3F> Æ5F> Æ7F> Æ>HÇ	9HÈHÈHÈHÈHc                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r  rY  r   )r*   rü  r�   )r   r…  s   "€r   r   r†  y  s"   ø€ ÷ #ñ #©)ð #Á%ð #ÉJñ #r   c                óü  € \        V4      p\        P                  RV P                  V4       \	        V4      P                  4       p\        V4      pRV9   g   RV9   d/   \        P                  RV P                  4       \        RRRR7      # V^,          pT;'       d    \        W4      ;'       g    RV9   p\        RTV P                  V4      ;'       g!    V P                  V4      ;'       g    V'       * VR	7      # )
a$  The failed ``SendResult`` for an exception escaping the chunk loop. ``retryable`` doubles as
"non-delivery is certain": a plain ``TimedOut`` may have reached Telegram, so it is neither re-sent
by ``_send_with_retry`` nor resumed from; a wrapped ConnectTimeout / httpx pool timeout never left.z([%s] Failed to send Telegram message: %sÚmessage_too_longútoo longzF[%s] send() content too long, falling back to new-message continuationFÚtoo_long)rÔ   r   Ú
error_kindr  )rÔ   r   r&  r™  )r,   r7   r   r„  r   rø   r�   r8   r�   r5  r�  r‡  )r“  r  rY  r  Úerr_strr™  Ú_toÚ
is_timeouts   &&&     r   r‹  Ú(TelegramAdapter._classify_send_exceptiony  sÝ   € ô 1°Ó3ˆ
Ü�‰Ð?ÀÇÁÈJÔWÜ�a“&—,‘,“.ˆÜ(¨Ó+ˆ
à Ô(¨J¸'Ô,AÜ�L‰LÐaÐcg×clÑclÔmÜ eÐ3EÐR\Ô]Ð]Ø˜!�nˆØ×0Ð0œj¨Ó0×KÐK°[ÀGÑ5Kˆ
ÜØ Ø×7Ñ7¸Ó:×pÐp¸d×>[Ñ>[Ð\]Ó>^×pÐpÐfpÔbpØ!ô#ð 	#r   c                óš   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[RS[/# )r   r±  r�  r�  rò  rO  rY  r   )r   rT  r   r  r   rü  r�   )r   r…  s   "€r   r   r†  Œ  sh   ø€ ÷ Fñ FÙðFÙ$(©¥IðFÙ:>¹s½)ðFÙOWÑX[Í}ðFá™4¡¡S �>Õ*ðFá9>ðFáCMñFr   c              ƒ  ó&  "  € V P                  V4      pV P                  V4      pRp	\        V4      p
V FŽ  pV P                  W\        V4      WEWyV4      G Rj  x€L
 p\	        V\
        4      '       d(   V P                  WÂ\        V4      V
,
          R V4      u # Vw  rÙVP                  \        VP                  4      4       K�  	  V P                  W4      G Rj  x€L
  \        RV'       d
   V^ ,          MRR\        V4      RVRV	/R7      #  L´ L45i)u  Deliver formatted ``chunks`` in order, appending each landed message id to ``delivered``
(pre-seeded with the ids of an earlier partial send when resuming â€” the chunk index used for
reply routing continues from there). A mid-loop refusal returns the ``partial_overflow`` result.FNTÚmessage_idsÚrequested_thread_idÚthread_fallback©rÔ   r¡  Úraw_response)rÓ  rû  r+  rd  r5  r�   rŒ  rd  r   r¡  rv  rT  )r“  r±  r�  r�  rò  rO  rY  rx  r¡  rX  r€  rO  Úoutcomer7  s   &&&&&&&       r   rŠ  ÚTelegramAdapter._send_chunksŒ  s  é € ð ×,Ñ,¨XÓ6ˆ	Ø"×>Ñ>¸yÓIÐØ$ÐÜ�I“ˆÛˆEØ ×9Ñ9Ø¤ I£°ÀIÐepór÷ rˆGä˜'¤:×.Ò.ð ×.Ñ.¨w¼sÀ9»~ÐPUÕ?UÐ?VÐ8WÐYbÓcÒcØ(/Ñ%ˆCØ×ÑœS §¡Ó0Ö1ñ ð ×$Ñ$ WÓ7×7Ð7ÜØ·Y Y¨q¦\ÀDàœt I›Ð0EÐGZÐ\mð  pDðEôFð 	Fñrñ 	8ùs%   ‚ADÁDÁBDÃDÃ3DÄDrƒ  c          
      óX   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[,          RS[RS[ /# )r   rJ   Úundeliveredr�  rƒ  r   )r�   rT  r   rB   )r   r…  s   "€r   r   r†  ¦  s=   ø€ ÷ ñ ÙðÙ)-©c­ðÙ?CÁC½yðÙ[_ðÙkuñr   c               ó”  € V'       g   V # \        V P                  \        4      '       d   \        V P                  4      M/ pVP                  RRR\	        V4      R\	        V4      \	        V4      ,           RVR
,          R\        VR,          4      /4       V'       d%   V'       d   \        V4      VR&   \        V4      VR	&   W@n        V # )au  Mark a split-send failure that happened after earlier chunks landed with the ``partial_overflow``
contract (the same key ``_edit_overflow_split`` sets and the stream consumer reads), so no caller
re-sends the already-visible head. ``undelivered`` (the formatted remainder, for
:meth:`_resume_partial_send`) is attached only when ``tail_certain``. No-op when nothing landed.Úpartial_overflowTÚdelivered_chunksÚtotal_chunksÚlast_message_idÚcontinuation_message_idsºé   NNÚundelivered_chunksÚdelivered_message_idséÿÿÿÿ)r5  r¤  r  r£  r+  rü  )rJ   r¨  r�  rƒ  rŒ  s   &&&$ r   rŒ  Ú"TelegramAdapter._with_partial_send¥  sµ   € ÷ ØˆMÜ+5°f×6IÑ6IÌ4×+PÒ+PŒd�6×&Ñ&Ô'ÐVXˆØ�
‰
Ø Ð&8¼#¸i».È.ÔZ]Ð^gÓZhÔknÐozÓk{ÕZ{Ø˜y¨�}Ð.HÌ%ÐPYÐZ\ÕP]ÓJ^ð`ô 	a÷ ŸKÜ(-¨kÓ(:ˆCÐ$Ñ%Ü+0°Ó+;ˆCÐ'Ñ(Ø!ÔØˆr   c                ó~   <€ V ^8„  d   QhRS[ RS[RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[,          /# )r   r±  rJ   rò  rO  r   )r   r�   r   r  r   )r   r…  s   "€r   r   r†  ¸  s`   ø€ ÷ zñ zÙðzÙ$.ðzÙ=EÁc½]ðzÙV^Ñ_cÑdgÑilÐdlÕ_mÕVnðzÙs{ñ  }Gõ  tHñzr   c          
   ƒ  óÀ  "  € \        VP                  \        4      '       d   VP                  M/ pVP                  R4      pV'       d   V P                  '       g   R# \        VP                  R4      ;'       g    R4      p\        V4      pV P                  V4      ;_uu_4       GRj  x€L
  V P                  V4      p	V	e8   V P                  \        V	4      \        V4      V4      uuRRR4      GRj  x€L
  # V P                  4       p
 V P                  V\        V4      WsWJ4      G Rj  x€L
 uuRRR4      GRj  x€L
  #  L˜ LO L L  \         di   pT P                  Yº4      pT P                  T\        T4      \        T4      T,
          R Y|P                  R7      u Rp?uuRRR4      GRj  x€L 
  # Rp?ii ; i  + GRj  x€L 
 '       g   i     R# ; i5i)z½Send only the chunks a partial ``send()`` could not deliver (``raw_response["undelivered_chunks"]``),
continuing the message-id sequence; ``None`` when the tail was not certain-undelivered.r±  Nr²  r‚  rQ   )r5  r¤  r  r  rÁ  rT  r+  rM  r„  rŒ  rÖ   rL  rŠ  r*   r‹  r&  )r“  r±  rJ   rò  rO  rŒ  r¨  r�  r€  r�  rY  r  r’  s   &&&$$        r   Ú_resume_partial_sendÚ$TelegramAdapter._resume_partial_send¸  s€  é € ô &0°×0CÑ0CÄT×%JÒ%Jˆf×!Ò!ÐPRˆØ—g‘gÐ2Ó3ˆß $§)§) )ÙÜ˜Ÿ™Ð!8Ó9×?Ð?¸RÓ@ˆ	Ü�I“ˆØ×'Ñ'¨×0×0Õ0Ø×:Ñ:¸7ÓCˆHØÒ#Ø×.Ñ.Ô/@ÀÓ/JÌDÐQ\ÓL]Ð_hÓi÷ 1×0Ò0ð ×4Ñ4Ó6ˆKðzØ!×.Ñ.¨w¼¸[Ó8IÈ9Ð`hÓv×v÷ 1×0Ö0ñ wñ 1øô ô zØ!×:Ñ:¸1ÓJ�
Ø×.Ñ.Ø¤ [Ó 1´#°i³.À5Õ2HÐ2IÐ JÈI×dxÑdxð /ó zô z÷ 1×0Ó0ûðzú÷ 1×0×0Ñ0üsÍ   ‚AGÁ
GÁGÁ;/GÂ*EÂ+GÂ.:GÃ(GÃ5EÃ6GÃ;GÄ EÄ,EÄ-EÄ0GÄ=E	Ä>GÅGÅEÅ	GÅF>ÅA
F9Æ F>Æ!GÆ%GÆ2F5Æ3GÆ9F>Æ>GÇG	ÇG
Ç
G	ÇG	Ç	Gc                ó^   <€ V ^8„  d   QhRS[ RS[ RS[ RS[S[S[ S[3,          ,          RS[/# )r   r±  Ú
status_keyr›  rO  r   r)  )r   r…  s   "€r   r   r†  Î  sG   ø€ ÷ ñ ÙðÙ(+ðÙ69ðÙHPÑQUÑVYÑ[^ÐV^ÕQ_ÕH`ðÙlvñr   c             ƒ  óf  "  € \        V4      \        V4      3pV P                  P                  V4      pVe¢   V P                  WVRVR7      G Rj  x€L
 pVP                  '       dW   VP
                  '       dC   V P                  P                  V4      V8X  d#   \        VP
                  4      V P                  V&   V# V P                  P                  VR4       V P                  WVR7      G Rj  x€L
 pVP                  '       d¥   VP
                  '       d“   \        V P                  4      V P                  8¼  dM   \        V P                  4      RV P                  ^,            F  pV P                  P                  VR4       K!  	  \        VP
                  4      V P                  V&   V#  EL\ L¿5i)uß  Send a status message, or edit the previous one with the same ``(chat_id, status_key)``; if the
edit fails (deleted, too old, â€¦) the cached id is dropped and a fresh message is sent.

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.
NT©ÚfinalizerO  rä  )r   r  r  Úedit_messagerÔ   r¡  rY   r{  r+  Ú_STATUS_MESSAGE_IDS_MAXrT  )	r“  r±  rº  r›  rO  r¤   Ú	cached_idrJ   Ústales	   &&&&$    r   Úsend_or_update_statusÚ%TelegramAdapter.send_or_update_statusÎ  sd  é € ô �7‹|œS ›_Ð-ˆØ×,Ñ,×0Ñ0°Ó5ˆ	ØÒ Ø×,Ñ,¨WÀÐSWÐbjÐ,Ók×kˆFØ�~�~ˆ~à×$×$Ð$¨×)AÑ)A×)EÑ)EÀcÓ)JÈiÔ)WÜ47¸×8IÑ8IÓ4J�D×,Ñ,¨SÑ1Ø�Ø×$Ñ$×(Ñ(¨¨dÔ3Ø—y‘y ¸H�yÓE×EˆØ�>�>ˆ>˜f×/×/Ð/Ü�4×+Ñ+Ó,°×0LÑ0LÔLä! $×":Ñ":Ó;Ð<_¸d×>ZÑ>ZÐ^_Õ>_Ó`�EØ×,Ñ,×0Ñ0°¸Ö=ñ aä,/°×0AÑ0AÓ,BˆD×$Ñ$ SÑ)Øˆò lñ Fùs>   ‚AF1ÁF,ÁF1Á'F1Á9A6F1Ã/F/Ã0F1ÄF1ÄBF1Æ/F1c          
      ó6   <€ V ^8„  d   QhRS[ RS[ RS[ RS[RR/# )r   r±  r¡  r+   rQ  r   Nr¦   )r   r…  s   "€r   r   r†  ê  s9   ø€ ÷ Cñ C©ð C¹ð CÁCð CÑUXð CÐdhñ Cr   c              ƒ  óÀ   "  € R\        V4      R\        V4      RV/pVe   WER&   \        V P                  P                  ! R	/ VB \
        RRR7      G Rj  x€L
  R#  L5i)
zN``editMessageText`` with normalized ids; ``parse_mode=None`` sends plain text.r±  r¡  r+   NrQ  r/  FrL  rQ   )r½   rÚ   rK   rÁ  Úedit_message_textr3  )r“  r±  r¡  r+   rQ  r¥   s   &&&&& r   Ú
_edit_textÚTelegramAdapter._edit_textê  sl   é € à"+Ô-GÈÓ-PÐR^Ô`cÐdnÓ`oÐqwÐy}Ð!~ˆØÒ!Ø#-�<Ñ Ü)Ø�I‰I×'Ò'Ñ1¨&Ñ1Ô;NÐVeð  }BôC÷ 	Cô 	Cùs   ‚AAÁAÁAc                ó>   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[ RS[/# )r   r±  r¡  Ú	formattedÚplainÚwarn_fmtr   r'  )r   r…  s   "€r   r   r†  ò  s;   ø€ ÷ 
ñ 
±Sð 
Ácð 
ÑVYð 
Ñbeð 
Ñqtð 
Ñy}ñ 
r   c              ƒ  óh  "  €  V P                  WV\        P                  4      G Rj  x€L
  R#  L  \         dt   pR\	        T4      P                  4       9   d    Rp?R# \        P                  YPP                  \        T4      4       T P                  YT4      G Rj  x€L 
   Rp?R# Rp?ii ; i5i)zšMarkdownV2 edit with plain-text fallback. Returns True on a "not modified" no-op (caller may
skip further work); the fallback edit's exceptions propagate.NrG  TF)
rÇ  r}   rS  r*   r   rø   r7   r-  r„  r,   )r“  r±  r¡  rÊ  rË  rÌ  Úfmt_errs   &&&&&& r   Ú_edit_markdown_or_plainÚ'TelegramAdapter._edit_markdown_or_plainò  s‡   é € ð	>Ø—/‘/ '°yÄ)×BWÑBWÓX×XÐXñ ñ YøÜô 	>Ø¤ W£×!3Ñ!3Ó!5Ô5ÝÜ�N‰N˜8§Y¡YÔ0KÈGÓ0TÔUØ—/‘/ '°uÓ=×=Õ=Ùûð	>üsN   ‚B2„$1 ¨/©1 ­B2¯1 ±B/¼B*ÁB2Á >B*ÂB!ÂB*Â$B2Â*B/Â/B2r½  c                ód   <€ V ^8„  d   QhRS[ RS[ RS[ RS[RS[S[S[ S[3,          ,          RS[/# ©r   r±  r¡  r›  r½  rO  r   ©r   rB   r   r  r   r�   )r   r…  s   "€r   r   r†  þ  sW   ø€ ÷ A?ñ A?ÙðA?Ù(+ðA?Ù69ðA?ÙHLðA?Ù`hÑimÑnqÑsvÐnvÕiwÕ`xðA?áñA?r   c          	   ƒ  óx  a"  € V P                   '       g   \        RRR7      # V'       gb   \        V4      V P                  8:  dH   V P	                  V4      ^ 8”  d2   \
        P                  RV P                  V4       \        RVRR/R7      # V P                  V4       V'       d9   V P                  V4      '       d"   V P                  WW5R7      G R	j  x€L
 pVe   V# \        V4      \        V4      3pRpV'       d   V P                  P                  VR	4       \        V4      V P                  8”  df   V'       d   V P                  WW4VR
7      G R	j  x€L
 # V P                  V4      pRpV P                  P!                  V4      V8X  d   \        RVR7      # M$V'       g   V P                  P                  VR	4        V'       g>   V P#                  WV4      G R	j  x€L
  V'       d   W0P                  V&   \        RVR7      # T P%                  YV P'                  V4      V'       d   \)        V4      MTR4      G R	j  x€L
  \        RVR7      #  EL{ Lý Lw L  \*         EdV   p	\        T	4      P-                  4       oRS9   d   \        RTR7      u R	p	?	# RS9   g   RS9   dÞ   \
        P                  RT P                  \        T4      T P                  4       T'       d#   T P                  YY4TR
7      G R	j  x€L 
 u R	p	?	# T P                  T4      p
T P                  P!                  T4      T
8X  d   \        RTR7      u R	p	?	# T P#                  YT
4      G R	j  x€L 
  Y P                  T&   \        RTR7      u R	p	?	# \/        T	RR	4      pTf	   RS9   Ede   T'       d   TMRpT\0        8”  d7   \
        P3                  RT P                  T\0        4       \5        T4      u R	p	?	# \
        P3                  RT P                  T4       \6        P8                  ! T4      G R	j  x€L 
   T P#                  YT4      G R	j  x€L 
  \        RTR7      u R	p	?	#   \*         dœ   p\;        T4      p\
        P=                  RT P                  T4       \/        TRR	4      pTf   R\        T4      P-                  4       9   d%   \5        Te   \?        T4      MT4      u R	p?u R	p	?	# \        RTR7      u R	p?u R	p	?	# R	p?ii ; i\;        T	4      pRp\@        ;QJ d    T3R lT 4       F  '       g   K   RM	  RM! T3R lT 4       4      '       d6   \
        P3                  RT P                  TT4       \        RTRR7      u R	p	?	# \
        P=                  RT P                  TT4       \        RTR7      u R	p	?	# R	p	?	ii ; i5i)aC  Edit a previously sent Telegram message.

Telegram caps a message at 4096 UTF-16 codeunits. Streaming replies that outgrow it must NOT be truncated
silently nor fail (the consumer would re-send a duplicate): edit with the first chunk, send the rest as
continuations, and return the final chunk's id as the next edit target.Frz  ©rÔ   r   zK[%s] skipping interim edit for chat %s (shared send+edit budget: slot busy)TÚskippedr£  rä  Nr¼  r1  z;[%s] MarkdownV2 edit failed, falling back to plain text: %srG  r–  r—  z6[%s] edit_message overflow (%d UTF-16 > %d), splittingrÕ   r\  rÐ   zQ[%s] Telegram flood control, refusing edit (retry_after %.1fs > %.0fs inline cap)z*[%s] Telegram flood control, waiting %.1fsz+[%s] Edit retry failed after flood wait: %sc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irP   rQ   )rR   r7  rš  s   & €r   rT   Ú/TelegramAdapter.edit_message.<locals>.<genexpr>{  s   øé € Ð<Ñ); A˜–<Ó);ùr?  z@[%s] Transient network error editing message %s (will retry): %sr[  z+[%s] Failed to edit Telegram message %s: %s)Úconnecterrorzconnect errorzconnection errorrq  znetwork errorr  ÚreadtimeoutÚwritetimeoutzserver disconnectedztemporarily unavailableztemporary failurer±  )!rÁ  r�   rš   r‰  r…  r7   r8   r„  r†  rÌ  rH  r   r  rY   Ú_edit_overflow_splitÚ!_truncate_stream_overflow_previewr  rÇ  rÏ  rˆ  rW  r*   rø   r]   r]  r-  rÖ   r0   rC  r,   r   rA   r¯  )r“  r±  r¡  r›  r½  rO  r‘  Ú_preview_keyÚ_saturated_previewr  Ú	truncatedrÕ   rÒ   r4  Úsafe_retry_errorÚ
retry_waitr  Ú_transient_markersrš  s   &&&&$$            @r   r¾  ÚTelegramAdapter.edit_messageþ  sí  øé € ð �y�yˆyÜ e°?ÔCÐC÷ Ü˜'Ó" d×&=Ñ&=Ô=Ø×2Ñ2°7Ó;¸aÔ?ä�L‰LØ]Ø—	‘	˜7ô$ô  d°zÐQZÐ\`ÐPaÔbÐbØ×%Ñ% gÔ.÷ ˜×+Ñ+¨G×4Ò4Ø $× 3Ñ 3°GÈÐ 3Ó d×dˆKØÒ&Ø"Ð"ô ˜G›¤c¨*£oÐ6ˆØ"ÐßØ×'Ñ'×+Ñ+¨L¸$Ô?Ü�WÓ × 7Ñ 7Ô7ßØ!×6Ñ6°wÈGÐqyÐ6Óz×zÐzØ×<Ñ<¸WÓEˆGØ!%Ðð ×*Ñ*×.Ñ.¨|Ó<ÀÔGÜ!¨$¸:ÔFÐFð Hçà×'Ñ'×+Ñ+¨L¸$Ô?ðA	?ßØ—o‘o g¸7ÓC×CÐCß%Ø@G×/Ñ/°Ñ=Ü!¨$¸:ÔFÐFØ×.Ñ.Ø T×%8Ñ%8¸Ó%A×[bÄ;ÈwÔCWÐhoØMóO÷ Oð Oô  d°zÔBÐBòG eñ  {ñ DñOøô õ 7	?Ü˜!“f—l‘l“nˆGØ Ô(Ü!¨$¸:ÔFÕFà! WÔ,°
¸gÔ0EÜ—‘ØLÈdÏiÉiÔYbÐcjÓYkÐmq÷  nEñ  nEôFçØ!%×!:Ñ!:¸7ÐPWÐu}Ð!:Ó!~×~Ð~Õ~ð !×BÑBÀ7ÓK�	Ø×.Ñ.×2Ñ2°<Ó@ÀIÔMÜ%¨d¸zÔJÕJØ—o‘o g¸9ÓE×EÑEØ<E×+Ñ+¨LÑ9Ü!¨$¸:ÔFÕFô " ! ]°DÓ9ˆKØÒ&¨-¸7Õ*Bß&1‘{°s�ØÔ5Ô5ä—N‘NØkØŸ	™	 4Ô)DôFô -¨TÓ2Õ2Ü—‘ÐKÈTÏYÉYÐX\Ô]Ü—m’m DÓ)×)Ñ)ðMØŸ/™/¨'¸wÓG×GÑGÜ%¨d¸zÔJÕJøÜ ô MÜ'BÀ9Ó'MÐ$Ü—L‘LÐ!NÐPT×PYÑPYÐ[kÔlÜ!(¨°MÀ4Ó!H�JØ!Ò-°Ä#ÀiÃ.×BVÑBVÓBXÔ1Xô
  1Ø1;Ò1GœE *Ô-ÈTó S÷ Sò Sä%¨eÐ;KÔL×LÒLûðMúô 5°QÓ7ˆJð"pÐ÷ ‹sÔ<Ñ);Ó<�s�sŠsÔ<Ñ);Ó<×<Ò<Ü—‘ÐaÐcg×clÑclÐnxð  {Eô  FÜ!¨%°zÈTÔRÕRÜ�L‰LÐFÈÏ	É	ÐS]Ð_iÔjÜ e°:Ô>Õ>ûðo7	?üs¿  ƒ'V:«A9V:Â%V:Â<V:ÃIÃA'V:Ä;V:ÅIÅAV:Æ V:Æ=I ÇI ÇIÇI Ç'I ÈV:È9I È;IÈ<I ÉV:ÉV:ÉI ÉI ÉV7É",V2ÊV7ÊV:ÊA"V2Ë6K9Ë7V2Ë;V7Ë<V:Ì=V2Ì>V7Ì?V:ÍV2ÍMÍV2Í9V7Í:V:Í? V2Î ?V2ÏV7Ï V:Ï%:V2ÐP"Ð V2Ð&QÐ;P>Ð<QÑV7ÑV:ÑS9ÑA4S4ÓS9ÓV2ÓV7ÓV:ÓS4Ó)S9Ó*V2Ó.V7Ó/V:Ó4S9Ó9/V2Ô+V2Õ	/V2Õ8V7Õ9V:Õ>.V2Ö,V7Ö-V:Ö2V7Ö7V:c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rš  rž   )r   r…  s   "€r   r   r†  �  s   ø€ ÷ \ñ \¹ð \Áñ \r   c                óR   € V P                  WP                  \        R7      ^ ,          # )a�  One-message preview for oversized streaming edits (edits must keep targeting the original id;
final edits use ``_edit_overflow_split``).

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ž  s   &&r   rÝ  Ú1TelegramAdapter._truncate_stream_overflow_preview�  s&   € ð ×$Ñ$ W×.EÑ.EÌiÐ$ÓXÐYZÕ[Ð[r   c                ó    <€ V ^8„  d   QhRS[ RS[ RS[S[,          RS[S[ S[3,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  rO  r	  r  rx  rO  r½  )r   r   rÚ   r  r   rB   )r   r…  s   "€r   r   r†  ‹  sf   ø€ ÷ &ñ &Ùð&Ù#&ð&Ù5=¹cµ]ð&ÙSWÑX[Ñ]`ÐX`ÕSað&á™C•=ð&á,4±T¹#¹s¸(µ^Õ,Dð&áPTñ&r   c              ƒ  ó>  "  € / V P                  4       CV P                  V4      CpV'       d   RMR Fœ  p	 V	'       d   \        V P                  V4      4      p
MV'       d   \	        V4      MTp
\        V P                  P                  ! RR\        V4      RT
RV	'       d   \        P                  MRRV/VBVB \        RRR7      G Rj  x€L
 u # 	  R#  L
  \         Ed9   pR	\        T4      P                  4       9   dÖ   T P                  T4      '       d   / MT P!                  YTRR
7      p \        T P                  P                  ! RR\        T4      RT'       d   \	        T4      MT/TBTB \        RRR7      G Rj  x€L 
 u Rp?u #   \         d;   p\"        P%                  RT P&                  \)        T4      4        Rp? Rp? R# Rp?ii ; iT	'       d    Rp?EK²  \"        P%                  RT P&                  \)        T4      4        Rp? R# Rp?ii ; i5i)z°Send one continuation chunk (MarkdownV2 then plain on finalize; raw when streaming); drops the
reply anchor once on 'reply message not found'. Returns the sent message or None.Fr±  r+   rQ  Nrù  r/  rL  zreply message not found©rù  z4[%s] Overflow continuation no-reply retry failed: %sz*[%s] Overflow continuation send failed: %s©TF©FrQ   )r—  rU  r[  rˆ  rW  rK   rÁ  rÄ  r½   r}   rS  r3  r*   r   rø   rå  r   r7   r-  r„  r,   )r“  r±  rO  r	  r  rx  rO  r½  ÚbaseÚuse_markdownr+   rO  Úretry_thread_kwargsÚ
_retry_errs   &&&&&&&&      r   Ú_send_overflow_continuationÚ+TelegramAdapter._send_overflow_continuation‹  s  é € ð
 V�$×+Ñ+Ó-ÐU°×1JÑ1JÈ8Ó1TÐUˆß-5™M¸8ÒCˆLðßÜ?À×@SÑ@SÐTYÓ@ZÓ[‘D÷ 2:œ; uÔ-¸u�DÜ8Ø—I‘I×*Ò*ñ NÜ6°wÓ?ðNØFJðNßp|ÔW`×WlÒWlð  CGðNà(3ðNà7DðNàHLñNô 0°Ð]bô	d÷ dò dñ Dñ@ ñ3døô
 õ Ø,´°H³×0CÑ0CÓ0EÔEð #×5Ñ5°h×?Ò?™Ø!×9Ñ9¸'ÈhÐlpÐ9Óqð (ð	$Ü%@Ø ŸI™I×2Ò2ñ ;Ü$>¸wÓ$Gð;ßdlÌkÐZ_ÔN`Ðrwð;à1ð;à59ñ;ô %8¸Ðejô	&l÷  lð  l÷ løô
 %ô $ÜŸ™ØRÐTX×T]ÑT]Ô_zð  |Fó  `GôHç#štûð$ú÷  ÞÜ—‘ÐKÈTÏYÉYÔXsÐt|ÓX}Ô~Þûð'üsœ   ‚3H¶*CÁ!A(CÃ	CÃ
CÃHÃCÃHÃ"4HÄHÄ.AFÆ FÆFÆHÆHÆGÆ*GÇHÇHÇGÇ
HÇHÇ$*HÈHÈHÈHc                ód   <€ V ^8„  d   QhRS[ RS[ RS[ RS[RS[S[S[ S[3,          ,          RS[/# rÒ  rÓ  )r   r…  s   "€r   r   r†  ³  s[   ø€ ÷ .nñ .nÙð.nÙ(+ð.nÙ69ð.nÙHLð.nÙX`ÑaeÑfiÑknÐfnÕaoÕXpð.nñ }Gñ.nr   c             ƒ  ó´  "  € V P                  W0P                  \        R7      p\        V4      ^8:  d   V.pV^ ,          p V'       d?   V P	                  W\        V P                  V4      4      \        V4      R4      G Rj  x€L
  MV P                  WV4      G Rj  x€L
   . p	V.p
TpV P#                  V4      pVR
,           EF-  pV'       d   \%        V4      MRpV P'                  WW^R7      pV P)                  WWïWÅV4      G Rj  x€L
 pVfž   \        P+                  RV P                  ^\        V	4      ,           \        V4      4       RP-                  R V
 4       4      p\!        RVRRRRR^\        V	4      ,           R\        V4      RVRVR\/        V	4      /\/        V	4      R7      u # \        \1        VRR4      4      ;'       g    TpV	P3                  V4       V
P3                  V4       TpEK0  	  V	'       d
   V	R,          MTp\        P5                  RV P                  ^\        V	4      ,           V4       \!        RV\/        V	4      R7      #  ELÐ EL¸  \         dq   pR\        T4      P                  4       9  dH   \        P                  RT P                  \        T4      RR7       \!        R\        T4      R	7      u Rp?#  Rp?EL+Rp?ii ; i ELÏ5i)a$  Split an oversized edit across the existing message + continuations: edit ``message_id`` with
chunk 1, send the rest as replies to the previous chunk, return ``message_id=<last-chunk-id>`` so
the consumer keeps editing the newest message. ``success=False`` only if the first-chunk edit fails.r€  zW[%s] Overflow split: MarkdownV2 first-chunk edit failed, falling back to plain text: %sNrG  z0[%s] Overflow split: first-chunk edit failed: %sTr3   FrÕ  r¯  rê  z6[%s] Overflow split: stopped at %d/%d chunks deliveredr!   c              3   óR   "  € T F  p\         P                  ! R RV4      x € K  	  R# 5i)z \(\d+/\d+\)$r!   NrT  )rR   r�  s   & r   rT   Ú7TelegramAdapter._edit_overflow_split.<locals>.<genexpr>Ó  s$   é € Ð*uÑdtÐW`¬2¯6ª6Ð2BÀBÈ	×+RÐ+RÓdtùs   ‚%'Úoverflow_continuation_failedrª  r«  r¬  r­  Údelivered_prefixr®  )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[  rˆ  rW  rÇ  r*   r   rø   r7   r   r„  r,   r�   rÓ  rÚ   r   rñ  r-  rh  rü  r]   rd  r8   )r“  r±  r¡  r›  r½  rO  r�  Úfirst_chunkr  Úcontinuation_idsr«  Úprev_idrx  rO  r	  r  Úsent_msgrø  Únew_idÚlast_ids   &&&&$$              r   rÜ  Ú$TelegramAdapter._edit_overflow_split³  sÝ  é € ð
 ×&Ñ& w×0GÑ0GÔPYÐ&ÓZˆÜˆv‹;˜!ÔØ�YˆFØ˜Q•iˆð
	WßØ×2Ñ2ØÔ)MÈd×NaÑNaÐbmÓNnÓ)oÔq|ð  ~Ió  rJØmóo÷ oñ oð —o‘o g¸;ÓG×GÑGð ')ÐØ'˜=ÐØˆØ×,Ñ,¨XÓ6ˆ	Ø˜B—Z‘ZˆEß*1œ#˜gœ,°tˆKØ ×8Ñ8¸ÈXÐ8ÓwˆMØ!×=Ñ=¸gÈkÐjsð  @Hó  I÷  IˆHØÒä—‘ÐWÐY]×YbÑYbÐdeÔhkÐl|Óh}Õd}ô  @Cð  DJó  @Kô  LØ#%§7¡7Ñ*uÑdtÓ*uÓ#uÐ Ü!Ø!¨gÐ=[Ðgkà*¨DÐ2DÀaÌ#ÐN^ÓJ_ÕF_Ø&¬¨F«Ð5FÈÐQcÐeuØ2´EÐ:JÓ4Kð"Mô .3Ð3CÓ-DôFò Fô œ ¨<¸Ó<Ó=×HÐHÀˆFØ×#Ñ# FÔ+Ø×#Ñ# EÔ*Ø‹Gñ%  ÷& +;Ð" 2Ö&À
ˆÜ�‰ÐJÈDÏIÉIÐWXÔ[^Ð_oÓ[pÕWpÐryÔzÜ $°7ÔUZÐ[kÓUlÔmÐmòGoò HøÜô 	WØ¤S¨£V§\¡\£^Ô3Ü—‘ÐOÐQU×QZÑQZÔ\wÐxyÓ\zð  FJ�ô  KÜ!¨%Ô7RÐSTÓ7UÔVÕVõ 4ûð	Wúò Iùs‡   ‚>KÁI Á	8I ÂIÂI ÂKÂI ÂIÂI Â!A%KÄKÄCKÇ	3KÇ=AKÉI ÉI ÉKÉ"AKËKËKËKËKc                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# ©r   r±  r¡  r   r'  )r   r…  s   "€r   r   r†  ã  s"   ø€ ÷ ñ ©Cð ¹Sð ÁTñ r   c           	   ƒ  ó2  "  € V P                   '       g   R#  V P                   P                  \        V4      \        V4      R7      G Rj  x€L
  R#  L  \         d7   p\
        P                  RT P                  T\        T4      4        Rp?R# Rp?ii ; i5i)uÂ  Delete a bot-posted message (Bot API allows it within 48h); failures are non-fatal.

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)r±  r¡  NTz-[%s] Failed to delete Telegram message %s: %s)	rÁ  Údelete_messager½   rÚ   r*   r7   r8   r„  r,   )r“  r±  r¡  r  s   &&& r   r  ÚTelegramAdapter.delete_messageã  s   é € ð �y�yˆyÙð	Ø—)‘)×*Ñ*Ô3MÈgÓ3VÔcfÐgqÓcrÐ*Ós×sÐsÙñ tøäô 	Ü�L‰LÐHÈ$Ï)É)ÐU_Ôa|Ð}~Óaô  AÝûð	üs@   ‚B˜2A Á
AÁA ÁBÁA ÁBÁ+BÂ	BÂBÂBc                ób   <€ V ^8„  d   QhRS[ S[,          RS[ S[S[S[3,          ,          RS[/# )r   rX  rO  r   )r   r   r  r   rB   )r   r…  s   "€r   r   r†  ô  s:   ø€ ÷ >ñ >±(¹3µ-ð >ÑRZÑ[_Ñ`cÑehÐ`hÕ[iÕRjð >Ñvzñ >r   c                óœ   € V P                   '       d   \        V P                   R4      '       g   R# T;'       g    RP                  4       R9   # )zÀsendMessageDraft works for private chats only (Bot API 9.5) and needs PTB >= 22.6; groups and
older installs use the edit-based path. ``rich_drafts`` controls draft *format*, not availability.Úsend_message_draftFr!   >   r[  r\  )rÁ  r)  rø   )r“  rX  rO  s   &&&r   Úsupports_draft_streamingÚ(TelegramAdapter.supports_draft_streamingô  s<   € ð �y�yˆy¤¨¯	©	Ð3G× HÒ HÙØ—�˜R×&Ñ&Ó(Ð,=Ñ=Ð=r   c                ó^   <€ V ^8„  d   QhRS[ RS[RS[ RS[S[S[ S[3,          ,          RS[/# rO  )r   rÚ   r   r  r   r�   )r   r…  s   "€r   r   r†  û  sO   ø€ ÷ )Añ )A©ð )A±sð )AÁSð )AÑT\Ñ]aÑbeÑgjÐbjÕ]kÕTlð )Añ  yCñ )Ar   c              ƒ  ó\  "  € V P                   '       g   \        RRR7      # V P                  V4      '       d.   V P                  WW44      G Rj  x€L
 '       d   \        RRR7      # \	        V P                   R4      '       g   \        RRR7      # \        V4      V P                  8:  d   TM'V P                  W0P                  \        R	7      ^ ,          p\        \        V R
R4      ;'       d,    \        V RR4      '       * ;'       d    V P                  V4      4      pV P                  W4      pV'       d   RMR Fº  pR\        V4      R\        V4      RV'       d   V P                  V4      MT/p	V'       d   \         P"                  V	R&   V	P%                  V4        \'        V P                   P(                  ! R/ V	B \*        RRR7      G Rj  x€L
 '       d   \        RRR7      u # \        RRR7      u # 	  \        RRR7      #  EL¶ L:  \,         d–   p
T'       dJ   T P/                  T
4      '       d3   \0        P3                  RT P4                  Y\7        T
4      4        Rp
?
EK,  \0        P3                  RT P4                  YT
4       \        R\7        T
4      R7      u Rp
?
u # Rp
?
ii ; i5i)zÁStream a partial message via ``sendRichMessageDraft`` (when rich is enabled and supported) else
``sendMessageDraft``; reusing ``draft_id`` animates the preview. The caller sends the final text.FÚnot_connectedrÕ  NTr1  r  Úapi_unavailabler€  rÈ  rÊ  r±  rP  r+   rQ  r/  rL  Ú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ì  rë  rQ   )rÁ  r�   rL  rS  r)  r+  r‰  r‡  rš   rB   r]   rÀ  r  r½   rÚ   rˆ  r}   rS  r£  rK   r  r3  r*   r6  r7   r8   r„  r,   )r“  r±  rP  r›  rO  r+   Úplain_rich_previewÚdraft_thread_kwargsrî  r¥   r  s   &&&&&      r   Ú
send_draftÚTelegramAdapter.send_draftû  sp  é € ð �y�yˆyÜ e°?ÔCÐCà×*Ñ*¨7×3Ò3¸d×>WÑ>WÐX_ÐkrÓ>}×8}Ö8}Ü d°tÔ<Ð<Ü�t—y‘yÐ"6×7Ò7Ü eÐ3DÔEÐEäØóØ×/Ñ/ô0‰wØ59×5JÑ5JÈ7×TkÑTkÔt}Ð5JÓ5~ð  @Aõ  6Bð 	ô "Ü�DÐ2°EÓ:÷ 1ð 1Ä7È4ÐQgÐinÓCoÔ?o÷ 1ð 1Ø×*Ñ*¨4Ó0ó2Ðð #×;Ñ;¸GÓNÐß);™XÀÒNˆLàÔ5°gÓ>À
ÌCÐPXËMØ·\˜×+Ñ+¨DÔ1Àtð&MˆF÷ Ü'0×'<Ñ'<��|Ñ$Ø�M‰MÐ-Ô.ðWÜ4Ø—I‘I×0Ò0Ñ:°6Ñ:ÔDWÐ_nð  FKôL÷ Lö Lä%¨d¸tÔDÒDÜ!¨%Ð7GÔHÒHñ Oô,  %Ð/?Ô@Ð@òG 9~ñ*Løô ô 	W÷   D×$>Ñ$>¸q×$AÒ$AÜ—L‘LØuØŸ	™	 7Ô6QÐRSÓ6TôVö Ü—‘ÐUÐW[×W`ÑW`ÐbiÐuvÔwÜ!¨%Ô7RÐSTÓ7UÔV×Vûð	Wüs–   ‚6J,¹J,ÁHÁ	J,ÁBJ,Ã,J,ÄA0J,Å7$J,Æ0H	ÇHÇ	H	ÇH	Ç#J,Ç&H	Ç2J,ÈH	È	J)ÈJ$È3+J$ÉJ,É%7J$ÊJ)ÊJ,Ê$J)Ê)J,c              ‹  ó–  "  € V P                   '       g   \        R4      hVP                  R4      p \        V P                   P                  ! R	/ VB \
        RRR7      G Rj  x€L
 #  L  \         dÓ   pTeÉ   T P                  T4      '       d²   T P                  T4      '       d›   \        P                  RT P                  T4       T P                  TP                  R4      T4       \        T4      pTP                  RR4       \        T P                   P                  ! R	/ TB \
        RRR7      G Rj  x€L 
 u Rp?# h Rp?ii ; i5i)
aÒ  Send a control-style message (approval prompts, pickers), retrying once without
message_thread_id on 'Message thread not found' (stale thread_id); ``send`` has its own.

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.
rz  r—  r/  FrL  NzP[%s] Thread %s not found for control message, retrying without message_thread_idr±  rQ   )rÁ  r  r  rK   rÄ  r3  r*   r6  r  r7   r-  r„  r,  r  rY   )r“  r¥   r—  rO  rP  s   &,   r   Ú"_send_message_with_thread_fallbackÚ2TelegramAdapter._send_message_with_thread_fallback&  sF  é € ð �y�yˆyÜ˜Ó/Ð/Ø"ŸJ™JÐ':Ó;Ðð	Ü4Ø—	‘	×&Ò&Ñ0¨Ñ0Ô:MÐUdð  |AôB÷ Bð Bñ Bøäô 
	Ø!Ò-°$×2LÑ2LÈX×2VÒ2VÐ[_×[zÑ[zð  |D÷  \Eò  \EÜ—‘ØfÐhl×hqÑhqð  tEôFð ×2Ñ2°6·:±:¸iÓ3HÐJ[Ô\Ü# F›|�Ø× Ñ Ð!4°dÔ;Ü8Ø—I‘I×*Ò*Ñ:¨\Ñ:ÔDWÐ_nð  FKôL÷ Lð Lõ Làûð
	üse   ‚/E	²0A) Á"A'Á#A) Á&E	Á'A) Á)EÁ4EÂEÂ&BEÄ5D8Ä6EÄ:EÄ;E	Å EÅEÅE	Úreply_markuprž  c                óŠ   <€ V ^8„  d   QhRS[ RS[ RS[RS[S[ ,          RS[S[S[ S[3,          ,          RS[RS[S[ ,          /# )r   r±  r+   rQ  rx  rO  r  rž  )r   r   r   r  )r   r…  s   "€r   r   r†  @  sh   ø€ ÷ Gñ GÙðGÙ"%ðGÙ69ðGÙFNÉsÅmðGÙ_gÑhlÑmpÑruÐmuÕhvÕ_wðGáðGá19¹#µñGr   c          
   ƒ  ó  "  € V P                  RWWR7      pR\        V4      RVRV/V P                  4       Cp	Ve   WiR&   W‰R&   V	P                  V P	                  WWXVR7      4       V P
                  ! R	/ V	B G Rj  x€L
 #  L5i)
zRSend a control-style message (prompt/picker) with topic routing + thread fallback.N©rž  r±  r+   rQ  r  rù  r	  rQ   )rö  r½   r—  r£  r   r  )
r“  r±  r+   rQ  rx  rO  r  rž  r	  r¥   s
   &&&$$$$$  r   Ú_send_control_messageÚ%TelegramAdapter._send_control_message@  s§   é € ð ×8Ñ8¸¸xÐ8ÓeˆàÔ1°'Ó:¸FÀDÈ,ÐXbð"CØfj×fÑfó  gBð"CˆàÒ#Ø%1�>Ñ"Ø(3Ð$Ñ%Ø�‰�d×2Ñ2Ø ÐYfð 3ó hô 	ià×<Ò<ÑF¸vÑF×FÐFÑFùs   ‚A9BÁ;B Á<BrQ  c                ój   <€ V ^8„  d   QhRS[ RS[ RS[S[S[ S[3,          ,          RS[RS[RS[RS[/# )r   r  r±  rO  rQ  rx  rž  r   r)  )r   r…  s   "€r   r   r†  N  s[   ø€ ÷ Sñ S¡sð S±Sð SÁHÉTÑRUÑWZÐRZÍ^ÕD\ð SÙ'*ðSÙ>AðSÙY\ðSÙhrñSr   c          
   ƒ  ó  "  € V P                   '       g   \        RRR7      #  V! 4       p\        V\        4      '       d   V# Vw  ršpT P                  Y)Ve   TM\        P
                  W¦W7R7      G Rj  x€L
 pVe	   V! V4       \        R\        VP                  4      R7      #  L0  \         dL   p\        P                  RT P                  T\        T4      4       \        R\        T4      R7      u Rp?# Rp?ii ; i5i)	u±   Shared control-prompt shell: not-connected guard, ``build()`` â†’ ``(text, keyboard, on_sent)`` (or a
SendResult to return as-is), routed send, state hook, redacted failure log.Frz  rÕ  N)rQ  r  rx  rO  rž  Tr1  z[%s] %s failed: %s)rÁ  r�   r5  r  r}   rS  r   r¡  r*   r7   r-  r„  r,   )r“  r  r±  rO  rs  rQ  rx  rž  Úbuiltr+   ÚkeyboardÚon_sentr7  r  s   &&&&&$$$      r   Ú_send_promptÚTelegramAdapter._send_promptN  sé   é € ð �y�yˆyÜ e°?ÔCÐCð	SÙ“GˆEÜ˜%¤×,Ò,Ø�Ø&+Ñ#ˆD˜GØ×2Ñ2Ø¸
Ò8N©*ÔT]×TiÑTiØ%ÀXð 3ó l÷ lˆCð Ò"Ù˜”Ü d´s¸3¿>¹>Ó7JÔKÐKñløô ô 	SÜ�N‰NÐ/°·±¸DÔB]Ð^_ÓB`ÔaÜ eÔ3NÈqÓ3QÔRÕRûð	SüsS   ‚ C?£B& ÁC?Á1B& Á3B$Á4/B& Â#C?Â$B& Â&C<Â1A C7Ã1C<Ã2C?Ã7C<Ã<C?c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   Úbuttonsr   rð  )r   r…  s   "€r   r   r†  d  s   ø€ ÷ Eñ E™dð E¡tñ Er   c                óh   € \        ^ \        V 4      ^4       Uu. uF  qW^,            NK  	  up# u upi )zL2-per-row layout keeps labels readable on mobile (a 4-button row truncates).)r{  r+  )r$  r   s   & r   Ú_rows_of_twoÚTelegramAdapter._rows_of_twoc  s2   € ô +0°´3°w³<ÀÔ*CÓDÑ*C Q˜˜a�%Ó Ñ*CÑDÐDùÒDs   ™/c                ód   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[S[S[ S[3,          ,          RS[/# )r   r±  Úpromptrr  Úsession_keyrO  r   r)  )r   r…  s   "€r   r   r†  h  s[   ø€ ÷ Mñ MÙðMÙ$'ðMÙ25ðMÙILðMÙ]eÑfjÑknÑpsÐksÕftÕ]uðMñ BLñMr   c           	   ƒ  ó’   a aa"  € VVV 3R lpS P                  RWVS P                  V4      S P                  R7      G Rj  x€L
 #  L5i)zJSend an inline-keyboard Yes/No prompt for the gateway ``/update`` watcher.c                  óê   <€ S'       d   \        R SR7      MRp SP                  R\        R4       RS V  24      p\        \        \        R4      RR7      \        \        R	4      R
R7      ..4      pWR3# )z%platform.telegram.prompt.default_hintrq  r!   u   â˜¤ *z&platform.telegram.prompt.update_headerú*

zplatform.telegram.prompt.affirmzupdate_prompt:y©Úcallback_datazplatform.telegram.prompt.negatezupdate_prompt:nN)rŠ   rˆ  rs   rr   )Údefault_hintr+   r  rr  r)  r“  s      €€€r   rs  Ú1TelegramAdapter.send_update_prompt.<locals>.buildk  sˆ   ø€ ßZaœ1ÐDÈgÕVÐgiˆLØ×&Ñ&¨¬qÐ1YÓ/ZÐ.[Ð[`ÐagÐ`hÐiuÐhvÐ'wÓxˆDÜ+Ü$¤QÐ'HÓ%IÐYjÔkÜ$¤QÐ'HÓ%IÐYjÔkð.mð -nó oˆHð  4Ð'Ð'r   Úsend_update_prompt©rx  rž  N©r!  rÓ  rÅ  )r“  r±  r)  rr  r*  rO  rs  s   f&ff&& r   r2  Ú"TelegramAdapter.send_update_prompth  sY   úé € ÷	(ð ×&Ñ&Ø  '°UÀd×F^ÑF^Ð_gÓFhÐx|÷  yLñ  yLð 'ó M÷ Mð 	Mñ Mùs   …;AÁ AÁAc                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  y  s   ø€ ÷ Vñ V™Cñ Vr   c                óH   € R \         P                  ! \        R4      4       R2# )u
   âš ï¸� <b>zgateway.exec_approval.headerz</b>

©r®   r¯   rŠ   r’  s   &r   Ú
_EA_HEADERÚTelegramAdapter._EA_HEADERx  s!   € àœEŸLšL¬Ð+IÓ)JÓKÐLÈHÐUÐUr   z<pre>z</pre>

c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  €  s   ø€ ÷ Lñ L¡#ñ Lr   c                óF   € \         P                  ! \        R 4      4       R2# )z"gateway.exec_approval.reason_labelz: r8  r’  s   &r   Ú_EA_REASON_LABELÚ TelegramAdapter._EA_REASON_LABEL  s   € ä—,’,œqÐ!EÓFÓGÐHÈÐKÐKr   c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  „  s   ø€ ÷ Uñ U¡Sñ Ur   c                ó8   € R \        \        R4      4      ,           # )ú

z%gateway.exec_approval.smart_deny_line)r²   rŠ   r’  s   &r   Ú_EA_SMART_DENY_LINEÚ#TelegramAdapter._EA_SMART_DENY_LINEƒ  s   € àÔ(¬Ð+RÓ)SÓTÕTÐTr   éô  c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rK  rž   )r   r…  s   "€r   r   r†  ‰  s   ø€ ÷ "ñ "™sð "¡sñ "r   c                ó.   € \         P                  ! V4      # rP   )r®   r¯   )r“  r+   s   &&r   Ú
_ea_escapeÚTelegramAdapter._ea_escape‰  s   € Ü�|Š|˜DÓ!Ð!r   c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   ÚdescriptionÚsmart_deniedr   )r   rB   rÚ   )r   r…  s   "€r   r   r†  Œ  s#   ø€ ÷ 7ñ 7±Sð 7Éð 7ÑQTñ 7r   c                óf  € \        V P                  V P                  ,           V P                  ,           V P                  ,           V P                  V4      ,           R ,           V P                  4       ,           V'       d   V P                  MR,           4      p\        ^ V P                  V,
          4      # )ú...r!   )
rš   r9  Ú_EA_CODE_OPENÚ_EA_CODE_CLOSEr=  rG  Ú_ea_deadline_linerB  r!  r‰  )r“  rJ  rK  Úfixeds   &&& r   Ú_exec_approval_cmd_budgetÚ)TelegramAdapter._exec_approval_cmd_budgetŒ  s�   € ô Ø�O‰O˜d×0Ñ0Õ0°4×3FÑ3FÕFÈ×I^ÑI^Õ^Ø�o‰o˜kÓ*õ+Ø-2õ3Ø59×5KÑ5KÓ5MõNç+7ˆt×'Ò'¸RõAóBˆô �1�d×-Ñ-°Õ5Ó6Ð6r   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r�   )r  r   )r   r…  s   "€r   r   r†  –  s   ø€ ÷ ~ñ ~¡4©©S¨¥>ñ ~r   c                óH   € R Uu/ uF  q\        RV 24      bK  	  up# u upi )Úoncez"platform.telegram.approval.action_)rV  ÚsessionÚalwaysÚdeny©rŠ   )r“  Úchoices   & r   Ú_EA_ACTION_LABELSÚ!TelegramAdapter._EA_ACTION_LABELS•  s0   € ñ X}Ó}ÑW|ÈVœÐ>¸v¸hÐGÓHÒHÑW|Ñ}Ð}ùÒ}s   …c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   r)  r   )rŽ   r�   )r   r…  s   "€r   r   r†  š  s    ø€ ÷ dñ dÑ7Ið dÉjñ dr   c           
   ƒ  óê   a a"  € VV 3R lpS P                  RSP                  SP                  V\        P                  S P                  SP                  4      S P                  R7      G Rj  x€L
 #  L5i)zmInline-keyboard approval prompt; buttons call ``resolve_gateway_approval()`` like the
text ``/approve`` flow.c                  óV  <a€ ^ RI p \        SR4      '       g   V P                  ^4      Sn        \	        SP                  4      oSP
                   UUUu. uF  w  rp\        VRV RS 2R7      NK  	  ppppSP                  \        SP                  V4      4      VVV3R l3# u upppi )r÷  NÚ_approval_counterúea:r¬   r.  c                 óP   <€ SP                   P                  SSP                  4      # rP   )r
  Ú__setitem__r*  )r7  Úapproval_idr)  r“  s   &€€€r   r¾  ÚKTelegramAdapter._send_exec_approval_prompt.<locals>.build.<locals>.<lambda>¦  s   ø€ ˜D×0Ñ0×<Ñ<¸[È&×J\ÑJ\Ô]r   )
Ú	itertoolsr)  Úcountra  r  Úactionsrr   r+   rs   r&  )rg  r;   r[  Ú_r$  re  r)  r“  s        @€€r   rs  Ú9TelegramAdapter._send_exec_approval_prompt.<locals>.build�  s¡   ù€ ãÜ˜4Ð!4×5Ò5Ø)2¯©¸Ó);�Ô&Ü˜t×5Ñ5Ó6ˆKà/5¯~ª~õ?Ù/=Ñ+˜5¨!ô ,¨EÀ3ÀvÀhÈaÐP[È}ÐA]×^Ù/=ð ò ?à—;‘;Ô 4°T×5FÑ5FÀwÓ5OÓ PÞ]ð_ð _ùô?s   ÁB$Úsend_exec_approval)rQ  rx  rž  N)r!  r±  rO  r}   ÚHTMLrÓ  rÅ  )r“  r)  rs  s   ff r   Ú_send_exec_approval_promptÚ*TelegramAdapter._send_exec_approval_promptš  sh   ùé € ö		_ð ×&Ñ&Ø  &§.¡.°&·/±/À5ÔU^×UcÑUcØ×.Ñ.¨v¯©Ó?Èt×ObÑObð 'ó d÷ dð 	dñ dùs   „A(A3Á,A1Á-A3c                ój   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[ RS[S[S[ S[3,          ,          RS[/# )r   r±  r–  r%  r*  Ú
confirm_idrO  r   r)  )r   r…  s   "€r   r   r†  «  s[   ø€ ÷ Mñ MÙðMÙ#&ðMÙ14ðMÙCFðMÙTWðMá™4¡¡S �>Õ*ðMá6@ñMr   c           	   ƒ  ó–   a aaa"  € VVV V3R lpS P                  RWVS P                  V4      S P                  R7      G Rj  x€L
 #  L5i)z8Render a three-button slash-command confirmation prompt.c                  ón  <€ \        \        \        R 4      RS 2R7      \        \        R4      RS 2R7      .\        \        R4      RS 2R7      ..4      p SP                  SP	                  SSP
                  \        SP                  R4      4      ,
          SP                  R7      4      pWVVV3R	 l3# )
z,platform.telegram.slash_confirm.approve_oncezsc:once:r.  z.platform.telegram.slash_confirm.always_approvez
sc:always:z&platform.telegram.slash_confirm.cancelz
sc:cancel:rM  )r¯   c                 ó<   <€ SP                   P                  SS4      # rP   )r  rd  )r7  rq  r“  r*  s   &€€€r   r¾  ÚCTelegramAdapter.send_slash_confirm.<locals>.build.<locals>.<lambda>¹  s   ø€ °$×2KÑ2K×2WÑ2WÐXbÐdoÔ2pr   )rs   rr   rŠ   rˆ  Ú_ea_fitr‰  rš   )r  Úpreviewrq  r%  r“  r*  s     €€€€r   rs  Ú1TelegramAdapter.send_slash_confirm.<locals>.build¯  sß   ø€ Ü+ä(¬Ð+YÓ)ZÐltÐuð  uAð  kBô  CÜ(¬Ð+[Ó)\Ðnxð  zDð  yEð  mFô  GðHô &¤aÐ(PÓ&QÐcmÐnxÐmyÐazÔ{Ð|ð	-ó ˆHð ×)Ñ)¨$¯,©,Ø˜×0Ñ0´9¸T×=PÑ=PÐQVÓ=WÓ3XÕXÐae×atÑatð +7ó +vó wˆGàÖ&pÐpÐpr   Úsend_slash_confirmr3  Nr4  )r“  r±  r–  r%  r*  rq  rO  rs  s   f&&fff& r   ry  Ú"TelegramAdapter.send_slash_confirm«  s`   ûé € ÷
	qð 
	qð ×&Ñ&Ø  '°UÀd×F^ÑF^Ð_gÓFhÐx|÷  yLñ  yLð 'ó M÷ Mð 	Mñ Mùs   †<A	ÁAÁA	c                óz   <€ V ^8„  d   QhRS[ RS[ RS[S[,          RS[ RS[ RS[S[S[ S[3,          ,          RS[/# )r   r±  ÚquestionÚchoicesÚ
clarify_idr*  rO  r   )r   r   rT  r  r   r�   )r   r…  s   "€r   r   r†  ½  s_   ø€ ÷ ñ ÙðÙ&)ðÙ4<¹TµNðÙPSðÙbeðá™4¡¡S �>Õ*ðá6@ñr   c           
   ƒ  ó¢   a aaaa"  € VVVV V3R lpS P                  RWV\        P                  S P                  V4      R7      G Rj  x€L
 #  L5i)u½   Render a clarify prompt: numbered buttons per choice plus "âœ�ï¸� Other (type answer)" (flips to
text-capture mode); without choices, plain question and the gateway text-intercept captures.c            
      óº  <€ R \         P                  ! S4       2p RpS'       dª   V RRP                  R \        S4       4       4      ,           ,          p \	        \        S4      4       Uu. uF'  p\        \        V^,           4      RS RV 2R7      .NK)  	  ppVP                  \        \        R4      RS R	2R7      .4       \        V4      pWVVV3R
 l3# u upi )õ   â�“ NrA  ra  c              3   ó|   "  € T F2  w  rV^,            R\         P                  ! \        V4      4       2x € K4  	  R# 5i)r°  z. N)r®   r¯   r   )rR   r   r¢  s   &  r   rT   Ú>TelegramAdapter.send_clarify.<locals>.build.<locals>.<genexpr>Ç  s3   é € Ð*mÑZlÑRVÐRS¨a°!­e¨W°B´u·|²|ÄCÈÃFÓ7KÐ6LÕ+MÓZlùs   ‚:<úcl:r¬   r.  zplatform.telegram.prompt.otherz:otherc                 ó<   <€ SP                   P                  SS4      # rP   )r  rd  )r7  r~  r“  r*  s   &€€€r   r¾  Ú=TelegramAdapter.send_clarify.<locals>.build.<locals>.<lambda>Ì  s   ø€ ¨t×/BÑ/B×/NÑ/NÈzÐ[fÔ/gr   )r®   r¯   rh  r}  r{  r+  rr   r   rd  rŠ   rs   )	r+   r  ÚidxÚrowsr}  r~  r|  r“  r*  s	       €€€€€r   rs  Ú+TelegramAdapter.send_clarify.<locals>.buildÂ  sð   ø€ Øœ%Ÿ,š, xÓ0Ð1Ð2ˆDØˆHßà˜ §¡Ñ*mÔZcÐdkÔZlÓ*mÓ!mÕmÕm�äpuÔvyð  {Bó  wCô  qDó  Eñ  qDÐilÔ-¬c°#¸µ'«lÈCÐPZÈ|Ð[\Ð]`Ð\aÐJbÔcÓdñ  qD�ð  EØ—‘Ô1´!Ð4TÓ2UÐgjÐkuÐjvÐv|Ðe}Ô~Ðô  AÜ/°Ó5�ØÖ#gÐgÐgùò Es   Á*-CÚsend_clarify)rQ  rx  N)r!  r}   rm  rÓ  )r“  r±  r|  r}  r~  r*  rO  rs  s   f&ffff& r   rŠ  ÚTelegramAdapter.send_clarify½  sV   üé € ÷

	hñ 
	hð ×&Ñ&Ø˜G¨uÄÇÁÐ[_×[sÑ[sÐt|Ó[}ð 'ó ÷ ð 	ñ ùs   ‡AAÁAÁ	Ac                 ó>   €  ^ RI Hp  V #   \         d    R p  T # i ; i)r÷  ©Ú	get_labelc                 ó   € V # rP   rQ   )Úslugs   &r   rŽ  Ú6TelegramAdapter._provider_get_label.<locals>.get_labelÕ  s   € Ø�r   )Úhermes_cli.providersrŽ  rD  r�  s    r   Ú_provider_get_labelÚ#TelegramAdapter._provider_get_labelÐ  s.   € ð	Ý6ð Ðøô ô 	óàÐð	ús   ‚
 Š›c                ój   <€ V ^8„  d   QhRS[ RS[RS[ RS[ RS[ RS[S[S[ S[3,          ,          RS[/# )r   r±  Ú	providersÚcurrent_modelÚcurrent_providerr*  rO  r   ©r   rT  r   r  r   r�   )r   r…  s   "€r   r   r†  Ù  sR   ø€ ÷ /ñ /Ùð/Ù'+ð/Ù<?ð/ÙSVð/Ùehð/á%-©d±3¹°8­nÕ%=ð/áISñ/r   c           	   ƒ  ó¶   a aaaaaa"  € VVVVVV V3R lpS P                  RSYxV'       d   VP                  R4      MRS P                  R7      G Rj  x€L
 #  L5i)uU   Send an inline-keyboard model picker: provider â†’ model drill-down, edited in place.c                  ó¸   <€ S	P                  S^ 4      w  rS	P                  S	P                  SS	P                  4       ! S4      V4      4      pVVVVVV	V
3R lpW V3# )r÷  c                 óh   <€ R V P                   RSRSRSRSRSR^ /SP                  \        S4      &   R# )Úmsg_idr–  r*  Úon_model_selectedr—  r˜  Úprovider_pageN)r¡  r  r   )r7  r±  r—  r˜  rž  r–  r“  r*  s   &€€€€€€€r   Ú	_rememberÚCTelegramAdapter.send_model_picker.<locals>.build.<locals>._rememberã  sG   ø€ à˜cŸn™n¨k¸9ÀmÐU`Ðbuð  xIØ# ]Ð4FÐHXÐZiÐklð:n�×(Ñ(¬¨W«Ó6r   )Ú_build_provider_keyboardrˆ  Ú_provider_list_textr“  )r  Úprovider_page_infor+   r   r±  r—  r˜  rž  r–  r“  r*  s       €€€€€€€r   rs  Ú0TelegramAdapter.send_model_picker.<locals>.buildÝ  sd   ø€ Ø+/×+HÑ+HÈÐTUÓ+VÑ(ˆHØ×&Ñ&Ø×(Ñ(¨¸×8PÑ8PÔ8RÐScÓ8dÐfxÓyóˆD÷nó nð  9Ð,Ð,r   Úsend_model_pickerrx  Nr3  ©r!  r  rÅ  )	r“  r±  r–  r—  r˜  r*  rž  rO  rs  s	   fffffff& r   r¦  Ú!TelegramAdapter.send_model_pickerÙ  sV   þé € ÷
	-ó 
	-ð ×&Ñ&Ø ¨(×bjÀXÇ\Á\ÐR]ÔE^ÐptØ×-Ñ-ð 'ó /÷ /ð 	/ñ /ùs   ‰A	AÁAÁAc                ód   <€ V ^8„  d   QhRS[ RS[ RS[RS[ RS[S[S[ S[3,          ,          RS[/# )r   r±  r–  r}  r*  rO  r   r™  )r   r…  s   "€r   r   r†  î  sJ   ø€ ÷ /ñ /Ùð/Ù#&ð/Ù15ð/ÙDGð/á™4¡¡S �>Õ*ð/á6@ñ/r   c           	   ƒ  ó²   a aaaaa"  € VVVV VV3R lpS P                  RSYgV'       d   VP                  R4      MRS P                  R7      G Rj  x€L
 #  L5i)u—   Flat inline-keyboard picker (one tap â†’ one value) for /reasoning, /fast, etc. Each choice dict:
``{"value": str, "label": str, "is_current": bool}``.c                  ó¸  <€ . p \        S4       F}  w  r\        VP                  R 4      ;'       g    VP                  R4      ;'       g    R4      pVP                  R4      '       d   RV 2pV P                  \	        VRV 2R7      4       K  	  V '       g   \        RRR	7      # \        S	P                  V 4      4      pVVVV	V
3R
 lpS	P                  S4      WE3# )r;   rH   r!   Ú
is_currentõ   âœ“ úcp:r.  Fz
No choicesrÕ  c                 ó\   <€ R V P                   RSRSRS/SP                  \        S4      &   R# )r�  r}  r*  Úon_choice_selectedN)r¡  r	  r   )r7  r±  r}  r°  r“  r*  s   &€€€€€r   r   ÚDTelegramAdapter.send_choice_picker.<locals>.build.<locals>._rememberþ  s6   ø€ à˜cŸn™n¨i¸À-ÐQ\Ð^rð  uGð;H�×)Ñ)¬#¨g«,Ó7r   )	r}  r   r  rd  rr   r�   rs   r&  rˆ  )r$  r   r[  r;   r  r   r±  r}  r°  r“  r*  r–  s         €€€€€€r   rs  Ú1TelegramAdapter.send_choice_picker.<locals>.buildó  sÄ   ø€ ØˆGÜ& wÖ/‘	�Ü˜FŸJ™J wÓ/×LÐL°6·:±:¸gÓ3F×LÐLÈ"ÓM�Ø—:‘:˜l×+Ò+Ø" 5 '˜N�EØ—‘Ô3°EÈ3ÈqÈcÈÔSÖTñ	 0÷
 Ü!¨%°|ÔDÐDÜ+¨D×,=Ñ,=¸gÓ,FÓGˆH÷Hñ Hð ×&Ñ& uÓ-¨xÐBÐBr   Úsend_choice_pickerrx  Nr3  r§  )r“  r±  r–  r}  r*  r°  rO  rs  s   ffffff& r   r³  Ú"TelegramAdapter.send_choice_pickerî  sX   ýé € ÷
	Cò 	Cð ×&Ñ&Ø  '¨8×ckÀhÇlÁlÐS^ÔF_ÐquØ×-Ñ-ð 'ó /÷ /ð 	/ñ /ùs   ˆAAÁAÁAc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úresult_textr   Nrž   )r   r…  s   "€r   r   r†    s   ø€ ÷ dñ d¹#ð dÀ$ñ dr   c           	   ƒ  ód  "  €  VP                  V P                  V4      \        P                  RR7      G Rj  x€L
  R#  L  \         db    \
        P                  ! \        4      ;_uu_ 4        TP                  TRRR7      G Rj  x€L 
  RRR4        R#   + '       g   i      R# ; ii ; i5i)zgReplace a picker message with ``result_text`` (MarkdownV2, then plain, then give up), keyboard removed.N©r+   rQ  r  )rÆ  rˆ  r}   rS  r*   r%  r&  )r“  Úqueryr¶  s   &&&r   Ú_edit_result_textÚ!TelegramAdapter._edit_result_text  s’   é € ð	dØ×)Ñ)¨t×/BÑ/BÀ;Ó/OÔ\e×\qÑ\qð  AEÐ)ó  F÷  Fô  FøÜô 	dÜ×$Ò$¤Y×/Õ/Ø×-Ñ-°;È4Ð^bÐ-Óc×cÑc÷ 0×/×/Ô/úð	düs_   ‚B0„4A ¸?¹A ½B0¿A Á-B-Á.BÂB	
ÂBÂB-ÂB0ÂB)Â"B-Â&B0Â)B-Â-B0c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# ©r   Údatar±  r   Nrž   )r   r…  s   "€r   r   r†    s#   ø€ ÷ 5ñ 5Áð 5Écð 5ÐVZñ 5r   c              ƒ  ór  "  € V P                   P                  V4      pV'       g&   VP                  \        R4      R7      G Rj  x€L
  R#  VR,          \	        VR,          4      ,          pTP                  R4      pT'       g&   TP                  \        R4      R7      G Rj  x€L
  R#  T! T\        TP                  R	4      ;'       g    R
4      4      G Rj  x€L
 pT P                  Y4      G Rj  x€L
  TP                  4       G Rj  x€L
  T P                   P                  TR4       R#  Lè  \
        \        3 d)    TP                  \        R4      R7      G Rj  x€L 
   R# i ; i LÇ L“  \         d7   p\        P                  RT4       \        R\        T4      R7      p Rp?LÍRp?ii ; i LÀ Lª5i)z.Handle choice picker button taps (cp:<index>).z&platform.telegram.picker.expired_rerunrO  Nr}  ºé   NNú*platform.telegram.picker.invalid_selectionr°  ú platform.telegram.picker.expiredrH   r!   z"Choice picker selection failed: %sz$platform.telegram.picker.apply_errorr  )r	  r  Úanswerr¨   rÚ   rÞ   Ú
IndexErrorr   r*   r7   r   rŠ   rº  rY   )	r“  r¹  r¾  r±  rŽ  r[  Úcallbackr¶  rê  s	   &&&&     r   Ú_handle_choice_picker_callbackÚ.TelegramAdapter._handle_choice_picker_callback  sm  é € à×)Ñ)×-Ñ-¨gÓ6ˆßØ—,‘,¤FÐ+SÓ$T�,ÓU×UÐUÙð	Ø˜9Õ%¤c¨$¨r­(£mÕ4ˆFð —9‘9Ð1Ó2ˆßØ—,‘,¤FÐ+MÓ$N�,ÓO×OÐOÙð	TÙ (¨´#°f·j±jÀÓ6I×6OÐ6OÈRÓ2PÓ Q×QˆKð ×$Ñ$ UÓ8×8Ð8Ø�l‰l‹n×ÐØ×!Ñ!×%Ñ% g¨tÖ4ñ% Vøô œJÐ'ô 	Ø—,‘,¤FÐ+WÓ$X�,ÓY×YÑYÚð	úñ
 Pñ RøÜô 	TÜ�L‰LÐ=¸sÔCÜÐBÌ#ÈcË(ÔS�Kûð	Túñ 	9Ùùs´   ‚AF7ÁD-ÁF7Á D/ Á,F7ÂF7Â#E+Â$F7Â+E/ ÃE/ ÃE-ÃE/ ÃF7Ã2F3Ã3F7Ä
F5Ä#F7Ä//E(ÅE!ÅE(Å$F7Å'E(Å(F7Å-E/ Å/F0Å:,F+Æ&F7Æ+F0Æ0F7Æ5F7c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úpr   )r  rr   )r   r…  s   "€r   r   r†  )  s    ø€ ÷ Lñ L™Dð LÑ%9ñ Lr   c           	     óÜ   € V P                  R \        V P                  R. 4      4      4      pV R,           RV R2pV P                  R4      '       d   RV 2p\        VRV R,           2R	7      # )
Útotal_modelsÚmodelsr„  z (rE   r¬  r­  úmp:r�  r.  )r  r+  rr   )rÊ  rh  r;   s   &  r   Ú_provider_buttonÚ TelegramAdapter._provider_button(  sj   € à—‘�n¤c¨!¯%©%°¸"Ó*=Ó&>Ó?ˆØ�V•9�+˜R ˜w aÐ(ˆØ�5‰5�×ÒØ˜5˜'�NˆEÜ# E¸3¸qÀ½y¸kÐ9JÔKÐKr   c                ó2   <€ V ^8„  d   QhRS[ RS[ RS[RS[/# )r   ÚpageÚtotal_pagesr  r   )rÚ   r   rT  )r   r…  s   "€r   r   r†  1  s)   ø€ ÷ ñ ™cð ±ð ¹Sð ÁTñ r   c           	     óF  € . pV ^ 8”  d2   VP                  \        \        R4      V RV ^,
           2R7      4       VP                  \        V ^,            RV 2RR7      4       W^,
          8  d2   VP                  \        \        R4      V RV ^,            2R7      4       V# )uN   ``â—€ Prev | n/N | Next â–¶`` row (``prefix`` = ``mpv``/``mg`` page callback).zplatform.telegram.picker.prevr¬   r.  Ú/zmx:noopzplatform.telegram.picker.next)rd  rr   rŠ   )rÒ  rÓ  r  Únavs   &&& r   Ú_picker_nav_rowÚTelegramAdapter._picker_nav_row0  s£   € ð ˆØ�!Œ8Ø�J‰JÔ+¬AÐ.MÓ,NÐagÐ`hÐhiÐjnÐqrÕjrÐisÐ^tÔuÔvØ�
‰
Ô'¨4°!­8¨*°A°k°]Ð(CÐS\Ô]Ô^Ø •/Ô!Ø�J‰JÔ+¬AÐ.MÓ,NÐagÐ`hÐhiÐjnÐqrÕjrÐisÐ^tÔuÔvØˆ
r   c                ó    <€ V ^8„  d   QhRS[ /# r�   rð  )r   r…  s   "€r   r   r†  <  s   ø€ ÷ nñ n¡Tñ nr   c                 óZ   € \        \        R 4      RR7      \        \        R4      RR7      .# )zplatform.telegram.picker.backÚmbr.  úplatform.telegram.picker.cancelÚmx)rr   rŠ   rQ   r   r   Ú_picker_back_cancel_rowÚ'TelegramAdapter._picker_back_cancel_row;  sA   € ä$¤QÐ'FÓ%GÐW[Ô\Ô^rÔstð  vWó  tXð  hlô  _mð  nð  	nr   c          
      ó8   <€ V ^8„  d   QhRS[ RS[RS[RS[ RS[/# )r   r$  Ú	page_metaÚ
nav_prefixÚtail_rowr   )rT  r  r   rü  )r   r…  s   "€r   r   r†  ?  s9   ø€ ÷ Bñ B¡tð B¹ð BÉ#ð BÑY]ð BÑbgñ Br   c                óê   € V P                  V4      pVR ,          ^8”  d1   VP                  V P                  VR,          VR ,          V4      4       VP                  V4       \        V4      VR,          3# )rÓ  rÒ  Ú	page_info)r&  rd  r×  rs   )r“  r$  rá  râ  rã  rˆ  s   &&&&& r   Ú_paged_keyboardÚTelegramAdapter._paged_keyboard?  sf   € Ø× Ñ  Ó)ˆØ�]Õ# aÔ'Ø�K‰K˜×,Ñ,¨Y°vÕ->À	È-Õ@XÐZdÓeÔfØ�‰�HÔÜ# DÓ)¨9°[Õ+AÐAÐAr   c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r–  rÒ  r   )rT  rÚ   rü  )r   r…  s   "€r   r   r†  F  s'   ø€ ÷ Vñ V±$ð V¹cð VÉ%ñ Vr   c           
     óÈ  €  ^ RI Hp V Uu/ uF  qDP                  R4      VbK  	  pp. pVEe)   T! V Uu. uF  qDP                  R4      NK  	  up4       Fý  pVR,          R8X  d¯   VR,           Uu. uF  qˆV9   g   K  WX,          NK  	  p	p\	        R V	 4       4      p
VR,           R	V
 R
2p\
        ;QJ d    R V	 4       F  '       g   K   RM	  RM! R V	 4       4      '       d   RV 2pVP                  \        VRVR,           2R7      4       K¿  VP                  VR,          4      pVf   KÝ  VP                  V P                  V4      4       Kÿ  	  MV Uu. uF  q@P                  V4      NK  	  ppV P                  WbV P                  4      w  rÍV P                  WÍR\        \        R4      RR7      .4      #   \         d    Rp ELÄi ; iu upi u upi u upi u upi )uÂ   Paginated top-level provider keyboard folding provider families (Kimi/Moonshot, MiniMax, xAIâ€¦)
into one ``mpg:<gid>`` button via the shared ``group_providers`` fold; singles are ``mp:<slug>``.)Úgroup_providersNr�  Úkindrf  Úmembersc           
   3   óv   "  € T F/  qP                  R \        VP                  R. 4      4      4      x € K1  	  R# 5i)rÌ  rÍ  N)r  r+  ©rR   r7  s   & r   rT   Ú;TelegramAdapter._build_provider_keyboard.<locals>.<genexpr>S  s/   é € ÐaÑY`ÐTU§¡ n´c¸!¿%¹%ÀÈ"Ó:MÓ6N× OÐ OÓY`ùs   ‚79r;   u    â–¸ (rE   c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5i)r¬  Nr¡  rî  s   & r   rT   rï  U  s   é € Ð@¹°1Ÿ5™5 ×.Ð.»ùrx  TFr­  úmpg:Úgroup_idr.  ÚmpvrÜ  rÝ  )Ú hermes_cli.models_catalog_staticrê  r*   r  rz  r¯  rd  rr   rÏ  Ú_format_choice_pageÚ_PROVIDER_PAGE_SIZEræ  rŠ   )r“  r–  rÒ  rê  rÊ  Úby_slugr$  rý  r7  rì  rh  r;   Úpage_buttonsrá  s   &&&           r   r¢  Ú(TelegramAdapter._build_provider_keyboardF  sÉ  € ð	#ÝHñ .7Ó7©Y¨—5‘5˜“= !Ò#©YˆÐ7ØˆØÓ&Ù&¹yÓ'I¹y¸!¯©¨f®¹yÑ'IÖJ�Ø�v•; 'Ô)Ø36°y¶>ÓR±>¨aÈ'Á\œz˜wŸz˜z±>�GÐRÜÑaÑY`ÓaÓa�EØ" 7�|˜n¨F°5°'¸Ð;�Eß“sÑ@¹Ó@—s—s’sÑ@¹Ó@×@Ò@Ø"& u g ˜Ø—N‘NÔ#7¸ÈtÐTWÐXbÕTcÐSdÐMeÔ#fÖgàŸ™ C¨¥KÓ0�AØ”}ØŸ™ t×'<Ñ'<¸QÓ'?Ö@ò Kñ :CÓC¹°A×,Ñ,¨QÖ/¹ˆGÐCØ"&×":Ñ":¸7È$×JbÑJbÓ"cÑˆØ×#Ñ# L¸UÔEYÔZ[Ð\}ÓZ~ð  OSô  FTð  EUó  Vð  	Vøô) ô 	#Ø"‹Oð	#üâ7ùò (JùâRùò Ds-   ‚F< ŒGµGÁ1GÁ>GÅGÆ<GÇGc                óB   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[/# )r   rÍ  rÒ  Úproviderr   )rT  rÚ   r   r  rü  )r   r…  s   "€r   r   r†  a  s5   ø€ ÷ ^ñ ^©Dð ^¹ð ^ÁxÑPTÅ~ð ^Ñafñ ^r   c           	     ó$  € ^ RI Hp V P                  WV P                  4      w  rVVR,          p. p\	        V4       F²  w  ršRV
9   d   V
P                  R4      R
,          MT
pV! W:4      p^&V'       d   \        V4      ^,           M^ ,
          p\        V4      V8”  d   VR\        V^,
          ^4       R,           pV'       d   V RV 2pVP                  \        VRWy,            2R7      4       K´  	  V P                  W†R	V P                  4       4      # )u¾   Build paginated model buttons. Returns (keyboard, page_info_text). Window plans: each button
carries the plan word (``model-b Â· Large``) from the provider row; other accounts are unchanged.)Úpicker_row_suffixre  rÕ  NrM  u    Â· úmm:r.  Úmgr³  )Úhermes_cli.model_picker_usagerý  rõ  Ú_MODEL_PAGE_SIZEr}  rr  r+  r!  rd  rr   ræ  rÞ  )r“  rÍ  rÒ  rû  rý  Úpage_modelsrá  re  r$  r   Úmodel_idÚshortr  Úrooms   &&&&          r   Ú_build_model_keyboardÚ%TelegramAdapter._build_model_keyboarda  s÷   € õ 	DØ!%×!9Ñ!9¸&È×H]ÑH]Ó!^ÑˆØ˜'Õ"ˆØˆÜ$ [Ö1‰KˆAØ/2°h¬�H—N‘N 3Ó'¨Ö+ÀHˆEÙ& xÓ:ˆFØ¯Fœ˜V› qž¸Õ:ˆDÜ�5‹z˜DÔ ØÐ/œs 4¨!¥8¨QÓ/Ð0°5Õ8�ßØ ˜'  f XÐ.�Ø�N‰NÔ/°ÀsÈ5Í9È+ÐEVÔWÖXñ 2ð ×#Ñ# G¸¸d×>ZÑ>ZÓ>\Ó]Ð]r   c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r   Útext_mdr   Nrž   )r   r…  s   "€r   r   r†  s  s   ø€ ÷ ñ ±ð À4ñ r   c              ƒ  ó¸   "  € VP                  V P                  V4      \        P                  VR7      G Rj  x€L
  VP	                  4       G Rj  x€L
  R#  L L5i)zCRe-render the picker message in place (MarkdownV2) and ack the tap.r¸  N)rÆ  rˆ  r}   rS  rÄ  )r“  r¹  r
	  r  s   &&&&r   Ú_picker_editÚTelegramAdapter._picker_edits  sX   é € à×%Ñ%¨4×+>Ñ+>¸wÓ+GÔT]×TiÑTið  yAÐ%ó  B÷  	Bð  	BØ�l‰l‹n×Òñ 	BÙùs!   ‚5A·A¸AÁAÁAÁAc                ó*   <€ V ^8„  d   QhRS[ RS[RR/# ©r   rŽ  rÒ  r   N©r  rÚ   )r   r…  s   "€r   r   r†  x  s"   ø€ ÷ ñ ±dð Á#ð È$ñ r   c              ƒ  óœ  a"  € VP                  R. 4      pW2R&   VP                  RR4      pVP                  RR4      o\        V3R lVR,           4       R4      pV P                  WCV4      w  rxV'       d   VP                  R	\        V4      4      M
\        V4      p	\        V4      p
Wš8”  d!   R
\	        R\        Wš,
          4      R7       R2MRpV'       d$   VP                  R4      '       d   RVR,           2MRpV P                  VR\	        R4       R\	        RRV R2R7       V V R\	        R4       V 2	V4      G Rj  x€L
  R#  L5i)zGRender the model page for the provider currently selected in ``state``.Ú
model_listÚ
model_pageÚselected_provider_namer!   Úselected_providerc              3   óF   <"  € T F  qR ,          S8X  g   K  Vx € K  	  R# 5i©r�  NrQ   ©rR   rÊ  Úprovider_slugs   & €r   rT   Ú6TelegramAdapter._picker_show_models.<locals>.<genexpr>~  s   øé € ÐUÑ$6˜q¸F½)À}Ñ:TŸšÓ$6ùó   ƒ!—
!r–  NrÌ  z
_z'platform.telegram.picker.more_available)rh  rj  Ú	plan_lineu   
âš ï¸� õ   âš™ *úplatform.telegram.picker.titler-  ú'platform.telegram.picker.provider_labelrp  ©rû  ra  z%platform.telegram.picker.select_model)r  r  r	  r+  rŠ   r   r	  )r“  r¹  rŽ  rÒ  rÍ  Úpnamerû  r  rå  ÚtotalÚshownr·  r	  r	  s   &&&&         @r   Ú_picker_show_modelsÚ#TelegramAdapter._picker_show_modelsx  sJ  øé € à—‘˜<¨Ó,ˆØ"ˆlÑØ—	‘	Ð2°BÓ7ˆØŸ	™	Ð"5°rÓ:ˆÜÔU E¨+Ö$6ÓUÐW[Ó\ˆØ"×8Ñ8¸ÀxÓPÑˆß=E�—‘˜^¬S°«[Ô9Ì3ÈvË;ˆÜ�F“ˆØchÔcp�#”aÐAÌÈUÍ]ÓI[Ô\Ð]Ð]^Ñ_Ðvxˆç;CÈÏÉÐU`×HaÒHa�i ¨Õ 5Ð6Ñ7Ðgiˆ	Ø×ÑØØ”AÐ6Ó7Ð8¸ÜÐ:ÀqÈÈÈqÀ\ÔRÐSÐT]ÐS^Ð_hÐ^iÐikÜÐ8Ó9Ð:¸5¸'ðCð ó÷ 	ô 	ùs   ƒCEÃEÃ/AEÅE
ÅEc                ó2   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ /# )r   r—  Úprovider_labelrå  r   rž   )r   r…  s   "€r   r   r†  �  s1   ø€ ÷ Oñ O©3ð OÁð OÑPSð OÑX[ñ Or   c           
     ó¤   € R T ;'       g    \        R4       R 2pR\        R4       R\        RVR7       R\        RVR	7       R
\        R4       V 2	# )Ú`z&platform.telegram.picker.unknown_modelr	  r	  r-  z&platform.telegram.picker.current_model)Úmodelra  r	  r 	  rA  ú(platform.telegram.picker.select_providerrZ  )r—  r'	  rå  r*	  s   &&& r   r£  Ú#TelegramAdapter._provider_list_textŒ  sn   € à�M×PÐP¤QÐ'OÓ%PÐQÐQRÐSˆØœÐ:Ó;Ð<¸EÄ!ÐDlÐtyÔBzÐA{Ð{}ÜÐ>ÈÔXÐYÐY]ÜÐ?Ó@ÐAÀ)ÀðNð 	Or   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# r	  r	  )r   r…  s   "€r   r   r†  “  s(   ø€ ÷ Gñ G¹ð GÁSð GÐX\ñ Gr   c              ƒ  óþ   "  € V P                  VR,          V4      w  rV V! VR,          4      pV P                  WP                  VR,          Wv4      V4      G Rj  x€L
  R#   \         d    TR,          p LIi ; i L 5i)z-Render the (folded, paginated) provider list.r–  r˜  r—  N)r¢  r*   r	  r£  )r“  r¹  rŽ  rÒ  rŽ  r  r¤  r'	  s   &&&&&   r   Ú_picker_show_providersÚ&TelegramAdapter._picker_show_providers“  s�   é € à'+×'DÑ'DÀUÈ;ÕEWÐY]Ó'^Ñ$ˆð	7Ù& uÐ-?Õ'@ÓAˆNð ×Ñ ×'?Ñ'?ÀÀoÕ@VÐXfÓ'{ð  ~Fó  G÷  	Gò  	Gøô ô 	7Ø"Ð#5Õ6ŠNð	7úñ 	Gùs3   ‚A=ŸA! ®,A=ÁA;ÁA=Á!A8Á5A=Á7A8Á8A=c                ó<   <€ V ^8„  d   QhRS[ RS[RS[S[,          /# )r   rŽ  Úraw_idxr   )r  r   r   rü  )r   r…  s   "€r   r   r†  œ  s,   ø€ ÷ Rñ R±Dð RÁ3ð RÉ8ÑTYÍ?ñ Rr   c              ƒ  óæ  "  €  \        V4      pTP	                  R. 4      pT^ 8  g   T\        T4      8¼  d&   TP                  \        R4      R7      G Rj  x€L
  R# TP	                  R4      pT'       g&   TP                  \        R4      R7      G Rj  x€L
  R# YET,          TP	                  RR	4      T3#   \         d)    TP                  \        R4      R7      G Rj  x€L 
   R# i ; i L– LZ5i)
uh   Resolve ``mm:``/``mc:`` index â†’ ``(idx, model_id, provider_slug, callback)``; answers + None on error.rÂ  rO  Nr	  z,platform.telegram.picker.invalid_model_indexrž  rÃ  r	  r!   )rÚ   rÞ   rÄ  r¨   r  r+  )r“  r¹  rŽ  r2	  r‡  r	  rÆ  s   &&&&   r   Ú_picker_selectionÚ!TelegramAdapter._picker_selectionœ  sÚ   é € ð	Ü�g“,ˆCð —Y‘Y˜|¨RÓ0ˆ
Ø�Œ7�cœS ›_Ô,Ø—,‘,¤FÐ+YÓ$Z�,Ó[×[Ð[ÙØ—9‘9Ð0Ó1ˆßØ—,‘,¤FÐ+MÓ$N�,ÓO×OÐOÙØ˜s•O U§Y¡YÐ/BÀBÓ%GÈÐQÐQøô ô 	Ø—,‘,¤FÐ+WÓ$X�,ÓY×YÑYÚð	úñ
 \ñ PùsX   ‚C1„B7 �AC1ÁC-ÁC1Á6C1ÂC/Â"C1Â7)C*Ã C#Ã!C*Ã&C1Ã)C*Ã*C1Ã/C1c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[ RR/# )r   r±  r	  r	  r   Nrž   )r   r…  s   "€r   r   r†  ­  s+   ø€ ÷ 4ñ 4±3ð 4Á#ð 4ÑVYð 4Ðhlñ 4r   c              ƒ  ó’  "  € Rp V! W#V4      G Rj  x€L
 pV P                  W4      G Rj  x€L
  TP                  \        V'       d   RMR4      R	7      G Rj  x€L
  V P                  P                  VR4       R#  Lh  \          d9   p\        P                  RT4       \        R\	        T4      R7      pRp Rp?L¤Rp?ii ; i L— Ll5i)
zGPerform the model switch, render the result, and drop the picker state.FNzModel picker switch failed: %sz%platform.telegram.picker.switch_errorr  Tz&platform.telegram.picker.switch_failedz!platform.telegram.picker.switchedrO  )
r*   r7   r   rŠ   r   rº  rÄ  r¨   r  rY   )	r“  r¹  r±  r	  r	  rÆ  Úswitch_failedr¶  rê  s	   &&&&&&   r   Ú_picker_switchÚTelegramAdapter._picker_switch­  sÀ   é € àˆð	!Ù (¨¸MÓ J×JˆKð
 ×$Ñ$ UÓ8×8Ð8Ø�l‰l¤×S`Ñ'Oð  gJó  !Kˆló  L÷  	Lð  	LØ× Ñ ×$Ñ$ W¨dÖ3ñ KøÜô 	!Ü�L‰LÐ9¸3Ô?ÜÐCÌ3ÈsË8ÔTˆKØ �Mûð	!úñ 	9ñ 	LùsY   ‚C†A= ’A;“A= —C«C¬,CÁCÁ"CÁ;A= Á=C Â.B;Â6CÂ;C Ã CÃCc                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   rŒ  r   rä   )r   r…  s   "€r   r   r†  »  s   ø€ ÷ ñ ¡cð ©h±s­mñ r   c              ƒ  óŽ   "  €  \        V4      #   \         d)    T P                  \        R 4      R7      G Rj  x€L 
   R# i ; i5i)z%platform.telegram.picker.invalid_pagerO  N)rÚ   rÞ   rÄ  r¨   )r¹  rŒ  s   &&r   Ú_parse_pageÚTelegramAdapter._parse_pageº  s>   é € ð	Ü�s“8ˆOøÜô 	Ø—,‘,¤FÐ+RÓ$S�,ÓT×TÑTÚð	üs-   ‚A„
 ŽA�)A¸;¹A¾AÁAÁAc                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# r½  rž   )r   r…  s   "€r   r   r†  Â  s(   ø€ ÷ N!ñ N!¹sð N!ÉSð N!ÐUYñ N!r   c              ƒ  óÞ  a"  € V P                   P                  V4      pV'       g&   VP                  \        R4      R7      G Rj  x€L
  R# V P	                  4       pVP                  R4      '       dŸ   VR,          o\        V3R lVR,           4       R4      pV'       g&   VP                  \        R4      R7      G Rj  x€L
  R# SVR	&   VP                  R
S4      VR&   VP                  R. 4      VR&   V P                  W^ 4      G Rj  x€L
  R# VP                  R4      '       dC   V P                  WR,          4      G Rj  x€L
 pVe   V P                  WV4      G Rj  x€L
  R# R# VP                  R4      '       dG   V P                  WR,          4      G Rj  x€L
 pVe!   WtR&   V P                  WWu4      G Rj  x€L
  R# R# VP                  R4      '       dL   V P                  WVR,          4      G Rj  x€L
 pVe%   Vw  ršopV P                  WV
SV4      G Rj  x€L
  R# R# VP                  R4      '       Ed"   V P                  WVR,          4      G Rj  x€L
 pVf   R# Tw  rÊop ^ RIHp \        P                  ! WÚSR7      G Rj  x€L
 pVe¬   \#        \%        \'        R4      RV 2R7      .V P)                  4       .4      pVP+                  V P-                  RVP.                   RVP0                   24      \2        P4                  VR7      G Rj  x€L
  VP                  \        R4      R7      G Rj  x€L
  R# V P                  WV
SV4      G Rj  x€L
  R# VP                  R4      '       EdA   TR,          p ^ RIHp VP                  VRR. 34      w  pppVR,           Uu/ uF  pVR,          VbK  	  ppV Uu. uF  pVV9   g   K  VV,          NK  	  ppV'       g&   VP                  \        R 4      R7      G Rj  x€L
  R# T P;                  V Uu. uF  pV P=                  V4      NK  	  up4      pVP?                  V P)                  4       4       T PA                  TR!\'        R"4       R\'        R#R$T;'       g    T R$2R%7       R&\'        R'4       2\#        V4      4      G Rj  x€L
  R# VR(8X  dA   T P                  Y\C        VP                  R^ 4      ;'       g    ^ 4      V4      G Rj  x€L
  R# VR)8X  d[   V P                   PE                  VR4       VP+                  \'        R*4      RR+7      G Rj  x€L
  VP                  4       G Rj  x€L
  R# VP                  4       G Rj  x€L
  R#  EL7 ELÀ ELx ELB EL' ELï ELÐ EL— ELt EL: EL
  \          d    Rp ELi ; i EL— ELw EL\  \          d	    R. pp EL)i ; iu upi u upi  ELÐu upi  EL/ Lê L£ L� Lu5i),z@Handle model picker callbacks (mp:/mpg:/mpv:/mm:/mc:/mb/mx/mg:).z&platform.telegram.picker.expired_modelrO  NrÎ  rÀ  c              3   óF   <"  € T F  qR ,          S8X  g   K  Vx € K  	  R# 5ir	  rQ   r	  s   & €r   rT   Ú@TelegramAdapter._handle_model_picker_callback.<locals>.<genexpr>Ë  s   øé € ÐYÑ(: 1À½iÈ=Ñ>XŸQšQÓ(:ùr	  r–  z+platform.telegram.picker.provider_not_foundr	  r„  r	  rÍ  r	  úmg:úmpv::é   NNrŸ  úmc:rþ  )Úcombined_selection_warningr 	  z&platform.telegram.picker.switch_anywayr.  u   âš  *r-  r¸  z*platform.telegram.picker.confirm_selectionrñ  )ÚPROVIDER_GROUPSr!   r�  z(platform.telegram.picker.group_not_foundr	  r	  z(platform.telegram.picker.provider_familyrp  )ÚfamilyrA  r+	  rÛ  rÝ  z"platform.telegram.picker.cancelled)r+   r  )#r  r  rÄ  r¨   r“  Ú
startswithr  r$	  r=	  r/	  r4	  r9	  Ú!hermes_cli.model_selection_guardsrG	  r0   râ  r*   rs   rr   rŠ   rÞ  rÆ  rˆ  r–  r%  r}   rS  rô  rH	  r&  rÏ  rd  r	  rÚ   rY   )r“  r¹  r¾  r±  rŽ  rŽ  rû  rÒ  ÚselÚ_idxr	  rÆ  r‡  rG	  r-  r  rò  rH	  Ú_labelÚ_descÚmember_slugsrÊ  r÷  r7  rì  rˆ  r	  s   &&&&                      @r   Ú_handle_model_picker_callbackÚ-TelegramAdapter._handle_model_picker_callbackÂ  sˆ  øé € à×(Ñ(×,Ñ,¨WÓ5ˆßØ—,‘,¤FÐ+SÓ$T�,ÓU×UÐUÙØ×,Ñ,Ó.ˆ	Ø�?‰?˜5×!Ò!Ø  �HˆMÜÔY¨¨kÖ(:ÓYÐ[_Ó`ˆHßØ—l‘l¬Ð/\Ó(]�lÓ^×^Ð^ÙØ)6ˆEÐ%Ñ&Ø.6¯l©l¸6À=Ó.QˆEÐ*Ñ+Ø"*§,¡,¨x¸Ó"<ˆE�,ÑØ×*Ñ*¨5¸Ó;×;Ò;Ø�_‰_˜U×#Ò#Ø×)Ñ)¨%°bµÓ:×:ˆDØÒØ×.Ñ.¨u¸TÓB×BÒBñ  à�_‰_˜V×$Ò$Ø×)Ñ)¨%°bµÓ:×:ˆDØÒØ)-�oÑ&Ø×1Ñ1°%ÀÓP×PÒPñ  ð �_‰_˜U×#Ò#Ø×.Ñ.¨u¸TÀ"½XÓF×FˆCØŠØ:=Ñ7� ¨xØ×)Ñ)¨%¸(ÀMÐS[Ó\×\Ò\ñ ð �_‰_˜U×#Ó#Ø×.Ñ.¨u¸TÀ"½XÓF×FˆCØŠ{ÙØ58Ñ2ˆC˜=¨(ðÝXä '× 1Ò 1Ð2LÐanÔ o×o�ð Ò"Ü/Ü)¬!Ð,TÓ*UÐgjÐknÐjoÐepÔqÐrÐtx÷  uQñ  uQó  uSð1Tó U�à×-Ñ-Ø×,Ñ,¨u°W·]±]°OÀ5ÈÏÉÐHYÐ-ZÓ[Ü(×4Ñ4À8ð .ó M÷ Mð Mð —l‘l¬Ð/[Ó(\�lÓ]×]Ð]ÙØ×%Ñ% e°hÀÈxÓX×XÒXØ�_‰_˜V×$Ó$Ø˜B•xˆHð.ÝLØ.=×.AÑ.AÀ(ÈRÐQSÐUWÈLÓ.YÑ+�˜˜|ð .3°;Ö-?Ó@Ñ-?¨�q˜•y !’|Ñ-?ˆGÐ@Ù+7ÓH©< a¸1À¹<”z�w˜q—z�z©<ˆGÐHßØ—l‘l¬Ð/YÓ(Z�lÓ[×[Ð[ÙØ×$Ñ$ÉÓ%PÉÀ1 d×&;Ñ&;¸AÖ&>ÉÑ%PÓQˆDØ�K‰K˜×4Ñ4Ó6Ô7Ø×#Ñ#ØØœÐ:Ó;Ð<¸EÜÐ?È!ÈF×L^ÐL^ÐV^ÐK_Ð_`ÐHaÔbÐcÐcgÜÐ?Ó@ÐAðCô % TÓ*ó,÷ ,ò ,ð �TŒ\Ø×-Ñ-¨e¼CÀÇ	Á	È/Ð[\Ó@]×@bÐ@bÐabÓ<cÐenÓo×oÒoØ�TŒ\Ø×$Ñ$×(Ñ(¨°$Ô7Ø×)Ñ)¬qÐ1UÓ/VÐeiÐ)Ój×jÐjØ—,‘,“.× Ò à—,‘,“.× Ò òU Vò _ò
 <â:âBâ:ò QâFò ]âFò pøÜô Ø“ðúò
Mò ^âXøô ô .Ø')¨2˜�šð.üâ@ùÚHâ[ùâ%Pò,ñ pñ kÙ á ùs  ƒAW-ÁU<Á,W-Á3AW-Â?U?Ã A
W-Ä
VÄW-Ä(W-ÅVÅW-Å!VÅ"W-ÆW-ÆVÆ!W-Æ>VÆ?W-ÇW-Ç:VÇ;%W-È VÈ!W-ÉW-ÉVÉW-É/!V ÊVÊV ÊBW-ÌV1Ì"W-Ì=V4Ì>W-ÍV7ÍW-Í:	W-ÎV: Î#W-Î.WÏW-Ï	WÏWÏ"(W-Ð
WÐW-Ð WÐ:AW-Ò	*W-Ò3W"Ò46W-Ó+W-Ó:W%Ó;AW-ÕW'ÕW-ÕW)ÕW-Õ5W+Õ6W-Õ?W-ÖW-ÖW-ÖW-ÖW-ÖW-ÖW-ÖW-ÖW-ÖV ÖV.Ö*W-Ö-V.Ö.W-Ö4W-Ö7W-Ö:W×	W-×W×W-×W-×%W-×'W-×)W-×+W-c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úuser_displayr   Nrž   )r   r…  s   "€r   r   r†    s   ø€ ÷ Iñ IÁð IÈñ Ir   c              ƒ  ó¸  "  € \         P                  ! \        4      ;_uu_ 4        VP                  \	        R4      R7      G Rj  x€L
  RRR4       T P                  TR\        P                  ! VP                  P                  ;'       g    R4       R\        P                  ! \        R4      4       R24      G Rj  x€L
  R#  L~  + '       g   i     L„; i L5i)	u•   Tell the user a clarify tap arrived too late (entry evicted or gateway restarted) â€” otherwise
the tap leaves a misleading âœ“ the agent never sees.z&platform.telegram.prompt.expired_toastrO  Nr�  r!   ú

<i>z%platform.telegram.prompt.expired_bodyú</i>)r%  r&  r*   rÄ  r¨   Ú_edit_html_quietr®   r¯   r%  r+   rŠ   )r“  r¹  rT	  s   &&&r   Ú_notify_clarify_expiredÚ'TelegramAdapter._notify_clarify_expired  s¼   é € ô × Ò ¤×+Õ+Ø—,‘,¤FÐ+SÓ$T�,ÓU×UÐU÷ ,à×#Ñ#Ø�Tœ%Ÿ,š, u§}¡}×'9Ñ'9×'?Ð'?¸RÓ@ÐAÀÌÏÊÔVWÐXó  WAó  JBð  ICð  CGð  HóI÷ 	Iò 	Iñ V÷ ,×+úñ	IùsA   ‚#C¥CÁCÁCÁ	ACÂ1CÂ<CÂ=CÃCÃC	Ã	Cc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r+   r   Nrž   )r   r…  s   "€r   r   r†    s   ø€ ÷ cñ c©Cð c°Dñ cr   c              ƒ  óä   "  € \         P                  ! \        4      ;_uu_ 4        V P                  V\        P
                  RR7      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)zBHTML edit with the keyboard removed; failures ignored (non-fatal).Nr¸  )r%  r&  r*   rÆ  r}   rm  )r¹  r+   s   &&r   rX	  Ú TelegramAdapter._edit_html_quiet  sN   é € ô × Ò ¤×+Õ+Ø×)Ñ)¨tÄ	ÇÁÐ]aÐ)Ób×bÐb÷ ,Ñ+Ùb÷ ,×+Ð+üs.   ‚#A0¥&AÁAÁAÁ
A0ÁAÁA-	Á'	A0c                ó$   <€ V ^8„  d   QhRS[ RR/# r		  rž   )r   r…  s   "€r   r   r†     s   ø€ ÷ Bñ B±3ð B¸4ñ Br   c              ƒ  ó  "  € \         P                  ! \        4      ;_uu_ 4        VP                  V P	                  V4      \
        P                  RR7      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)zHMarkdownV2 edit with the keyboard removed; failures ignored (non-fatal).Nr¸  )r%  r&  r*   rÆ  rˆ  r}   rS  )r“  r¹  r
	  s   &&&r   Ú_edit_md_quietÚTelegramAdapter._edit_md_quiet   sj   é € ä× Ò ¤×+Õ+Ø×)Ñ)¨t×/BÑ/BÀ7Ó/KÔXa×XmÑXmð  }AÐ)ó  B÷  Bð  B÷ ,Ñ+ñ B÷ ,×+Ð+üs.   ‚#A?¥5A+ÁA)ÁA+Á
A?Á)A+Á+A<	Á6	A?c                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# ©r   r£  r  r   N©ro   rz   r…   )r   r…  s   "€r   r   r†  %  s.   ø€ ÷ ,Wñ ,W±ð ,WÁ,×B[ÑB[ð ,WÐ`dñ ,Wr   c              ƒ  ó¬  "  € \        VRR4      pVf   R# \        VRR4      p\        \        VRR4      ;'       g    R4      P                  4       p \        V4      ;'       d     V P	                  WUR\        VRR4      R7      pV'       g6    ^ RI	H
p V P                  4        VP                  . VR
R7      G Rj  x€L
  R#  ^ RIHpHp	 ^ RI	H
p
Hp \$        P&                  ! T\        VRR4      ;'       g    R\        VRR4      ;'       g    RR7      G Rj  x€L
 w  rÍV Uu. uF1  pV! VR,          VR,          VR,          V	! VR,          4      R7      NK3  	  ppV P                  4        VP                  WúR
VR7      G Rj  x€L
  R#   \
         d)    \        P                  R	T P                  R
R7       Rp EL8i ; i EL  \
         d7    T P                  4        \        P                  RT P                  R
R7        R# i ; i Lîu upi  LŠ  \
         d7    T P                  4        \        P                  RT P                  R
R7        R# i ; i5i)ag  Answer ``@botname <query>`` with a searchable command/skill picker (the ``/`` menu is capped at
60 slots). Results are computed per keystroke, 50 per page; tapping sends ``/cmd`` text as the
user, so dispatch flows through the normal command path. Inline queries arrive from ANY chat, so
unauthorized users get an empty list (the skill catalog is not leaked).Úinline_queryNr�  rZ   r!   r\  r“  )r±  rX  ry  z$[%s] inline picker auth check failedTr3   F)ÚCACHE_TIME_SECONDS)Ú
cache_timeÚis_personalz&[%s] inline picker empty answer failed)ÚInlineQueryResultArticleÚInputTextMessageContent)rg	  Úbuild_inline_resultsr¹  Úoffset)rm	  r–  rJ  Úmessage_text)rZ   r–  rJ  Úinput_message_content)rh	  ri	  Únext_offsetz [%s] inline picker answer failed)r]   r   r  rB   rŠ  r*   r7   r8   r„  Ú(plugins.platforms.telegram.inline_pickerrg	  r  rÄ  r  r<   rj	  rk	  rl	  r0   râ  )r“  r£  r  rf	  r�  rk  rÈ  Ú_deny_cacherj	  rk	  Ú_CACHErl	  Úresultsrp	  r2  Úarticless   &&&             r   rk  Ú$TelegramAdapter._handle_inline_query%  sG  é € ô
 ˜v ~°tÓ<ˆØÒÙÜ˜L¨+°tÓ<ˆ	Ü”g˜i¨¨rÓ2×8Ð8°bÓ9×?Ñ?ÓAˆð	ä˜g›÷ oð o¨4×+LÑ+LØ°IÌÐQZÐ\fÐhlÓImð ,Mó ,oˆJ÷
 ðaÝfØ×#Ñ#Ô%Ø"×)Ñ)¨"¸ÐRVÐ)ÓW×WÐWñ ð	WßRßsä)0×):Ò):Ø$Ü˜ g¨rÓ2×8Ð8°bÄÈÐW_ÐacÓAd×AjÐAjÐhjô*l÷ $lÑ ˆGñ !ó	ñ !�Añ )Ø˜•w a¨¥j¸aÀÕ>NÙ*AÀ!ÀNÕBSÓ*T÷Vñ !ð	 ð ð ×ÑÔ!Ø×%Ñ% hÈtÐalÐ%Óm×mÒmøô7 ô 	Ü�L‰LÐ?ÀÇÁÐUYˆLÔZØ‹Jð	úò XøÜô aØ×-Ñ-Ô/Ü—‘ÐEÀtÇyÁyÐ[_�Õ`Ùðaúñ$lùòñ nøÜô 	WØ×)Ñ)Ô+Ü�L‰LÐ;¸T¿Y¹YÐQUˆL×Vð	WüsÆ   ‚AIÁF
 Á$ F
 ÂIÂ-G Â:G Â;G Â?IÃ4H Ã7H ÄH ÄHÄ
H Ä#7H	Å)H ÆHÆH ÆIÆ
/F=Æ9IÆ<F=Æ=IÇ G Ç=HÈ IÈHÈIÈH È	H È=IÉIÉIÉIc                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r�   r’  )r   r…  s   "€r   r   r†  T  s   ø€ ÷ Gñ G¡¡S©# X¥ñ Gr   c                ó¶   € \        V RR4      p\        VRR4      pR\        VRR4      R\        VRR4      R\        VRR4      R	\        V P                  R
R4      /# )zEChat/thread/user context of a button tap, for the callback auth gate.r%  Nr‘  r±  rX  r'   rx  r—  ry  Ú
first_name)r]   r�  )r¹  Úquery_messageÚ
query_chats   &  r   Ú_callback_ctxÚTelegramAdapter._callback_ctxS  sx   € ô    y°$Ó7ˆÜ˜]¨F°DÓ9ˆ
à”w˜}¨i¸Ó>ÀÌWÐU_ÐagÐimÓMnØœ Ð0CÀTÓJÈKÔY`Ðaf×apÑapÐr~ð  AEó  ZFðGð 	Gr   c                óB   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[/# )r   ÚcbÚdenial_textr   ©r  r   r   rB   )r   r…  s   "€r   r   r†  \  s,   ø€ ÷ ñ ±D¹¹c¸µNð ÑQTð ÑY]ñ r   c           	   ƒ  óN  "  € T P                  \        \        VP                  RR4      4      VR,          VR,          e   \        VR,          4      MRVR,          e   \        VR,          4      MRVR,          R7      '       d   R	# VP	                  VR
7      G Rj  x€L
  R#  L5i)zRGate a button tap on the callback allowlist; answers ``denial_text`` when refused.rZ   r!   r±  rX  Nrx  ry  rÅ  TrO  F)rŠ  r   r]   r�  rÄ  )r“  r¹  r	  r€	  s   &&&&r   Ú_callback_authorizedÚ$TelegramAdapter._callback_authorized\  s’   é € à×,Ñ,Ü”˜Ÿ™¨¨rÓ2Ó3¸RÀ	½]Ø.0°­oÒ.I”c˜"˜[�/Ô*ÈtØ.0°­oÒ.I”c˜"˜[�/Ô*ÈtÐ_aÐbmÕ_nð -÷ pò pñ Ø�l‰l ˆlÓ,×,Ð,Ùñ 	-ùs   ‚BB%ÂB%ÂB#ÂB%c                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# rc	  rd	  )r   r…  s   "€r   r   r†  f  s)   ø€ ÷ ñ ±6ð ÁL×D]ÑD]ð Ðbfñ r   c              ƒ  ó  "  € VP                   pV'       d   VP                  '       g   R# V P                  4        VP                  pV P                  V4      pRV P                  3RV P
                  33 F“  w  rgVP                  V4      '       g   K  VP                  '       d    \        VP                  P                  4      MRpV'       d:   V P                  W5\        4       4      G Rj  x€L
 '       d   V! W4V4      G Rj  x€L
   R# 	  RV P                  3RV P                  3RV P                  3RV P                  3RV P                   33 F0  w  r—VP                  V	4      '       g   K  V! W4V4      G Rj  x€L
   R# 	  R#  L™ L„ L5i)	zCDispatch inline keyboard button clicks on the callback_data prefix.Nzgt:rb  zsc:r„  zupdate_prompt:)rÎ  rñ  rD	  rþ  rF	  rÛ  rÝ  rC	  )r®  )Úcallback_queryr¾  r  r|	  rQ	  rÇ  rJ	  r%  r   r±  rƒ	  r¢   Ú_handle_gmail_triage_callbackÚ_handle_exec_approval_callbackÚ_handle_slash_confirm_callbackÚ_handle_clarify_callbackÚ_handle_update_prompt_callback)
r“  r£  r  r¹  r¾  r	  Úprefixesr  r±  r  s
   &&&       r   rj  Ú&TelegramAdapter._handle_callback_queryf  sU  é € à×%Ñ%ˆß˜EŸJŸJ˜JÙØ×ÑÔØ�z‰zˆØ×Ñ Ó&ˆð FÀt×GiÑGiÐjØ�t×:Ñ:Ð;ó"=ÑˆHð �‰˜x×(Ô(Ø8=¿¿¸œ#˜eŸm™m×3Ñ3Ô4È4�ç T×%>Ñ%>¸uÌ-Ë/Ó%Z×ZÖZÙ! %¨wÓ7×7Ð7Úñ"=ð �D×6Ñ6Ð7¸%À×AdÑAdÐ9eØ�D×7Ñ7Ð8¸5À$×B_ÑB_Ð:`Ø˜t×BÑBÐCó E‰OˆFð �‰˜v×&Ô&Ù˜e¨2Ó.×.Ð.Úó Eñ  [Ù7ñ /ùsZ   ‚&F
©A$F
ÂF
Â$(F
ÃF
Ã*FÃ+	F
Ã5F
ÄFÄA%F
Å,F
Å8FÅ9F
ÆF
ÆF
rY   c          
      óN   <€ V ^8„  d   QhRS[ S[S[3,          RS[ RS[RS[RS[/# )r   r	  rŽ  ÚdenialÚresolvedrY   r�	  )r   r…  s   "€r   r   r†  €  s;   ø€ ÷ ñ ±T¹#¹s¸(µ^ð ÉDð Ñ_bð Ñnqð Ñ{ñ r   c             ƒ  óô   "  € V P                  WV4      G Rj  x€L
 '       g   R# V'       d   VP                  VR4      MVP                  V4      pV'       g   VP                  VR7      G Rj  x€L
  V#  L[ L5i)zeAuth-gate a button tap, then claim its pending entry; None (after answering) when refused or expired.NrO  )rƒ	  rY   r  rÄ  )	r“  r¹  r	  rŽ  r¤   r�	  r‘	  rY   r*  s	   &&&&&&&$ r   Ú_claim_callback_stateÚ%TelegramAdapter._claim_callback_state€  sb   é € à×.Ñ.¨u¸&ÓA×AÖAÙß.1�e—i‘i  TÔ*°u·y±yÀ³~ˆßØ—,‘, H�,Ó-×-Ð-ØÐñ Bñ .ùs1   ‚A8˜A4™	A8£	A8­*A8ÁA8Á-A6Á.A8Á6A8c                ó@   <€ V ^8„  d   QhRS[ RS[S[ S[3,          RR/# ©r   r¾  r	  r   Nr=  )r   r…  s   "€r   r   r†  ‰  s,   ø€ ÷ *<ñ *<Áð *<ÉÉcÑSVÈhÍð *<Ð\`ñ *<r   c           
   ƒ  ó*  "  € VP                  R^4      p\        V4      ^8w  d   R# V^,          p \        V^,          4      pT P                  YT P                  T\        4       \        R4      4      G Rj  x€L
 pT'       g   R# \        TP                  RR4      ;'       g    \        R4      p ^ RIHp	 T	! Yu4      p
\        P!                  R	Y§YX4       T
'       d7   RRRRRRRR/P'                  TR4      p\        RT 24      p\        RYØR7      pM\        R4      p\        RTR7      pTP                  TR\(         R7      G Rj  x€L
  T P+                  Y4      G Rj  x€L
  T
'       d1   TR,          e$   T P-                  \/        TR,          4      4       R# R# R#   \        \        3 d)    TP                  \        R4      R7      G Rj  x€L 
   R# i ; i ELe  \"         d$   p\        P%                  R
T4       ^ p
 Rp?EL2Rp?ii ; i LÇ L°5i)uB   ``ea:<choice>:<approval_id>`` â€” resolve a pending exec approval.r¬   Nz-platform.telegram.approval.toast_invalid_datarO  z1platform.telegram.approval.toast_already_resolvedry	  úplatform.telegram.user_fallback)Úresolve_gateway_approvalzKTelegram button resolved %d approval(s) for session %s (choice=%s, user=%s)z;Failed to resolve gateway approval from Telegram button: %srV  Úresolved_oncerW  Úresolved_sessionrX  Úresolved_alwaysrY  Úresolved_denyÚresolved_genericzplatform.telegram.approval.ú+platform.telegram.approval.resolved_by_user©r;   r™  z"platform.telegram.approval.expiredz)platform.telegram.approval.expired_detail)r;   r±  )rr  r+  rÚ   rÞ   rÅ  rÄ  r¨   r“	  r
  r¢   r]   r�  rŠ   Útools.approvalr™	  r7   rç   r*   r   r  r¡   r`	  Úresume_typing_for_chatr   )r“  r¹  r¾  r	  Úpartsr[  re  r*  rT	  r™	  rh  rê  Ú	label_keyr;   Ú	edit_texts   &&&&           r   r‰	  Ú.TelegramAdapter._handle_exec_approval_callback‰  sû  é € à—
‘
˜3 Ó"ˆÜˆu‹:˜Œ?ÙØ�q•ˆð	Ü˜e A�h›-ˆKð !×6Ñ6Ø�t×+Ñ+¨[¼-»/ÜÐFÓGóI÷ Iˆ÷ ÙÜ˜uŸ™°¸dÓC×kÐkÄqÐIjÓGkˆð
	õ @Ù,¨[ÓAˆEÜ�K‰KØ]Ð_dÐsyôI÷
 Ø °)Ð=OÐQYÐ[lÐntð  wFð  G÷  Kñ  KØÐ*ó,ˆIäÐ3°I°;Ð?Ó@ˆEÜÐGÈuÔh‰IäÐ:Ó;ˆEÜÐEÈUÔSˆIØ�l‰l  m¤|Ð 4ˆlÓ5×5Ð5Ø×!Ñ! %Ó3×3Ð3ç�R˜	•]Ò.Ø×'Ñ'¬¨B¨y­MÓ(:Ö;ñ /‰5øôC œJÐ'ô 	Ø—,‘,¤FÐ+ZÓ$[�,Ó\×\Ñ\Úð	úòIøô  ô 	Ü�L‰LÐVÐX[Ô\ØŽEûð	úñ 	6Ù3ùs¡   ‚.H±F Á3HÁ6GÁ7HÂHÂ#HÂ0%G ÃHÃA*HÅHÅHÅ HÅ!HÅ-2HÆ/GÇGÇGÇHÇGÇHÇHÇ)HÈHÈHÈHÈHc                ó@   <€ V ^8„  d   QhRS[ RS[S[ S[3,          RR/# r–	  r=  )r   r…  s   "€r   r   r†  µ  s1   ø€ ÷ -bñ -bÁð -bÉÉcÑSVÈhÍð -bÐ\`ñ -br   c           
   ƒ  óä  "  € VP                  R^4      p\        V4      ^8w  d   R# V^,          pV^,          pV P                  WV P                  V\	        4       \        R4      4      G Rj  x€L
 pV'       g   R# RRRRRR	/P                  VR
4      p\        VP                  RR4      ;'       g    \        R4      p	\        RV 24      p
VP                  V
R\         R7      G Rj  x€L
  V P                  V\        RW©R7      4      G Rj  x€L
   ^ RIHp VP                  WvV4      G Rj  x€L
 pV'       Edê   VP                   '       EdÕ   \        VP                   RR4      p\        \        VP                   RR4      RR4      p\        VP                   RR4      pR\#        VP                   P$                  4      RV P'                  V4      R\(        P*                  /V P-                  4       Cp\/        \        VRV4      4      P1                  4       R\/        \2        P4                  4      P1                  4       \/        \        \2        P4                  R\2        P4                  4      4      P1                  4       09   pVe†   R\/        V4      /pRpV'       d   Ve   \#        V4      ;pVR&   RVR&   VP7                  V P9                  \/        VP                   P$                  4      \/        V4      VVV P:                  R7      4       V P<                  ! R"/ VB G Rj  x€L
  R# R# R#  ELº ELB EL  EL L  \>         d/   p\@        PC                  R T PD                  TRR!7        Rp?R# Rp?ii ; i5i)#uF   ``sc:<choice>:<confirm_id>`` â€” resolve a slash-command confirmation.r¬   Nú0platform.telegram.slash_confirm.already_resolvedrV  zslash_confirm.resolved_oncerX  zslash_confirm.resolved_alwaysr|  zslash_confirm.resolved_cancelzapproval.resolved_genericry	  r˜	  zplatform.telegram.rO  rŸ	  r 	  )Úslash_confirmr—  r‘  r'   r¡  r±  r+   rQ  rH   r\  rx  rù  Trã  r	  z&[%s] slash-confirm callback failed: %sr3   rQ   )#rr  r+  r“	  r  r¢   r¨   r  r]   r�  rŠ   rÄ  r¡   r`	  Útoolsrª	  Úresolver%  rÚ   r±  rˆ  r}   rS  r—  r   rø   r~   ÚPRIVATEr£  r   rÅ  r  r*   r7   r   r„  )r“  r¹  r¾  r	  r£	  r[  rq  r*  r¤	  rT	  r;   Ú_slash_confirm_modr¶  rx  rX  Úprompt_message_idrH  Úis_private_chatÚmetar	  rê  s   &&&&                 r   rŠ	  Ú.TelegramAdapter._handle_slash_confirm_callbackµ  s)  é € à—
‘
˜3 Ó"ˆÜˆu‹:˜Œ?ÙØ�q•ˆØ˜1•Xˆ
Ø ×6Ñ6Ø�t×0Ñ0°*¼m»oÜÐEÓFóH÷ Hˆ÷ ÙØÐ:¸HÐFeÐgoð  rQð  R÷  Vñ  VØÐ/ó1ˆ	ä˜uŸ™°¸dÓC×kÐkÄqÐIjÓGkˆÜÐ& y kÐ2Ó3ˆØ�l‰l  m¤|Ð 4ˆlÓ5×5Ð5Ø×!Ñ! %¬Ð+XÐ`eÔ)yÓz×zÐzð	bÝAØ 2× :Ñ :¸;ÐTZÓ [×[ˆKßˆ{˜uŸ}Ÿ}™}ô $ E§M¡MÐ3FÈÓM�	Ü#¤G¨E¯M©M¸6À4Ó$HÈ&ÐRVÓW�	Ü$+¨E¯M©M¸<ÈÓ$NÐ!àœs 5§=¡=×#8Ñ#8Ó9¸6À4×CVÑCVÐWbÓCcØ ¤)×"7Ñ"7ð/Xà;?×;TÑ;TÓ;Vð/X�ô #&¤g¨i¸À)Ó&LÓ"M×"SÑ"SÓ"UØœs¤8×#3Ñ#3Ó4×:Ñ:Ó<¼cÄ'Ì(×JZÑJZÐ\cÔem×euÑeuÓBvÓ>w×>}Ñ>}Ó>ðZAñ #A�àÒ(Ø,7¼¸Y»Ð+H�DØ"&�Kß&Ð+<Ò+HÜKNÐO`ÓKaÐa˜ kÐ2GÑ&HØCG˜Ð?Ñ@Ø×&Ñ& t×'CÑ'CÜØ!ŸM™M×1Ñ1óä˜y›>¨4À[Ð`d×`sÑ`sð (Dó (uô vð ×=Ò=ÑLÀÑL×LÒLñ+  -‰{òHò 	6Úzò \ñ, MøÜô 	bÜ�L‰LÐAÀ4Ç9Á9ÈcÐ\`ˆL×aÒaûð	büs�   ‚A*M0Á,L&Á-M0Á97M0Â16M0Ã'L)Ã($M0ÄL,ÄM0ÄL4 Ä-L/Ä.L4 Ä;L4 ÅGL4 ÌL2ÌL4 Ì M0Ì)M0Ì,M0Ì/L4 Ì2L4 Ì4M-Ì?#M(Í"M0Í(M-Í-M0c                ó@   <€ V ^8„  d   QhRS[ RS[S[ S[3,          RR/# r–	  r=  )r   r…  s   "€r   r   r†  ä  s5   ø€ ÷ Arñ Ar¹#ð ArÁ4ÉÉSÈÅ>ð ArÐVZñ Arr   c              ƒ  óô  "  € VP                  R^4      p\        V4      ^8w  d   R# V^,          pV^,          pV P                  WV P                  V\	        4       \        R4      RR7      G Rj  x€L
 pV'       g   R# \        VP                  RR4      ;'       g    \        R4      pVR8X  dÔ   Rp	 ^ R	I	H
p
 V
! V4      p	V	'       g8   V P                  P                  VR4       V P!                  W4      G Rj  x€L
  R# VP#                  \        R4      R7      G Rj  x€L
  T P%                  TRVP&                  P(                  ;'       g    R R\*        P,                  ! \        RVR7      4       R24      G Rj  x€L
  R#  \/        V4      pRp ^ RI	Hp T! T4      pT'       dK   TP6                  '       d9   ^ Tu;8:  d   \        TP6                  4      8  d   M MTP6                  T,          pTf   RT^,            2pT P                  P                  TR4        ^ RI	Hp T! Y]4      pT'       d»   TP#                  RTR,           2R7      G Rj  x€L
  T P%                  TR\*        P,                  ! TP&                  P(                  ;'       g    R4       R\*        P,                  ! T4       R\*        P,                  ! T4       24      G Rj  x€L
  \        P=                  RY]T4       R# T P!                  Y4      G Rj  x€L
  \        P                  RT4       R#  EL°  \         d-   p\        P                  R
T P                  T4        Rp?EL”Rp?ii ; i ELd ELB ELç  \0        \2        3 d)    TP#                  \        R4      R7      G Rj  x€L 
   R# i ; i  \         d    Rp ELÀi ; i  \         d/   p\        P;                  RT P                  T4       Rp Rp?EL½Rp?ii ; i ELž EL$ Lô5i)uU   ``cl:<clarify_id>:<idx|other>`` â€” resolve a clarify prompt or flip to text capture.r¬   Nr©	  F)rY   ry	  r˜	  Úother)Úmark_awaiting_textz"[%s] mark_awaiting_text failed: %sz$platform.telegram.prompt.type_answerrO  r�  r!   rV	  z'platform.telegram.prompt.awaiting_typed)r™  rW	  z'platform.telegram.prompt.invalid_choice)Úget_pendingzchoice )Úresolve_gateway_clarifyz'[%s] resolve_gateway_clarify failed: %sr­  :Né<   Nz

<b>z:</b> z<Telegram clarify button resolved (id=%s, choice=%r, user=%s)zGTelegram clarify button: resolve_gateway_clarify returned False (id=%s))rr  r+  r“	  r  r¢   r¨   r]   r�  rŠ   Útools.clarify_gatewayr¶	  r*   r7   r-  r„  rY   rY	  rÄ  rX	  r%  r+   r®   r¯   rÚ   rÞ   rÝ   r·	  r}  r¸	  r   rç   )r“  r¹  r¾  r	  r£	  r~  Úchoice_tokenr*  rT	  Úflippedr¶	  rê  r‡  Úresolved_textr·	  r¬  r¸	  r‘	  s   &&&&              r   r‹	  Ú(TelegramAdapter._handle_clarify_callbackä  sž  é € à—
‘
˜3 Ó"ˆÜˆu‹:˜Œ?ÙØ˜1•Xˆ
Ø˜Q•xˆØ ×6Ñ6Ø�t×*Ñ*¨J¼»ÜÐEÓFÈEð 7ó S÷ Sˆ÷ ÙÜ˜uŸ™°¸dÓC×kÐkÄqÐIjÓGkˆØ˜7Ô"ð ˆGðUÝDÙ,¨ZÓ8�÷ à×#Ñ#×'Ñ'¨
°DÔ9Ø×2Ñ2°5ÓG×GÐGÙØ—,‘,¤FÐ+QÓ$R�,ÓS×SÐSØ×'Ñ'ØØ�u—}‘}×)Ñ)×/Ð/¨RÐ0ð 1Ü—l’l¤1Ð%NÐUaÔ#bÓcÐdÐdhðjók÷ kð kñ ð	Ü�lÓ#ˆCð (,ˆð	!Ý9Ù 
Ó+ˆEß˜ŸŸ˜¨1°Ö+H´c¸%¿-¹-Ó6H×+HØ %§¡¨cÕ 2�ð Ò à% c¨A¥g YÐ/ˆMØ×Ñ×Ñ 
¨DÔ1ð	ÝEÙ.¨zÓIˆH÷ Ø—,‘, d¨=¸Õ+=Ð*>Ð$?�,Ó@×@Ð@Ø×'Ñ'Ø˜œeŸlšl¨5¯=©=×+=Ñ+=×+CÐ+CÀÓDÐEÀWÌUÏ\Ê\ÐZfÓMgÐLhÐhnÔot×o{Òo{ð  }Jó  pKð  oLð  MóN÷ Nð Nä�K‰KÐVÐXbÐsö  Að ×.Ñ.¨uÓC×CÐCÜ�N‰NÐdÐfpÖqòuSøô ô UÜ—‘ÐCÀTÇYÁYÐPS×TÒTûðUúò
 HâSòkøô œIÐ&ô 	Ø—,‘,¤FÐ+TÓ$U�,ÓV×VÑVÚð	ûô ô 	!Ø ‹Mð	!ûô ô 	Ü�L‰LÐBÀDÇIÁIÈsÔSØŽHûð	úò AòNñ
 DùsV  ‚A,O8Á.LÁ/O8Á;O8ÂO8Â1L! Â?O8Ã0O8Ã7MÃ8$O8ÄMÄ-O8Å/O8Å:M!Å;O8ÆM$ ÆO8ÆN  Æ&N  Æ8$N  ÇO8ÇN  Ç0,O8ÈN4 È+O8È3O8ÉO0É=O8Ê>O8ËO3Ë1O8ÌO6ÌO8Ì!MÌ,!MÍO8ÍMÍO8ÍO8Í!O8Í$/NÎNÎNÎO8ÎNÎO8Î N1Î-O8Î0N1Î1O8Î4O-Î?#O(Ï"O8Ï(O-Ï-O8Ï3O8Ï6O8c                ó@   <€ V ^8„  d   QhRS[ RS[S[ S[3,          RR/# r–	  r=  )r   r…  s   "€r   r   r†  '  s1   ø€ ÷ Sñ SÁð SÉÉcÑSVÈhÍð SÐ\`ñ Sr   c           
   ƒ  ó´  "  € VP                  R^4      ^,          pV P                  W\        4       4      G Rj  x€L
 '       g   R# VP                  \	        RVR7      R7      G Rj  x€L
  \        VR8X  d   RMR4      pV P                  VR	\        R
RV R2R7       24      G Rj  x€L
   ^ RIHp V! 4       R,          pVP                  R4      pVP                  VRR7       VP                  V4       \        P                  RV\        VP                  RR4      4       R#  Lé L¾ L€  \          d"   p	\        P#                  RT	4        Rp	?	R# Rp	?	ii ; i5i)uE   ``update_prompt:<y|n>`` â€” forward the answer to the update process.r¬   Nz$platform.telegram.prompt.update_sent)rÄ  rO  Úyz$platform.telegram.prompt.affirm_wordz$platform.telegram.prompt.negate_wordu   â˜¤ z(platform.telegram.prompt.update_answeredrp  rœ  z.update_responsez.tmprî   )ró   z/Telegram update prompt answered '%s' by user %srZ   Úunknownz1Failed to write update response from callback: %s)rr  rƒ	  r¢   rÄ  r¨   rŠ   r`	  r¼  r�  Úwith_suffixÚ
write_textrï   r7   rç   r]   r�  r*   r   )
r“  r¹  r¾  r	  rÄ  Úwordr�  Úresponse_pathÚtmprê  s
   &&&&      r   rŒ	  Ú.TelegramAdapter._handle_update_prompt_callback'  s1  é € à—‘˜C Ó# AÕ&ˆØ×.Ñ.¨u¼-»/ÓJ×JÖJÙØ�l‰l¤Ð'MÐV\Ô ]ˆlÓ^×^Ð^Ü¸6ÀS¼=Ñ7ÐNtÓuˆØ×!Ñ! %¨4´Ð2\ÐghÐimÐhnÐnoÐepÔ0qÐ/rÐ)sÓt×tÐtð	SÝ8Ù+Ó-Ð0BÕBˆMØ×+Ñ+¨FÓ3ˆCØ�N‰N˜6¨GˆNÔ4Ø�K‰K˜Ô&Ü�K‰KÐIÈ6ÔSZÐ[`×[jÑ[jÐlpÐr{ÓS|Ö}ñ Ká^átøô ô 	SÜ�L‰LÐLÈc×RÒRûð	Süsd   ‚7E¹D#º	EÁ"EÁ&D%Á'?EÂ&D'Â'EÂ,A5D) Ä!EÄ%EÄ'EÄ)EÄ4EÅ
EÅEÅEr{  zsend-draft.shÚ	done_sendÚarchivez
archive.shÚdone_archiveÚdraftzdraft-blank.shÚ
done_draftÚspamzspam.shÚ	done_spamÚmutezmute-add.shÚemailÚ	done_mutezmute-domainÚdomainÚdone_mute_domainÚtrustztrusted-ops-add.shÚ
done_trustztrust-domainÚdone_trust_domainÚvipz
vip-add.shÚdone_vipz
vip-domainÚdone_vip_domainc                ó@   <€ V ^8„  d   QhRS[ RS[S[ S[3,          RR/# r–	  r=  )r   r…  s   "€r   r   r†  I  s1   ø€ ÷ 4nñ 4n¹sð 4nÉÉSÑRUÈXÍð 4nÐ[_ñ 4nr   c              ƒ  óD	  "  € VP                  R^4      p\        V4      ^8w  d&   VP                  \        R4      R7      G Rj  x€L
  R# V^,          V^,          reV P	                  W\        4       4      G Rj  x€L
 '       g   R# V P                  P                  V4      pV'       g(   VP                  \        RVR7      R7      G Rj  x€L
  R# Tw  r‰r«^ RIH	p V! 4       R,          R	,          V,          pVP                  4       '       gI   VP                  \        R
VR7      R7      G Rj  x€L
  \        P                  RV P                  V4       R# Rp ^ RIHp \         P"                  ! \%        V4      V.V	O5R\         P&                  P(                  R\         P&                  P*                  R\         P&                  P*                  RV! RR7      / G Rj  x€L
 p\         P,                  ! VP/                  4       ^<R7      G Rj  x€L
 w  ppVP0                  ^ 8X  d3   \3        RV
 24      pRp\        P5                  RV P                  WV4       M£VP7                  RRR7      P9                  4       pV'       d   VP;                  4       R/,          M\3        R\%        VP0                  4      R7      p\3        RVVR,          R7      p\        P                  R V P                  WVVP0                  V4        VP                  VR\@         R7      G Rj  x€L
  V'       g   R# VPB                  '       d!   VPB                  PD                  ;'       g    R'MR'p\G        VPH                  R(R4      ;'       g    \3        R)4      pV R*\3        R+VVR,7       2p\J        PL                  ! \>        4      ;_uu_ 4        VPN                  ! R0R-V/V'       d   / MR.R/B G Rj  x€L
  RRR4       R#  EL£ ELq EL$ ELÃ EL ELî  \<         d3    \3        R!TR7      p\        P                  R"T P                  YV4        EL?\>         dG   p\3        R#T\%        T4      R$7      p\        P                  R%T P                  YVTRR&7        Rp?ELŠRp?ii ; i ELv L²  + '       g   i     R# ; i5i)1z=Dispatch a gmail-triage inline-button callback (gt:verb:arg).r¬   z+platform.telegram.gmail_triage.invalid_datarO  Nz+platform.telegram.gmail_triage.unknown_verb)Úverbrœ  Úscriptszgmail-triagez-platform.telegram.gmail_triage.script_missing)Úscriptz$[%s] gmail-triage script missing: %sF)Úbuild_subprocess_envrñ   r  ÚstderrÚenvT)Ústrip_launch_profiler`  zplatform.telegram.gmail_triage.z-[%s] gmail-triage callback ok: verb=%s arg=%srî   rï   )rô   z(platform.telegram.gmail_triage.exit_code)r$  z%platform.telegram.gmail_triage.failed:NéP   N)rÝ	  ÚdetailzA[%s] gmail-triage callback failed: verb=%s arg=%s rc=%s stderr=%sz(platform.telegram.gmail_triage.timed_outz4[%s] gmail-triage callback timed out: verb=%s arg=%sz$platform.telegram.gmail_triage.error)rÝ	  r   z;[%s] gmail-triage callback exception: verb=%s arg=%s err=%sr3   r!   ry	  r˜	  ra  z*platform.telegram.gmail_triage.appended_byr 	  r+   r  r³  rQ   )(rr  r+  rÄ  r¨   rƒ	  r¢   Ú_GT_VERB_DISPATCHr  r¼  r�  r¼  r7   r   r„  Útools.environments.localrà	  r0   Úcreate_subprocess_execr   r   r  ÚPIPEr:  Úcommunicater  rŠ   rç   Údecoder  r¿  rG   r*   r¡   r%  r+   r]   r�  r%  r&  rÆ  )r“  r¹  r¾  r	  r£	  rÝ	  Úargr¬  Úscript_nameÚ
extra_argsÚsuccess_keyÚis_state_verbr�  Úscript_pathrÔ   rà	  r	  Ú_stdout_bytesÚstderr_bytesr;   Ústderr_textÚ	last_linerê  Úoriginal_textrT	  Úappendeds   &&&&                      r   rˆ	  Ú-TelegramAdapter._handle_gmail_triage_callbackI  s&  é € à—
‘
˜3 Ó"ˆÜˆu‹:˜Œ?Ø—,‘,¤FÐ+XÓ$Y�,ÓZ×ZÐZÙØ˜!•H˜e A�hˆcØ×.Ñ.¨u¼-»/ÓJ×JÖJÙØ×&Ñ&×*Ñ*¨4Ó0ˆßØ—,‘,¤FÐ+XÐ_cÔ$d�,Óe×eÐeÙØ>CÑ;ˆ Ý4Ù%Ó'¨)Õ3°nÕDÀ{ÕRˆØ×!Ñ!×#Ò#Ø—,‘,¤FÐ+ZÐcnÔ$o�,Óp×pÐpÜ�L‰LÐ?ÀÇÁÈKÔXÙØˆð	BåEÜ ×7Ò7Ü�KÓ  #ðEØ(2òEÜ:A×:LÑ:L×:TÑ:TðEÜ]d×]oÑ]o×]tÑ]tðEô ~E÷  ~Pñ  ~P÷  ~Uñ  ~UðEá(¸dÔCñE÷ EˆDô 18×0@Ò0@À×AQÑAQÓASÐ]_Ô0`×*`Ñ'ˆM˜<Ø�‰ !Ô#ÜÐ;¸K¸=ÐIÓJ�Ø�Ü—‘ÐKÈTÏYÉYÐX\Õbà*×1Ñ1°'À)Ð1ÓL×RÑRÓT�ß<G˜K×2Ñ2Ó4°RÖ8ÌQÐOyô  ADð  EI÷  ETñ  ETó  AUô  NV�	ÜÐAÈÐU^Ð_bÕUcÔd�Ü—‘ØWÐY]×YbÑYbÐdhÐos×o~Ño~ð  ALõMð �l‰l  m¤|Ð 4ˆlÓ5×5Ð5ßÙØ6;·m·m°m˜Ÿ™×+Ñ+×1Ð1¨røÈˆÜ˜uŸ™°¸dÓC×kÐkÄqÐIjÓGkˆØ#�_ B¤qÐ)UÐ]bÐiuÔ'vÐ&wÐxˆä× Ò ¤×+Õ+Ø×)Ò)Ñm¨xÐmÇ-¹BÐVdÐfjÐUkÑm×mÐm÷ ,Ñ+ò_ [ò Kò fò qòEò +aøô ô 	gÜÐ@ÀtÔLˆEÜ�L‰LÐOÐQU×QZÑQZÐ\`×fÜô 	BÜÐ<À4ÌsÐSVËxÔXˆEÜ�L‰LÐVÐX\×XaÑXaÐcgÐnqð  }AˆL÷  Bò  Bûð	Búò 	6ñ n÷ ,×+Ð+üs  ‚AR ÁO&Á4R Á8O)Á9	R Â$R Â( R ÃO,Ã	A#R Ä,O/Ä-)R ÅBO8 ÇO2Ç-O8 ÈO5ÈA	O8 ÉR É(O8 É;A9O8 Ë4R ÌRÌR ÌR Ì2R Í"R Í2AR Î3$RÏR
ÏRÏR Ï)R Ï,R Ï/R Ï2O8 Ï5O8 Ï89RÐ1R Ð4RÐ=RÐ>;Q?Ñ9R Ñ?RÒR Ò
RÒR	Ò	R c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r   r;   rã   r   rž   )r   r…  s   "€r   r   r†    s"   ø€ ÷ ñ ©sð ¹#ð Á#ñ r   c                óT   € V RV 2pVP                  R4      '       d
   VR,          pV# )z`File-not-found error for MEDIA delivery; /workspace-style paths often exist only in the sandbox.z file not found: 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.))z/workspace/z/output/z	/outputs/)rJ	  )r“  r;   rã   r   s   &&& r   Ú_missing_media_path_errorÚ)TelegramAdapter._missing_media_path_error  s;   € à�'Ð*¨4¨&Ð1ˆØ�?‰?ÐC×DÒDØðsõtˆEð ˆr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# ©r   Ú
image_pathr   r•  )r   r…  s   "€r   r   r†  ‰  s   ø€ ÷ ñ ©ð ±¹#µñ r   c                óÄ  €  \        V R4      ;_uu_ 4       pVP                  ^4      pRRR4       XP                  R4      '       d   R# TP                  R4      '       d   R# TP                  R4      '       d   TR,          R8X  d   R# TP                  R	4      '       d   R
# TP                  R4      '       d   R# R#   + '       g   i     L�; i  \         d     R# i ; i)z³Identify convertible raster formats by magic bytes.

Replacement for stdlib ``imghdr`` (removed in Python 3.13). Returns
one of ``png``/``gif``/``webp``/``bmp``/``tiff`` or None.
ræ   Ns   ‰PNG

Úpngs   RIFF:é   é   Ns   WEBPÚwebps   BMÚbmpÚtiff)s   GIF87as   GIF89a)s   II* s   MM *)rú   Úreadr'  rJ	  )rÿ	  ÚfhÚheads   &  r   Ú_sniff_raster_formatÚ$TelegramAdapter._sniff_raster_formatˆ  s¯   € ð	Ü�j $×'Ô'¨2Ø—w‘w˜r“{�÷ (ð �?‰?Ð/×0Ò0ÙØ�?‰?Ð1×2Ò2áØ�?‰?˜7×#Ò#¨¨T­
°gÔ(=ÙØ�?‰?˜5×!Ò!ÙØ�?‰?Ð3×4Ò4ÙÙ÷ (×'ûäô 	Úð	ús-   ‚C –B=¨C Â=C	ÃC ÃC ÃCÃCc                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# rþ	  r•  )r   r…  s   "€r   r   r†  ¡  s#   ø€ ÷ ]ñ ]±#ð ]¹(Á3½-ñ ]r   c           
     ó  € ^ RI p \        P                  P                  V4      p\        P                  P                  T4      ^,          P                  4       pTR9   d   R# Y0P                  8  d   R# T P                  T4      f   R#  ^ RI	H
p  TP                  T4      ;_uu_ 4       pTP                   R9   d�   TP#                  RTP$                  R4      pTP                   R8X  d   TP'                  R4      MTpTP                   R9   d)   TP)                  YˆP+                  4       R,          R7       MTP)                  T4       Tp	MTP'                  R4      p	RRR4       X	P$                  w  r«\-        Y«4      pYÀP.                  8”  dP   T P.                  T,          pT	P1                  \3        Y­,          4      \3        Y½,          4      3TP4                  4      p	TP7                  RR	R
7      w  rï\        P8                  ! T4       T	P;                  TRT P<                  RRR7       \        P?                  RT P                  TTR,          T\        P                  P                  T4      R,          4       T#   \         d     R# i ; i  \         d%    \        P                  RT P                  4        R# i ; i  + '       g   i     ELi; i  \         d-   p\        P                  RT P                  T4        Rp?R# Rp?ii ; i)a  Pre-compress a large image to progressive JPEG before upload.

Behind an HTTP proxy (e.g. tgapi.indevs.in) the PTB
media_write_timeout (~20s) is easily exceeded by raw PNGs > 1-2MB.
A progressive JPEG at ~85% quality keeps the upload well under the
timeout while remaining visually equivalent for photos / info-graphics.

Returns the path to a temporary JPEG, or None when the original can be
used as-is (already small / already JPEG / Pillow not available). The
caller is responsible for cleaning up the returned temp file.
NrË   )ÚImagez/[%s] Pillow not available for image compressionÚRGBAÚPÚRGB)ÚmaskÚtg_compress_r  ÚJPEGT)ÚqualityÚprogressiveÚoptimizeuA   [%s] Pre-compressed %s (%.1fKB â†’ %s %.1fKB) for Telegram uploadr€  z5[%s] Image compression failed, uploading original: %s)rË   rÌ   )r
  ÚLAr
  )éÿ   r
  r
  )r
  r
  r³  ) r   rö   rã   r$  r'  r÷   rø   Ú_IMG_COMPRESS_THRESHOLD_BYTESr

  ÚPILr
  r*   r7   r-  r„  rú   rF  ÚnewÚsizeÚconvertÚpasterr  r!  Ú_IMG_MAX_DIMENSIONÚresizerÚ   ÚLANCZOSr"  r#  ÚsaveÚ_IMG_JPEG_QUALITYrç   )r“  rÿ	  r   Ú	file_sizeÚextr
  ÚsrcÚ
backgroundÚlayerÚimgÚmax_wÚmax_hÚmax_dimÚscaler+  rÇ	  r  s   &&               r   Ú_compress_image_to_jpegÚ'TelegramAdapter._compress_image_to_jpeg¡  s‡  € ó 	ð	ÜŸ™Ÿ™¨
Ó3ˆIô �g‰g×Ñ˜zÓ*¨1Õ-×3Ñ3Ó5ˆð Ð#Ô#Ùð ×9Ñ9Ô9Ùð
 ×$Ñ$ ZÓ0Ò8Ùð	Ý!ð3	ð —‘˜J×'Ô'¨3Ø—8‘8Ð2Ô2ð "'§¡¨5°#·(±(¸OÓ!L�JØ36·8±8¸s´?˜CŸK™K¨Ô/È�EØ—z‘z ^Ô3Ø"×(Ñ(¨·[±[³]À2Õ5FÐ(ÕGà"×(Ñ(¨Ô/Ø$‘CàŸ+™+ eÓ,�C÷ (ð Ÿ8™8‰LˆEÜ˜%Ó'ˆGØ×0Ñ0Ô0Ø×/Ñ/°'Õ9�Ø—j‘j¤# e¥mÓ"4´c¸%½-Ó6HÐ!IÈ5Ï=É=ÓY�à×&Ñ&ØØ%ð 'ó ‰GˆBô �HŠH�RŒLà�H‰HØØØ×.Ñ.Ø Øð ô ô �K‰KØSØ—	‘	ØØ˜DÕ ØÜ—‘—‘ Ó$ tÕ+ôð ˆJøôM ô 	Úð	ûô* ô 	ä�N‰NÐLÈdÏiÉiÔXÚð	ú÷ (×'Ð'ûôT ô 	Ü�N‰NØGØ—	‘	Øôõ
 ûð	úsU   †I7 Â
J	 ÂK Â*B1J;ÅDK É7JÊJÊ	+J8Ê7J8Ê;K	Ë	K ËLË!LÌLc                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[ /# )r   r;   r%
  Ú	max_bytesr   )r   r   rÚ   )r   r…  s   "€r   r   r†     s1   ø€ ÷ Jñ J±Cð JÁCð JÑTWð JÑ\_ñ Jr   c                ó´   € \        ^VR,          4      p \        T;'       g    ^ 4      R,          R R2pRV RV RV R2#   \        \        3 d    Rp L!i ; i)	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.]r  )r!  rÚ   rÝ   rÞ   )r“  r;   r%
  r2
  Úlimit_mbÚ	size_texts   &&&&  r   Ú_telegram_media_too_large_noteÚ.TelegramAdapter._telegram_media_too_large_note   s{   € Ü�q˜)¨Õ4Ó5ˆð	'Ü˜yŸ~˜~¨AÓ.°+Õ>¸sÐCÀ3ÐGˆIð ˜E˜7Ð"6°y°kÀÈxÈjð  YIð  Jð  	Jøô œ:Ð&ô 	'Ø&ŠIð	'ús   • A ÁAÁAc                ó&   <€ V ^8„  d   QhRS[ RS[/# rÙ   )r   rÚ   )r   r…  s   "€r   r   r†  	  s   ø€ ÷ ñ ™Cð ¡Cñ r   c                ó^   €  \        T ;'       g    ^ 4      #   \        \        3 d     ^ # i ; i©r÷  )rÚ   rÝ   rÞ   r"  s   &r   Ú_int_or_zeroÚTelegramAdapter._int_or_zero  s.   € ð	Ü�u—z�z “?Ð"øÜœ:Ð&ô 	Úð	ús   ‚ � —,«,c          	      óR   <€ V ^8„  d   QhRS[ RS[RS[S[S[S[,          3,          /# )r   rˆ  r;   r   )r   r   rü  rB   r   )r   r…  s   "€r   r   r†    s8   ø€ ÷ Rñ R±3ð R¹sð RÁuÉTÑS[Ñ\_ÕS`ÐM`ÕGañ Rr   c                óÀ   € \        \        V RR4      ;'       g    R4      pV P                  \        VRR4      4      pV^ 8:  g   WC8:  d   R# RV P                  W$V4      3# )z<Validate Telegram media size before downloading into memory.r  r%
  NFr´  r   )rÚ   r]   r;
  r6
  )r“  rˆ  r;   r2
  r
  s   &&&  r   Ú_telegram_media_size_allowedÚ,TelegramAdapter._telegram_media_size_allowed  sc   € äœ Ð&6Ð8HÓI×]Ð]ÐM]Ó^ˆ	Ø× Ñ ¤¨°¸dÓ!CÓDˆØ�1Œ9˜Ô)ØÐØ�d×9Ñ9¸%ÀyÓQÐQÐQr   c                ó¤   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[S[S[,          S[S[ S[3,          3,          /# )r   r±  rò  rO  r   )r   r   r  r   rü  rÚ   )r   r…  s   "€r   r   r†    sg   ø€ ÷ nñ nÙðnÙ&.©s¥mðnÙ?GÉÉSÑRUÈXÍÕ?WðnÙ\aÑbjÑknÕboÑquÑvyÑ{~Ðv~ÕqÐbõ  ]Añnr   c                óê   € V P                  W#V P                  R7      pV P                  WP                  V4      W4V P                  R7      pVR\	        V4      RVR\
        /VCV P                  V4      C3# )zHReturn ``(reply_to_id, base_kwargs)`` shared by every native media send.r  r	  r±  rù  rŽ  )rö  rÅ  r   rÓ  r½   Ú_MEDIA_SEND_READ_TIMEOUTrU  )r“  r±  rò  rO  r	  r  s   &&&&  r   Ú_media_send_kwargsÚ"TelegramAdapter._media_send_kwargs  s¡   € ð ×8Ñ8¸Ð[_×[nÑ[nÐ8ÓoˆØ×4Ñ4Ø×-Ñ-¨hÓ7¸Ðrv÷  sFñ  sFð 5ó GˆàØÔ1°'Ó:Ð<QÐS^ØÔ4ðnà8EðnàIM×IbÑIbÐckÓIlðnð nð 	nr   c                ó�   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[S[S[S[ 3,          ,          RS[RS[S[ ,          RS[ RS[ /# )	r   rG  r±  rò  rO  rI  rJ  Úmedia_kwargsr   )r   r   r   r  )r   r…  s   "€r   r   r†  !  sq   ø€ ÷ nñ nÙðnÙ%(ðnÙ4<¹SµMðnÙMUÑVZÑ[^Ñ`cÐ[cÕVdÕMeðnÙtwðná™c•]ðná;>ðnáCFñnr   c           	   ‹  óx   "  € V P                  W#V4      w  r‰V P                  V/ V	CVCWHWVR7      G Rj  x€L
 #  L5i)zJSend one native media payload with thread routing + DM-topic anchor retry.©rJ  N)rD
  rQ  )
r“  rG  r±  rò  rO  rI  rJ  rG
  r	  r¥   s
   &&&&&&&,  r   Ú_send_mediaÚTelegramAdapter._send_media!  sW   é € ð #×5Ñ5°gÈÓRÑˆØ×@Ñ@ØÐ/˜Ð/ ,Ð/°Èð Aó n÷ nð 	nñ nùó   ‚1:³8´:c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# )r   r7  r   ©r   r   )r   r…  s   "€r   r   r†  *  s#   ø€ ÷ 3ñ 3™x©�}ð 3±¹#µñ 3r   c                ó(   € V '       d
   V R ,          # R# )ºNi   NNrQ   )r7  s   &r   Ú_caption_1024ÚTelegramAdapter._caption_1024)  s   € ç!(ˆw�u�~Ð2¨dÐ2r   c              ƒ  ó&  a"  € . pV'       d_    V P                  V4      p\        V4      R8:  d"   VP                  V\        P                  34       TP                  TR,          R34       MVP                  R4       Rp	V F?  w  r« V P                  V P                  P                  W#VRV3R lSW«VR	7
      G Rj  x€L
 u # 	  T	;'       g    \#        R4      h  \
         d&    \        P                  RT P                  RR7        L·i ; i LP  \
         dv   p\        T4      P                  4       pTeS   R
T9   g   RT9   dE   \        P                  RT P                  \        T4      4       Tp	SP!                  ^ 4        Rp?EK  h Rp?ii ; i5i)z™sendVoice with caption variants: MarkdownV2 when it fits 1024 chars, plain fallback when the
Bot API rejects the entities; anything else is a real error.r€  zF[%s] voice caption MarkdownV2 formatting failed; sending plain captionTr3   rP
  NÚvoicec                  ó&   <€ S P                  ^ 4      # r:
  ©r*  ©Ú
audio_files   €r   r¾  Ú4TelegramAdapter._send_voice_bubble.<locals>.<lambda>C  s   ø€ Ðdn×dsÑdsÐtuÔdvr   )rJ  rT
  r7  rQ  r  rR  Úentitz:[%s] voice caption MarkdownV2 rejected, retrying plain: %sz3Telegram send_voice failed for all caption variants©NN)rˆ  rš   rd  r}   rS  r*   r7   r8   r„  rJ
  rÁ  Ú
send_voicer   rø   r-  r,   r*  r  )r“  rX
  r±  rò  rO  r7  Úduration_secsÚ_caption_variantsÚ_formatted_captionÚ_last_parse_errorÚ	_cap_textÚ_cap_parse_modeÚ
_cap_errorrõ  s   &f&&&&&       r   Ú_send_voice_bubbleÚ"TelegramAdapter._send_voice_bubble-  s’  øé € ð *,ÐßðAØ%)×%8Ñ%8¸Ó%AÐ"ÜÐ/Ó0°DÔ8Ø%×,Ñ,Ð.@Ä)×BWÑBWÐ-XÔYð ×$Ñ$ g¨e¥n°dÐ%;Õ<à×$Ñ$ \Ô2Ø15ÐÛ*;Ñ&ˆIðØ!×-Ñ-Ø—I‘I×(Ñ(¨'¸XÀwÔ\vØ$¨iÐ^kð .ó m÷ mò mñ +<ð  ×fÐf¤<Ð0eÓ#fÐføô) ô AÜ—‘ÐeÐgk×gpÑgpÐ{�ö  AðAúñmøô ô Ü˜*“o×+Ñ+Ó-�Ø"Ò.°G¸s´NÀgÐQTÄnÜ—N‘NØTÐVZ×V_ÑV_Ôa|ð  ~Hó  bIôJà(2Ð%Ø—O‘O AÔ&ÞØûðüsr   ƒF�AC Á5FÂ4DÂ;DÂ<DÂ?FÃFÃ-D	ÄFÄD	Ä	FÄDÄFÄA(F	ÆFÆF	Æ	FÆFc                ó„   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  Ú
audio_pathr7  rò  rO  r   r)  )r   r…  s   "€r   r   r†  P  sT   ø€ ÷ +6ñ +6Ùð+6Ù(+ð+6Ù6>¹sµmð+6ÙV^Ñ_bÕVcð+6á™4¡¡S �>Õ*ð+6á@Jñ+6r   c              ‹  óX	  <a"  € V P                   '       g   \        RRR7      # Rp \        P                  P	                  V4      '       gh   \        RV P                  RV4      R7      V'       dC   \        P                  ! \        4      ;_uu_ 4        \        P                  ! V4       RRR4       # # VP                  R4      '       d§   \        P                  P                  V4      ^,          P                  4       R9  dn   ^ RIHp \        P                   ! W‚4      G Rj  x€L
 pV'       d   TpM>\"        P%                  RV P&                  \        P                  P)                  V4      4       \        P                   ! \*        V4      G Rj  x€L
 p	\-        VR	4      ;_uu_ 4       o\        P                  P                  V4      ^,          P                  4       p
V
R9   d   V P/                  SWWSV	4      G Rj  x€L
 pMÀV
R9   dJ   V P1                  V P                   P2                  WVR
V3R lSV P5                  V4      V	R7	      G Rj  x€L
 pMpV P7                  WW4VR7      G Rj  x€L
 uuRRR4       V'       dC   \        P                  ! \        4      ;_uu_ 4        \        P                  ! V4       RRR4       # # RRR4       \        R\9        XP:                  4      R7      V'       dC   \        P                  ! \        4      ;_uu_ 4        \        P                  ! V4       RRR4       # #   + '       g   i     # ; i EL# ELº ELQ EL Lé  + '       g   i     # ; i  + '       g   i     L®; i  + '       g   i     # ; i  \<         d¯   p\"        P?                  RT P&                  \A        T4      RR7       \B        ST `‰  YY4TR7      G Rj  x€L 
 u Rp?T'       dV   \        P                  ! \        4      ;_uu_ 4        \        P                  ! T4       RRR4       #   + '       g   i     # ; i# Rp?ii ; i  T'       dV   \        P                  ! \        4      ;_uu_ 4        \        P                  ! T4       RRR4       i   + '       g   i     i ; ii ; i5i)z<Send audio as a native Telegram voice message or audio file.Frz  rÕ  NÚAudioÚis_voice)Útranscode_to_ogg_opusuf   [%s] voice transcode unavailable for %s â€” sending original format (install ffmpeg for voice bubbles)ræ   Úaudioc                  ó&   <€ S P                  ^ 4      # r:
  rV
  rW
  s   €r   r¾  Ú,TelegramAdapter.send_voice.<locals>.<lambda>m  s   ø€ Ðhr×hwÑhwÐxyÔhzr   )rJ  rl
  r7  r  )r±  Ú	file_pathr7  rò  rO  Tr1  zJ[%s] Failed to send Telegram voice/audio, falling back to base adapter: %sr3   rä  )ú.oggú.opus>   rp
  rq
  >   ú.m4aú.mp3)#rÁ  r�   rö   rã   r¼  rû	  r%  r&  r'  Úunlinkr  r÷   rø   Úgateway.platforms.baserk
  r0   râ  r7   r-  r„  Úbasenamer
  rú   rd
  rJ
  Ú
send_audiorQ
  Úsend_documentr   r¡  r*   r   r,   rµ  r\
  )r“  r±  rg
  r7  rò  rO  r¥   Ú_transcoded_voice_pathrk
  Ú_duration_secsr&
  r7  r  rX
  r  s   &&&&&&,      @€r   r\
  ÚTelegramAdapter.send_voiceP  so  ùé € ð �y�yˆyÜ e°?ÔCÐCØ04Ðð$	6Ü—7‘7—>‘> *×-Ò-Ü!¨%°t×7UÑ7UÐV]Ð_iÓ7jÔk÷@ &Ü×(Ò(¬×1Õ1Ü—I’IÐ4Ô5÷ 2Ð1ð &ð; �z‰z˜*×%Ò%¬"¯'©'×*:Ñ*:¸:Ó*FÀqÕ*I×*OÑ*OÓ*QÐYjÔ*jÝHÜ/6×/@Ò/@ÐAVÓ/c×)cÐ&ß)Ø!7‘Jä—N‘Nð AØŸ	™	¤2§7¡7×#3Ñ#3°JÓ#?ôAô $+×#4Ò#4Ô5RÐT^Ó#_×_ˆNÜ�j $×'Ô'¨:Ü—g‘g×&Ñ& zÓ2°1Õ5×;Ñ;Ó=�ØÐ+Ô+Ø $× 7Ñ 7¸
ÀGÐW_ÐjxÓ y×y‘CØÐ,Ô,Ø $× 0Ñ 0ØŸ	™	×,Ñ,¨gÀÈ7Ô`zØ(°$×2DÑ2DÀWÓ2MÐXfð !1ó !h÷ h‘Cð "&×!3Ñ!3Ø 'ÀwÐltð "4ó "v÷ v÷ (Ñ'÷$ &Ü×(Ò(¬×1Õ1Ü—I’IÐ4Ô5÷ 2Ð1ð &÷% (ô  d´s¸3¿>¹>Ó7JÔK÷ &Ü×(Ò(¬×1Õ1Ü—I’IÐ4Ô5÷ 2Ð1ð &ß1×1úò9 *dò `ò zòhñv÷ 2×1ú÷' (×'ú÷& 2×1ûô ô 	gÜ�L‰LØ\Ð^b×^gÑ^gÜ+¨AÓ.¸ð ô ?ô ™Ñ+¨GÀÐ]eÐ+Óf×fÐfÔfç%Ü×(Ò(¬×1Õ1Ü—I’IÐ4Ô5÷ 2×1×1Ð1úð &ûð	gû÷ &Ü×(Ò(¬×1Õ1Ü—I’IÐ4Ô5÷ 2×1×1Ð1úð &üsl  „"R*§AN Á(*R*ÂL2Â)
R*Â3N Ã
AN Ä"MÄ#N Ä/AN ÆMÆN Æ'AM&Ç:MÇ;AM&É
MÉM&É'MÉ(M&É+
N É5*R*ÊMÊ6
R*Ë 'N Ë'R*Ë/"R*ÌM9Ì(
R*Ì2MÌ=R*ÍN ÍN ÍM&ÍM&ÍM&ÍM#ÍR*Í&M6	Í1N Í9N	ÎR*ÎQÎAQ ÏOÏQ ÏQÏQ Ï"*R*ÐP,Ð#	R*Ð,P<Ð7	R*Ñ QÑQ Ñ+R'Ñ3R	Ò
	R'ÒR#Ò	R'Ò'R*c          
      ón   <€ V ^8„  d   QhRS[ RS[S[,          RS[S[S[ S[3,          ,          RS[RS[/# )r   r±  ÚimagesrO  Úhuman_delayr   )r   rT  rü  r   r  r   rA   r�   )r   r…  s   "€r   r   r†  }  sX   ø€ ÷ Kgñ KgÙðKgÙ$(©¥KðKgÙ;CÁDÉÉcÈÅNÕ;SðKgÙinðKgñ zDñKgr   c              ƒ  ó^  <a a!"  € S P                   '       g   \        RRR7      # V'       g   \        RRR7      #  ^ RIHp T 3R lpT Uu. uF  q‡! T^ ,          4      '       g   K  TNK  	  p	pT Uu. uF  q‡! T^ ,          4      '       d   K  TNK  	  p
pRpT	'       d&   \        S"S `%  YY4R	7      G Rj  x€L
 pTP                  pT
'       g   \        Y»'       d   RR7      # R
R7      # ^ RIHp ^
p\        ^ \        T
4      T4       Uu. uF  qúYÿT,            NK  	  pp\        T4       EFå  w  ppT^ 8”  d&   T^ 8”  d   \         P"                  ! T4      G Rj  x€L
  . p. o!. p T Fç  w  ppTpTP%                  R4      '       d¡   T! TR,          4      p\&        P(                  P+                  T4      '       g$   \
        P                  RS P                  T4       Kv  S P-                  T4      pT'       d   TP/                  T4       Tp\1        TR4      pS!P/                  T4       TP/                  T! TS P3                  T4      R7      4       Ké  	  T'       g“    S! F>  p\4        P6                  ! \        4      ;_uu_ 4        TP9                  4        RRR4       K@  	  T FD  p\4        P6                  ! \:        4      ;_uu_ 4        \&        P<                  ! T4       RRR4       KF  	  EKÁ  \
        P?                  RS P                  \        T4      T^,           \        T4      4       S PA                  TRT4      w  ppR T!3R llpS PC                  S P                   PD                  / TCRT/CTTRTR7      G Rj  x€L
  RpS! F>  p\4        P6                  ! \        4      ;_uu_ 4        TP9                  4        RRR4       K@  	  T FD  p\4        P6                  ! \:        4      ;_uu_ 4        \&        P<                  ! T4       RRR4       KF  	  EKè  	  \        Y»'       d   RR7      # R
R7      #   \         dE   p\
        P                  RS P                  T4       \        S"S `%  YY44      G Rj  x€L 
 u Rp?# Rp?ii ; iu upi u upi  ELÕu upi  EL;  + '       g   i     EKL  ; i  + '       g   i     EK  ; i ELF  \         d{   p\
        P                  RS P                  T^,           \        T4      \G        T4      RR7       \        S"S `%  TTY4R	7      G Rj  x€L 
 p T;'       g    T P                  p Rp?ELÂRp?ii ; i  + '       g   i     EKÚ  ; i  + '       g   i     EK«  ; i  S! FR  p\4        P6                  ! \        4      ;_uu_ 4        TP9                  4        RRR4       K@    + '       g   i     KQ  ; i	  T FX  p\4        P6                  ! \:        4      ;_uu_ 4        \&        P<                  ! T4       RRR4       KF    + '       g   i     KW  ; i	  i ; i5i)zÅSend images as Telegram albums (``send_media_group``, 10 per chunk). Animated GIFs can't join a
media group (need ``send_animation``) so they go via the base per-image path, as does a failed chunk.Frz  rÕ  zno images to send)ÚInputMediaPhotozD[%s] InputMediaPhoto unavailable, falling back to per-image send: %sNc                 ób   <€ V P                  R 4      '       * ;'       d    SP                  V 4      # )úfile://)rJ	  Ú_is_animation_url)Úurlr“  s   &€r   r¾  Ú6TelegramAdapter.send_multiple_images.<locals>.<lambda>Š  s(   ø€  #§.¡.°Ó";Ô;×[Ð[À×@VÑ@VÐWZÓ@[Ð[r   )r~
  zall images failed to send)Úunquoter‚
  :é   NNz.[%s] Skipping missing image in media group: %sræ   )Úmediar7  z5[%s] Sending media group of %d photo(s) (chunk %d/%d)c                ó   € V ^8„  d   QhRR/# rd   rQ   )r   s   "r   r   Ú:TelegramAdapter.send_multiple_images.<locals>.__annotate__²  s   € ÷ 'ñ '¨Tñ 'r   c                  óº   <€ S F?  p \         P                  ! \        4      ;_uu_ 4        V P                  ^ 4       RRR4       KA  	  R#   + '       g   i     KV  ; i)r÷  N)r%  r&  r*   r*  )r
  Úopened_filess    €r   Ú_reset_opened_filesÚATelegramAdapter.send_multiple_images.<locals>._reset_opened_files²  s;   ø€ Û*˜Ü'×0Ò0´×;Õ;ØŸG™G AœJ÷ <Ñ;ó +ß;×;Ð;ús   ©A	Á	Arˆ
  zmedia grouprI
  TzI[%s] send_media_group failed (chunk %d/%d), falling back to per-image: %sr3   )$rÁ  r�   r<   r€
  r*   r7   r-  r„  rµ  Úsend_multiple_imagesrÔ   rå  r†
  r{  r+  r}  r0   rC  rJ	  rö   rã   r¼  r/
  rd  rú   rQ
  r%  r&  r#  r'  r(  rç   rD
  rQ  Úsend_media_groupr,   )#r“  r±  r}
  rO  r~
  r€
  rê  Úis_animr*
  Ú
animationsÚphotosr�  Úanim_resultÚ_unquoteÚCHUNKr   r�  Ú	chunk_idxrO  rˆ
  Ú
temp_pathsÚ	image_urlÚalt_textrˆ  Ú
local_pathÚ
compressedr
  rÇ	  r	  rH  r�
  r  rý  rŒ
  r  s#   f&&&&                            @€r   r�
  Ú$TelegramAdapter.send_multiple_images}  s  úé € ð �y�yˆyÜ e°?ÔCÐCßÜ eÐ3FÔGÐGð	^Ý0ô \ˆÙ%+Ó?¡V˜c¨w°s¸1µv¯—c�c¡Vˆ
Ð?Ù!'Ó?¡˜#¨w°s¸1µv¯—#�#¡ˆÐ?Øˆ	ßÜ %¡Ñ <¸WÐRZÐ <Ó t×tˆKØ#×+Ñ+ˆIßÜ i¾y°tÔjÐjÐNiÔjÐjÝ4ØˆÜ/4°Q¼¸F»ÀUÔ/KÓLÑ/K¨!˜˜u�9Ó%Ñ/KˆÐLÜ )¨&× 1ÑˆI�uØ˜QŒ 9¨q¤=Ü—m’m KÓ0×0Ð0Ø!ˆEØ&(ˆLØ$&ˆJð+'Û+0Ñ'�I˜xØ"+�FØ ×+Ñ+¨I×6Ò6Ù%-¨i¸­mÓ%<˜
Ü!Ÿw™wŸ~™~¨j×9Ò9Ü"ŸN™NÐ+[Ð]a×]fÑ]fÐhrÔsÙ$ð &*×%AÑ%AÀ*Ó%M˜
ß%Ø&×-Ñ-¨jÔ9Ø)3˜JÜ!% j°$Ó!7˜Ø$×+Ñ+¨FÔ3Ø—L‘L¡°vÀt×GYÑGYÐZbÓGcÔ!dÖeñ ,1÷  Øó( '�BÜ#×,Ò,¬Y×7Õ7ØŸ™œ
÷ 8Ñ7ñ 'ó &�CÜ#×,Ò,¬W×5Õ5ÜŸ	š	 #œ÷ 6Ñ5ô &ô- —‘ÐSÐUY×U^ÑU^Ô`cÐdiÓ`jÐluÐxyÕlyÔ{~ð  @Fó  |Gô  HØ+/×+BÑ+BÀ7ÈDÐRZÓ+[Ñ(�˜[÷'ð 'ð
 ×AÑAØ—I‘I×.Ñ.Ð0O°;Ð0OÀÈÑ0OÐQYÐ[fØ!Ð/Bð Bó D÷ Dð Dð !�	ó '�BÜ#×,Ò,¬Y×7Õ7ØŸ™œ
÷ 8Ñ7ñ 'ó &�CÜ#×,Ò,¬W×5Õ5ÜŸ	š	 #œ÷ 6Ñ5ô &ñ_ !2ôd  )¾9°4ÔfÐfÐJeÔfÐføôC ô 	^Ü�N‰NÐaÐcg×clÑclÐnqÔrÜ™Ñ5°gÀxÓ]×]Ð]Õ]ûð	^üò @ùÚ?ò uùò Mò 1÷V 8×7Ñ7ú÷ 6×5Ñ5úòDøô ô :Ü—‘Ø_Ðae×ajÑajØ •M¤3 v£;Ô0KÈAÓ0NÐY]ð ô _ô "'¡Ñ!=¸gÀuÈhÐ!=Ó!p×pÐp�Ø%×9Ð9¨×)9Ñ)9–	ûð:ú÷ 8×7Ñ7ú÷ 6×5Ñ5ûó	 '�BÜ#×,Ò,¬Y×7Õ7ØŸ™œ
÷ 8×7×7Ò7úñ 'ó &�CÜ#×,Ò,¬W×5Õ5ÜŸ	š	 #œ÷ 6×5×5Ò5úò &üsŸ  …'X-­X-»P, Á
X-ÁQ>Á&Q>Á,X-Á2RÂRÂ X-Â3RÂ4X-Ã;X-ÄRÄ;X-ÅRÅ
X-Å!AS Æ6;S Ç2A#S É'X-É>R	Ê3X-ËR(	ËX-Ë(BS Í7R=Í8S Í>'X-Î%U	Î63X-Ï)U	Ð ,X-Ð,Q;Ð74Q6Ñ+Q.Ñ,Q6Ñ0Q;Ñ1X-Ñ6Q;Ñ;X-ÒX-ÒR%Ò
X-Ò(R:Ò3
X-Ò=S Ó UÓAU ÔT!ÔU Ô-U Ô:U2Õ UÕU2ÕUÕ
X-ÕU/Õ(
X-Õ2(X*ÖV5Ö+
X*Ö5W× 2X*×2XØ	
X*ØX$ØX*Ø*X-c                ó„   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  rÿ	  r7  rò  rO  r   r)  )r   r…  s   "€r   r   r†  Ê  sT   ø€ ÷ %*ñ %*Ùð%*Ù(+ð%*Ù6>¹sµmð%*ÙV^Ñ_bÕVcð%*á™4¡¡S �>Õ*ð%*á@Jñ%*r   c           
   ‹  ó(  <a aaaaaa	a
"  € S P                  S4      pT;'       g    So	V'       dK   \        P                  P                  \        P                  P	                  S4      4      ^ ,          R,           M\        P                  P	                  S4      o
R VV	VVV
VVVV 3	R llp S P                  RS	SSSRVV 3R lV4      G Rj  x€L
 V'       dC   \        P                  ! \        4      ;_uu_ 4        \        P                  ! V4       RRR4       # #  LN  + '       g   i     # ; i  T'       dV   \        P                  ! \        4      ;_uu_ 4        \        P                  ! T4       RRR4       i   + '       g   i     i ; ii ; i5i)z5Send a local image file natively as a Telegram photo.rË   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r  r   )r*   r�   )r   s   "r   r   Ú5TelegramAdapter.send_image_file.<locals>.__annotate__Ô  s   € ÷ 	Eñ 	E¤9ð 	E´ñ 	Er   c           	   “   óÖ  <	"  € \        V 4      pR V9   g   RV9   d#   \        P                  RSP                  S4       M,\        P	                  RSP                  \        V 4      RR7        SP                  SSSSS
S	R7      G Rj  x€L
 #  L  \         dO   p\        P                  RSP                  TRR7       \        \        S`/  SSSS
S	R	7      G Rj  x€L 
 u Rp?# Rp?ii ; i5i)
Ú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: %sTr3   )r±  ro
  r7  Ú	file_namerò  rO  NzV[%s] Failed to send Telegram local image as document, falling back to base adapter: %srä  )r   r7   rç   r„  r-  r,   rx
  r*   r   rµ  rz  Úsend_image_file)r  Ú	error_strÚdoc_errr  Úactual_pathr7  r±  Údoc_namerÿ	  rO  rò  r“  s   &  €€€€€€€€€r   Ú_photo_failedÚ6TelegramAdapter.send_image_file.<locals>._photo_failedÔ  s
  øé € Ü˜A›ˆIà)¨YÔ6Ð:TÐXaÔ:aÜ—‘ÐiÐko×ktÑktð  wAõ  Bä—‘ØeÐgk×gpÑgpÜ/°Ó2¸Tð ô CðEØ!×/Ñ/Ø#¨{ÀGÐW_Ø%°ð 0ó :÷ :ð :ñ :øô ô EÜ—‘ØlØ—I‘I˜w°ð ô 7ô #¤?°DÑIÈ'ÐS]Ð_fÐhpð  |DÐIó  E÷  Eð  Eõ  Eûð	EüsT   ƒA(C)Á,B ÂBÂB Â
C)ÂB ÂC&Â>C!ÃCÃC!ÃC&ÃC)Ã!C&Ã&C)r
  r´   c                 ó.   <€ R V RSP                  S4      /# ©r´   r7  ©rQ
  )Úfr7  r“  s   &€€r   r¾  Ú1TelegramAdapter.send_image_file.<locals>.<lambda>ë  s   ø€ ˜7 A y°$×2DÑ2DÀWÓ2MÑNr   N)
r/
  rö   rã   r÷   rv
  Ú_send_local_filer%  r&  r'  r(  )r“  r±  rÿ	  r7  rò  rO  r¥   rœ
  r«
  r©
  rª
  r  s   ffffff,  @@€r   r¦
  ÚTelegramAdapter.send_image_fileÊ  s  ÿøé € ð ×1Ñ1°*Ó=ˆ
Ø ×.Ð. JˆßQ[”2—7‘7×#Ñ#¤B§G¡G×$4Ñ$4°ZÓ$@ÓAÀ!ÕDÀvÖMÔac×ahÑah×aqÑaqÐr|Óa}ˆ÷	E÷ 	Eð 	Eð(	*Ø×.Ñ.Ø˜ g¨x¸À7ÝNÐP]ó_÷ _÷ Ü×(Ò(¬×1Õ1Ü—I’I˜jÔ)÷ 2Ð1ð ñ	_÷
 2×1û÷ Ü×(Ò(¬×1Õ1Ü—I’I˜jÔ)÷ 2×1×1Ð1úð üse   ‹%F±A:FÂ, D0 ÃDÃD0 Ã*FÃ:DÄ
FÄD0 ÄD-Ä(FÄ0+FÅE;	Å2	FÅ;FÆ	FÆFc                ó2   <€ V ^8„  d   QhRS[ RS[ RS[ RS[/# )r   r;   rã   Ú	media_keyr   )r   r�   )r   r…  s   "€r   r   r†  ñ  s-   ø€ ÷ %ñ %Ùð%Ù #ð%ÙMPð%á	ñ%r   c	           	   ƒ  óD  a"  € V P                   '       g   \        RRR7      #  \        P                  P	                  V4      '       g   \        RV P                  W4      R7      # \        VR4      ;_uu_ 4       oV P                  ! \        V P                   RV 24      W4WV3RV3R l/V! S4      B G Rj  x€L
 p	RRR4       \        R	\        X	P                  4      R
7      #  L,  + '       g   i     L2; i  \         d   p
T! T
4      G Rj  x€L 
 u Rp
?
# Rp
?
ii ; i5i)z¯Shared shell for native local-file sends: existence check, open, send with routing, then
``await on_error(exc)`` on any failure. ``build_kwargs(f)`` supplies the media kwargs.Frz  rÕ  ræ   Úsend_rJ  c                  ó&   <€ S P                  ^ 4      # r:
  rV
  )r°
  s   €r   r¾  Ú2TelegramAdapter._send_local_file.<locals>.<lambda>þ  s   ø€ ¨¯©¨q¬	r   NTr1  )rÁ  r�   rö   rã   r¼  rû	  rú   rJ
  r]   r   r¡  r*   )r“  r;   rã   r±  rò  rO  rµ
  Úbuild_kwargsÚon_errorr7  r  r°
  s   &&&&&&&&&  @r   r²
  Ú TelegramAdapter._send_local_fileñ  sñ   øé € ð
 �y�yˆyÜ e°?ÔCÐCð		%Ü—7‘7—>‘> $×'Ò'Ü!¨%°t×7UÑ7UÐV[Ó7bÔcÐcÜ�d˜D×!Ô! QØ ×,Ò,Ü˜DŸI™I¨¨y¨kÐ':Ó;¸WÐPXñFä 1ðFá5AÀ!³_ñF÷ F�÷ "ô  d´s¸3¿>¹>Ó7JÔKÐKñF÷ "×!ûô
 ô 	%Ù! !›×$Ð$Õ$ûð	%üs|   ƒ D ¤$C7 Á	C7 Á$D Á%C7 Á9<C$Â5C"Â6C$Â:'C7 Ã!D Ã"C$Ã$C4	Ã/C7 Ã7DÄDÄDÄDÄDÄD ÄDÄD c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   rµ
  r  r   )r   r*   r�   )r   r…  s   "€r   r   r†    s"   ø€ ÷ ñ ©#ð ±)ð É*ñ r   c              ƒ  óx   "  € \         P                  R V P                  V\        V4      4       VG Rj  x€L
 #  L5i)z[%s] Failed to send %s: %sN)r7   r-  r„  r,   )r“  rµ
  r  rý  s   &&&&r   Ú
_warn_thenÚTelegramAdapter._warn_then  s-   é € Ü�‰Ð3°T·Y±YÀ	ÔKfÐghÓKiÔjØ�~Ð‰~ùrL
  c                óš   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  ro
  r7  r¥
  rò  rO  r   r)  )r   r…  s   "€r   r   r†    si   ø€ ÷ 
gñ 
gÙð
gÙ'*ð
gÙ5=¹cµ]ð
gÙV^Ñ_bÕVcð
gá™3•-ð
gá2:¹4ÁÁSÀ½>Õ2Jð
gá`jñ
gr   c              ‹  ó‚   <a aaaaaa"  € S P                  RSSSSRVVVV 3R lVVVVVVVV 3R l4      G Rj  x€L
 #  L5i)z<Send a document/file natively as a Telegram file attachment.rþ   Údocumentc                 ó€   <€ R T RS;'       g     \         P                  P                  S4      RSP                  S4      /# )rÃ
  Úfilenamer7  )rö   rã   rv
  rQ
  )r°
  r7  r¥
  ro
  r“  s   &€€€€r   r¾  Ú/TelegramAdapter.send_document.<locals>.<lambda>  sC   ø€ �z 1 j°)×2ZÐ2Z¼r¿w¹w×?OÑ?OÐPYÓ?ZÐ\eÐgk×gyÑgyð  {Bó  hCñ  Dr   c                 óX   <€ SP                  R V \        \        S`  SSSSSSR7      4      # )rÃ
  rä  )r¿
  rµ  rz  rx
  )	r  r  r7  r±  r¥
  ro
  rO  rò  r“  s	   &€€€€€€€€r   r¾  rÆ
    s3   ø€ �d—o‘oØ˜AœuÜ# Tñ  à '¨°G¸YÈÐ[c�-Ódôfr   N)r²
  )	r“  r±  ro
  r7  r¥
  rò  rO  r¥   r  s	   fffffff,€r   rx
  ÚTelegramAdapter.send_document  sH   ÿé € ð ×*Ñ*Ø�I˜w¨°(¸J÷ D÷fó fóg÷ gð 	gñ gùs   Š.?¸=¹?c                ó„   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  Ú
video_pathr7  rò  rO  r   r)  )r   r…  s   "€r   r   r†    sT   ø€ ÷  *ñ  *Ùð *Ù(+ð *Ù6>¹sµmð *ÙV^Ñ_bÕVcð *á™4¡¡S �>Õ*ð *á@Jñ *r   c              ‹  óÎ  <a aaaaaaa	"  € \         P                  ! \        S4      G Rj  x€L
 oS'       d4   \         P                  ! \        SSP	                  R4      4      G Rj  x€L
 MRo	 VVV V	3R lpS P                  RSSSSRVV
VVVVV V3R l4      G Rj  x€L
 S	'       dC   \        P                  ! \        4      ;_uu_ 4        \        P                  ! S	4       RRR4       # #  L¿ L† LR  + '       g   i     # ; i  S	'       dV   \        P                  ! \        4      ;_uu_ 4        \        P                  ! S	4       RRR4       i   + '       g   i     i ; ii ; i5i)a‹  Send a video natively as a Telegram video message.

Real geometry and a JPEG thumbnail ride along explicitly. Telegram only runs its own video
processing for uploads under roughly 10 MB; larger files come back as an unprocessed
``320x320`` video with ``duration=0`` and no thumbnail, which clients then draw as a square
tile whatever the true aspect ratio (portrait reels and 16:9 clips alike).
Nr  c                 óP   <€ R V RSP                  S4      /SCpS'       d   SVR&   V# )Úvideor7  Ú	thumbnailr¯
  )r°
  rå  r7  r  r“  Ú
thumb_paths   & €€€€r   rº
  Ú0TelegramAdapter.send_video.<locals>.build_kwargs#  s6   ø€ Ø" A y°$×2DÑ2DÀWÓ2MÐZÐQYÐZ�ßð ,6�G˜KÑ(Ø�r   ÚVideorÍ
  c                 óV   <€ SP                  R V \        \        S`  SSSSSR7      4      # )rÍ
  rä  )r¿
  rµ  rz  Ú
send_video)r  r  r7  r±  rO  rò  r“  rÊ
  s   &€€€€€€€r   r¾  Ú,TelegramAdapter.send_video.<locals>.<lambda>-  s7   ø€ ˜$Ÿ/™/Ø˜Q¤¤o°tÑ GÈÐQ[Ð]dÐfnð  zBÐ Gó  !Côr   )r0   râ  r  r,  r  r²
  r%  r&  r'  rö   r(  )r“  r±  rÊ
  r7  rò  rO  r¥   rº
  r  rÏ
  r  s   ffffff, @@€r   rÓ
  ÚTelegramAdapter.send_video  s
  ÿøé € ô !×*Ò*Ô+@À*ÓM×Mˆ÷ ô ×#Ò#Ô$9¸:ÀxÇ|Á|ÐT^ÓG_Ó`×`Ð`Ø!ð 	ð	*÷ð ð ×.Ñ.Ø˜ W¨h¸À'È<÷ò ó÷ ÷ Ü×(Ò(¬×1Õ1Ü—I’I˜jÔ)÷ 2Ð1ð ñ) Ná`ñ÷ 2×1û÷ Ü×(Ò(¬×1Õ1Ü—I’I˜jÔ)÷ 2×1×1Ð1úð üs€   ‹E%ªC*«E%·.E%Á%C,Á&E%Á-.D ÂC.ÂD Â*E%Ã	C0Ã E%Ã,E%Ã.D Ã0D Ã;E%Ä+E"Ä.E	Å	E"ÅEÅ	E"Å"E%c                ó„   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  r™
  r7  rò  rO  r   r)  )r   r…  s   "€r   r   r†  5  s\   ø€ ÷ jñ jÙðjÙ'*ðjÙ5=¹cµ]ðjÙU]Ñ^aÕUbðjá™4¡¡S �>Õ*ðjá6@ñjr   c              ƒ  ó¾  <"  € V P                   '       g   \        RRR7      # ^ RIHp V! V4      '       g;   \        P                  RV P                  4       \        SV `!  WW4VR7      G Rj  x€L
 # V P                  V4      p V P                  V P                   P                  WVRW'R	7      G Rj  x€L
 p\        R
\        VP                  4      R7      #  Lh L&  \         Edv   p	\        P                  RT P                  \        T	4      R
R7        ^ RIHp
 ^ RIHp T! RRT
./R7      ;_uu_4       GRj  x€L 
 pTP'                  T4      G Rj  x€L 
 pTP)                  4        TP*                  pRRR4      GRj  x€L 
  M  + GRj  x€L 
 '       g   i     M; iT P                  T P                   P                  YTRXTR	7      G Rj  x€L 
 p\        R
\        TP                  4      R7      u Rp	?	#   \         dN   p\        P-                  RT P                  TR
R7       \        ST `!  YY4TR7      G Rj  x€L 
 u Rp?u Rp	?	# Rp?ii ; iRp	?	ii ; i5i)ub   Send a URL image as a Telegram photo: URL send (<5MB) â†’ download+upload (â‰¤10MB) â†’ base text.Frz  rÕ  )Úis_safe_urlz/[%s] Blocked unsafe image URL (SSRF protection)rä  Nz	URL photor®
  Tr1  z8[%s] URL-based send_photo failed, trying file upload: %sr3   )Ússrf_redirect_guard)Úcreate_ssrf_safe_async_clientrm  Úresponse)r?   Úevent_hookszuploaded photoz+[%s] File upload send_photo also failed: %s)rÁ  r�   Útools.url_safetyrØ
  r7   r-  r„  rµ  Ú
send_imagerQ
  rJ
  Ú
send_photor   r¡  r*   r,   ru
  rÙ
  rÚ
  r  Úraise_for_statusr›  r   )r“  r±  r™
  r7  rò  rO  rØ
  Úphoto_captionr7  r  rÙ
  rÚ
  ÚclientÚrespÚ
image_dataÚe2r  s   &&&&&&          €r   rÞ
  ÚTelegramAdapter.send_image5  s  øé € ð �y�yˆyÜ e°?ÔCÐCÝ0Ù˜9×%Ò%Ü�N‰NÐLÈdÏiÉiÔXÜ™Ñ+¨GÀÐ\dÐ+Óe×eÐeØ×*Ñ*¨7Ó3ˆð	jØ×(Ñ(Ø—	‘	×$Ñ$ g¸À;ÐV_ð )ó x÷ xˆCä d´s¸3¿>¹>Ó7JÔKÐKñ fñxøô õ 	jÜ�N‰NØJÈDÏIÉIÔWrÐstÓWuð  AEð ô FðjÝFÝJÙ8ÀÐT^ÐatÐ`uÐSv×w×wÖwð  |BØ!'§¡¨IÓ!6×6Ð6�DØ×)Ñ)Ô+Ø!%§¡�J÷ x×w×w×w×wÒwúð !×,Ñ,Ø—I‘I×(Ñ(¨'¸XÐGWÐ_ið  tAð -ó B÷ Bð B�ä!¨$¼3¸s¿~¹~Ó;NÔOÕOøÜô jÜ—‘ÐJÈDÏIÉIÐWYÐdh�ÔiÜ"™WÑ/°ÀGÐ`hÐ/Ói×iÐi×iÒiûðjþð	jüsô   ƒ3I·5IÁ,CÁ-IÂ-C Â0CÂ1#C ÃIÃC ÃIÃ%,IÄ%G:Ä7D:
Ä8G:Ä<FÅE
Å!FÅ3G:Å>FÅ?G:ÆFÆFÆ
FÆFÆ6G:ÇGÇ$G:Ç4IÇ5IÇ:IÈ8IÈ=I È>IÉIÉIÉIÉIÉIÉIÉIÉIc                ó„   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   r±  Úanimation_urlr7  rò  rO  r   r)  )r   r…  s   "€r   r   r†  U  s\   ø€ ÷ gñ gÙðgÙ+.ðgÙ9AÁ#½ðgÙYaÑbeÕYfðgá™4¡¡S �>Õ*ðgá6@ñgr   c              ƒ  óÔ  "  € V P                   '       g   \        RRR7      #  V P                  V P                   P                  WVRVV P	                  V4      R7      G Rj  x€L
 p\        R\        VP                  4      R7      #  L$  \         dT   p\        P                  R	T P                  \        T4      RR
7       T P                  YY4TR7      G Rj  x€L 
 u Rp?# Rp?ii ; i5i)zJSend an animated GIF natively as a Telegram animation (auto-plays inline).Frz  rÕ  Ú	animation)rê
  r7  NTr1  zA[%s] Failed to send Telegram animation, falling back to photo: %sr3   rä  )rÁ  r�   rJ
  Úsend_animationrQ
  r   r¡  r*   r7   r   r„  r,   rÞ
  )r“  r±  rè
  r7  rò  rO  r7  r  s   &&&&&&  r   rë
  ÚTelegramAdapter.send_animationU  sÖ   é € ð �y�yˆyÜ e°?ÔCÐCð		gØ×(Ñ(Ø—	‘	×(Ñ(¨'¸XÀ{Ð^kØ×*Ñ*¨7Ó3ð )ó 5÷ 5ˆCô  d´s¸3¿>¹>Ó7JÔKÐKñ5øô ô 	gÜ�L‰LØSÐUY×U^ÑU^Ü+¨AÓ.¸ð ô ?ð Ÿ™¨ÀÐ]e˜Óf×fÐfÕfûð		güsS   ‚ C(£=B Á BÁ!#B ÂC(ÂB ÂC%ÂAC ÃCÃC ÃC%ÃC(Ã C%Ã%C(c                ó&   <€ V ^8„  d   QhRS[ RS[/# ré  r  )r   r…  s   "€r   r   r†  g  s   ø€ ÷ 
_ñ 
_©	ð 
_±dñ 
_r   c                óÀ  a€ \        V RR4      e   R# \        V RR4      ;'       g    \        V RR4      p\        V\        4      '       d   VR8X  g   VR8¼  d   R# \        V 4      P	                  4       o\
        ;QJ d    V3R lR
 4       F  '       g   K   RM	  R	M! V3R lR
 4       4      '       d   R# \        V \        \        \        \        P                  34      # )z:Return True for Telegram typing errors worth cooling down.rÕ   NTr•  r$  i­  rD  c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5irP   rQ   )rR   r<  r+   s   & €r   rT   Ú=TelegramAdapter._is_transient_typing_error.<locals>.<genexpr>o  s   øé € ÐtÑ,s &˜Ž~Ó,sùr?  F)ztoo many requestsz
rate limitr  r?   Útemporar)
r]   r5  rÚ   r   rø   r¯  r'  rG   ÚConnectionErrorr0   )rê  r•  r+   s   & @r   Ú_is_transient_typing_errorÚ*TelegramAdapter._is_transient_typing_errorf  s¨   ø€ ô �3˜ tÓ,Ò8ÙÜ˜c =°$Ó7×UÐU¼7À3ÈÐPTÓ;UˆÜ�k¤3×'Ò'¨[¸CÔ-?À;ÐRUÔCUÙÜ�3‹x�~‰~Óˆß‹3ÔtÑ,sÓt�3�3Š3ÔtÑ,sÓt×tÒtÙÜ˜#¤¬´Ì×H\ÑH\Ð]Ó^Ð^r   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   r±  rê  r   N)r   r*   )r   r…  s   "€r   r   r†  s  s'   ø€ ÷ 	}ñ 	}©sð 	}¹ð 	}Àtñ 	}r   c                óx  € \        V R4      '       g   / V n        \        VRR4      p Ve   \        V4      MV P                  p\        P                  ! 4       P                  4       \        R\        VR4      4      ,           V P                  \        V4      &   R#   \
        \        3 d    T P                  p Lui ; i)zJSuppress Telegram typing refreshes for this chat after transient failures.rÍ  rÕ   NrÐ   ro  )r)  rÍ  r]   rA   rÏ  rÝ   rÞ   r0   rÑ  r}  r!  r‹  r   )r“  r±  rê  rÕ   r3  s   &&&  r   Ú_record_typing_cooldownÚ'TelegramAdapter._record_typing_cooldowns  s¤   € ä�tÐ>×?Ò?Ø35ˆDÔ0Ü˜c =°$Ó7ˆð	;Ø*5Ò*A”E˜+Ô&Àt×GmÑGmˆEô >E×=UÒ=UÓ=W×=\Ñ=\Ó=^ÔadÐehÔjmÐnsÐuzÓj{Óa|Õ=|ˆ×,Ñ,¬S°«\Ó:øô œ:Ð&ô 	;Ø×:Ñ:ŠEð	;ús   ¨B ÂB9Â8B9c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   r±  r   r'  )r   r…  s   "€r   r   r†  ~  s   ø€ ÷ 
ñ 
©3ð 
±4ñ 
r   c                ó8  € \        V R 4      '       g   / V n        RV n        V P                  P                  \	        V4      4      pVf   R# \
        P                  ! 4       P                  4       V8  d   R# V P                  P                  \	        V4      R4       R# )rÍ  rm  NFT)	r)  rÍ  rÏ  r  r   r0   rÑ  r}  rY   )r“  r±  Úuntils   && r   Ú_typing_in_cooldownÚ#TelegramAdapter._typing_in_cooldown~  s|   € Ü�tÐ>×?Ò?Ø35ˆDÔ0Ø59ˆDÔ2Ø×4Ñ4×8Ñ8¼¸W»ÓFˆØŠ=ÙÜ×#Ò#Ó%×*Ñ*Ó,¨uÔ4ÙØ×,Ñ,×0Ñ0´°W³¸tÔDÙr   c                ó    <€ V ^8„  d   QhRS[ /# )r   r±  rw  )r   r…  s   "€r   r   r†  �  s   ø€ ÷ )ñ )©Sñ )r   c           	    óÖ  "  € \        \        V4      4      pV P                  P                  R/ 4      pV P                  P                  R/ 4      p\        P
                  ! 4       pVP                  V4      VJ d   R5x € R# VP                  V\        P                  ! 4       4      pT;_uu_4       GRj  x€L
  WTV&    R5x € VP                  VR4       \        VRR4      '       g   VP                  VR4       RRR4      GRj  x€L
  R#  LW  TP                  TR4       \        TRR4      '       g   TP                  TR4       i i ; i LE  + GRj  x€L 
 '       g   i     R# ; i5i)u  FIFO per-chat gate around outgoing API calls, reentrant within one asyncio task (media paths
nest: send_voice â†’ send_document, and ``super().send_*`` fallbacks reach ``send()``; a plain
``asyncio.Lock`` re-acquired by its holder would wedge that chat's sends for good).Ú_telegram_chat_send_locksÚ_telegram_chat_send_lock_ownersNÚ_waiters)
r   r½   rÇ  r¦  r0   r„  r  rú  rY   r]   )r“  r±  r¤   ÚlocksÚownersr.   rØ  s   &&     r   rM  ÚTelegramAdapter._chat_send_lock�  s  é € ô
 Ô,¨WÓ5Ó6ˆØ)-¯©×)AÑ)AÐB]Ð_aÓ)bˆØ*.¯-©-×*BÑ*BÐCdÐfhÓ*iˆÜ×#Ò#Ó%ˆØ�:‰:�c‹?˜dÓ"ÜÙØ×Ñ ¤W§\¢\£^Ó4ˆß—4’4Ø�3‰Kð)Üà—
‘
˜3 Ô%Ü˜t Z°×6Ò6Ø—I‘I˜c 4Ô(÷ —4“4øð
 —
‘
˜3 Ô%Ü˜t Z°×6Ò6Ø—I‘I˜c 4Õ(ð 7ú÷ —4—4“4üsf   ‚B1E)Â3DÂ4E)Â7EÂ=DÃ7EÃ9E)ÄE
ÄE)Ä:EÅEÅ
E)ÅE&	ÅEÅ
E&	ÅE&	Å 	E)c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r±  rÒ   r   )r   rA   r�   )r   r…  s   "€r   r   r†  ¥  s"   ø€ ÷ 'ñ '±3ð '¹eð 'É
ñ 'r   c           	     ó  € V P                   P                  R/ 4      p\        P                  ! 4       P	                  4       \        R\        \        V4      R4      4      ,           V\        \        V4      4      &   \        V4      # )a#  A send refused with ``retry_after=wait`` arms a per-chat window during which ``send()`` fails
closed locally (same ``flood_control:<s>`` result, so ledger recognition and redelivery timing are
unchanged) instead of firing more requests into a penalty Telegram lengthens while it is hammered.Ú_telegram_send_cooldown_untilrÐ   ro  )rÇ  r¦  r0   rÑ  r}  r!  r‹  rA   r   r½   rÖ   )r“  r±  rÒ   rü
  s   &&& r   r^  Ú+TelegramAdapter._record_send_flood_cooldown¥  sl   € ð #'§-¡-×":Ñ":Ð;ZÐ\^Ó"_ˆÜ:A×:RÒ:RÓ:T×:YÑ:YÓ:[Ô^aÐbeÔgjÔkpÐquÓkvÐx}Óg~Ó^Õ:ˆŒcÔ,¨WÓ5Ó6Ñ7Ü  Ó&Ð&r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# rú
  )r   r   rA   )r   r…  s   "€r   r   r†  ­  s   ø€ ÷ ñ ±cð ¹hÁu½oñ r   c                ó  € V P                   P                  R/ 4      p\        \        V4      4      pVP	                  V4      pVf   R# V\
        P                  ! 4       P                  4       ,
          pV^ 8”  d   V# VP                  VR4       R# )zLSeconds left in this chat's flood window, or ``None`` when sends may go out.r	  N©	rÇ  r¦  r   r½   r  r0   rÑ  r}  rY   )r“  r±  rü
  r¤   ÚdeadlineÚ	remainings   &&    r   r„  Ú.TelegramAdapter._send_flood_cooldown_remaining­  sz   € à"&§-¡-×":Ñ":Ð;ZÐ\^Ó"_ˆÜÔ,¨WÓ5Ó6ˆØ—9‘9˜S“>ˆØÒÙØœw×7Ò7Ó9×>Ñ>Ó@Õ@ˆ	Ø�qŒ=ØÐØ�	‰	�#�tÔÙr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rú
  )r   rA   )r   r…  s   "€r   r   r†  ¿  s   ø€ ÷ ñ ±Sð ¹Uñ r   c                ó  € V P                   P                  R/ 4      p\        \        V4      4      pVP	                  V4      pVf   R# V\
        P                  ! 4       P                  4       ,
          pV^ 8:  d   VP                  VR4       R# V# )zQSeconds until this chat's shared send+edit slot is open again (0 = may fire now).Ú"_telegram_chat_outbound_slot_untilNr¦  r  )r“  r±  Ú
slot_untilr¤   r  r  s   &&    r   r…  Ú-TelegramAdapter._chat_outbound_slot_remaining¿  s{   € à'+§}¡}×'?Ñ'?Ð@dÐfhÓ'iˆ
ÜÔ,¨WÓ5Ó6ˆØ—>‘> #Ó&ˆØÒÙØœw×7Ò7Ó9×>Ñ>Ó@Õ@ˆ	Ø˜Œ>Ø�N‰N˜3 Ô%ÙØÐr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r±  r   Nrw  )r   r…  s   "€r   r   r†  Ì  s   ø€ ÷ Bñ B±ð B¸ñ Br   c                óò   € V P                   P                  R/ 4      p\        V R\        4      p\        P
                  ! 4       P                  4       \        RV4      ,           V\        \        V4      4      &   R# )zEArm/re-arm this chat's slot after an actual send/edit API call fires.r  Ú!_telegram_chat_outbound_slot_secsr¦  N)
rÇ  r¦  r]   Ú#_TELEGRAM_CHAT_OUTBOUND_BUDGET_SECSr0   rÑ  r}  r!  r   r½   )r“  r±  r  Úbudgets   &&  r   r†  Ú(TelegramAdapter._hold_chat_outbound_slotÌ  s`   € à'+§}¡}×'?Ñ'?Ð@dÐfhÓ'iˆ
Ü˜ÐBÔDgÓhˆä×$Ò$Ó&×+Ñ+Ó-´°C¸Ó0@Õ@ð 	”3Ô1°'Ó:Ó;Ó<r   c                óP   <€ V ^8„  d   QhRS[ RS[S[S[ S[3,          ,          RR/# rg  r  )r   r…  s   "€r   r   r†  Ó  s5   ø€ ÷ Hñ H©ð H¹ÁÁcÉ3ÀhÅÕ8Pð HÐ\`ñ Hr   c              ƒ  ó²  a a"  € S P                   '       d   S P                  S4      '       d   R# RpRpR VV 3R llp S P                  V4      pS P                  S P	                  V4      4      pV! VR7      G Rj  x€L
  R#  L  \
         dÅ   pT'       d]   TeY    T! 4       G Rj  x€L 
   Rp?R#   \
         d4   pS P                  T4      '       d   S P                  ST4        Rp?M1Rp?ii ; iS P                  T4      '       d   S P                  ST4       \        P                  RS P                  \        T4      RR7        Rp?R# Rp?ii ; i5i)	zSend typing indicator.NFc                ó   € V ^8„  d   QhRR/# rd   rQ   )r   s   "r   r   Ú1TelegramAdapter.send_typing.<locals>.__annotate__Ú  s   € ÷ 	Iñ 	I 4ñ 	Ir   c               ›   óÀ   <"  € SP                   P                  ! RR \        S4      RR/V B G Rj  x€L
  SP                  P	                  \        S4      R4       R#  L+5i)r±  ÚactionÚtypingNrQ   )rÁ  Úsend_chat_actionr½   rÍ  rY   r   )Úkwr±  r“  s   ,€€r   Ú_actionÚ,TelegramAdapter.send_typing.<locals>._actionÚ  sT   øé € Ø—)‘)×,Ò,ÑpÔ5OÐPWÓ5XÐpÐaiÐpÐmoÑp×pÐpØ×0Ñ0×4Ñ4´S¸³\À4ÖHñ qùs   ƒ-A°A±,A)r—  z1[%s] Failed to send Telegram typing indicator: %sTr3   )rÁ  rý
  rå  r  rÓ  r*   ró
  r÷
  r7   r8   r„  r,   )r“  r±  rO  Ú_is_dm_topicr—  r%  r  Úfallback_excs   ff&     r   rm  ÚTelegramAdapter.send_typingÓ  s.  ùé € à�y�yˆy˜D×4Ñ4°W×=Ò=ÙØ"ˆØ+/Ð÷	Iñ 	Ið	HØ×2Ñ2°8Ó<ˆLØ $× BÑ BÀ4×C[ÑC[Ð\dÓCeÓ fÐÙÐ,=Ô>×>Ô>øÜô 	H÷ Ð 1Ò =ðLÙ!›)—O‘OÝøÜ ô LØ×6Ñ6°|×DÒDØ×4Ñ4°W¸lÔKÿøðLúð ×0Ñ0°×3Ò3Ø×,Ñ,¨W°aÔ8Ü�L‰LÐLÈdÏiÉiÔYtÐuvÓYwð  CGˆL÷  Hò  Hûð	Hüs�   „)E®E¿=B Á<BÁ=B ÂEÂB ÂEÂEÂ
B3Â'B*Â(B3Â-EÂ3C1Â>)C,Ã'EÃ,C1Ã1EÄ>EÅ	EÅEÅEc                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[3,          /# rú
  r=  )r   r…  s   "€r   r   r†  ï  s'   ø€ ÷ Iñ I©3ð I±4¹¹S¸µ>ñ Ir   c              ƒ  óì  "  € V P                   '       g   RRRR/#  V P                   P                  \        V4      4      G Rj  x€L
 pRpVP                  \        P
                  8X  d   RpMWVP                  \        P                  8X  d   VP                  '       d   RMRpM!VP                  \        P                  8X  d   RpRVP                  ;'       g     VP                  ;'       g    \        V4      RVR	VP                  R
\        VR
R4      /#  LÏ  \         dR   p\        P!                  RT P"                  T\%        T4      RR7       R\        T4      RRR\        T4      /u Rp?# Rp?ii ; i5i)z&Get information about a Telegram chat.r„  ÚUnknownr'   r[  Nrf  r^  rÆ  r“  rY  Fz0[%s] Failed to get Telegram chat info for %s: %sTr3   r   )rÁ  Úget_chatr½   r'   r~   ÚGROUPÚ
SUPERGROUPrY  ÚCHANNELr–  r”  r   r“  r]   r*   r7   r   r„  r,   )r“  r±  r‘  rX  r  s   &&   r   Úget_chat_infoÚTelegramAdapter.get_chat_infoï  s;  é € à�y�yˆyØ˜I v¨tÐ4Ð4ð	IØŸ™×+Ñ+Ô,FÀwÓ,OÓP×PˆDØˆIØ�y‰yœHŸN™NÔ*Ø#‘	Ø—‘œh×1Ñ1Ô1Ø'+§}§} }™G¸'‘	Ø—‘œh×.Ñ.Ô.Ø%�	à˜Ÿ
™
×DÐD d§n¡n×DÐD¼¸G»ÀfÈiÐYcÐei×erÑerØœG D¨*°eÓ<ð>ð >ñ Qøô ô 	IÜ�L‰LÐKÈTÏYÉYÐX_Ôa|ØóbØ!ð ô #àœC ›L¨&°$¸ÄÀQÃÐHÕHûð	IüsZ   ‚E4œ'D ÁDÁAD Â9D ÃD Ã+'D ÄE4ÄD ÄE1Ä AE,Å&E1Å'E4Å,E1Å1E4c                ó&   <€ V ^8„  d   QhRS[ RS[ /# rš  rž   )r   r…  s   "€r   r   r†    s   ø€ ÷ c$ñ c$¡cð c$©cñ c$r   c                óf  aaa€ V'       g   V# / o^ .oR VV3R lloR V3R llp\        V4      pV3R lp\        P                  ! RVV4      p\        P                  ! RV3R lV4      pV3R	 lp\        P                  ! R
WS4      pV3R lp\        P                  ! RWc\        P                  R7      p\        P                  ! RV! RR4      V4      p\        P                  ! RV! RR4      V4      p\        P                  ! RV! RR4      V4      p\        P                  ! RV! RR4      V4      pV3R lp\        P                  ! RWs\        P                  R7      p\	        V4      p\        \        SP                  4       4      4       F  pVP                  VSV,          4      pK  	  . p	\        \        P                  ! RV4      4       FQ  w  r«V
^,          ^8X  d   V	P                  V4       K&  V	P                  \        P                  ! RV3R lV4      4       KS  	  RP                  V	4      # )z·Convert standard markdown to Telegram MarkdownV2: code is stashed behind placeholders first (never
modified), markdown constructs become MarkdownV2 syntax, everything else is escaped.c                ó0   € V ^8„  d   QhR\         R\         /# rÙ   rž   )r   s   "r   r   Ú4TelegramAdapter.format_message.<locals>.__annotate__  s   € ÷ 	ñ 	”sð 	œsñ 	r   c                óV   <€ RS^ ,           R2pS^ ;;,          ^,          uu&   V SV&   V# )z@Stash *value* behind a placeholder token that survives escaping.z PHÚ rQ   )rH   r¤   ÚcounterÚplaceholderss   & €€r   Ú_phÚ+TelegramAdapter.format_message.<locals>._ph  s1   ø€ à˜7 1�:˜, dÐ+ˆCØ�A�J˜!�O‹JØ %ˆL˜ÑØˆJr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úopen_r#  rž   )r   s   "r   r   r6    s   € ÷ 	Nñ 	NœCð 	N¬ñ 	Nr   c                 ó   <a a€ VVV 3R  l# )c                 óP   <€ S! S \        V P                  ^4      4       S 24      # )r°  )rP  rf  )r7  r;  r#  r>  s   &€€€r   r¾  ÚBTelegramAdapter.format_message.<locals>._ph_wrap.<locals>.<lambda>  s%   ø€ ™S E 7¬<¸¿¹À»
Ó+CÐ*DÀUÀGÐ!LÔMr   rQ   )r>  r#  r;  s   ff€r   Ú_ph_wrapÚ0TelegramAdapter.format_message.<locals>._ph_wrap  s	   ú€ ÞMÐMr   c                 ó  <€ V P                  ^4      pV P                  ^4      pV P                  ^4      pV P                  ^4      pVP                  RR4      P                  RR4      pVS! W#,           V,           4      ,           # )r°  Ú\ú\\r)	  z\`©rf  rï   )r7  r  ÚopeningÚbodyÚclosingr;  s   &    €r   Ú_protect_fencedÚ7TelegramAdapter.format_message.<locals>._protect_fenced*  sk   ø€ Ø—W‘W˜Q“ZˆFØ—g‘g˜a“jˆGØ—7‘7˜1“:ˆDØ—g‘g˜a“jˆGØ—<‘<  fÓ-×5Ñ5°c¸5ÓAˆDØ™C ¥°Õ 8Ó9Õ9Ð9r   zF(?m)^((?:(?!```)[^\n])*)(```[^`\n]*\n)([\s\S]*?)(^[ \t]*```)[ \t]*\r?$z	(`[^`]+`)c                 óR   <€ S! V P                  ^ 4      P                  RR4      4      # )r÷  rE  rF  rG  )r7  r;  s   &€r   r¾  Ú0TelegramAdapter.format_message.<locals>.<lambda><  s   ø€ ‘c˜!Ÿ'™' !›*×,Ñ,¨T°6Ó:Ô;r   c                 ó´   <€ V P                  ^4      P                  RR4      P                  RR4      pS! R\        V P                  ^4      4       RV R24      # )r   rE  rF  rE   z\)Ú[ú]()rf  rï   rP  )r7  r„
  r;  s   & €r   Ú_convert_linkÚ5TelegramAdapter.format_message.<locals>._convert_linkB  sR   ø€ Ø—'‘'˜!“*×$Ñ$ T¨6Ó2×:Ñ:¸3ÀÓFˆCÙ˜œ<¨¯©°«
Ó3Ð4°B°s°e¸1Ð=Ó>Ð>r   z-\[([^\]]+)\]\(([^()]*(?:\([^()]*\)[^()]*)*)\)c                 ó˜   <€ \         P                  ! R RV P                  ^4      P                  4       4      pS! R\	        V4       R24      # )ú\*\*(.+?)\*\*rS  rp  )rU  rN  rf  r  rP  )r7  Úinnerr;  s   & €r   Ú_convert_headerÚ7TelegramAdapter.format_message.<locals>._convert_headerH  sA   ø€ Ü—F’FÐ+¨U°A·G±G¸A³J×4DÑ4DÓ4FÓGˆEÙ˜œ<¨Ó.Ð/¨qÐ1Ó2Ð2r   z^#{1,6}\s+(.+)$)ÚflagsrU  rp  z\*([^*\n]+)\*rj  z	~~(.+?)~~Ú~z\|\|(.+?)\|\|ú||c           	      ó  <€ V P                  ^4      V P                  ^4      r!VP                  R4      '       d2   VP                  R4      '       d   S! V R\        VRR 4       R24      # S! V R\        V4       24      # )r°  z**r[  Ú Néþÿÿÿ)rf  rJ	  r3  rP  )r7  r  r›  r;  s   &  €r   Ú_convert_blockquoteÚ;TelegramAdapter.format_message.<locals>._convert_blockquoteT  s{   ø€ ØŸg™g a›j¨!¯'©'°!«*�GØ× Ñ  ×&Ò&¨7×+;Ñ+;¸D×+AÒ+AÙ˜f˜X Q¤|°G¸C¸R°LÓ'AÐ&BÀ"ÐEÓFÐFÙ˜&˜ ¤<°Ó#8Ð"9Ð:Ó;Ð;r   z^((?:\*\*)?>{1,3}) (.+)$z(```[\s\S]*?```|`[^`]+`)z[(){}]c                 ó,   € \         P                  W4      # rP   )rz  Ú_escape_bare_bracket)r7  Ú_segs   &&r   r¾  rN  f  s   € Ì/×JnÑJnÐopÔJwr   r!   )Ú_wrap_markdown_tablesrU  rN  Ú	MULTILINErP  ÚreversedrT  r°  rï   r}  rr  rd  rh  )r“  r›  rB  r+   rK  rR  rW  r_  r¤   Ú_safe_partsrM	  rc  r;  r9  r:  s   &&          @@@r   rˆ  ÚTelegramAdapter.format_message  sÝ  ú€ ÷ ØˆNØˆØ�#ˆ÷	ñ 	÷	Nð 	Nô
 % WÓ-ˆõ$	:ô �vŠvØUØØó
ˆô �vŠvØÜ;Øó
ˆõ	?ô �vŠvÐFÈÓ\ˆõ	3ô �vŠvÐ(¨/ÄrÇ|Á|ÔTˆô �vŠvÐ&©°°cÓ(:¸DÓAˆÜ�vŠvÐ&©°°cÓ(:¸DÓAˆÜ�vŠv�l¡H¨S°#Ó$6¸Ó=ˆÜ�vŠvÐ&©°°tÓ(<¸dÓCˆõ	<ô �vŠvÐ1Ð3FÔTV×T`ÑT`Ôaˆä˜DÓ!ˆäœD ×!2Ñ!2Ó!4Ó5Ö6ˆCØ—<‘<  \°#Õ%6Ó7ŠDñ 7ð ˆÜ#¤B§H¢HÐ-HÈ$Ó$OÖP‰JˆDØ�a�x˜1Œ}Ø×"Ñ" 4Ö(à×"Ñ"¤2§6¢6¨)ÀDÓ5wÐy}Ó#~Öñ	 Qð
 �w‰w�{Ó#Ð#r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   Úsegr   rž   )r   r…  s   "€r   r   r†  j  s   ø€ ÷ ñ ¡Sð ©Sñ r   c                ó(  € V P                  4       pV P                  ^ 4      pV^ 8”  d   W^,
          ,          R8X  d   V# VR8X  d   V^ 8”  d   W^,
          ,          R8X  d   V# VR8X  d¢   VRV pRV9   g   RV9   d�   ^ p\        V^,
          \        VR,
          R	4      R	4       Fc  pW,          R8X  d<   V^,          pV^ 8  d*   V^ 8”  d   W^,
          ,          R8X  d   Vu #  RV,           # KK  W,          R8X  g   KZ  V^,          pKe  	  RV,           # )
zVEscape a bare ( ) { } unless it is already escaped or delimits a ``[text](url)`` link.rE  Ú(Ú]rE   Nz](httprQ  r{  r³  )re  rf  r{  r!  )r7  rj  rò  Úchr~  ÚdepthÚjs   &&     r   rb  Ú$TelegramAdapter._escape_bare_bracketi  s  € ð �G‰G‹IˆØ�W‰W�Q‹ZˆØˆqŒ5�S˜Q�•Z 4Ô'ØˆIØ�Œ9˜˜Qœ 3¨1¥u¥:°Ô#4ØˆIØ�Œ9Ø˜˜!�WˆFØ˜6Ô! T¨V¤^Ø�Ü˜q 1�u¤c¨!¨d­(°BÓ&7¸Ö<�AØ•v ”}Ø �
˜Ø  1œ9Ø  1œu¨°­U­°sÔ):Ø')¢	Ø!ð �b�yÐñ %ð � 3žØ �
šñ =ð �b�yÐr   c          
      ó8   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ RS[/# )r   r¤   Úenv_namerr  Úfallback_keysr   r'  )r   r…  s   "€r   r   r†  ƒ  s9   ø€ ÷ 
Mñ 
M™sð 
M©cð 
M¹Cð 
MÑQTð 
MÑY]ñ 
Mr   c                ó<  € \        V P                  P                  WR4      pV F.  pVe   K	  V P                  P                  P                  V4      pK0  	  Vf   Tp\	        V\
        4      '       d   V# \        V4      P                  4       P                  4       R9   # )ue   Boolean gate: scoped ``env_name`` â†’ ``config.extra[key]`` (then ``fallback_keys``) â†’ ``default``.N>   r  r‹  r�  r‚  )	Ú_extra_or_secretrš  r·  r  r5  rB   r   r  rø   )r“  r¤   rs  rr  rt  rZ  Úalts   &&&&*  r   Ú_extra_boolÚTelegramAdapter._extra_boolƒ  s†   € ä% d§k¡k×&7Ñ&7¸ÈÓMˆ
Û ˆCØÔ!Ø!Ÿ[™[×.Ñ.×2Ñ2°3Ó7’
ñ !ð ÒØ ˆJÜ�j¤$×'Ò'ØÐÜ�:‹×$Ñ$Ó&×,Ñ,Ó.Ð2LÑLÐLr   c                ó<   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          /# )r   r¤   rs  r   )r   rX   )r   r…  s   "€r   r   r†  �  s+   ø€ ÷ Nñ N¡#ð N±ð N¹¹S½ñ Nr   c                óÐ  € \        V P                  P                  WRRR7      p\        V4      p\	        V\
        4      '       dK   V Uu0 uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       kK?  	  up# \        V4      P                  R4       Uu0 uF*  qDP                  4       '       g   K  VP                  4       kK,  	  up# u upi u upi )uN   Comma/list allowlist: scoped ``env_name`` â†’ ``config.extra[key]`` â†’ empty.r!   F©Úblank_is_unsetro  )	rv  rš  r·  Ú_decode_json_list_literalr5  rT  r   r  rr  )r“  r¤   rs  rŒ  Úparts   &&&  r   Ú_extra_str_setÚTelegramAdapter._extra_str_set�  sŸ   € ä˜tŸ{™{×0Ñ0°#ÀÐTYÔZˆÜ'¨Ó,ˆÜ�cœ4× Ò Ù25ÓK±#¨$¼¸T»¿¹×9JÔ%”C˜“I—O‘OÖ%±#ÑKÐKÜ),¨S«¯©¸Ô)<ÓMÑ)< Ç
Á
Ç”�—
‘
–Ñ)<ÑMÐMùò LùÚMs   Á	!CÁ/CÂ+C#ÃC#c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  —  s   ø€ ÷ Xñ X©4ñ Xr   c                ó(   € V P                  RRR4      # )zBReturn whether group chats should require an explicit bot trigger.Úrequire_mentionÚTELEGRAM_REQUIRE_MENTIONrŽ  ©rx  r’  s   &r   Ú_telegram_require_mentionÚ)TelegramAdapter._telegram_require_mention—  s   € à×ÑÐ 1Ð3MÈwÓWÐWr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  ›  s   ø€ ÷ 1ñ 1¹dñ 1r   c                ó*   € V P                  RRRR4      # )zdStore skipped unmentioned group messages as context (observe chatter, dispatch only when addressed).Ú"observe_unmentioned_group_messagesÚ+TELEGRAM_OBSERVE_UNMENTIONED_GROUP_MESSAGESrŽ  Ú!ingest_unmentioned_group_messagesr†  r’  s   &r   Ú,_telegram_observe_unmentioned_group_messagesÚ<TelegramAdapter._telegram_observe_unmentioned_group_messages›  s!   € à×ÑØ0Ð2_ÐahØ/ó1ð 	1r   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  ¡  s   ø€ ÷ Nñ N¡dñ Nr   c                ó(   € V P                  RRR4      # )zFReturn whether non-allowlisted groups may trigger via direct @mention.Ú
guest_modeÚTELEGRAM_GUEST_MODErŽ  r†  r’  s   &r   Ú_telegram_guest_modeÚ$TelegramAdapter._telegram_guest_mode¡  s   € à×Ñ Ð.CÀWÓMÐMr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  ¥  s   ø€ ÷ eñ e±$ñ er   c                ó(   € V P                  RRR4      # )zJReturn whether explicit @...bot mentions exclusively route group messages.Úexclusive_bot_mentionsÚTELEGRAM_EXCLUSIVE_BOT_MENTIONSr‚  r†  r’  s   &r   Ú _telegram_exclusive_bot_mentionsÚ0TelegramAdapter._telegram_exclusive_bot_mentions¥  s   € à×ÑÐ 8Ð:[Ð]cÓdÐdr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  ©  s   ø€ ÷ 
ñ 
±ñ 
r   c                ó(   € V P                  RRR4      # )z Whether another bot's message must explicitly @mention us (a quote-reply alone won't);
breaks two-bot reply loops in groups while human replies stay unaffected.Úbots_require_mentionÚTELEGRAM_BOTS_REQUIRE_MENTIONrŽ  r†  r’  s   &r   Ú_telegram_bots_require_mentionÚ.TelegramAdapter._telegram_bots_require_mention©  s   € ð ×ÑØ"Ð$CÀWó
ð 	
r   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   ©rX   r   )r   r…  s   "€r   r   r†  °  s   ø€ ÷ Zñ Z©s±3­xñ Zr   c                ó&   € V P                  R R4      # )Úfree_response_chatsÚTELEGRAM_FREE_RESPONSE_CHATS©r€  r’  s   &r   Ú_telegram_free_response_chatsÚ-TelegramAdapter._telegram_free_response_chats°  s   € Ø×"Ñ"Ð#8Ð:XÓYÐYr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   r£  )r   r…  s   "€r   r   r†  ³  s   ø€ ÷ \ñ \±±Cµñ \r   c                ó&   € V P                  RR4      # )zWTopic-level free-response entries as ``<chat_id>:<thread_id>`` (General topic = ``1``).Úfree_response_topicsÚTELEGRAM_FREE_RESPONSE_TOPICSr§  r’  s   &r   Ú_telegram_free_response_topicsÚ.TelegramAdapter._telegram_free_response_topics³  s   € à×"Ñ"Ð#9Ð;ZÓ[Ð[r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  ·  s   ø€ ÷ nñ n¹ð nÁDñ nr   c                ó¼   € V P                  4       pV'       g   R# V P                  V4      pV'       g   R# V RV P                  V P                  V4      4       2V9   # )zGTrue when the message's chat/topic pair is in ``free_response_topics``.Fr¬   )r®  Ú_chat_id_strÚ_topic_id_or_generalÚ_effective_message_thread_id)r“  r%  r¤  r±  s   &&  r   Ú _telegram_is_free_response_topicÚ0TelegramAdapter._telegram_is_free_response_topic·  s[   € à×4Ñ4Ó6ˆßÙØ×#Ñ# GÓ,ˆßÙØ�˜!˜D×5Ñ5°d×6WÑ6WÐX_Ó6`ÓaÐbÐcÐgmÑmÐmr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   r£  )r   r…  s   "€r   r   r†  Á  s   ø€ ÷ Nñ N©©S­ñ Nr   c                ó&   € V P                  RR4      # )z‚Group chat IDs the bot responds in (non-empty: others need ``guest_mode`` + @mention; DMs never
filtered; empty = no restriction).Úallowed_chatsÚTELEGRAM_ALLOWED_CHATSr§  r’  s   &r   Ú_telegram_allowed_chatsÚ'TelegramAdapter._telegram_allowed_chatsÁ  s   € ð ×"Ñ" ?Ð4LÓMÐMr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   r£  )r   r…  s   "€r   r   r†  Æ  s   ø€ ÷ Zñ Z©s±3­xñ Zr   c                ó&   € V P                  RR4      # )z0Return Telegram chats authorized at group scope.Úgroup_allowed_chatsr¬  r§  r’  s   &r   Ú_telegram_group_allowed_chatsÚ-TelegramAdapter._telegram_group_allowed_chatsÆ  s   € à×"Ñ"Ð#8Ð:XÓYÐYr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   r£  )r   r…  s   "€r   r   r†  Ê  s   ø€ ÷ Wñ W±±Sµñ Wr   c                óŠ   € V P                  4       pV'       g   \        4       # V P                  4       pV'       d	   W,          # T# )uu   Chats where observed group context may use a shared source: ``group_allowed_chats`` âˆ©
``allowed_chats`` (when set).)rÀ  rX   r»  )r“  Úgroup_allowedÚresponse_alloweds   &  r   Ú_telegram_observe_allowed_chatsÚ/TelegramAdapter._telegram_observe_allowed_chatsÊ  s;   € ð ×:Ñ:Ó<ˆßÜ“5ˆLØ×7Ñ7Ó9Ðß3Cˆ}Õ/ÐVÈÐVr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   r£  )r   r…  s   "€r   r   r†  Ó  s   ø€ ÷ Pñ P©#©c­(ñ Pr   c                ó&   € V P                  RR4      # )z�Forum topic IDs this bot handles (non-empty: other topics ignored; DMs never filtered; missing
``message_thread_id`` == General topic ``1``).Úallowed_topicsÚTELEGRAM_ALLOWED_TOPICSr§  r’  s   &r   Ú_telegram_allowed_topicsÚ(TelegramAdapter._telegram_allowed_topicsÓ  s   € ð ×"Ñ"Ð#3Ð5NÓOÐOr   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# r�   )rX   rÚ   )r   r…  s   "€r   r   r†  Ø  s   ø€ ÷ ñ ©3©s­8ñ r   c                óØ  € \        V P                  P                  RRRRR7      p\        V4      p\	        4       p\        V\        4      '       d   TM\        V4      P                  R4       FA  p\        V4      P                  4       pV'       g   K&   VP                  \        V4      4       KC  	  V#   \        \        3 d&    \        P                  RT P                   T4        K|  i ; i)uV   Thread ids to skip: scoped ``TELEGRAM_IGNORED_THREADS`` â†’ ``config.extra`` â†’ none.Úignored_threadsÚTELEGRAM_IGNORED_THREADSr!   Fr|  ro  z,[%s] Ignoring invalid Telegram thread id: %r)rv  rš  r·  r~  rX   r5  rT  r   rr  r  r[   rÚ   rÝ   rÞ   r7   r-  r„  )r“  rŒ  ÚignoredrH   r+   s   &    r   Ú_telegram_ignored_threadsÚ)TelegramAdapter._telegram_ignored_threadsØ  s¿   € ä˜tŸ{™{×0Ñ0Ð2CÐE_ÐacÐtyÔzˆÜ'¨Ó,ˆÜ›EˆÜ'¨¬T×2Ò2‘c¼¸C»¿¹ÀsÓ8KÒKˆEÜ�u“:×#Ñ#Ó%ˆDßÙðaØ—‘œC ›IÖ&ñ Lð ˆøô œzÐ*ô aÜ—‘ÐMÈtÏyÉyÐZ_×`ðaús   ÂB3Â32C)Ã(C)c                óD   <€ V ^8„  d   QhRS[ S[P                  ,          /# r�   )rT  rU  ÚPattern)r   r…  s   "€r   r   r†  ç  s    ø€ ÷ Mñ M©4±·
±
Õ+;ñ Mr   c                ób  € \        RR4      P                  4       pV'       d    \        P                  ! V4      pM%V P                  P                  P                  R4      pVf   . # \        W P                  RR\        R7      #   \         d¡    TP                  4        Uu. uF*  q3P                  4       '       g   K  TP                  4       NK,  	  Mu upi ppT'       gL   TP                  R4       Uu. uF*  q3P                  4       '       g   K  TP                  4       NK,  	  Mu upi pp LÍi ; i)z=Compile optional regex wake-word patterns for group triggers.ÚTELEGRAM_MENTION_PATTERNSr!   ro  Úmention_patternsr<   ÚTelegram)Ú
log_prefixÚplatform_labelÚdisplay_labelÚlogger_)rq  r  r  r  r*   r¿  rr  rš  r·  r  r]  r„  r7   )r“  Úenv_rawÚpatternsr  s   &   r   rÃ  Ú)TelegramAdapter._compile_mention_patternsç  sò   € ô #Ð#>ÀÓC×IÑIÓKˆßð]ÜŸ:š: gÓ.‘ð —{‘{×(Ñ(×,Ñ,Ð-?Ó@ˆHØÒØˆIÜ'¨¿Y¹YÐWaÐq{ô  FLô  Mð  	Møô ô ]Ø5<×5GÑ5GÔ5IÓZÑ5I¨TÏZÉZÏ\œL˜DŸJ™JžLÒ5IùÒZ�ÐZßØ9@¿¹ÀsÔ9KÓ\Ñ9K°ÏzÉzÏ|¤ §
¡
¦Ò9KùÒ\�HÐ\ùð]ús5   ¤B ÂD.Â CÂ<CÃ#D.Ã3D$ÄD$Ä#D.Ä-D.c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  ú  s   ø€ ÷ Uñ U¡ñ Ur   c                óŠ   € V '       d;   \        \        V RR4      4      P                  R4      R,          P                  4       # R# )uP   PTB enum or plain-string ``chat.type`` â†’ bare lowercase name (``supergroup``).r'   r!   Ú.r³  ©r   r]   rr  rø   )r‘  s   &r   Ú_chat_type_strÚTelegramAdapter._chat_type_strù  s;   € ÷ IMŒs”7˜4 ¨Ó,Ó-×3Ñ3°CÓ8¸Õ<×BÑBÓDÐTÐRTÐTr   c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  ÿ  s   ø€ ÷ Fñ F¡ñ Fr   c           	     óD   € \        \        \        V R R4      RR4      4      # )r‘  NrZ   r!   )r   r]   ©r%  s   &r   r²  ÚTelegramAdapter._chat_id_strþ  s   € ä”7œ7 7¨F°DÓ9¸4ÀÓDÓEÐEr   c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†    s   ø€ ÷ Yñ Y±ñ Yr   c                ó8   € Ve   \        V4      # V P                  # rP   )r   r  r  s   &&r   r³  Ú$TelegramAdapter._topic_id_or_general  s   € à!*Ò!6Œs�9‹~ÐX¸C×<XÑ<XÐXr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†    s   ø€ ÷ Sñ S¡gð S±$ñ Sr   c                ój   € \        VR R4      p\        V4      ;'       d    V P                  V4      R9   # )r‘  N>   rf  r]  )r]   rB   ræ  )r“  r%  r‘  s   && r   Ú_is_group_chatÚTelegramAdapter._is_group_chat  s3   € Ü�w ¨Ó-ˆÜ�D‹z×RÐR˜d×1Ñ1°$Ó7Ð;RÑRÐRr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# rÀ  )rq   r   r   )r   r…  s   "€r   r   r†    s#   ø€ ÷ Hñ H±7ð H¹xÉ½}ñ Hr   c                ó\  € \        VRR4      pV P                  V4      p\        VRR4      p\        \        VRR4      4      pVR	9   pT;'       d    \        VRR4      RJ pVe5   V'       g    V'       d	   V'       g   VR8X  d   V'       d   \        V4      # R# V'       d   V P                  # R# )
a  Routable thread id: forum General-topic messages arrive with ``message_thread_id=None`` but
Telegram addresses that topic as ``1``; plain group/DM replies carry a reply-UI anchor that is NOT
a routing id. Gating, skill binding and outbound routing must all agree on this value.r‘  Nr—  r˜  FrY  Tr\  )rf  r]  )r]   ræ  rB   r   r  )rÒ  r%  r‘  rX  rŒ  r˜  Úis_groupr›  s   &&      r   r´  Ú,TelegramAdapter._effective_message_thread_id
  s£   € ô
 �w ¨Ó-ˆØ×&Ñ& tÓ,ˆ	Ü�gÐ2°DÓ9ˆÜ¤¨Ð1CÀUÓ KÓLÐØÐ 7Ñ7ˆØ!×NÐN¤g¨d°JÀÓ&FÈ$Ð&NˆØŠ?ß§(×/?ÀYÐR[ÔE[×`pÜ˜3“x�Ùß/=ˆs×+Ñ+ÐGÀ4ÐGr   z[a-z0-9_]{2,29}botro  c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†     s   ø€ ÷ Pñ P¡sñ Pr   c                ó¬   € \        V RR4      pV'       d   V# \        V P                  RR4      ;'       g    RP                  R4      P                  4       # )zŸThis bot's live @username (lowercased, no ``@``): the last observed handle beats PTB's
``get_me()`` cache, which keeps a stale handle after a BotFather rename.rõ  Nr“  r!   Ú@)r]   rÁ  Úlstriprø   )r“  Úobserveds   & r   Ú_current_bot_usernameÚ%TelegramAdapter._current_bot_username   sJ   € ô ˜4Ð!9¸4Ó@ˆßØˆOÜ˜Ÿ	™	 :¨tÓ4×:Ð:¸×BÑBÀ3ÓG×MÑMÓOÐOr   c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   r“  r   NrN
  )r   r…  s   "€r   r   r†  (  s#   ø€ ÷ Lñ L©8±C­=ð L¸Tñ Lr   c                ó,  € T;'       g    RP                  R4      P                  4       pV'       g   R# \        V RR4      pW28X  d   R# W n        \        P
                  ! 4       V n        V'       d$   \        P                  RV P                  W24       R# R# )z9Record the bot's current @username, logging real renames.r!   rù  Nrõ  z[[%s] Telegram bot username changed: @%s -> @%s (mention routing now follows the new handle))
rú  rø   r]   rõ  r}  r~  rö  r7   rç   r„  )r“  r“  ÚhandlerÔ  s   &&  r   r;  Ú"TelegramAdapter._note_bot_username(  s|   € à—.�.˜b×(Ñ(¨Ó-×3Ñ3Ó5ˆßÙÜ˜4Ð!9¸4Ó@ˆØÔÙØ&,Ô#Ü(,¯ªÓ(8ˆÔ%ßÜ�K‰KØmÐos×oxÑoxð  {CöLñ r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r%  r   NrŽ  )r   r…  s   "€r   r   r†  6  s   ø€ ÷ Nñ N¹'ð NÀdñ Nr   c                ó  € \        V P                  RR4      pVf   R# \        VRR4      \        \        VRR4      RR4      3 F9  pVf   K	  \        VRR4      V8X  g   K  V P                  \        VRR4      4       K;  	  R# )z–Learn our own handle from a message Telegram says we authored (own messages and
``reply_to_message``); only trusted when the user id matches this bot.rZ   Nr�  Úreply_to_messager“  )r]   rÁ  r;  )r“  r%  Úbot_idÚ	candidates   &&  r   Ú"_observe_bot_identity_from_messageÚ2TelegramAdapter._observe_bot_identity_from_message6  s…   € ô ˜Ÿ™ D¨$Ó/ˆØŠ>ÙÜ! '¨;¸Ó=¼wÄwÈwÐXjÐlpÓGqÐs~ð  AEó  @Fó  GˆIØÔ$¬°¸DÀ$Ó)GÈ6Ö)QØ×'Ñ'¬°	¸:ÀtÓ(LÖMó Gr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  @  s   ø€ ÷ kñ k©ñ kr   c                ó†   € \        V RR4      pVRJ;'       d*    \        P                  ! 4       V,
          V P                  8  # )u¢   True when identity was re-read within the TTL. ``None`` (never checked) is always stale â€” do
not fold it into ``0.0``: monotonic clocks have an arbitrary epoch.rö  N)r]   r}  r~  rË  )r“  Ú
checked_ats   & r   Ú_bot_identity_is_freshÚ&TelegramAdapter._bot_identity_is_fresh@  s=   € ô ˜TÐ#=¸tÓDˆ
Ø Ð%×jÐj¬4¯>ª>Ó+;¸jÕ+HÈD×LjÑLjÑ*jÐjr   r&   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r&   r   Nr.  )r   r…  s   "€r   r   r†  F  s   ø€ ÷ ?ñ ?±Dð ?ÀTñ ?r   c             ƒ  óZ  "  € V P                   pVe   \        \        VRR4      4      '       g   R# V'       g   V P                  4       '       d   R#  \        P
                  ! VP                  4       V P                  4      G Rj  x€L
 p\        P                  ! 4       T n        T P#                  \        TRR4      4       R#  L<  \        P                   d    h \         dF   p\        P                  RT P                  T P                  4       ;'       g    RT4        Rp?R# Rp?ii ; i5i)z£Re-read bot identity when the cache may be stale (``get_me()`` rewrites PTB's ``Bot._bot_user``
in place). Best-effort: a failed probe keeps the last known handle.Nr8  z7[%s] Telegram identity refresh failed (keeping @%s): %srÂ	  r“  )rÁ  rf  r]   r  r0   r:  r8  Ú_BOT_IDENTITY_PROBE_TIMEOUTr6   r*   r7   r8   r„  rü  r}  r~  rö  r;  )r“  r&   rf   Úmerê  s   &$   r   rÌ  Ú%TelegramAdapter._refresh_bot_identityF  sè   é € ð �i‰iˆØŠ;œh¤w¨s°H¸dÓ'C×DÒDÙß˜×4Ñ4×6Ò6Ùð	Ü×'Ò'¨¯
©
«°d×6VÑ6VÓW×WˆBô )-¯ªÓ(8ˆÔ%Ø×Ñ¤¨¨J¸Ó =Ö>ñ XøÜ×%Ñ%ô 	ØÜô 	Ü�L‰LØIÈ4Ï9É9ÐVZ×VpÑVpÓVr×VÐVÐvð  BEôFåûð	üsR   ‚6D+¹D+ÁD+Á2C ÂCÂC Â	8D+ÃC ÃD(Ã"D(Ã#:D#ÄD+Ä#D(Ä(D+c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  [  s   ø€ ÷ fñ f©ð f±Dñ fr   c                óî   € V P                   '       d   \        VR R4      '       g   R# \        VP                  RR4      p\        T;'       d&    \        VRR4      \        V P                   RR4      8H  4      # )r  NFr�  rZ   )rÁ  r]   r  rB   )r“  r%  Ú
reply_users   && r   Ú_is_reply_to_botÚ TelegramAdapter._is_reply_to_bot[  sa   € Ø�y�yˆy¤¨Ð1CÀT× JÒ JÙÜ˜W×5Ñ5°{ÀDÓIˆ
Ü�J×dÐd¤7¨:°t¸TÓ#BÄgÈdÏiÉiÐY]Ð_cÓFdÑ#dÓeÐer   c                ó    <€ V ^8„  d   QhRS[ /# r�  rŽ  )r   r…  s   "€r   r   r†  b  s   ø€ ÷ hñ h¡ñ hr   c              #  óÎ   "  € \        V RR4      ;'       g    R\        V RR4      ;'       g    . 3x € \        V RR4      ;'       g    R\        V RR4      ;'       g    . 3x € R# 5i)z<``(text, entities)`` pairs for the message text and caption.r+   Nr!   Úentitiesr7  Úcaption_entitiesr<  rê  s   &r   Ú_entity_sourcesÚTelegramAdapter._entity_sourcesa  sf   é € ô �g˜v tÓ,×2Ð2°´G¸GÀZÐQUÓ4V×4\Ð4\ÐZ\Ð\Ò\Ü�g˜y¨$Ó/×5Ð5°2´w¸wÐHZÐ\`Ó7a×7gÐ7gÐegÐgÔgùs   ‚*A%­A%ÁA%ÁA%c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  h  s   ø€ ÷ Gñ G¡ñ Gr   c                óv   € \        \        V R R4      4      P                  R4      R,          P                  4       # )r'   r!   rä  r³  rå  )Úentitys   &r   Ú_entity_typeÚTelegramAdapter._entity_typeg  s/   € ä”7˜6 6¨2Ó.Ó/×5Ñ5°cÓ:¸2Õ>×DÑDÓFÐFr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# )r   Úsource_textr   r•  )r   r…  s   "€r   r   r†  l  s#   ø€ ÷ Fñ F¡sð F±xÁµ}ñ Fr   c                óž   € \        \        VRR4      4      p\        \        VR^ 4      4      pV^ 8  g   V^ 8:  d   R# V P                  WV4      # )z9The entity's text, or None when its offsets are unusable.rm	  rè   Nr³  )rÚ   r]   Ú_telegram_entity_text)rÒ  r$  r   rm	  rè   s   &&&  r   Ú_entity_spanÚTelegramAdapter._entity_spank  sM   € ô ”W˜V X¨rÓ2Ó3ˆÜ”W˜V X¨qÓ1Ó2ˆØ�AŒ:˜ 1œÙØ×(Ñ(¨¸fÓEÐEr   c                ó<   <€ V ^8„  d   QhRS[ RS[RS[S[,          /# )r   r%  Úself_usernamer   )rq   r   rX   )r   r…  s   "€r   r   r†  {  s)   ø€ ÷ +'ñ +'±Wð +'ÉSð +'ÑZ]Ñ^aÕZbñ +'r   c                ó²  a a€ \        4       pT;'       g    RP                  R4      P                  4       oR V V3R llpS P                  V4       Fø  w  rVV Fí  pS P	                  V4      pVR9  d   K  S P                  WW4      p	V	f   K4  V	P                  4       p	VR8X  dA   V	P                  R4      P                  4       p
V! V
4      '       d   VP                  V
4       K‹  V	P                  R4      pV^ 8  d   K¥  W›^,           R P                  4       P                  4       pV! V4      '       g   KÜ  VP                  V4       Kï  	  Kú  	  S P                  V4       Fu  w  rÖV'       d	   V'       d   K  \        P                  ! RV4       FC  pVP                  ^4      P                  4       p
V! V
4      '       g   K2  VP                  V
4       KE  	  Kw  	  V# )	zúExplicit bot usernames mentioned in text/captions: foreign handles count only when bot-shaped
(``...bot``), ``self_username`` opts our OWN handle in regardless of shape. Entity mentions are
authoritative; the raw-text fallback is deliberately narrow.r!   rù  c                ó0   € V ^8„  d   QhR\         R\        /# )r   r   r   r'  )r   s   "r   r   ÚDTelegramAdapter._extract_bot_mention_usernames.<locals>.__annotate__‚  s   € ÷ 	Fñ 	F¤3ð 	F¬4ñ 	Fr   c                 ó‚   <€ V '       g   R # S'       d
   V S8X  d   R# \        SP                  P                  V 4      4      # )FT)rB   Ú_FOREIGN_BOT_HANDLE_REÚ	fullmatch)r   rÒ  Úowns   &€€r   Ú_is_bot_handleÚFTelegramAdapter._extract_bot_mention_usernames.<locals>._is_bot_handle‚  s1   ø€ ßÙß�v ”}ÙÜ˜×2Ñ2×<Ñ<¸VÓDÓEÐEr   ÚmentionNz.(?i)(?<![A-Za-z0-9_`/])@([A-Za-z0-9_]{2,31})\b>   r4  Úbot_command)rX   rú  rø   r  r!  r'  r  r[   ÚfindrU  rc  rf  )rÒ  r%  r*  Úmentioned_bot_usernamesr2  r$  r  r   Úentity_typeÚentity_textr   Úat_indexÚcommand_targetÚraw_textr¼  r1  s   f&&            @r   Ú_extract_bot_mention_usernamesÚ.TelegramAdapter._extract_bot_mention_usernamesz  s£  ù€ ô
 -0«EÐØ×"Ð" ×*Ñ*¨3Ó/×5Ñ5Ó7ˆ÷	Fñ 	Fð &)×%8Ñ%8¸Ö%AÑ!ˆKÛ"�Ø!×.Ñ.¨vÓ6�ØÐ&@Ô@ÙØ!×.Ñ.¨{ÓC�ØÒ&ÙØ)×/Ñ/Ó1�Ø )Ô+Ø(×/Ñ/°Ó4×:Ñ:Ó<�FÙ% f×-Ò-Ø/×3Ñ3°FÔ;Ùà&×+Ñ+¨CÓ0�Ø˜a”<ÙØ!,¸­\¨]Ð!;×!AÑ!AÓ!C×!IÑ!IÓ!K�Ù! .×1Ô1Ø+×/Ñ/°Ö?ó' #ñ &Bð, #&×"5Ñ"5°gÖ">ÑˆHßŸxÙÜŸšÐ%VÐX`Öa�ØŸ™ Q›×-Ñ-Ó/�Ù! &×)Ô)Ø+×/Ñ/°Ö7ó bñ #?ð 'Ð&r   c                ó2   <€ V ^8„  d   QhRS[ RS[RS[RS[ /# )r   r$  rm	  rè   r   )r   rÚ   )r   r…  s   "€r   r   r†  ©  s)   ø€ ÷ ñ ©3ð ¹ð ÁSð ÉSñ r   c                ó¶   € V^ 8  g   V^ 8:  d   R#  V P                  R4      V^,          W,           ^,           P                  R4      #   \         d     R# i ; i)z=Return a Telegram entity span using UTF-16 code-unit offsets.r!   z	utf-16-le)rû  rë	  ÚUnicodeDecodeError)r$  rm	  rè   s   &&&r   r&  Ú%TelegramAdapter._telegram_entity_text¨  s[   € ð �AŒ:˜ 1œÙð	Ø×%Ñ% kÓ2°6¸Aµ:¸v½ÐRSÕ>SÐT×[Ñ[Ð\gÓhÐhøÜ!ô 	Úð	ús   ’6A	 Á	AÁAc                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  ²  s   ø€ ÷ ñ ©Wð ¹ñ r   c                ó$  € V P                   '       g   R # V P                  4       p\        V P                   RR4      pV'       d   RV 2MRpV P                  V4       EF  w  rVV EF  pV P	                  V4      pVR8X  dI   V'       dA   V P                  WW4      p	V	e*   V	P                  4       P                  4       V8X  d     R# Kb  Kd  VR8X  d0   \        VRR4      p
V
'       d   \        V
RR4      V8X  d     R# K˜  Kš  VR8X  g   K£  V'       g   K­  V P                  WW4      pVf   KÄ  VP                  R4      pV^ 8¼  g   KÞ  W¼R P                  4       P                  4       V8X  g   EK    R# 	  EK  	  V'       d   W P                  W4      9   # R # )	FrZ   Nrù  r4  TÚtext_mentionr™  r5  )
rÁ  rü  r]   r  r!  r'  r  rø   r6  r=  )r“  r%  Úbot_usernamer  Úexpectedr$  r  r   r8  Úspanr™  Úcommand_textr:  s   &&           r   Ú_message_mentions_botÚ%TelegramAdapter._message_mentions_bot²  sc  € Ø�y�yˆyÙØ×1Ñ1Ó3ˆÜ˜Ÿ™ D¨$Ó/ˆß)5�Q�|�nÑ%¸4ˆð &*×%9Ñ%9¸'×%BÑ!ˆKÜ"�Ø"×/Ñ/°Ó7�Ø )Ô+·Ø×,Ñ,¨[ÓA�DØÒ'¨D¯J©J«L×,>Ñ,>Ó,@ÀHÔ,LÛ#ñ -MÑ'à  NÔ2Ü" 6¨6°4Ó8�Dß¤¨¨d°DÓ 9¸VÔ CÛ#ñ !D‘tà  MÖ1·h±hà#'×#4Ñ#4°[Ó#I�LØ#Ò+Ù Ø+×0Ñ0°Ó5�HØ 1–}¨°iÐ)@×)FÑ)FÓ)H×)NÑ)NÓ)PÐT\×)\Û#ô# #ñ &C÷& Ø×#FÑ#FÀwÓ#]Ñ]Ð]Ùr   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  Ñ  s   ø€ ÷ 4ñ 4°ñ 4r   c                óÀ  € \        V RR4      pVe   VP                  4       '       d   V P                  4       '       d   R#  \        P                  ! 4       pTP                  T P                  4       4      pY0n        \        T RR4      p\        T\        4      '       d/   TP                  T4       TP                  TP                  4       R# R#   \
         d     R# i ; i)z­Fire a TTL-guarded identity refresh in the background when routing is about to discard a
message naming other bots but not us (the symptom of a stale handle after a rename).rå  Nrp  )r]   r{  r  r0   rÑ  r  rÒ  rÌ  rå  r5  rX   r[   rq  rr  )r“  Úexistingrâ  r.   ru  s   &    r   Ú_schedule_bot_identity_recheckÚ.TelegramAdapter._schedule_bot_identity_recheckÑ  s»   € ô ˜4Ð!=¸tÓDˆØÒ ¨¯©¯ª¸T×=XÑ=X×=ZÒ=ZÙð	Ü×+Ò+Ó-ˆDð ×Ñ × :Ñ :Ó <Ó=ˆØ*.Ô'Ü˜$Ð 3°TÓ:ˆÜ�gœs×#Ò#Ø�K‰K˜ÔØ×"Ñ" 7§?¡?Ö3ñ $øô ô 	Úð	ús   ÁC ÃCÃCc                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  â  s   ø€ ÷ ñ ¹7ð Átñ r   c                óâ   € V P                   '       g   R# V P                  4       pV'       g   R# V P                  W4      p\        V4      ;'       d    W#9  pV'       d   V P	                  4        V# )zŠTrue when explicit bot handles target other bots, not this one (``@bot3 hi @bot4`` must not
wake ``@bot1`` via reply/wake-word fallbacks).F)rÁ  rü  r=  rB   rO  )r“  r%  rF  r7  Úexcludes_selfs   &&   r   Ú#_explicit_bot_mentions_exclude_selfÚ3TelegramAdapter._explicit_bot_mentions_exclude_selfâ  s`   € ð �y�yˆyÙØ×1Ñ1Ó3ˆßÙØ"&×"EÑ"EÀgÓ"\ÐÜÐ4Ó5×eÐe¸,Ñ:eˆßà×/Ñ/Ô1ØÐr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  ñ  s   ø€ ÷ 3ñ 3¹ð 3ÁTñ 3r   c           	     ó   a € S P                   '       g   R # \        ;QJ d7    V 3R l\        VRR4      \        VRR4      3 4       F  '       g   K   R# 	  R # ! V 3R l\        VRR4      \        VRR4      3 4       4      # )Fc              3   ó~   <"  € T F2  q'       g   K  SP                    F  pVP                  V4      x € K  	  K4  	  R # 5irP   )rÄ  r¬  )rR   r  Úpatternr“  s   &  €r   rT   ÚDTelegramAdapter._message_matches_mention_patterns.<locals>.<genexpr>ô  s?   øé € ð 3á`�	Ódmô &à×1Ô1�ð �N‰N˜9×%Ð%á1ñ &Û`ùs   ƒ	=‘,=r+   Nr7  T)rÄ  r¯  r]   ©r“  r%  s   f&r   Ú!_message_matches_mention_patternsÚ1TelegramAdapter._message_matches_mention_patternsñ  s}   ø€ Ø×%×%Ð%Ùß‹sô 3ä% g¨v°tÓ<¼gÀgÈyÐZ^Ó>_Ñ`ó3�sŒsð 	3Šsð 	3ˆsô 3ä% g¨v°tÓ<¼gÀgÈyÐZ^Ó>_Ñ`ó3ó 3ð 	3r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  ù  s   ø€ ÷ Sñ S©ð S±Tñ Sr   c                óT   € V P                  4       ;'       d    V P                  V4      # )zMGuest-mode bypass: explicit bot mention (caller already verified group chat).)r”  rJ  r[  s   &&r   Ú_is_guest_mentionÚ!TelegramAdapter._is_guest_mentionù  s$   € à×(Ñ(Ó*×RÐR¨t×/IÑ/IÈ'Ó/RÐRr   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# rK  rN
  )r   r…  s   "€r   r   r†  ý  s#   ø€ ÷ ñ ©H±S­Mð ¹hÁs½mñ r   c                óÚ   € V P                  4       pV'       d	   V'       g   V# \        P                  ! R \        P                  ! V4       R2RV4      P	                  4       pT;'       g    T# )z(?i)@z\b[,:\-]*\s*r!   )rü  rU  rN  r¯   r  )r“  r+   rF  rV  s   &&  r   Ú_clean_bot_trigger_textÚ'TelegramAdapter._clean_bot_trigger_textý  sT   € Ø×1Ñ1Ó3ˆßŸ<ØˆKÜ—&’&˜E¤"§)¢)¨LÓ"9Ð!:¸,ÐGÈÈTÓR×XÑXÓZˆØ�ˆ˜$Ðr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[ ,          /# )r   Úwarn_non_numericr   )rB   r   )r   r…  s   "€r   r   r†    s    ø€ ÷ ñ Áð ÉÑRVÍñ r   c               ó>  € V P                  4       pV'       d   V P                  V4      V9  d   R# Ve%    \        V4      V P                  4       9   d   R#  R# R#   \        \
        3 d1    T'       g    R# \        P                  RT P                  T4        R# i ; i)zR``allowed_topics`` / ``ignored_threads`` gates; False = blocked, None = undecided.FNz8[%s] Ignoring non-numeric Telegram message_thread_id: %r)	rÌ  r³  rÚ   rÓ  rÝ   rÞ   r7   r-  r„  )r“  rx  rg  rÊ  s   &&$ r   Ú_topic_gates_passÚ!TelegramAdapter._topic_gates_pass  s‘   € à×6Ñ6Ó8ˆß˜d×7Ñ7¸	ÓBÈ.ÔXÙØÒ ðqÜ�y“> T×%CÑ%CÓ%EÔEÙ ð Fó øô	 œzÐ*ô qß'Ú Ü—‘ÐYÐ[_×[dÑ[dÐfoÕpÙð	qús   ¶A ÁBÁ7!BÂBc                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†    s   ø€ ÷ 
ñ 
©gð 
¹$ñ 
r   c                ó¢   € \        V P                  4       ;'       d0    V P                  V4      ;'       d    V P                  V4      '       * 4      # )zÛTrue when ``bots_require_mention`` vetoes this other-bot message: another bot must
explicitly @mention us, its quote-replies and plain chatter do not count (two bots
answering each other's replies never stop otherwise).)rB   r   Ú_sender_is_other_botrJ  r[  s   &&r   Ú_bot_sender_suppressedÚ&TelegramAdapter._bot_sender_suppressed  sP   € ô Ø×/Ñ/Ó1÷ 8ð 8Ø×)Ñ)¨'Ó2÷8ð 8à×.Ñ.¨wÓ7Ô7ó
ð 	
r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†    s   ø€ ÷ Cñ CÁð CÉTñ Cr   c                óÚ  € V P                  V4      '       g.   V P                  4       '       d   V P                  V4      '       g   R# V P                  \	        VRR4      RR7      RJ d   R# V P                  V4      pV P                  4       '       d   V P                  V4      '       d   R# V P                  4       pV'       d   W#9  d   R# W P                  4       9   g   V P                  V4      '       d   R# V P                  V4      '       d   R# V P                  4       '       d/   V P                  V4      '       g   V P                  V4      '       d   R# V P                  V4      '       * # )zEReturn True when a group message should be stored but not dispatched.Fr—  N©rg  T)Ú_is_own_messagerŽ  rñ  ri  r]   r²  rš  rT  rÆ  r¨  rµ  rn  r‡  r  rJ  r\  )r“  r%  Úchat_id_strrÊ  s   &&  r   Ú)_should_observe_unmentioned_group_messageÚ9TelegramAdapter._should_observe_unmentioned_group_message  s6  € à×Ñ ×(Ò(°×0aÑ0a×0cÒ0cÐko×k~Ñk~ð  @G÷  lHò  lHÙØ×!Ñ!¤'¨'Ð3FÈÓ"MÐ`eÐ!ÓfÐjoÓoÙØ×'Ñ'¨Ó0ˆØ×0Ñ0×2Ò2°t×7_Ñ7_Ð`g×7hÒ7hÙà×6Ñ6Ó8ˆß˜+Ô4Ùà×<Ñ<Ó>Ô>À$×BgÑBgÐho×BpÒBpÙð
 ×&Ñ& w×/Ò/ÙØ×-Ñ-×/Ò/°4×3HÑ3HÈ×3QÒ3QÐUY×UoÑUoÐpw×UxÒUxÙØ×9Ñ9¸'ÓBÔBÐBr   c                ó6   € \         P                  ! VRRRR7      # )zFReturn a chat/topic-scoped source for observed Telegram group context.N)rk  ry  Úuser_id_alt)Údataclassesrï   )r“  rˆ  s   &&r   Ú%_telegram_group_observe_shared_sourceÚ5TelegramAdapter._telegram_group_observe_shared_source7  s   € ä×"Ò" 6°4À4ÐUYÔZÐZr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   r  r   ©r¸   r   )r   r…  s   "€r   r   r†  ;  s   ø€ ÷ Vñ V¹\ð VÉcñ Vr   c                ó¼   € VP                   P                  ;'       g    R pRVP                   P                  ;'       g    T RT RVP                  ;'       g    R 2# )rÂ	  rP  Ú|z]
r!   )rˆ  rk  ry  r+   )r“  r  rk  s   && r   Ú'_telegram_group_observe_attributed_textÚ7TelegramAdapter._telegram_group_observe_attributed_text;  sS   € Ø—,‘,×&Ñ&×3Ð3¨)ˆØ�5—<‘<×)Ñ)×4Ð4¨WÐ5°Q°w°i¸sÀ5Ç:Á:×CSÐCSÐQSÐBTÐUÐUr   c                ó    <€ V ^8„  d   QhRS[ /# r�   rž   )r   r…  s   "€r   r   r†  ?  s   ø€ ÷ 	Sñ 	S¹ñ 	Sr   c                óŒ   € V P                  4       ;'       g    R p\        \        V RR4      RR4      ;'       g    R pRV RV R2# )rÂ	  rÁ  NrZ   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ü  r]   )r“  r“  r  s   &  r   Ú&_telegram_group_observe_channel_promptÚ6TelegramAdapter._telegram_group_observe_channel_prompt?  s\   € Ø×-Ñ-Ó/×<Ð<°9ˆÜœ  v¨tÓ4°d¸DÓA×NÐNÀYˆð(Ø(. xÐ/OÐPXÈzð ZRðRð	Sr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# r}  rI  )r   r…  s   "€r   r   r†  J  s    ø€ ÷ lñ l¹|ð lÑP\ñ lr   c                óF  € V P                  4       '       g   V# \        VRR4      pV'       d   V P                  V4      '       g   V# V P                  4       pV'       d   V P	                  V4      V9  d   V# V P                  4       pVP                  '       d   VP                   RV 2MTpVP                  \        P                  8X  d   \        P                  ! WR7      # \        P                  ! WP                  V4      V P                  VP                  4      VR7      # )z>Align triggered group turns with observed-history attribution.Úraw_messageNrA  )Úchannel_prompt)r+   rˆ  rŠ  )rŽ  r]   rñ  rÆ  r²  r…  rŠ  Úmessage_typer¹   r\  ry  rï   r�  rz  rˆ  )r“  r  r‰  rÊ  Úobserve_promptrŠ  s   &&    r   Ú)_apply_telegram_group_observe_attributionÚ9TelegramAdapter._apply_telegram_group_observe_attributionJ  sõ   € à×@Ñ@×BÒBØˆLÜ˜e ]°DÓ9ˆß $×"5Ñ"5°k×"BÒ"BØˆLØ×6Ñ6Ó8ˆß˜$×+Ñ+¨KÓ8ÀÔGØˆLØ×DÑDÓFˆØJO×J^×J^ÐJ^˜E×0Ñ0Ð1°°nÐ5EÑFÐdrˆØ×Ñ¤×!4Ñ!4Ô4ä×&Ò& uÔLÐLÜ×"Ò"Ø×DÑDÀUÓKØ×=Ñ=¸e¿l¹lÓKÐ\jôlð 	lr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   r7  r   )rq   r¹   )r   r…  s   "€r   r   r†  ]  s   ø€ ÷ $ñ $¡wð $±;ñ $r   c                ó  € R\         P                  3R\         P                  3R\         P                  3R\         P                  3R\         P
                  33 F  w  r#\        W4      '       g   K  Vu # 	  \         P                  # )zUClassify a Telegram media message into a MessageType (first present attachment wins).Ústickerr´   rÍ
  rl
  rT
  )r¹   ÚSTICKERra  rb  rc  rd  r]   ÚDOCUMENT)r“  r7  rn  Úmtypes   &&  r   Ú_media_message_typeÚ#TelegramAdapter._media_message_type]  sx   € ð œ×+Ñ+Ð,¨w¼×8IÑ8IÐ.JÈWÔVa×VgÑVgÐLhØ”k×'Ñ'Ð(¨7´K×4EÑ4EÐ*FóH‰KˆDô �s×!Ô!Ø’ñ	Hô
 ×#Ñ#Ð#r   ÚimagerÍ
  rl
  c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   r7  r  r  )r   r…  s   "€r   r   r†  h  s   ø€ ÷ ñ ±#ð ¹Sñ r   c              ƒ  ór  "  € ^ RI Hp V P                  V4      w  rErgVf   R# \        VRR4      p^ V P	                  V4      u;8  d   \        V RR4      8:  g    RV3#  RV3#  VP                  4       G Rj  x€L
 p	\        V	P                  4       G Rj  x€L
 4      p
V'       g5   \        P                  P                  \        V	RR4      ;'       g    R4      pV! W¥WgR7      G Rj  x€L
 pTf   R# RT3#  L} Lb L  \         d/   p\        P                  R	T\        T4      R
R7       Ru Rp?# Rp?ii ; i5i)zÓDownload ``msg``'s attachment into the media cache (bounded by ``_max_doc_bytes``). Returns ``(status, cached)``:
``"none"``, ``"oversized"`` (cached = raw file_size), ``"failed"``, ``"unreadable"`` or ``"ok"``.©Úcache_media_bytes_asyncNr%
  r  Ú	oversizedro
  r!   )rÅ
  Ú	mime_typeÚdefault_kindú![Telegram] Failed to cache %s: %sTr3   r’  )ÚnoneNr´  )rE  N)Ú
unreadableN)ru
  r›  Ú_observed_media_sourcer]   r;
  Úget_fileÚbytesÚdownload_as_bytearrayrö   rã   rv
  r*   r7   r-  r,   )r“  r7  r  r›  rˆ  rÅ
  Úmimerë  r%
  Úfile_objr¾  r©  rê  s   &&&          r   Ú_download_observed_mediaÚ(TelegramAdapter._download_observed_mediah  s2  é € õ 	CØ'+×'BÑ'BÀ3Ó'GÑ$ˆ˜$ØŠ>ØÐÜ˜F K°Ó6ˆ	Ø�D×%Ñ% iÓ0Öe´G¸DÐBRÐTdÓ4eÕeØ 	Ð)Ð)ð fØ 	Ð)Ð)ð	"Ø#Ÿ_™_Ó.×.ˆHÜ˜x×=Ñ=Ó?×?Ó@ˆDßÜŸ7™7×+Ñ+¬G°H¸kÈ2Ó,N×,TÐ,TÐRTÓU�Ù2°4ÐVZÔn×nˆFð Š>Ø%Ð%Ø�Vˆ|Ðñ /Ù?ñ oøÜô 	"Ü�N‰NÐ>ÀÔFaÐbeÓFfÐquˆNÔvØ!Õ!ûð	"üsx   ‚A!D7Á$C; Á7C5Á8C; ÂC7ÂC; Â%,C; ÃC; Ã&C9Ã'C; Ã+
D7Ã5C; Ã7C; Ã9C; Ã;D4Ä#D/Ä)D4Ä*D7Ä/D4Ä4D7c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# ©r   r7  r  r   N©rq   r¸   )r   r…  s   "€r   r   r†    s(   ø€ ÷ sñ s©wð s¹|ð sÐPTñ sr   c              ƒ  ó¾  "  € V P                  VR4      G Rj  x€L
 w  r4VR8X  dR   \        V RR4      R,          pV P                  VP                  RV R24      Vn        \        P                  RV4       R# VR8X  d$   V P                  VP                  R	4      Vn        R# VR
8X  d2   . Vn        . Vn        V P                  W$VP                  4       R4       R# R#  LÂ5i)z›Cache an unmentioned group attachment and annotate the observed text; oversized or unsupported
attachments are noted in the transcript without downloading.zobserved group mediaNrœ  r  zB[Observed Telegram attachment too large or unverifiable. Maximum: z MB.]z6[Telegram] Observed group attachment skipped (size=%s)r¡  z=[Observed Telegram attachment could not be read, not cached.]r’  z)[Telegram] Cached observed group %s at %sr´  r  )
r¨  r]   Ú_append_observed_noter+   r7   rç   Ú
media_urlsÚmedia_typesÚ_attach_cachedÚcontext_note)r“  r7  r  Ústatusr©  r4
  s   &&&   r   Ú_cache_observed_mediaÚ%TelegramAdapter._cache_observed_media  sÝ   é € ð  $×<Ñ<¸SÐBXÓY×Y‰ˆØ�[Ô Ü˜tÐ%5Ð7GÓHÈ[ÕYˆHØ×3Ñ3Ø—
‘
Ð`ÐaiÐ`jÐjoÐpórˆEŒJä�K‰KÐPÐRXÔYÙØ�\Ô!Ø×3Ñ3°E·J±JÐ@ó  AˆEŒJÙØ�TŒ>Ø!ˆEÔØ "ˆEÔØ×Ñ ¨v×/BÑ/BÓ/DÐFqÖrñ ñ Zùs   ‚C˜C™CCc                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r   r  ÚnoteÚlog_fmtr   Nr~  )r   r…  s   "€r   r   r†  ‘  s*   ø€ ÷ 7ñ 7¡Lð 7Áð 7Écð 7ÐVZñ 7r   c                óÞ  € VP                   P                  VP                  4       VP                  P                  VP                  4       \        VP                   4      ^8X  d>   VP                  V P                  9   d#   V P                  VP                  ,          Vn        V P                  VP                  V4      Vn
        \        P                  WBP                  VP                  4       R# )z_Append a cached attachment to the event (message type follows the kind only for the first one).N)r¯  rd  rã   r°  Ú
media_typer+  rë  Ú_CACHED_KIND_TO_MESSAGE_TYPEr‹  r®  r+   r7   rç   )r“  r  r©  r·  r¸  s   &&&&&r   r±  ÚTelegramAdapter._attach_cached‘  s�   € à×Ñ×Ñ §¡Ô,Ø×Ñ× Ñ  ×!2Ñ!2Ô3Üˆu×ÑÓ  AÔ%¨&¯+©+¸×9ZÑ9ZÔ*ZØ!%×!BÑ!BÀ6Ç;Á;Õ!OˆEÔØ×/Ñ/°·
±
¸DÓAˆŒ
Ü�‰�GŸ[™[¨&¯+©+Ö6r   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# r«  )r   r¸   )r   r…  s   "€r   r   r†  š  s"   ø€ ÷ 	9ñ 	9©cð 	9¹,ð 	9È4ñ 	9r   c              ƒ  óø   "  € \        VRR4      pVf   R# V P                  VR4      G Rj  x€L
 w  rEVR8X  d>   V P                  W%RVP                   RVP                   RVP
                   R2R	4       R# R#  LL5i)
z:Cache media from the message this turn replies to, if any.r  Nzreplied-to mediar’  z[Replied-to z 'z' saved at: rm  z%[Telegram] Cached replied-to %s at %s)r]   r¨  r±  rë  Údisplay_namerã   )r“  r7  r  Ú	reply_msgr³  r©  s   &&&   r   Ú_cache_replied_mediaÚ$TelegramAdapter._cache_replied_mediaš  s‡   é € ä˜CÐ!3°TÓ:ˆ	ØÒÙØ#×<Ñ<¸YÐHZÓ[×[‰ˆØ�TŒ>Ø×ÑØ ¨f¯k©k¨]¸"¸V×=PÑ=PÐ<QÐQ]Ð^d×^iÑ^iÐ]jÐjkÐlØ7ö9ñ ñ \ùs   ‚)A:«A8¬AA:c                ó    <€ V ^8„  d   QhRS[ /# )r   r7  rŽ  )r   r…  s   "€r   r   r†  ¥  s   ø€ ÷ "ñ "©'ñ "r   c                ó  € VP                   '       d   VP                   R
,          RRR3# VP                  '       d   VP                  RRR3# VP                  '       d   VP                  RRR3# VP                  '       d0   VP                  \	        VP                  RR4      ;'       g    RRR3# VP
                  '       dH   VP
                  pY"P                  ;'       g    RVP                  ;'       g    RP                  4       R	3# R# )zEReturn (telegram_file_source, filename, mime, default_kind) or Nones.r!   r—  ú	video/mp4rÍ
  z	voice.oggú	audio/oggrl
  r¥
  Nr³  )Nr!   r!   N)	r´   rÍ
  rT
  rl
  r]   rÃ
  r¥
  r�  rø   )r“  r7  Údocs   && r   r¢  Ú&TelegramAdapter._observed_media_source¥  sÑ   € à�9�9ˆ9Ø—9‘9˜R•= " b¨'Ð1Ð1Ø�9�9ˆ9Ø—9‘9˜b +¨wÐ6Ð6Ø�9�9ˆ9Ø—9‘9˜k¨;¸Ð?Ð?Ø�9�9ˆ9Ø—9‘9œg c§i¡i°¸bÓA×GÐGÀRÈÈWÐTÐTØ�<�<ˆ<Ø—,‘,ˆCØŸ™×+Ð+¨¨c¯m©m×.AÐ.A¸r×-HÑ-HÓ-JÈDÐPÐPØ!Ð!r   c                ó<   <€ V ^8„  d   QhRS[ S[,          RS[RS[/# )r   rN  r·  r   rN
  )r   r…  s   "€r   r   r†  µ  s&   ø€ ÷ =ñ =©±­ð =¹Sð =ÁSñ =r   c                óL   € V'       g   T ;'       g    R # V '       d   V  RV 2# T# )r!   rA  rQ   )rN  r·  s   &&r   r®  Ú%TelegramAdapter._append_observed_note´  s)   € çØ—>�>˜rÐ!ß*2�(�˜4 ˜vÐ&Ð<¸Ð<r   c                óL   <€ V ^8„  d   QhRS[ RS[RS[RS[RS[S[,          RR/# )r   r7  r  rë  rê  r¿  r   N)rq   r¸   r   r*   r   )r   r…  s   "€r   r   r†  º  sC   ø€ ÷ ñ ÙðÙ#/ðÙ7:ðÙAJðÙZbÑcfÕZgðØswñr   c              ƒ  óÄ  "  € V P                  VP                  4      ;_uu_ 4        V'       d   \        RVR7      MRpT P                  \        RV\        9   d   \        \        V,          4      MTWdP
                  P                  R7      4      pV'       d+    V P                  4        VP                  V4      G Rj  x€L
  T P                  VP                  V'       d    R
V V RVP
                  P                   R2MR
V V R24      Vn        RRR4       R#  L\  \         d#   p\        P                  RY8RR	7        Rp?L‚Rp?ii ; i  + '       g   i     R# ; i5i)uð  Surface a failed media download to BOTH the user (reply asking to retry) and the agent (observed
note) â€” otherwise the turn dispatches silently with empty media_urls.

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).
z$platform.telegram.media.named_suffixr—  r!   z'platform.telegram.media.download_failed)rë  r„  r   Nz;[Telegram] Failed to notify user about %s cache failure: %sTr3   z[The user attempted to send a z! but it could not be downloaded (z"); they have been asked to retry.]z! but it could not be downloaded.])Ú_media_delivery_scoperˆ  rŠ   Úwarning_textÚ_MEDIA_KIND_KEYSr  r(   r  Ú
reply_textr*   r7   r-  r®  r+   )	r“  r7  r  rë  rê  r¿  ÚnamedÚnoticeÚ	reply_errs	   &&&&&&   r   Ú_surface_media_cache_failureÚ,TelegramAdapter._surface_media_cache_failureº  sA  é € ð ×'Ñ'¨¯©×5Õ5ßT`”AÐ<À<ÕPÐfhˆEà×&Ñ&¤qØ9Ø26Ô:JÔ2J”QÔ'¨Õ-Ô.ÐPTØ§-¡-×"8Ñ"8ô(:ó ;ˆF÷ ðBØ×'Ñ'Ô)ØŸ.™.¨Ó0×0Ð0ð ×3Ñ3Ø—
‘
çð 1°°°u°gÐ=^Ð_b×_lÑ_l×_uÑ_uÐ^vð  wYñ  ZØ!?À¸vÀeÀWÐLmÐnóˆEŒJ÷ 6Ñ5ñ 1øÜ ô BÜ—N‘NÐ#`Ðbfð  }A�N÷  Bñ  BûðBú÷ 6×5Ð5üs_   ‚$E ¦A2EÂ$DÂ=DÂ>DÃEÃ 0EÄ
E ÄDÄE	Ä'EÄ?EÅE	Å	EÅE	Å	E c          
      óV   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[S[,          RR/# )r   r%  Úmsg_typeÚ	update_idr  r   N©rq   r¹   r   rÚ   r¸   )r   r…  s   "€r   r   r†  Ù  sJ   ø€ ÷ cñ cÙðcÙ*5ðcÙBJÉ3Å-ðcÙ_gÑhtÕ_uðcð BFñcr   c                ó   € \        V RR4      pV'       g   R# \        V RR4      p T;'       g    V P                  WVR7      pVP                  V P                  VP                  4      4      pRRRV P                  V4      R	\        P                  ! \        R
7      P                  4       RR/pVP                  '       d   \        VP                  4      VR&   V P                  4        VP                  VP                  V4       \        P!                  RT\        \        VRR4      RR4      VP                  P"                  ;'       g    R4       R#   \$         d2   p	T P'                  4        \        P)                  RYi4        Rp	?	R# Rp	?	ii ; i)zGAppend skipped group chatter to the target session without dispatching.r#  Nr„  r<   ©rÙ  Úroler™  r›  Ú	timestamp)Útzrû  Tr¡  zF[%s] Telegram group message observed (no bot trigger): chat=%s from=%sr‘  rZ   rÂ	  z1[%s] Failed to observe Telegram group message: %s)r]   Ú_build_message_eventÚget_or_create_sessionrz  rˆ  r�  r   rD  r   r9  r¡  r   r  Úappend_to_transcriptÚ
session_idr7   rç   rk  r*   r  r-  )
r“  r%  rØ  rÙ  r  ÚstoreÚadapter_nameÚsession_entryr¬  rê  s
   &&&&&     r   Ú"_observe_unmentioned_group_messageÚ2TelegramAdapter._observe_unmentioned_group_messageÙ  sZ  € ô ˜Ð.°Ó5ˆßÙÜ˜t V¨ZÓ8ˆð	cØ×^Ð^˜T×6Ñ6°wÐT]Ð6Ó^ˆEØ!×7Ñ7¸×8bÑ8bÐch×coÑcoÓ8pÓqˆMà˜ 	¨4×+WÑ+WÐX]Ó+^ØœXŸ\š\¬SÔ1×;Ñ;Ó=¸zÈ4ðQˆEð ××ÐÜ&)¨%×*:Ñ*:Ó&;��lÑ#Ø×ÑÔ!Ø×&Ñ& }×'?Ñ'?ÀÔGÜ�K‰KØXÐZfÜœ ¨°Ó6¸¸iÓHÈ%Ï,É,×J^ÑJ^×JkÐJkÐbkömøô ô 	cØ×)Ñ)Ô+Ü�N‰NÐNÐP\×bÒbûð	cús*   ¦E ¯BE Â?BE ÅE ÅFÅ&FÆFc                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  ñ  s   ø€ ÷ 	Pñ 	P¡wð 	P±4ñ 	Pr   c                óÐ   € V P                   '       g   R# \        VRR4      pVf   R# \        V P                   RR4      p\        VRR4      pVRJ;'       d    VRJ;'       d    W48H  # )zXTrue when sent by this bot itself (echoed getUpdates must not count as incoming unread).Fr�  NrZ   )rÁ  r]   )r“  r%  r�  r  rk  s   &&   r   rs  ÚTelegramAdapter._is_own_messageñ  sh   € à�y�yˆyÙÜ˜G [°$Ó7ˆ	ØÒÙÜ˜Ÿ™ D¨$Ó/ˆÜ˜) T¨4Ó0ˆØ˜TÐ!×OÐO g°TÐ&9×OÐO¸fÑ>OÐOr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  rÁ  )r   r…  s   "€r   r   r†  ü  s   ø€ ÷ Jñ J©Gð J¹ñ Jr   c                óÎ   € \        VRR4      pVe   \        VRR4      '       g   R# \        V P                  RR4      p\        VRR4      pVRJ ;'       g    VRJ ;'       g    WC8g  # )zvTrue when the sender is a bot other than this one (this bot's own echoes are already
filtered by ``_is_own_message``).r�  Nr’  FrZ   )r]   rÁ  )r“  r%  Úsenderr  Ú	sender_ids   &&   r   rm  Ú$TelegramAdapter._sender_is_other_botü  sj   € ô ˜ +¨tÓ4ˆØŠ>¤¨°¸5×!AÒ!AÙÜ˜Ÿ™ D¨$Ó/ˆÜ˜F D¨$Ó/ˆ	Ø˜ˆ~×IÐI ¨dÐ!2×IÐI°iÑ6IÐIr   Ú
is_commandc                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r%  rñ  r   rÁ  )r   r…  s   "€r   r   r†    s#   ø€ ÷ %?ñ %?©wð %?Átð %?ÑX\ñ %?r   c               ó8  € V P                  V4       V P                  V4      '       d   R# V P                  V4      '       g   R# V P                  V4      pV P	                  VRR7      RJ d   R# V P                  V4      pV P                  4       '       d   V P                  V4      '       d   R# V P                  V4      pV P                  4       pV'       d	   WF9  d   V# V'       g,   W@P                  4       9   g   V P                  V4      '       d   R# V P                  V4      '       d   R# V P                  4       '       d   V P                  V4      '       d   R# V P                  4       '       g   V P!                  V4      '       d   R# V P#                  V4      # )a)  Apply Telegram group trigger rules: DMs unrestricted; group messages pass ``allowed_chats`` (hard gate; only
the ``guest_mode`` @mention bypass crosses it) and then any of free_response chat/topic, ``require_mention``
off, reply to the bot, @mention (incl. ``/cmd@botname``), or a wake-word match.FTrr  )r  rs  rñ  r´  ri  r²  rš  rT  r`  r»  r¨  rµ  rn  r‡  r  r”  rJ  r\  )r“  r%  rñ  rx  rt  Úguest_mentionrÊ  s   &&$    r   Ú_should_process_messageÚ'TelegramAdapter._should_process_message  sa  € ð 	×/Ñ/°Ô8Ø×Ñ ×(Ò(ÙØ×"Ñ" 7×+Ò+ÙØ×5Ñ5°gÓ>ˆ	Ø×!Ñ! )¸dÐ!ÓCÀuÓLÙØ×'Ñ'¨Ó0ˆØ×0Ñ0×2Ò2°t×7_Ñ7_Ð`g×7hÒ7hÙà×.Ñ.¨wÓ7ˆà×.Ñ.Ó0ˆß�{Ô1Ø Ð ß˜K×+MÑ+MÓ+OÔOÐSW×SxÑSxð  zA÷  TBò  TBÙð ×&Ñ& w×/Ò/ÙØ×-Ñ-×/Ò/°4×3HÑ3HÈ×3QÒ3QÙØ×(Ñ(×*Ò*¨t×/IÑ/IÈ'×/RÒ/RÙØ×5Ñ5°gÓ>Ð>r   c                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†  -  s   ø€ ÷ }ñ }°tñ }r   c           
   ƒ  ó–  "  € V P                   ;_uu_4       GRj  x€L
   \        VRR4      pV'       d   \        VRR4      '       g    RRR4      GRj  x€L
  R# \        VP                  4      pW0P                  9   d    RRR4      GRj  x€L
  R# ^ RIHp ^ RIHpH	p \        P                  ! WV! 4       R7      G Rj  x€L
 w  rxV P                  V4      p	V P                  P                  W”! VR7      R	7      G Rj  x€L
  V P                  P                  V4       \         P#                  R
V P$                  \'        V	4      V4       RRR4      GRj  x€L
  R#  ELA EL
 LÔ L¢ Lf  \(         d5   p
\         P+                  RT P$                  \-        T
4      4        Rp
?
LXRp
?
ii ; i LT  + GRj  x€L 
 '       g   i     R# ; i5i)z‡Lazy-register bot commands for forum supergroups (topics don't inherit AllGroupChats scope;
Telegram resolves via BotCommandScopeChat).Nr‘  rY  F)ÚBotCommandScopeChatrÚ  rÝ  )r±  rß  z2[%s] Lazy-registered %d commands for forum chat %sz/[%s] Forum command lazy-registration failed: %s)r   r]   rÚ   rZ   rþ  r<   rù  rá  rÛ  rÜ  r0   râ  rã  rÁ  rå  r[   r7   rç   r„  r+  r*   r-  r,   )r“  r%  r‘  r±  rù  rÛ  rÜ  ræ  rj  rè  r  s   &&         r   Ú_ensure_forum_commandsÚ&TelegramAdapter._ensure_forum_commands-  se  é € ð ×#×#×#Ó#ð}Ü˜w¨°Ó5�ß¤7¨4°¸U×#CÒ#CØ÷	 $×#Ñ#ô
 ˜dŸg™g›,�Ø×<Ñ<Ô<Ø÷ $×#Ñ#õ 9ßlÜ)0×):Ò):Ø*Ð9SÓ9Uô*W÷ $WÑ �à#×1Ñ1°-Ó@�Ø—i‘i×/Ñ/°ÐDWÐ`gÔDhÐ/Ói×iÐiØ×.Ñ.×2Ñ2°7Ô;Ü—‘ÐPÐRV×R[ÑR[Ô]`ÐamÓ]nÐpwÔx÷ $×#×#Ñ#ñ$Wñ jøô ô }Ü—‘ÐPÐRV×R[ÑR[Ô]xÐyzÓ]{×|Ñ|ûð}ú÷! $×#×#Ó#üsÎ   ‚G	›EœG	ŸF,¡(E(Á
G	ÁEÁG	Á%E(ÂG	ÂE"ÂG	Â-E(ÃE$Ã=E(Ã?E&Ä A
E(Å
G	ÅF*ÅG	ÅG	Å"G	Å$E(Å&E(Å(F'Å3*F"ÆF,Æ"F'Æ'F,Æ*G	Æ,G	Æ2F5Æ3
G	Æ>G	Ç 	G	c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   r£  r   )ro   r   rq   )r   r…  s   "€r   r   r†  C  s$   ø€ ÷ ^ñ ^±ð ^¹8ÁGÕ;Lñ ^r   c                óF   € \        VRR4      ;'       g    \        VRR4      # )zUMessage-like payload for normal messages and channel posts (``update.channel_post``).Úeffective_messageNr%  r<  r  s   &&r   Ú_effective_update_messageÚ)TelegramAdapter._effective_update_messageC  s$   € ä�vÐ2°DÓ9×]Ð]¼WÀVÈYÐX\Ó=]Ð]r   Úlevelr  zunauthorized userc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r  r   Nrž   )r   r…  s   "€r   r   r†  G  s   ø€ ÷ =ñ =ÁSð =Ðcgñ =r   c               ó�   € \         P                  VR V\        \        VRR4      RR4      \        \        VRR4      RR4      4       R# )z#[Telegram] Blocked %s %s in chat %sr�  NrZ   r‘  )r7   Úlogr]   )r“  r7  r  r  s   &&$$r   Ú_log_blocked_userÚ!TelegramAdapter._log_blocked_userG  sD   € Ü�
‰
ØÐ8¸$ÄÌÐPSÐU`ÐbfÓHgÐimÐosÓ@tÜ”G˜C ¨Ó.°°dÓ;ö	=r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   rØ  r   )r¹   rB   )r   r…  s   "€r   r   r†  L  s   ø€ ÷ ñ ±kð Ádñ r   c                ó    € V P                  V4      '       d   R# V P                  V4      '       d   V P                  WVP                  R7       R# )zQGroup trigger gate; observes unmentioned chatter when configured. True = proceed.TrÜ  F)rõ  ru  rç  rÙ  )r“  r7  r£  rØ  s   &&&&r   Ú_gate_or_observeÚ TelegramAdapter._gate_or_observeL  sC   € à×'Ñ'¨×,Ò,ÙØ×9Ñ9¸#×>Ò>Ø×3Ñ3°CÈV×M]ÑM]Ð3Ô^Ùr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r  )r¹   r¸   )r   r…  s   "€r   r   r†  T  s    ø€ ÷ Eñ EÁ+ð EÑR^ñ Er   c              ƒ  óØ   "  € ^ RI Hp V P                  WVP                  R7      pV! WVP                  4      Vn        V P                  W4      G Rj  x€L
  V P                  V4      #  L5i)z~Event for an addressed text/command: trigger text cleaned (sole addressee only), replied-to
media cached, attribution applied.©Úgroup_trigger_textrÜ  N)Ú+plugins.platforms.telegram.telegram_contextr  rà  rÙ  r+   rÁ  r�  )r“  r7  r£  rØ  r  r  s   &&&&  r   Ú_build_triggered_eventÚ&TelegramAdapter._build_triggered_eventT  sb   é € õ 	SØ×)Ñ)¨#À6×CSÑCSÐ)ÓTˆÙ'¨°5·:±:Ó>ˆŒ
Ø×'Ñ'¨Ó3×3Ð3Ø×=Ñ=¸eÓDÐDñ 	4ùs   ‚AA*ÁA(ÁA*c                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# rc	  rd	  )r   r…  s   "€r   r   r†  ]  s.   ø€ ÷ cñ c±ð cÁ,×B[ÑB[ð cÐ`dñ cr   c              ƒ  óÈ  "  € V P                  V4      pV'       d   VP                  '       g   R# V P                  V4      '       g   V P                  V4       R# V P	                  W1\
        P                  4      '       g   R# V P                  VP                  4      G Rj  x€L
  T P                  V P                  W1\
        P                  4      G Rj  x€L
 4       R#  L= L5i)zHHandle incoming text; buffers client-split chunks into one MessageEvent.N)rÿ  r+   rÍ  r  r
  r¹   r[  rú  r%  Ú_enqueue_text_eventr  )r“  r£  r  r7  s   &&& r   r]  Ú$TelegramAdapter._handle_text_message]  s¦   é € à×,Ñ,¨VÓ4ˆß˜#Ÿ(Ÿ(˜(Ùà×4Ñ4°S×9Ò9Ø×"Ñ" 3Ô'ÙØ×$Ñ$ S´+×2BÑ2B×CÒCÙØ×)Ñ)¨&¯.©.Ó9×9Ð9Ø× Ñ  t×'BÑ'BÀ3ÔP[×P`ÑP`Ó'a×!aÖbñ 	:Ù!aùs/   ‚+C"®C"ÁAC"Â CÂ!2C"ÃC ÃC"Ã C"c                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# rc	  rd	  )r   r…  s   "€r   r   r†  k  s)   ø€ ÷ )ñ )©Fð )¹\×=VÑ=Vð )Ð[_ñ )r   c              ƒ  ó4  "  € V P                  V4      pV'       d   VP                  '       g   R# V P                  VRR7      '       g   R# V P                  V4      '       g   V P	                  V4       R# V P                  V4      G Rj  x€L
  V P                  W1\        P                  4      G Rj  x€L
 p\        VP                  ;'       g    R4      V P                  8¼  d   V P                  V4       R# V P                  V4      G Rj  x€L
  R#  Lˆ Lb L
5i)z!Handle incoming command messages.NT)rñ  r!   )rÿ  r+   rõ  rÍ  r  rú  r  r¹   r\  r+  Ú_SPLIT_THRESHOLDr  rK  )r“  r£  r  r7  r  s   &&&  r   r^  ÚTelegramAdapter._handle_commandk  sà   é € à×,Ñ,¨VÓ4ˆß˜#Ÿ(Ÿ(˜(ÙØ×+Ñ+¨C¸DÐ+×AÒAÙØ×4Ñ4°S×9Ò9Ø×"Ñ" 3Ô'ÙØ×)Ñ)¨#Ó.×.Ð.Ø×1Ñ1°#¼{×?RÑ?RÓS×Sˆô ˆu�z‰z×Ð˜RÓ  D×$9Ñ$9Ô9Ø×$Ñ$ UÔ+ÙØ×!Ñ! %Ó(×(Ò(ñ 	/ÙSñ 	)ùsL   ‚+D®DÁ	DÁ"'DÂ	DÂ
'DÂ1DÂ2DÃ=DÄDÄDÄDÄDc                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# rc	  rd	  )r   r…  s   "€r   r   r†  ~  s.   ø€ ÷ Yñ Y±Vð YÁl×F_ÑF_ð YÐdhñ Yr   c              ƒ  óf  "  € V P                  V4      pV'       g   R# V P                  V4      '       g   V P                  V4       R# V P                  W1\        P
                  4      '       g   R# \        VRR4      pV'       d   \        VRR4      M\        VRR4      pV'       g   R# \        VRR4      p\        VRR4      pVe   Vf   R# R.pV'       dS   \        VRR4      p	\        VRR4      p
V	'       d   VP                  R	V	 24       V
'       d   VP                  R
V
 24       VRV 2RV 2RV RV 2R.,          pV P                  V\        P
                  VP                  R7      pRP                  V4      Vn        V P                  V P                  V4      4      G Rj  x€L
  R#  L5i)z,Handle incoming location/venue pin messages.NÚ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=ro  zSAsk what they'd like to find nearby (restaurants, cafes, etc.) and any preferences.rÜ  ra  )rÿ  rÍ  r  r
  r¹   r_  r]   rd  rà  rÙ  rh  r+   rK  r�  )r“  r£  r  r7  r  r  ÚlatÚlonr£	  r–  r!  r  s   &&&         r   r`  Ú(TelegramAdapter._handle_location_message~  s•  é € à×,Ñ,¨VÓ4ˆßÙØ×4Ñ4°S×9Ò9Ø×"Ñ" 3Ô'ÙØ×$Ñ$ S´+×2FÑ2F×GÒGÙÜ˜˜W dÓ+ˆß7<”7˜5 *¨dÔ3Ä'È#ÈzÐ[_ÓB`ˆßÙÜ�h 
¨DÓ1ˆÜ�h ¨TÓ2ˆØŠ;˜#š+ÙØ4Ð5ˆßÜ˜E 7¨DÓ1ˆEÜ˜e Y°Ó5ˆGßØ—‘˜w u gÐ.Ô/ßØ—‘˜y¨¨	Ð2Ô3ØØ˜˜Ð +¨c¨UÐ 3Ð7lÐmpÐlqÐqrÐsvÐrwÐ5xØaðcõ 	cˆð ×)Ñ)¨#¬{×/CÑ/CÈv×O_ÑO_Ð)Ó`ˆØ—Y‘Y˜uÓ%ˆŒ
Ø×!Ñ! $×"PÑ"PÐQVÓ"WÓX×XÔXùs*   ‚2F1µA1F1Â'0F1Ã=F1ÄBF1Æ(F/Æ)F1c                ó&   <€ V ^8„  d   QhRS[ RS[/# r}  r~  )r   r…  s   "€r   r   r†  ¡  s   ø€ ÷ .ñ .¡\ð .±cñ .r   c                óD   <€ V P                  V4       \        SV `	  V4      # )zeSession-scoped batching key; topic recovery first so DM-topic batches coalesce on the recovered lane.)Ú_apply_topic_recoveryrµ  Ú_text_batch_keyrL  s   &&€r   r(  ÚTelegramAdapter._text_batch_key¡  s!   ø€ à×"Ñ" 5Ô)Ü‰wÑ& uÓ-Ð-r   c                ó$   <€ V ^8„  d   QhRS[ RR/# rH  rI  )r   r…  s   "€r   r   r†  ¦  s   ø€ ÷ ñ ©ð ¸$ñ r   c                óœ   <€ V P                  4       '       d   V P                  VRR7       R# \        SV `  V4       V P	                  4        R# )zGBuffer a text chunk, or hold it while delayed delivery must be dropped.ztext-enqueuer   N)rK  r%  rµ  r  r  rL  s   &&€r   r  Ú#TelegramAdapter._enqueue_text_event¦  sA   ø€ à×-Ñ-×/Ò/Ø×$Ñ$ U°.Ð$ÔAÙÜ‰Ñ# EÔ*Ø×ÑÖr   c                ó<   <€ V ^8„  d   QhRS[ RS[ RS[RS[RS[RR/# )r   rO  rq  r¤   r3  r!  r   N)r  r   rA   )r   r…  s   "€r   r   r†  ®  s:   ø€ ÷ '%ñ '%©Tð '%¹$ð '%ÁSð '%ÑQVð '%Ñ_bð '%Ðtxñ '%r   c              ƒ  óL  "  € \         P                  ! 4       pV P                  P                  R/ 4      pRp	 \         P                  ! V4      G Rj  x€L
  VP                  V4      p
V
e[   W§JdV    VP                  WS34      VJ d   VP                  WS3R4       VP                  V4      VJ d   VP                  VR4       R# R# VP                  VR4      p	V	'       gV    VP                  WS34      VJ d   VP                  WS3R4       VP                  V4      VJ d   VP                  VR4       R# R# VP                  VR4       VP                  WS34      pWxWS3&   Ve6   VP                  4       '       g    \         P                  ! V04      G Rj  x€L
  V P                  4       '       dm   V P                  W• R2R7       Rp	 VP                  WS34      VJ d   VP                  WS3R4       VP                  V4      VJ d   VP                  VR4       R# R# Ve	   V! V	4       V P                  V	4      G Rj  x€L
  Rp	 TP                  YS34      TJ d   TP                  YS3R4       TP                  T4      TJ d   TP                  TR4       R# R#  ELC EL La  \         P                   d    T	e   T P                  Y• R2R7       h i ; i  TP                  YS34      TJ d   TP                  YS3R4       TP                  T4      TJ d   TP                  TR4       i i ; i5i)z¦Shared delayed-flush body: sleep, pop, hold if teardown started, else dispatch. A cancel after
the pop but before durable dispatch re-holds the event (never lose it).rØ  Nz-flushr   z-flush-cancelled)r0   r„  rÇ  r¦  rC  r  rY   r{  rÒ   rK  r%  rK  r6   )r“  rO  rq  r¤   r3  r!  Úlog_fnr„  Ú	committedr  Úownerr€  s   &&&&&&&     r   Ú_flush_bufferedÚTelegramAdapter._flush_buffered®  sÐ  é € ô ×+Ò+Ó-ˆØ—M‘M×,Ñ,Ð-EÀrÓJˆ	Øˆð!	%Ü—-’- Ó&×&Ð&ð —I‘I˜c“NˆEØÒ  UÓ%>Øð0 �}‰}˜e˜\Ó*¨lÓ:Ø—‘˜u˜l¨DÔ1Ø�y‰y˜‹~ Ó-Ø—	‘	˜#˜tÖ$ñ .ð3 —K‘K  TÓ*ˆEßØð* �}‰}˜e˜\Ó*¨lÓ:Ø—‘˜u˜l¨DÔ1Ø�y‰y˜‹~ Ó-Ø—	‘	˜#˜tÖ$ñ .ð) �I‰I�c˜4Ô Ø—M‘M 5 ,Ó/ˆEØ&2�u�lÑ#ØÒ ¨¯©¯ªÜ—l’l E 7Ó+×+Ð+Ø×1Ñ1×3Ò3Ø×(Ñ(¨¸¸vÐ6FÐ(ÔGØ�Øð �}‰}˜e˜\Ó*¨lÓ:Ø—‘˜u˜l¨DÔ1Ø�y‰y˜‹~ Ó-Ø—	‘	˜#˜tÖ$ñ .ð Ò!Ù�u”Ø×%Ñ% eÓ,×,Ð,Ø‰Eð �}‰}˜e˜\Ó*¨lÓ:Ø—‘˜u˜l¨DÔ1Ø�y‰y˜‹~ Ó-Ø—	‘	˜#˜tÖ$ñ .ò? 'ò ,ñ -øä×%Ñ%ô 	ØÒ Ø×(Ñ(¨¸Ð?OÐ6PÐ(ÔQØð	ûð
 �}‰}˜e˜\Ó*¨lÓ:Ø—‘˜u˜l¨DÔ1Ø�y‰y˜‹~ Ó-Ø—	‘	˜#˜tÕ$ð .üs”   ‚4L$·J ÁJÁJ Á0AL$ÃJ ÃAL$Ä3AJ Å6J ÆJÆJ Æ+J ÇAL$È J È7JÈ8J È?AL$ÊJ ÊJ ÊJ Ê0KËK ËAL!Ì!L$c                ó6   <€ V ^8„  d   QhRS[ S[,          RS[/# )r   rO  r   )r   r¸   rA   )r   r…  s   "€r   r   r†  ×  s    ø€ ÷ .ñ .©X±lÕ-Cð .Éñ .r   c                ó”  € V'       d   \        VR^ 4      M^ pV'       d!   \        \        VRR4      ;'       g    R4      M^ pW P                  8¼  d   V P                  # W0P                  8:  d!   \        V P                  V P                  4      # W0P                  8:  d!   \        V P                  V P                  4      # V P                  # )u¾   Adaptive delay: near-split-point last chunk â†’ long delay (continuation almost certain);
short/medium totals â†’ capped fast delays; else configured cap (all min()'d with the operator cap).Ú_last_chunk_lenr+   r!   )
r]   r+  r  rÞ  Ú_TEXT_BATCH_FAST_LENr‹  rÛ  Ú_TEXT_BATCH_FAST_DELAY_SÚ_TEXT_BATCH_SHORT_LENÚ_TEXT_BATCH_SHORT_DELAY_S)r“  rO  Úlast_lenÚ	total_lens   &&  r   Ú_text_batch_delay_forÚ%TelegramAdapter._text_batch_delay_for×  s¥   € ÷ >E”7˜7Ð$5°qÔ9È!ˆß?F”Cœ ¨°Ó4×:Ð:¸Ô;ÈAˆ	Ø×,Ñ,Ô,Ø×7Ñ7Ð7Ø×1Ñ1Ô1Ü�t×5Ñ5°t×7TÑ7TÓUÐUØ×2Ñ2Ô2Ü�t×5Ñ5°t×7UÑ7UÓVÐVØ×-Ñ-Ð-r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r¤   r   Nrž   )r   r…  s   "€r   r   r†  ä  s   ø€ ÷ mñ m©3ð m°4ñ mr   c           
   ƒ  óÐ   a"  € V P                  V P                  V P                  SV P                  V P                  P	                  S4      4      RV3R l4      G Rj  x€L
  R#  L5i)u  Telegram keeps its own flush body: a cancel after the pop must HOLD the event and re-raise
(PTB already acked the update; the hold queue redispatches after reconnect) rather than shield
the dispatch â€” teardown must be able to stop a flush from reaching a torn-down session.r+   c                 ól   <€ \         P                  R S\        V P                  ;'       g    R4      4      # )z,[Telegram] Flushing text batch %s (%d chars)r!   )r7   rç   r+  r+   )Úevr¤   s   &€r   r¾  Ú3TelegramAdapter._flush_text_batch.<locals>.<lambda>ë  s*   ø€ ”v—{‘{Ð#QÐSVÔX[Ð\^×\cÑ\c×\iÐ\iÐgiÓXjÔkr   N)r2  r$  r#  r=  r  )r“  r¤   s   &fr   Ú_flush_text_batchÚ!TelegramAdapter._flush_text_batchä  sZ   øé € ð ×"Ñ"Ø×&Ñ&¨×(FÑ(FÈØ×&Ñ& t×'AÑ'A×'EÑ'EÀcÓ'JÓKÈVÜkóm÷ 	mô 	mùs   ƒAA&ÁA$ÁA&c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r  r7  r   )r¸   rq   r   )r   r…  s   "€r   r   r†  ï  s'   ø€ ÷ kñ k¡lð k¹ð kÁSñ kr   c                óf   € V P                  V4      p\        VRR4      pV'       d   V RV 2# V R2# )z1Return a batching key for Telegram photos/albums.Úmedia_group_idNz:album:z:photo-burst)Ú_event_session_keyr]   )r“  r  r7  r*  rH  s   &&&  r   Ú_photo_batch_keyÚ TelegramAdapter._photo_batch_keyï  sD   € à×-Ñ-¨eÓ4ˆÜ  Ð&6¸Ó=ˆß:H�+�˜g nÐ%5Ð6ÐjÐQ\ÐP]Ð]iÐNjÐjr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Ú	batch_keyr   Nrž   )r   r…  s   "€r   r   r†  õ  s   ø€ ÷ zñ z±#ð z¸$ñ zr   c           	   ƒ  ó”   a"  € V P                  V P                  V P                  SV P                  RV3R l4      G Rj  x€L
  R#  L5i)z;Send a buffered photo burst/album as a single MessageEvent.r´   c                 óX   <€ \         P                  R S\        V P                  4      4      # )z3[Telegram] Flushing photo batch %s with %d image(s))r7   rç   r+  r¯  )rB  rM  s   &€r   r¾  Ú4TelegramAdapter._flush_photo_batch.<locals>.<lambda>ù  s!   ø€ ”v—{‘{Ð#XÐZcÔehÐik×ivÑivÓewÔxr   N)r2  rÔ  rÕ  rÓ  )r“  rM  s   &fr   Ú_flush_photo_batchÚ"TelegramAdapter._flush_photo_batchõ  sC   øé € à×"Ñ"Ø×'Ñ'¨×)HÑ)HÈ)ÐUY×UtÑUtÐv}Üxóz÷ 	zô 	zùs   ƒ<A¿AÁ Ac                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r   rO  r¤   r  r   N)r  r   r¸   )r   r…  s   "€r   r   r†  û  s0   ø€ ÷ 	Kñ 	K©4ð 	K±cð 	KÁ,ð 	KÐSWñ 	Kr   c                óN  € VP                  V4      pVf   W1V&   R# VP                  P                  VP                  4       VP                  P                  VP                  4       VP                  '       d.   V P                  VP                  VP                  4      Vn        R# R# )zCMerge ``event`` into ``pending[key]`` (media + caption) or seed it.N)r  r¯  r\   r°  r+   Ú_merge_caption)r“  rO  r¤   r  rN  s   &&&& r   Ú_merge_into_pendingÚ#TelegramAdapter._merge_into_pendingû  s~   € à—;‘;˜sÓ#ˆØÒØ �C‰LÙØ×Ñ×"Ñ" 5×#3Ñ#3Ô4Ø×Ñ×#Ñ# E×$5Ñ$5Ô6Ø�:�:ˆ:Ø ×/Ñ/°·±¸u¿z¹zÓJˆHŽMñ r   c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   rM  r  r   N©r   r¸   )r   r…  s   "€r   r   r†    s'   ø€ ÷ 
mñ 
m©cð 
m¹,ð 
mÈ4ñ 
mr   c                óª  € V P                  4       '       d   V P                  VRR7       R# V P                  V P                  W4       V P	                  4        V P
                  P                  V4      pV'       d'   VP                  4       '       g   VP                  4        \        P                  ! V P                  V4      4      V P
                  V&   R# )z;Merge photo events into a pending batch and schedule flush.zphoto-enqueuer   N)rK  r%  rV  rÔ  r  rÕ  r  r{  r|  r0   rÒ  rQ  )r“  rM  r  Ú
prior_tasks   &&& r   Ú_enqueue_photo_eventÚ$TelegramAdapter._enqueue_photo_event  s¡   € à×-Ñ-×/Ò/Ø×$Ñ$ U°/Ð$ÔBÙØ× Ñ  ×!<Ñ!<¸iÔOØ×ÑÔØ×4Ñ4×8Ñ8¸ÓCˆ
ß˜jŸo™o×/Ò/Ø×ÑÔÜ5<×5HÒ5HÈ×I`ÑI`ÐajÓIkÓ5lˆ×'Ñ'¨	Ó2r   c                ó$   <€ V ^8„  d   QhRS[ RR/# rH  rI  )r   r…  s   "€r   r   r†    s   ø€ ÷ Pñ P±<ð PÀDñ Pr   c              ƒ  óú   "  € V P                  V4      '       d   R# \        VRR4      pV'       d&   V P                  \        V4      V4      G Rj  x€L
  R# V P	                  V P                  W!4      V4       R#  L)5i)zSAlbum items debounce on media_group_id; singles go through the photo burst batcher.NrH  )Ú_drop_unresolvedr]   Ú_queue_media_group_eventr   r\  rJ  )r“  r7  r  rH  s   &&& r   Ú_route_photo_eventÚ"TelegramAdapter._route_photo_event  sg   é € à× Ñ  ×'Ò'ÙÜ  Ð&6¸Ó=ˆßØ×/Ñ/´°NÓ0CÀUÓK×KÒKà×%Ñ% d×&;Ñ&;¸EÓ&GÈÖOñ Lùs   ‚AA;ÁA9Á*A;c                ó<   <€ V ^8„  d   QhRS[ S[,          RS[RS[/# )r   ro
  rr  r   rN
  )r   r…  s   "€r   r   r†    s&   ø€ ÷ ñ ¡(©3¥-ð Ácð Écñ r   c                ó~   € V '       d5   V P                  4       pV F  pVP                  V4      '       g   K  Vu # 	  V# )z`First extension in ``candidates`` that ``file_path`` ends with (case-insensitive), else default.)rø   r3  )ro
  r  rr  r�  r  s   &&&  r   Ú_ext_from_pathÚTelegramAdapter._ext_from_path  s;   € ÷ Ø—o‘oÓ'ˆGÛ'�	Ø×#Ñ# I×.Ô.Ø$Ò$ñ (ð ˆr   c                óD   <€ V ^8„  d   QhRS[ RS[RS[RS[RS[RS[RS[/# )r   r  rˆ  r;   rë  r&
  r¦  r   )r¸   r   r   rB   )r   r…  s   "€r   r   r†  &  sG   ø€ ÷ ñ ±,ð Éð ÑTWð Ñ_bð Ñilð Ñtwð ñ  }Añ r   c           	   ƒ  ó|  "  €  V P                  W44      w  r‰V'       gi   T P                  VP                  T	;'       g    R4      Vn        \        P	                  RV\        VRR4      4       V P                  V4      G Rj  x€L
  R# VP                  4       G Rj  x€L
 p
V
P                  4       G Rj  x€L
 pVR8X  dY   V P                  \        V
RR4      \        V4      p\        \        V4      VR7      G Rj  x€L
 p\        P                  ! VR	4      pM\        \        V4      VR7      G Rj  x€L
 pV.Vn        V.Vn        \        P	                  R
W\4       R#  LÛ LÃ L­ Lh L4  \"         dI   p\        P%                  RT\'        T4      RR7       T P)                  YYM4      G Rj  x€L 
   Rp?R# Rp?ii ; i5i)z£Download a voice/audio/video attachment into the local cache. Returns True when the event was
already dispatched (oversized attachment), so the caller must return.r!   z.[Telegram] Skipped oversized user %s (size=%s)r%
  NTrÍ
  ro
  ©r&
  rÅ  z[Telegram] Cached user %s at %srŸ  r3   F)r?
  r®  r+   r7   rç   r]   rK  r£  r¥  rf  r–   r”   r¤  r  r“   r¯  r°  r*   r-  r,   rÕ  )r“  r7  r  rˆ  r;   rë  r&
  r¦  rÊ  r·  r§  r¾  Úcached_pathr  s   &&&&&&&&      r   Ú_cache_inbound_avÚ!TelegramAdapter._cache_inbound_av&  s{  é € ð	JØ ×=Ñ=¸fÓL‰MˆGßØ!×7Ñ7¸¿
¹
ÀDÇJÀJÈBÓO�”
Ü—‘ÐLÈdÔT[Ð\bÐdoÐquÓTvÔwØ×)Ñ)¨%Ó0×0Ð0ÙØ#Ÿ_™_Ó.×.ˆHØ!×7Ñ7Ó9×9ˆDØ�wŒØ×)Ñ)¬'°(¸KÈÓ*NÔPeÐgjÓk�Ü$@ÄÀtÃÐRUÔ$V×V�Ü,×0Ò0°°kÓB‘ä$@ÄÀtÃÐRUÔ$V×V�Ø +˜}ˆEÔØ!% ˆEÔÜ�K‰KÐ9¸4ÔMñ ñ! 1á.Ù9ñ Wñ Wøô ô 	JÜ�N‰NÐ>ÀÔFaÐbcÓFdÐosˆNÔtØ×3Ñ3°CÀÓI×IÕIÙûð	Jüs§   ‚F<„9E& ¾AE& Â EÂE& ÂF<ÂE& ÂEÂE& Â2E Â3AE& Ã9E"Ã:5E& Ä/E$Ä0*E& ÅF<ÅE& ÅE& Å E& Å"E& Å$E& Å&F9Å17F4Æ(F+Æ)F4Æ.F<Æ4F9Æ9F<c                ó,   <€ V ^8„  d   QhRS[ RS[RS[/# )r   r  r+   r   )r¸   r   rB   )r   r…  s   "€r   r   r†  @  s"   ø€ ÷ ñ ©|ð Á3ð É4ñ r   c              ƒ  óP   "  € W!n         V P                  V4      G Rj  x€L
  R#  L5i)zWReplace the event text with a user-facing note and dispatch it; returns True (handled).NT)r+   rK  )r“  r  r+   s   &&&r   Ú_dispatch_with_textÚ#TelegramAdapter._dispatch_with_text@  s&   é € àŒ
Ø×!Ñ! %Ó(×(Ð(Ùñ 	)ùs   ‚&�$ž&c                ó<   <€ V ^8„  d   QhRS[ RS[RS[RS[RS[RR/# )r   r  rã   r¦  r”  r¸  r   N)r¸   r   r¹   )r   r…  s   "€r   r   r†  G  s9   ø€ ÷ #ñ #¡ð #±Sð #Áð #ÉKð #Ñbeð #Ðjnñ #r   c                ó\   € V.V n         V.V n        W0n        \        P	                  WA4       R # rP   )r¯  r°  r‹  r7   rç   )r  rã   r¦  r”  r¸  s   &&&&&r   Ú_set_cached_mediaÚ!TelegramAdapter._set_cached_mediaF  s(   € à ˜6ˆÔØ!˜FˆÔØ"ÔÜ�‰�GÖ"r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# r}  )r¸   rB   )r   r…  s   "€r   r   r†  M  s   ø€ ÷ Qñ Q¹ð QÉñ Qr   c              ƒ  ó¦  "  € VP                   p VP                  ;'       g    RpV'       d5   \        P                  P	                  V4      ^,          P                  4       MRpVP                  ;'       g    RP                  4       pV'       g`   V'       dX   \        P                  VR4      pV'       g:   \        P                  ! 4        UUu/ uF  w  rxW‡bK	  	  uppP                  VR4      pT;'       g    T;'       g    T;'       g    Rp	VP                  '       d   VP                  V P                  8”  dP   \        P                  RVP                  4       V P                  VRV P                  R',           R24      G Rj  x€L
 # V\         9   g   VP#                  R4      '       dÝ   VP%                  4       G Rj  x€L
 p
V
P'                  4       G Rj  x€L
 pV\         9   d   TM\        P                  VR4      p \)        \+        V4      VR	7      G Rj  x€L
 pT P3                  Y-TP#                  R4      '       d   TM\4        P                  TR4      \6        P8                  R4       T P;                  Y4      G Rj  x€L
  R# V'       gV   VP                  '       dD   \<        P                  ! 4        UUu/ uF  w  rxW‡bK	  	  uppP                  VP                  R4      pV'       gb   VP                  '       dP   / p\>        P                  ! 4        F  w  ppVPA                  VV4       K  	  VP                  VP                  R4      pV\<        9   d–   VP%                  4       G Rj  x€L
 p
V
P'                  4       G Rj  x€L
 pT P3                  T\C        \+        V4      VR	7      G Rj  x€L
 \<        V,          \6        PD                  R4       V PG                  V4      G Rj  x€L
  R# VP%                  4       G Rj  x€L
 p
\+        V
P'                  4       G Rj  x€L
 4      p^ RI$H%p T! TT;'       g    RT;'       g    R 2VR7      G Rj  x€L
 pVf   V P                  VRV	 R24      G Rj  x€L
 # VP                  .Vn&        VPN                  .Vn(        R.Vn)        VPT                  R8X  d   \6        PV                  Vn,        \        P                  RVPT                  VP                  VPN                  4       R(pV\Z        9   ;'       g    T;'       g    RP#                  R4      pV'       dŽ   \]        V4      V8:  d~    VP_                  R4      p\`        Pb                  ! RRT;'       g    RT;'       g    R 24      pR V R!V 2pVPd                  '       d   V R"VPd                   2MTVn2        R.Vn)        R# R# u uppi  ELG EL ELû EL¼  \,         dK   p\        P/                  R
\1        T4      RR7       T P                  TRT	 R24      G Rj  x€L 
 u Rp?# Rp?ii ; i EL¯u uppi  ELÍ EL¸ EL‘ EL[ ELD EL* ELù ELÚ  \f         d     R# i ; i  \h         d`   p\        P/                  R#\1        T4      RR7       T Pk                  YR$T\m        TR%R4      ;'       g    RR&7      G Rj  x€L 
   Rp?R# Rp?ii ; i5i))u´   Cache a document attachment (image â†’ photo path, video, else generic media + text injection).
Returns True when the event was already dispatched/routed so the caller must return.r!   rÂ	  z'[Telegram] Document too large: %s byteszFThe document is too large or its size could not be verified. Maximum: z MB.Núimage/rË   rj  z-[Telegram] Failed to cache image document: %sTr3   zImage document 'z ' could not be read as an image.r×   z+[Telegram] Cached user image-document at %sz+[Telegram] Cached user video document at %srš  rÃ
  z.bin)rÅ
  r�  z
Document 'z' could not be cached.Frl
  z$[Telegram] Cached user %s at %s (%s)ztext/rî   z	[^\w.\- ]rj  z.txtz[Content of z]:
rA  z'[Telegram] Failed to cache document: %sr³   r¥
  )r¿  r  i � )7rÃ
  r¥
  rö   rã   r÷   rø   r�  Ú_TELEGRAM_IMAGE_MIME_TO_EXTr  r—   r
  r%
  r  r7   rç   rp  Ú_TELEGRAM_IMAGE_EXTENSIONSrJ	  r£  r¥  r’   r¤  rÞ   r-  r,   rt  Ú_TELEGRAM_IMAGE_EXT_TO_MIMEr¹   ra  rb  r–   r˜   r¦  r”   rb  rK  ru
  r›  r¯  rº  r°  Úmedia_text_inlinedrë  rc  r‹  r™   r+  rë	  rU  rN  r+   rA  r*   rÕ  r]   )r“  r7  r  rÇ  Úoriginal_filenamer&
  Údoc_mimer  r  Údisplayr§  Úimage_bytesÚ	image_extrk  r  Úimage_mime_to_extrA  Ú_mimeÚvideo_bytesÚ	raw_bytesr›  r©  ÚMAX_TEXT_INJECT_BYTESÚ_is_textÚtext_contentr¿  Ú	injections   &&&                        r   Ú_cache_inbound_documentÚ'TelegramAdapter._cache_inbound_documentM  s  é € ð �l‰lˆðL	GØ #§¡× 3Ð 3°ÐßDU”"—'‘'×"Ñ"Ð#4Ó5°aÕ8×>Ñ>Ô@Ð[]ˆCØŸ™×+Ð+¨×2Ñ2Ó4ˆHßŸ8Ü1×5Ñ5°hÀÓC�ßÜ,D×,JÒ,JÔ,LÔMÑ,L¡D A˜1š4Ñ,LÒM×QÑQÐRZÐ\^Ó_�CØ'×GÐG¨8×GÐG°s×GÐG¸iˆGà—=—=�= C§M¡M°D×4GÑ4GÔ$GÜ—‘ÐEÀsÇ}Á}ÔUØ!×5Ñ5ØÐcÐdh×dwÑdwð  }Hõ  eIð  dJð  JNð  OóP÷ Pð Pð Ô0Ô0°H×4GÑ4GÈ×4QÒ4QØ!$§¡£×/�Ø$,×$BÑ$BÓ$D×D�Ø#&Ô*DÔ#D™CÔJe×JiÑJiÐjrÐtzÓJ{�	ðÜ(DÄUÈ;ÓEWÐ]fÔ(g×"g�Kð ×&Ñ&Ø°H×4GÑ4GØ ÷5ò 5©ä6×:Ñ:¸9ÀlÓSÜ×%Ñ%Ð'Tô	Vð
 ×-Ñ-¨cÓ9×9Ð9Ùß˜3Ÿ=Ÿ=˜=Ü(=×(CÒ(CÔ(EÔFÑ(E¡ �q’tÑ(EÒF×JÑJÈ3Ï=É=ÐZ\Ó]�ß˜3Ÿ=Ÿ=˜=à46Ð!Ü#A×#GÒ#GÖ#I‘K�D˜%Ø%×0Ñ0°¸Ö=ñ $Jà'×+Ñ+¨C¯M©M¸2Ó>�ØÔ+Ô+Ø!$§¡£×/�Ø$,×$BÑ$BÓ$D×D�Ø×&Ñ&ØÔ!=¼eÀKÓ>PÐVYÔ!Z×ZÔ\qÐruÕ\vô  yD÷  yJñ  yJØAôCð ×)Ñ)¨%Ó0×0Ð0Ùð !Ÿ\™\›^×+ˆHÜ H×$BÑ$BÓ$D×DÓEˆIÝFÙ2°9ÐGX×GvÐGvÐ^fÐgj×gtÐgtÐntÐfuÐ\vð  CKô  L÷  LˆFØŠ~Ø!×5Ñ5°e¸zÈ'ÈÐRhÐ=iÓj×jÐjØ &§¡˜}ˆEÔØ!'×!2Ñ!2Ð 3ˆEÔØ(- wˆEÔ$Ø�{‰{˜gÔ%Ü%0×%6Ñ%6�Ô"Ü�K‰KÐ>ÀÇÁÈVÏ[É[ÐZ`×ZkÑZkÔlð %/Ð!ØÔ5Ñ5×]Ð]¸(¿.¸.Àb×9TÑ9TÐU\Ó9]ˆHßœC 	›NÐ.CÔCðØ#,×#3Ñ#3°GÓ#<�LÜ#%§6¢6¨,¸Ð=N×=lÐ=lÐT\Ð]`×]jÐ]jÐdjÐ\kÐRlÓ#m�LØ".¨|¨n¸DÀÀÐ O�IØCHÇ:Ç:À: I ;¨d°5·:±:°,Ñ!?ÐS\�E”JØ04¨v�EÔ,ó ùóM Nò
Pò 0ÚDò #høÜ!ô Ü—N‘NÐ#RÔToÐpqÓTrð  ~B�Nô  CØ!%×!9Ñ!9¸%ÐCSÐT[ÐS\Ð\|ÐA}Ó!~×~Ð~Õ~ûðúò :ùó Gò 0ÚDâZâ0ò ,ÚDò Lâjøô$ *ô Øñ ðûäô 	GÜ�N‰NÐDÔFaÐbcÓFdÐosˆNÔtØ×3Ñ3°CÀÈaÔ^eÐfiÐkvÐx|Ó^}÷  _Fð  _Fð  BFÐ3ó  G÷  Gõ  GÙûð	GüsU  ‚[�Y$ ®AY$ Á7Y$ ÂY$ ÂY$ Â6Y$ ÃWÃY$ Ã8	Y$ Ä	Y$ ÄY$ Ä!A%Y$ ÆWÆY$ Æ
[Æ!Y$ Æ-Y$ Ç WÇY$ ÇWÇ'Y$ ÈW ÈWÈW ÈA#Y$ ÊX1ÊY$ Ê[Ê	Y$ ÊY$ Ê#Y$ Ê;X4Ë%Y$ Ë.Y$ Ì A-Y$ Í-X:Í.Y$ ÎX=Î)Y$ Î/Y 
Î08Y$ Ï(YÏ)Y$ Ï-[Ï/Y$ ÐYÐY$ ÐY	Ð Y$ Ð:
Y$ ÑY$ ÑYÑ!Y$ Ñ5YÑ6Y$ Ñ9[Ñ:BY$ Ô	Y$ ÔY$ Ô8Y$ Õ	+Y Õ5
Y Ö "Y Ö# Y ×[×Y$ ×Y$ ×Y$ ×W ×X.×$:X)ØX!ØX)Ø#X.Ø$Y$ Ø([Ø)X.Ø.Y$ Ø4Y$ Ø=Y$ Ù Y$ ÙY$ ÙY$ Ù	Y$ ÙY$ ÙY$ ÙY!ÙY$ Ù[Ù Y!Ù!Y$ Ù$[Ù/A[	Ú=[ Ú>[	Û[Û	[Û[c                ó>   <€ V ^8„  d   QhRS[ RS[P                  RR/# rc	  rd	  )r   r…  s   "€r   r   r†     s)   ø€ ÷ 8)ñ 8)±&ð 8)Á<×C\ÑC\ð 8)Ðaeñ 8)r   c           	   ƒ  ó	  "  € VP                   pV'       g   R# V P                  V4      '       g%   V P                  V\        P                  RR7       R# V P                  V4      '       g¸   V P                  V4      '       dŸ   V P                  W0P                  V4      VP                  R7      pVP                  '       d    V P                  \        V4      4      Vn        V P                  W44      G Rj  x€L
  V P                  W4P                   VP                  VR7       R# V P                  W0P                  V4      VP                  R7      pVP                  '       d   ^ RIHp V! W\        V4      4      Vn        VP&                  '       dD   V P)                  W54      G Rj  x€L
  V P+                  V P-                  V4      4      G Rj  x€L
  R# V P-                  V4      pVP.                  '       dÊ    VP.                  R,          P1                  4       G Rj  x€L
 pVP3                  4       G Rj  x€L
 pV P5                  VP6                  . ROR4      p	T P9                  T\;        \=        V4      V	R7      G Rj  x€L
 R	V	P?                  R
4       2VP                   R4       V PA                  W54      G Rj  x€L
  R# VPL                  '       d2   V PO                  W5VPL                  RRRR4      G Rj  x€L
 '       d   R# M¹VPP                  '       d2   V PO                  W5VPP                  RRRR4      G Rj  x€L
 '       d   R# MvVPR                  '       d2   V PO                  W5VPR                  RRRR4      G Rj  x€L
 '       d   R# M3VPT                  '       d"   V PW                  W54      G Rj  x€L
 '       d   R# \Y        VRR4      pV'       d&   V P[                  \]        V4      V4      G Rj  x€L
  R# V P+                  V4      G Rj  x€L
  R#  EL ELo ELJ ELþ ELé EL£ ELj  \B         dI   p
\D        PG                  R\I        T
4      RR7       T PK                  Y5RT
4      G Rj  x€L 
   Rp
?
EL´Rp
?
ii ; i EL‡ ELG EL LÕ L— L~5i)zBHandle incoming media messages, downloading images to local cache.Nzmedia from unauthorized user)r  r  rÜ  )rÙ  r  r  rË   rj  rx  rä  z"[Telegram] Cached user photo at %sz$[Telegram] Failed to cache photo: %sTr3   r´   rµ   rT
  rp
  rÆ  r¶   rl
  rs
  z	audio/mp3r·   rÍ
  z.mp4rÅ  rH  r³  )rÊ   rÍ   rÎ   rÌ   rË   )/r%  rÍ  r  ÚloggingÚINFOrõ  ru  rà  r•  rÙ  r7  rd  r»   r+   r´  rç  r‹  r  r  r‘  Ú_handle_stickerrK  r�  r´   r£  r¥  rf  ro
  rt  r’   r¤  rú  rb  r*   r7   r-  r,   rÕ  rT
  rl  rl
  rÍ
  rÃ
  rŠ  r]   ra  r   )r“  r£  r  r7  Ú_eventr  r  r§  r€  r&
  r  rH  s   &&&         r   rh  Ú%TelegramAdapter._handle_media_message   sÉ  é € à�n‰nˆßÙØ×4Ñ4°S×9Ò9Ø×"Ñ" 3¬g¯l©lÐA_Ð"Ô`ÙØ×+Ñ+¨C×0Ò0Ø×=Ñ=¸c×BÒBØ×2Ñ2°3×8PÑ8PÐQTÓ8UÐag×aqÑaqÐ2Ór�Ø—;—;�;Ø"&×">Ñ">Ô?SÐTWÓ?XÓ"Y�F”KØ×0Ñ0°Ó=×=Ð=Ø×7Ñ7¸×=PÑ=PÐ\b×\lÑ\lÐtzÐ7Ô{ÙØ×)Ñ)¨#×/GÑ/GÈÓ/LÐX^×XhÑXhÐ)ÓiˆØ�;�;ˆ;ÝVÙ+¨DÔ7KÈCÓ7PÓQˆEŒJà�;�;ˆ;Ø×&Ñ& sÓ2×2Ð2Ø×%Ñ% d×&TÑ&TÐUZÓ&[Ó\×\Ð\ÙØ×>Ñ>¸uÓEˆà�9�9ˆ9ðPØ!$§¡¨2¥×!7Ñ!7Ó!9×9�Ø$,×$BÑ$BÓ$D×D�Ø×)Ñ)¨(×*<Ñ*<Ò>hÐjpÓq�Ø×&Ñ&ØÔ!=¼eÀKÓ>PÐVYÔ!Z×ZÐ^dÐeh×eoÑeoÐpsÓetÐduÐ\vÐx}÷  yKñ  yKØ8ô:ð ×-Ñ-¨cÓ9×9Ð9Ùð
 �9�9ˆ9Ø×+Ñ+¨C¸¿	¹	À?ÐT[Ð]cÐepÓq×qÖqÙð rà�Y�YˆYØ×+Ñ+¨C¸¿	¹	À<ÐQXÐZ`ÐbmÓn×nÖnÙð oà�Y�YˆYØ×+Ñ+¨C¸¿	¹	À<ÐQXÐZ`ÐbmÓn×nÖnÙð oà�\�\ˆ\ D×$@Ñ$@ÀÓ$L×LÖLÙÜ  Ð&6¸Ó=ˆßØ×/Ñ/´°NÓ0CÀUÓK×KÐKÙØ×!Ñ! %Ó(×(Ò(òW >ò 3Ú\ò :ÚDò [â9øäô PÜ—‘ÐEÔGbÐcdÓGeÐpt�ÔuØ×7Ñ7¸ÀGÈQÓO×O×OûðPúò
 rò oò oáLñ Lá(ùsc  ‚-R	°:R	Á+R	ÂA1R	Ã3PÃ4BR	ÆR	Æ#PÆ$'R	ÇPÇ(R	Ç6$P$ ÈPÈP$ È2PÈ3AP$ É;P
É<;P$ Ê7P!Ê8P$ Ê<R	Ë#R	Ë3Q:Ë4	R	Ë>R	Ì#R	Ì6Q=Ì7	R	ÍR	Í#R	Í9R Í:	R	ÎR	ÎR	Î-RÎ.	R	Î85R	Ï-RÏ.R	ÐRÐ	R	ÐR	ÐR	ÐP$ ÐP$ ÐP$ Ð!P$ Ð$Q7Ð/7Q2Ñ&Q)Ñ'Q2Ñ,R	Ñ2Q7Ñ7R	Ñ=R	Ò R	ÒR	ÒR	ÒR	c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   rH  r  r   NrY  )r   r…  s   "€r   r   r†  Ú  s(   ø€ ÷ uñ u¹Sð uÉð uÐZ^ñ ur   c              ƒ  ó†  "  € V P                  4       '       d   V P                  VRR7       R# V P                  V P                  W4       V P	                  4        V P
                  P                  V4      pV'       d   VP                  4        \        P                  ! V P                  V4      4      V P
                  V&   R# 5i)z�Debounce album items (shared media_group_id) into one MessageEvent so the second image isn't
treated as a new message interrupting the first.zmedia-group-enqueuer   N)rK  r%  rV  rÖ  r  r×  r  r|  r0   rÒ  Ú_flush_media_group_event)r“  rH  r  r[  s   &&& r   ra  Ú(TelegramAdapter._queue_media_group_eventÚ  s›   é € ð ×-Ñ-×/Ò/Ø×$Ñ$ UÐ2GÐ$ÔHÙØ× Ñ  ×!9Ñ!9¸>ÔQØ×ÑÔØ×,Ñ,×0Ñ0°Ó@ˆ
ßØ×ÑÔÜ29×2EÒ2EÀd×FcÑFcÐdrÓFsÓ2tˆ×Ñ Ó/ùs   ‚B?Cc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rH  r   Nrž   )r   r…  s   "€r   r   r†  ç  s   ø€ ÷ }ñ }¹Sð }ÀTñ }r   c              ƒ  ó†   "  € V P                  V P                  V P                  WP                  R 4      G Rj  x€L
  R#  L5i)zmedia-groupN)r2  rÖ  r×  ÚMEDIA_GROUP_WAIT_SECONDS)r“  rH  s   &&r   r•  Ú(TelegramAdapter._flush_media_group_eventç  s<   é € Ø×"Ñ"Ø×$Ñ$ d×&=Ñ&=¸~×OlÑOlÐn{ó}÷ 	}ô 	}ùs   ‚6A¸?¹Ac                ó*   <€ V ^8„  d   QhRS[ RS[RR/# r«  r¬  )r   r…  s   "€r   r   r†  ë  s'   ø€ ÷ !Lñ !L©ð !L¹ð !LÈ$ñ !Lr   c              ƒ  ó¬  "  € ^ RI HpHpHpHpHp VP                  pVP                  ;'       g    Rp	VP                  ;'       g    Rp
VP                  '       g   VP                  '       d   V! V	4      Vn        R# V! VP                  4      pV'       dY   V! VR,          VP                  RV	4      VP                  RV
4      4      Vn        \        P                  RVP                  4       R# V	'       d   RV	 2MR	p VP!                  4       G Rj  x€L
 pVP#                  4       G Rj  x€L
 p\%        \'        V4      R
R7      G Rj  x€L
 p\        P                  RV4       ^ RIHp V P-                  4        \.        P0                  ! V! W÷R7      G Rj  x€L
 4      pVP                  R4      '       d?   VP                  RR	4      pV! VP                  VWš4      G Rj  x€L
  V! VWš4      Vn        R# V! WÉV
4      Vn        R#  Lð LÚ L¾ Ls L,  \2         d;   p\        P5                  R\7        T4      RR7       T! YÉT
4      Tn         Rp?R# Rp?ii ; i5i)zjDescribe a sticker via vision, cached by file_unique_id; animated/video stickers get an emoji placeholder.)Úget_cached_descriptionÚcache_sticker_description_asyncÚbuild_sticker_injectionÚ build_animated_sticker_injectionÚSTICKER_VISION_PROMPTr!   NrJ  r*  Úset_namez [Telegram] Sticker cache hit: %sza sticker with emoji z	a stickerrÍ   rj  z"[Telegram] Analyzing sticker at %s)Úvision_analyze_tool)r™
  Úuser_promptrÔ   Úanalysisz%[Telegram] Sticker analysis error: %sTr3   )Úgateway.sticker_cacher�  rž  rŸ  r   r¡  r‘  r*  r¢  Úis_animatedÚis_videor+   Úfile_unique_idr  r7   rç   r£  r¥  r’   r¤  Útools.vision_toolsr£  r  r  r  r*   r-  r,   )r“  r7  r  r�  rž  rŸ  r   r¡  r‘  r*  r¢  r©  rý  r§  r€  rk  r£  rJ   rJ  r  s   &&&                 r   r�  ÚTelegramAdapter._handle_stickerë  sú  é € ÷	Eõ 	Eð —+‘+ˆØ—‘×#Ð# ˆØ×#Ñ#×)Ð) rˆØ××Ð '×"2×"2Ð"2Ù9¸%Ó@ˆEŒJÙÙ'¨×(>Ñ(>Ó?ˆßÙ0°¸Õ1FÈÏ
É
ÐSZÐ\aÓHbÐdj×dnÑdnÐoyð  |Dó  eEó  FˆEŒJÜ�K‰KÐ:¸G×<RÑ<RÔSÙß6;Ð*¨5¨'Ñ2Àˆð	LØ$×-Ñ-Ó/×/ˆHØ (× >Ñ >Ó @×@ˆKÜ <¼UÀ;Ó=OÐU\Ô ]×]ˆKÜ�K‰KÐ<¸kÔJÝ>Ø×ÑÔ!Ü—Z’ZÑ&9ÀKÔ&s× sÓtˆFØ�z‰z˜)×$Ò$Ø$Ÿj™j¨°[ÓA�Ù5°g×6LÑ6LÈkÐ[`Ók×kÐkÙ4°[À%ÓR�–
á4°XÀhÓO�–
ñ 0Ù@Ù]ñ !tñ løô ô 	LÜ�N‰NÐBÔD_Ð`aÓDbÐmqˆNÔrÙ0°À(ÓKˆE�JŠJûð	Lüs¼   ‚AIÁIÁIÁ-(IÂAIÃ6IÃ>H ÄHÄH Ä)HÄ*H ÅHÅAH ÆHÆH Æ4)H ÇH
ÇH Ç0IÇ2H È IÈH ÈH ÈH ÈH È
H ÈIÈ/IÉIÉIÉIc                ó   <€ V ^8„  d   QhRR/# rd   rQ   )r   r…  s   "€r   r   r†    s   ø€ ÷ Zñ Z¨tñ Zr   c           	     ón  €  ^ RI Hp V! 4       P                  R/ 4      P                  R/ 4      P                  R/ 4      P                  R. 4      pV'       g   . V n        \	        4       V n        R# W n        V Uu0 uF  pRV9   g   K  \        VR,          4      kK   	  upV n        V FË  pVP                  R4      pV'       g   K  VP                  R. 4       F—  pVP                  ! R	4      pVP                  ! R
4      pV'       g   K1  V'       g   K;  V RV 2V P                  9  g   KS  \        V4      V P                  V RV 2&   \        P                  RV P                  V RV 2V4       K™  	  KÍ  	  R# u upi   \         d-   p\        P                  RT P                  T4        Rp?R# Rp?ii ; i)zURe-read dm_topics from config.yaml so externally created topics work without restart.)Úload_config_readonlyr¹  r<   r·  r°  Nr±  r¤  rx  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  rX   r  r   rü  rÚ   r7   rç   r„  r*   r8   )	r“  r®  r°  r«  ÚcidrŠ   Útidr„  r  s	   &        r   Ú_reload_dm_topics_from_configÚ-TelegramAdapter._reload_dm_topics_from_config  s‚  € ð	ZÝ>Ù,Ó.×2Ñ2°;ÀÓC×GÑGÈ
ÐTVÓW×[Ñ[Ð\cÐegÓh×lÑlÐmxÐz|Ó}ˆIßØ)+�Ô&Ü*-«%�Ô'ÙØ%.Ô"ÙT]Ó&yÑT]ÀjÐajÐnxÑaxÔ'A¤s¨:°iÕ+@Ö'AÑT]Ñ&yˆDÔ#Û'�
Ø —n‘n YÓ/�ßÙØ#Ÿ™¨°"Ö5�AØŸ%š% Ó,�CØŸ5š5 ›=�Dß‘sŸt™t¨3¨%¨q°°¨¸t¿¹Ö(NÜ;>¸s»8˜Ÿ™¨3¨%¨q°°¨Ñ8ÜŸ™Ð$^Ð`d×`iÑ`iÐnqÐmrÐrsÐtxÐsyÐkzÐ|ö  Aó 6ó	 (ùò 'zøô ô 	ZÜ�L‰LÐJÈDÏIÉIÐWX×YÒYûð	ZúsP   ‚AE= ÁE= Á/
E= Á9	E8ÂE8ÂA&E= ÄE= ÄE= Ä*AE= Å8E= Å=F4Æ!F/Æ/F4c          	      ób   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[S[ S[3,          ,          /# )r   r±  rx  r   r  )r   r…  s   "€r   r   r†  &  s8   ø€ ÷ ñ ©#ð ¹(Á3½-ð ÉHÑUYÑZ]Ñ_bÐZbÕUcÕLdñ r   c                ó�   a aa€ V'       g   R# \        V4      oR VV V3R llpV! 4       pVe   V# S P                  4        V! 4       # )zOReturn the DM topic config dict (name, skill, ...) for this thread_id, or None.Nc                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# r�   rP  )r   s   "r   r   Ú8TelegramAdapter._get_dm_topic_info.<locals>.__annotate__,  s    € ÷ 
	ñ 
	œ¤$¤s¬C x¥.Õ1ñ 
	r   c                  óª  <€ SP                   P                  4        F³  w  rVS8X  g   K  V P                  S R 24      '       g   K*  V P                  R ^4      ^,          pSP                   F\  p\        VP                  R4      4      S8X  g   K$  VP                  R. 4       F"  pVP                  ! R4      V8X  g   K  Vu u u # 	  K^  	  RV/u # 	  R# )r¬   r±  r¤  r„  N)rü  r
  rJ	  rr  r  r   r  )r¤   Ú
cached_tidrœ  r«  rŠ   r±  r“  Úthread_id_ints        €€€r   Ú_lookupÚ3TelegramAdapter._get_dm_topic_info.<locals>._lookup,  s°   ø€ Ø#'§?¡?×#8Ñ#8Ö#:‘�Ø Ö.°3·>±>ÀWÀIÈQÀ-×3PÔ3PØ!$§¡¨3°Ó!2°1Õ!5�JØ&*×&<Ô&<˜
Ü˜zŸ~™~¨iÓ8Ó9¸WÖDØ%/§^¡^°H¸bÖ%A Ø#$§5¢5¨£=°JÖ#>Ø+,¦Hó &Bñ '=ð
 # JÐ/Ò/ñ $;ñ r   )rÚ   r±  )r“  r±  rx  rº  Úfoundr¹  s   ff&  @r   Ú_get_dm_topic_infoÚ"TelegramAdapter._get_dm_topic_info&  sD   ú€ çÙÜ˜I›ˆ÷
	ò 
	ñ “	ˆØÒØˆLØ×*Ñ*Ô,Ù‹yÐr   c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[ RR/# )r   r±  rx  rœ  r   Nrž   )r   r…  s   "€r   r   r†  >  s1   ø€ ÷ rñ r±Cð rÁCð rÑUXð rÐ]añ rr   c                óª   € V RV 2pW@P                   9  d<   \        V4      V P                   V&   \        P                  RV P                  WB4       R# R# )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Ú   r7   rç   r„  )r“  r±  rx  rœ  r¨  s   &&&& r   Ú_cache_dm_topic_from_messageÚ,TelegramAdapter._cache_dm_topic_from_message>  sL   € à�i˜q  Ð-ˆ	ØŸO™OÔ+Ü),¨Y«ˆD�O‰O˜IÑ&Ü�K‰KÐOÐQU×QZÑQZÐ\eÖqñ ,r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÙ   r  )r   r…  s   "€r   r   r†  F  s   ø€ ÷ ñ ©cð ±cñ r   c                ó<  a € Vf   R# \        V\        4      '       d   V# \        V\        4      '       d   RP                  V 3R lV 4       4      # \        V\        4      '       d6   R F/  pVP                  V4      f   K  S P                  W,          4      u # 	  R# )zFBest-effort plaintext flattener for Bot API rich-message inline nodes.r!   c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5irP   )Ú_flatten_rich_inline_text)rR   ÚitemrÒ  s   & €r   rT   Ú<TelegramAdapter._flatten_rich_inline_text.<locals>.<genexpr>M  s   øé € ÐQÉ5À4˜3×8Ñ8¸×>Ð>Ë5ùr:  )r+   Úchildren)r5  r   rT  rh  r  r  rÆ  )rÒ  rH   r¤   s   f& r   rÆ  Ú)TelegramAdapter._flatten_rich_inline_textE  s~   ø€ ð Š=ÙÜ�eœS×!Ò!ØˆLÜ�eœT×"Ò"Ø—7‘7ÔQÉ5ÓQÓQÐQÜ�eœT×"Ò"Û+�Ø—9‘9˜S“>Ô-Ø×8Ñ8¸½ÓDÒDñ ,ñ r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úblocksr   r  )r   r…  s   "€r   r   r†  U  s   ø€ ÷ Bñ B©#ð B±#ñ Br   c                ó  € \        V\        4      '       g   R# . pV EFM  p\        V\        4      '       g   K  VP                  R4      R8X  dÒ   VP                  R. 4       F¸  p\        V\        4      '       g   K  V P	                  VP                  R4      4      P                  4       pV'       g   KS  VP                  R4      pTP                  V'       d   V RV^ ,           2P                  4       MV^ ,          4       VP                  VR,          4       Kº  	  EK  V P                  VP                  R	4      4      pV'       g   EK.  VP                  VP                  4       4       EKP  	  R
P                  R V 4       4      # )z@Best-effort plaintext flattener for Bot API rich-message blocks.r!   r'   rT  r
  rÌ  r;   r]  r¯  r+   ra  c              3   óT   "  € T F  q'       g   K  VP                  4       x € K   	  R # 5irP   )Úrstripr½  s   & r   rT   Ú7TelegramAdapter._flatten_rich_blocks.<locals>.<genexpr>k  s   é € ÐA±5¨4»Dœ˜Ÿ™Ÿ˜³5ùs   ‚	(�()r5  rT  r  r  Ú_flatten_rich_blocksr¿  rd  r  r\   rÆ  rh  )rÒ  rÌ  Úlinesr­  rÇ  Ú
item_linesr;   r+   s   &&      r   rÑ  Ú$TelegramAdapter._flatten_rich_blocksT  s+  € ô ˜&¤$×'Ò'ÙØˆÜˆEÜ˜e¤T×*Ò*ÙØ�y‰y˜Ó  FÔ*Ø!ŸI™I g¨rÖ2�DÜ% d¬D×1Ò1Ù Ø!$×!9Ñ!9¸$¿(¹(À8Ó:LÓ!M×!XÑ!XÓ!Z�Jß%Ù Ø ŸH™H WÓ-�EØ—L‘LÇu E 7¨!¨J°q­M¨?Ð!;×!AÑ!AÔ!CÐR\Ð]^ÕR_Ô`Ø—L‘L ¨B¥Ö0ñ 3ò Ø×0Ñ0°·±¸6Ó1BÓCˆDßŠtØ—‘˜TŸ_™_Ó.×/ñ! ð" �y‰yÑA±5ÓAÓAÐAr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   r  r   )r   r   r   )r   r…  s   "€r   r   r†  n  s   ø€ ÷ ñ ¹ð ÁÉÅñ r   c                ó(  €  \        \        VRR4      RR4      p\        V4      '       g   R# \        V! R4      RR4      p\        V4      '       g   R# V P                  V! R4      4      P                  4       ;'       g    R#   \         d     R# i ; i)zAReturn plaintext echoed by Telegram's rich_message reply payload.r.  Nr  r?  rÌ  )r]   rf  rÑ  r  r*   )rÒ  r  ÚgetterÚrich_getters   &&  r   Ú_extract_rich_reply_textÚ(TelegramAdapter._extract_rich_reply_textm  sˆ   € ð		ÜœWÐ%5°|ÀTÓJÈEÐSWÓXˆFÜ˜F×#Ò#ÙÜ!¡&¨Ó"8¸%ÀÓFˆKÜ˜K×(Ò(ÙØ×+Ñ+©K¸Ó,AÓB×HÑHÓJ×RÐRÈdÐRøÜô 	Úð	ús"   ‚)B ­$B Á+B Á?B ÂBÂBc                óB   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[/# )r   r%  rX  Úthread_id_strr   )rq   r   r   rü  )r   r…  s   "€r   r   r†  {  s1   ø€ ÷ ('ñ ('©gð ('Á#ð ('ÑV^Ñ_bÕVcð ('Ñhmñ ('r   c                óü  € VP                   pRpRpVR8X  dÌ   V'       dÄ   V P                  \        VP                  4      V4      pV'       d#   VP	                  R4      pVP	                  R4      p\        VR4      '       d`   VP                  '       dN   VP                  P                  pV'       d0   V P                  \        VP                  4      W84       V'       g   TpWV3# VR8X  Ed†   V'       Ed}   V P                  P                  P	                  R. 4      p	\        V	\        4      '       d)   V	P                  4        U
Uu. uF  w  r«RV
R	V/NK  	  pp
pMB\        V	\        4      '       d+   V	 Uu. uF  p\        V\        4      '       g   K  VNK  	  ppM. pV FÐ  p\        VP	                  RR
4      4      \        VP                  4      8w  d   K8  VP	                  R	. 4      p\        V\        4      '       d   TM.  Ff  p\        V\        4      '       g   K  VP	                  R4      pVf   K2  \        V4      V8X  g   KD  VP	                  R4      pVP	                  R4      p M	   WV3# 	  WV3# u upp
i u upi )zVReturn ``(chat_topic, topic_skill)`` for a DM topic or bound forum topic (else Nones).Nr[  r„  ÚskillÚforum_topic_createdrf  Úgroup_topicsr±  r¤  r!   rx  )r‘  r½  r   rZ   r  r)  rß  r„  rÁ  rš  r·  r5  r  r
  rT  )r“  r%  rX  rÜ  r‘  Ú
chat_topicÚtopic_skillÚ
topic_infoÚcreated_nameÚgroup_topics_configÚcfg_chat_idr¤  Úgroup_topics_iterr¬  r«  r�  r°  s   &&&&             r   Ú_resolve_topic_bindingÚ&TelegramAdapter._resolve_topic_binding{  s8  € à�|‰|ˆØˆ
ØˆØ˜Ô§Ø×0Ñ0´°T·W±W³¸}ÓMˆJßØ'Ÿ^™^¨FÓ3�
Ø(Ÿn™n¨WÓ5�ä�wÐ 5×6Ò6¸7×;V×;VÐ;VØ&×:Ñ:×?Ñ?�ßØ×5Ñ5´c¸$¿'¹'³lÀMÔ`ß%Ø%1˜
ð0 Ð&Ð&ð/ ˜'Õ!§m mð #'§+¡+×"3Ñ"3×"7Ñ"7¸ÈÓ"KÐÜÐ-¬t×4Ò4Øk~÷  lEñ  lEô  lGô  %Hñ  lGÑTgÐT_ i°¸hÈÓ%Oñ  lGÐ!ñ  %HÐ!ÜÐ/´×6Ò6Ù8KÓ$gÑ8K¨uÌzÐZ_Ôae×Of§U UÑ8KÐ!Ð$gÐ!à$&Ð!Û/�
Ü�z—~‘~ i°Ó4Ó5¼¸T¿W¹W»ÔEÙØ#Ÿ™¨°"Ó5�Ü(2°6¼4×(@Ò(@™fÀbÒH�EÜ% e¬T×2Ò2Ù ØŸ)™) KÓ0�CØ”¬3¨s«8°}Ö+DØ%*§Y¡Y¨vÓ%6˜
Ø&+§i¡i°Ó&8˜Ùñ Ið ØÐ&Ð&ñ 0ð Ð&Ð&ùó% %Hùâ$gs   ÅI3Å2I9ÆI9c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÀ  )rq   rü  )r   r…  s   "€r   r   r†  ¥  s   ø€ ÷ *ñ *¡gð *±%ñ *r   c                ó2  € VP                   '       g   R# \        VP                   P                  4      p\        VRR4      pVe   \        VRR4      MRpV'       d   W$3# VP                   P                  ;'       g!    VP                   P
                  ;'       g    RpV'       g   V P                  VP                   4      pV'       g:    ^ RIHp VP                  \        VP                  P                  4      V4      pW%3# W%3#   \         d    Rp Y%3# i ; i)z–``(reply_to_id, reply_to_text)`` for the replied-to message: Telegram's native partial quote
first, then text/caption, rich echo, then the sent index.NÚquoter+   r!  r[
  )r  r   r¡  r]   r+   r7  rÙ  r#  r"  Úlookupr‘  rZ   r*   )r“  r%  r	  rì  Ú
quote_textÚreply_to_textr"  s   &&     r   Ú_reply_contextÚTelegramAdapter._reply_context¥  s   € ð ×'×'Ð'ØÐÜ˜'×2Ñ2×=Ñ=Ó>ˆÜ˜ ¨$Ó/ˆØ5:Ò5F”W˜U F¨DÔ1ÈDˆ
ßØÐ*Ð*Ø×0Ñ0×5Ñ5×aÐa¸×9QÑ9Q×9YÑ9Y×aÐaÐ]aˆßØ ×9Ñ9¸'×:RÑ:RÓSˆMßð
%Ý3Ø /× 6Ñ 6´s¸7¿<¹<¿?¹?Ó7KÈ[Ó Y�ð Ð)Ð)ˆ{Ð)Ð)øô ô %ð !%‘ØÐ)Ð)ð%ús   Ã	5D ÄDÄDc                óB   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[/# )r   r%  rØ  rÙ  r   rÚ  )r   r…  s   "€r   r   r†  À  s7   ø€ ÷ *[ñ *[©Gð *[¹{ð *[ÑW_Ñ`cÕWdð *[Ñp|ñ *[r   c                óx  € VP                   pVP                  pV P                  V4      pVR9   d   RM
VR8X  d   RMRpV P                  V4      pV P	                  WV4      pV P                  WV4      w  rš\        VR4      pV'       d   VP                  pM1V'       d   VR8X  d   VP                  pMVR8X  d   VP                  MRpT P                  \        VP                  4      VP                  ;'       g    V'       d   VP                  MRTV'       d   \        VP                  4      MVR9   d   \        VP                  4      MRYÈT	\        VP                  4      V'       d   \        \        VRR4      4      MRR7	      pV P                  V4      w  rï^ R	IHp ^ R
IHp \        VP                  4      pT! V P(                  P*                  T;'       g    TV'       d   TMR4      p\-        \/        V4      W-V\        VP                  4      VWïV
V! WV4      V P1                  W4      VP2                  R7      # )z—Build a MessageEvent from a Telegram message. ``update_id`` lets ``/restart`` record the
triggering offset so the new gateway process advances past it.rf  rÆ  r[  r”  Nr’  F)	r±  Ú	chat_namerX  rk  ry  rx  rá  r¡  r’  )Úresolve_channel_prompt)Úgroup_identity_prompt)r+   r‹  rˆ  r‰  r¡  Úplatform_update_idrù  rï  Ú
auto_skillrŠ  Úedit_revisionrÞ  >   rf  r]  >   r[  rÆ  )r‘  r�  ræ  r´  Ú_adopt_created_topic_threadrè  r)  r”  r–  r¢  r   rZ   r¡  rB   r]   rð  ru
  rõ  r  rö  rš  r·  r¸   r»   Ú_edit_revisionÚdate)r“  r%  rØ  rÙ  r‘  r™  Útelegram_chat_typerX  rÜ  rá  râ  Úhas_full_namery  rˆ  r	  rï  rõ  rö  r²  rŠ  s   &&&&                r   rà  Ú$TelegramAdapter._build_message_eventÀ  sï  € ð �|‰|ˆØ× Ñ ˆØ!×0Ñ0°Ó6ÐØ1Ð5LÔL‘GÐ`rÐvÔ`ÑS\ð  FJˆ	ð ×9Ñ9¸'ÓBˆð ×8Ñ8¸È]Ó[ˆØ"&×"=Ñ"=¸gÐR_Ó"`Ñˆ
Ü  kÓ2ˆßØŸ™‰Iß˜y¨DÔ0ØŸ™‰Ià&/°9Ô&<˜Ÿ
š
À$ˆIØ×"Ñ"Ü˜Ÿ™“L¨D¯J©J×,eÐ,eÏ]¸4¿>º>Ð`dÐqzß%)”S˜Ÿ™”\À	ÐM^Ô@^´°D·G±G´ÐdhØÀZÔ\_Ð`g×`rÑ`rÓ\sß;?”4œ  h°Ó6Ô7ÀUð	 #ó Lˆð
 &*×%8Ñ%8¸Ó%AÑ"ˆÝAÝUÜ˜4Ÿ7™7“|ˆÙ/°·±×0AÑ0AÀ=×C`ÐC`ÐT`×rÑbnð  FJó  KˆÜÜ% gÓ.¸XÐbiÜ˜7×-Ñ-Ó.À9Ø +ÐU`Ù0°ÀÓOØ×-Ñ-¨gÓAÈWÏ\É\ô[ð 	[r   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# )r   rÙ  r   )r   rÚ   r   )r   r…  s   "€r   r   r†  í  s'   ø€ ÷ 
Wñ 
W©8±C­=ð 
W¹XÁc½]ñ 
Wr   c                óX  € \        V RR4      p\        VR4      '       g   R# Ve   RV 2# \        V RR4      ;'       g    \        V RR4      ;'       g    RP                  4       p\        VP	                  4       4       R\
        P                  ! V4      P                  4       R	,           2# )
a  Identity of one edit of a message, None for a new send. ``edit_date`` has whole-second
resolution, so two edits in one second would share it: the update id is unique per edit and
stable on redelivery; without one, the edited text tells same-second edits apart.r8  NrÞ  Úur+   r7  r!   rä  :Né   N)r]   r)  rû  rÚ   rÞ  rø  rú  rü  )r%  rÙ  r8  r+   s   &&  r   rû  ÚTelegramAdapter._edit_revisionì  sž   € ô
 ˜G [°$Ó7ˆ	Ü�y +×.Ò.ÙØÒ Ø�y�k�?Ð"Ü˜ ¨Ó.×YÐY´'¸'À9ÈdÓ2S×YÐYÐWY×aÑaÓcˆÜ�i×)Ñ)Ó+Ó,Ð-¨Q¬w¯~ª~¸dÓ/C×/MÑ/MÓ/OÐPSÕ/TÐ.UÐVÐVr   c                ó    <€ V ^8„  d   QhRS[ /# r�   r.  )r   r…  s   "€r   r   r†  û  s   ø€ ÷ 
Cñ 
C¡Dñ 
Cr   c                óŠ   € \        V P                  P                  RRR4      pVf   R# \        V4      P	                  4       R9  # )un  Reactions: scoped ``TELEGRAM_REACTIONS`` â†’ ``extra.reactions`` (YAML, per profile) â†’ off.

An explicit env var wins over YAML, so the stock ``reactions: false`` every install
materializes cannot silently kill a documented ``TELEGRAM_REACTIONS=true`` (#109032). Under
multiplex a scoped miss falls to the profile's own YAML, never another profile's env (#72348).
Ú	reactionsÚTELEGRAM_REACTIONSNF>   rŒ  r�  rŽ  )rv  rš  r·  r   rø   rY  s   & r   Ú_reactions_enabledÚ"TelegramAdapter._reactions_enabledû  sB   € ô & d§k¡k×&7Ñ&7¸ÐFZÐ\`Óaˆ
ØÒÙÜ�:‹×$Ñ$Ó&Ð.BÑBÐBr   c                óB   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[/# )r   r±  r¡  r*  r   rl  )r   r…  s   "€r   r   r†    s/   ø€ ÷ ñ ©3ð ¹Cð ÉÑQTÍð ÑZ^ñ r   c           	   ƒ  ó’  "  € V P                   '       g   R#  V P                   P                  \        V4      \        V4      VR7      G Rj  x€L
  R#  L  \         df   pTf,   \
        P                  RT P                  \        T4      4       M+\
        P                  RT P                  T\        T4      4        Rp?R# Rp?ii ; i5i)z`Set a single emoji reaction (``None`` clears all bot-set reactions, the documented Bot API way).F)r±  r¡  r/  NTz[%s] clear reactions failed: %sz)[%s] set_message_reaction failed (%s): %s)	rÁ  Úset_message_reactionr½   rÚ   r*   r7   r8   r„  r,   )r“  r±  r¡  r*  r  s   &&&& r   Ú_set_reactionÚTelegramAdapter._set_reaction  s¬   é € à�y�yˆyÙð	Ø—)‘)×0Ñ0Ô9SÐT[Ó9\ÔilÐmwÓixð  DIÐ0ó  J÷  Jð  JÙñ Jøäô 	ØŠ}Ü—‘Ð>ÀÇ	Á	ÔKfÐghÓKiÕjä—‘ÐHÈ$Ï)É)ÐUZÔ\wÐxyÓ\zÔ{Ýûð	üsA   ‚C˜3A ÁAÁA ÁCÁA ÁCÁAB?Â9CÂ?CÃCc                ó,   <€ V ^8„  d   QhRS[ RS[ RS[/# r  r'  )r   r…  s   "€r   r   r†    s'   ø€ ÷ Cñ C©cð C¹sð CÁtñ Cr   c              ƒ  óB   "  € V P                  WR4      G Rj  x€L
 #  L5i)zClear all bot-set reactions.N)r  )r“  r±  r¡  s   &&&r   Ú_clear_reactionsÚ TelegramAdapter._clear_reactions  s   é € à×'Ñ'¨¸TÓB×BÐBÑBùs   ‚˜™c                ó$   <€ V ^8„  d   QhRS[ RR/# rH  rI  )r   r…  s   "€r   r   r†    s   ø€ ÷ Hñ H©|ð HÀñ Hr   c              ƒ  óæ   "  € V P                  4       '       g   R# \        VP                  RR4      p\        VRR4      pV'       d'   V'       d   V P                  W#R4      G Rj  x€L
  R# R# R#  L
5i)z;Add an in-progress reaction when message processing begins.Nr±  r¡  u   ðŸ‘€)r	  r]   rˆ  r  )r“  r  r±  r¡  s   &&  r   Úon_processing_startÚ#TelegramAdapter.on_processing_start  s\   é € à×&Ñ&×(Ò(ÙÜ˜%Ÿ,™,¨	°4Ó8ˆÜ˜U L°$Ó7ˆ
ß—zØ×$Ñ$ W¸,ÓG×GÒGñ "‰7ÙGùs   ‚AA1ÁA1Á$A/Á%A1c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   r  r¥  r   N)r¸   rº   )r   r…  s   "€r   r   r†  "  s)   ø€ ÷ Bñ B±,ð BÑIZð BÐ_cñ Br   c              ƒ  ót  "  € V P                  4       '       g   R# \        VP                  RR4      p\        VRR4      pV'       d	   V'       g   R# V\        P                  8X  d   V P                  W44      G Rj  x€L
  R# T P                  Y4V\        P                  8X  d   RMR4      G Rj  x€L
  R#  L9 L5i)u“   Swap the in-progress reaction for a final success/failure reaction (set_message_reaction
replaces, not adds); CANCELLED explicitly clears the ðŸ‘€.Nr±  r¡  u   ðŸ‘�u   ðŸ‘Ž)r	  r]   rˆ  rº   Ú	CANCELLEDr  r  ÚSUCCESS)r“  r  r¥  r±  r¡  s   &&&  r   Úon_processing_completeÚ&TelegramAdapter.on_processing_complete"  s£   é € ð ×&Ñ&×(Ò(ÙÜ˜%Ÿ,™,¨	°4Ó8ˆÜ˜U L°$Ó7ˆ
ßŸJÙØÔ'×1Ñ1Ô1Ø×'Ñ'¨Ó<×<Ò<à×$Ñ$ WÈ'ÔUf×UnÑUnÔJn¹,ð  uAó  B÷  Bò  Bñ =ñ Bùs*   ‚AB8Á+B8Á:B4Á;2B8Â-B6Â.B8Â6B8c                ó>   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   # )r   ÚREQUIRES_EDIT_FINALIZEÚFALLBACK_ON_FINAL_EDIT_FLOODÚ%RESEND_FINAL_ON_EMPTY_STREAM_FALLBACKr.  )r   r…  s   "€r   r   r†    s,   ø‡ ‚ ñ: !Ñ'ñ; ñ< #'Ñ-ñ= ñ> ,0Ñ6ò? r   )RrÉ  r¸  ra  r
  rÁ  rö  rå  rõ  r	  r  rÿ  rØ  rl  rÇ  r  rü  r  rß  r  rþ  r   rû  rà  rá  rº  ró  rô  r  r  rÓ  rÖ  r×  rÄ  r  r  rý  rÕ  rÔ  rç  rê  rî  râ  ré  rï  rä  rð  rè  rø  r÷  rí  rì  rã  r‘  ræ  rÅ  rÌ  rÊ  rÈ  rË  r¹  rù  r  r  r  r  r  rÏ  rÍ  rÑ  rÒ  rÐ  rÛ  rÞ  rQ  r»  r½  rÀ  r¿  r¾  rò  rñ  rÂ  r[
  )NNNrP   rì  )r!   r!   Nr:
  )Nr¦  )NNNN)r!   (�  r(   r‚   rƒ   r„   rv  r¿  r‰  Úsupports_code_blocksÚsplits_long_messagesr�  r  r™  ÚHELD_INBOUND_MAXr  rA  rB  r$
  r 
  r
  r  r   r!  r7  r8  r9  r:  Ústaticmethodr�  Úpropertyr”  r—  r¶  r  r  r!  r*  r4  r=  rG  rK  rU  r`  rh  rv  rŠ  rœ  r¥  r±  r½  rÍ  ÚclassmethodrÓ  rÚ  rß  rå  rë  rï  rö  r   rü  r  rû  r  r  r,  r6  rD  rQ  r[  r`  rh  rs  r|  r�  r‡  rÆ  r—  rŸ  r¦  rU  Úcompiler5  ÚDOTALLr¯  r«  rµ  r±  r¶  rÀ  rÄ  rÈ  rÌ  rÓ  r×  rÛ  rß  ræ  ró  rø  r
  r  r  r  r%  r:  r2  r4  rH  rL  rS  r[  rW  rX  rw  r�  r�  r—  r”  r©  rÆ  rÄ  rÙ  rÞ  rä  rè  rï  rö  r  r  r  r%  r)  rî  rG  r<  rN  r>  r=  rd  rÓ  rp  r  r  r‘  r™  r­  r³  r§  rÇ  rÍ  rÒ  rí  rã  rä  rÑ  r  r  r  r#  r  r  r  r  rK  rR  rs  r|  r»  rÌ  rÕ  rê  rô  r  r  r  r  r*  r0  r  r8  r@  r  rL  rU  rd  rv  r{  r|  r‹  rŠ  rŒ  r·  rÂ  rÇ  rÏ  r¾  rÝ  rñ  rÜ  r  r  r  r  r  r!  r&  r2  r9  rN  rO  r=  rB  Ú_EA_REASON_BUDGETrG  rR  r\  rn  ry  rŠ  r“  r¦  rö  r³  rº  rÇ  r	  rÏ  r×  rÞ  ræ  r¢  r	  r	  r$	  r£  r/	  r4	  r9	  r=	  rQ	  rY	  rX	  r`	  rk  r|	  rƒ	  rj  r“	  r‰	  rŠ	  r‹	  rŒ	  ræ	  rˆ	  rû	  r

  r/
  r6
  r;
  r?
  rD
  rJ
  rQ
  rd
  r\
  r�
  r¦
  r²
  r¿
  rx
  rÓ
  rÞ
  rë
  ró
  r÷
  rý
  r%  ÚasynccontextmanagerrM  r^  r„  r…  r†  rm  r1  rˆ  rb  rx  r€  r‡  rŽ  r”  rš  r   r¨  r®  rµ  r»  rÀ  rÆ  rÌ  rÓ  rÃ  ræ  r²  r³  rñ  r´  r/  rË  rü  r;  r  r  rÌ  r  r  r  r!  r'  r=  r&  rJ  rO  rT  r\  r`  rd  ri  rn  ru  rz  r�  r…  r�  r•  r¹   ra  rb  rc  r»  r¨  r´  r±  rÁ  r¢  r®  rÕ  rç  rs  rm  rõ  rú  rÿ  rŽ  ÚWARNINGr  r
  r  r]  r^  r`  r(  r  r2  r=  rD  rJ  rQ  rV  r\  rb  rf  rl  rp  rt  rŠ  rh  ra  r•  r�  r±  r½  rÁ  rÆ  rÑ  rÙ  rè  rð  rà  rû  r	  r  r  r  r  Ú__annotate_func__r†   r¦  r§  )r  r…  s   @@r   rz  rz    s¿  ù‡ € ÙVð #ÐàÐØÐØÐØ"ÐØÐØ"ÐØÐØ"Ðð #ÐØ"Ðð
 ÐØÐØ$-Ð!ð
 $(ÐØ)-Ð Ø26Ð)ð ÐØ#ÐØ ÐØ $ÐàðÐVZð Ðy}÷ ñ ó ðð  ÷Aó ðAð ñó ð÷L;ó L;ð\ ÷Aó ðA÷1ó 1÷
%ó %÷vó v÷Gð G÷ð ÷ð ÷*Fð F÷
.ð .ð ÷ó ðò6ð ÷<ó ð<ð#Ø8<ð#ØY]ð#à#'ð#àDH÷#ò #÷JEð Eò<D÷(Bð B÷eð e÷$4Eð 4Eðl ÷Aó ðAð ÷?ó ð?ð ÷_ó ð_ð ÷Só ðSð ÷Dó ðDð ÷ró ðrð ÷ò ó ðð ÷#Qò #Qó ð#QðJ ÷]ó ð]÷Bð Bð ÷ó ðð
 ÷5ó ð5ð
 ÷8ó ð8ðLÐrv÷ Lò Lð> ÷ó ðð ÷Dó ðD÷(Dó D÷0cð cð ÷:ó ð:ð ÷	ó ð	ð ÷*ó ð*ð" ÷ó ðð ÷mó ðmð
 ÷ó ð÷ó ÷2ð 2÷;ð ;÷Wð Wð
 —z’zÐ"BÀBÇMÁMÐTV×T]ÑT]ÕD]Ó^ÐØ!Ÿzšzð	Nð 	�‰˜Ÿ	™	Õ!ó	 #Ðð —:’:ÐxÓy€L÷tð t÷Cð C÷ð ÷$Cð C÷+ð +÷0ð 0÷_ó _÷,ó ,÷ Mð M÷Yð Yð
ÐSX÷ ò ÷
%ð 
%÷<ð <÷Ið I÷ *ð *ð ÷có ðcðwÐVZ÷ wò wð ÷ó ð÷(hð (h÷Tð ÷ð ÷?ó ?÷.0ð 0÷ð ÷*Að A÷0ð ÷#ð #÷J(ð (÷
Fð F÷4ð ò4F÷8ð 8òð2$$Øafð$$à"&÷$$ò $$÷L9ð 9÷&ð ÷kð k÷&Sð S÷Vð V÷lð lð6È5÷ ò ÷.]ð ]ð8<Ðuz÷ <ò <÷|2ð 2÷ð ÷&Pð P÷F0ð F0÷PRYð RY÷h@Lð @L÷DDð D÷6ð 6÷@-ð -÷:=ð =÷']ó ']÷Rð ÷,\6ð \6÷|)ð )÷ ó  ÷D5ð 5÷&ó &÷P	rð 	r÷%jó %j÷N"xñ "x÷Hoò o÷_ò _÷Kò Kð> ÷tñ tó ðtð
 ÷Cñ Có ðC÷
/ò /÷0aò aó>k÷ò ð ÷Mñ Mó ðM÷
ò 
÷>
ò 
÷B"ò "÷ ò  ÷,õ ,÷
%ò %÷lò l÷2I÷ Ið I÷*[Nò [N÷z=?ò =?÷~ò ÷(ò (÷:Dò Dñ:a°E÷ aô a÷Fò ð ÷	ñ 	ó ð	÷*ò *÷
&uò &u÷Pò ÷29ò 9÷"ò "÷BBò BB÷H	 ò 	 ð ÷+ñ +ó ð+÷"ò ÷fò f÷P%4ò %4÷NVõ V÷2)~ò )~÷V#ò #÷&Fò Fð2 ñØbf÷ó ó ð÷$zò zð,Øcg÷ô ÷8Cõ C÷
ò 
ñA?ØOTðA?Ø{÷A?ô A?÷F\ò \÷&ò &ðP.nØsw÷.nô .n÷`ò ÷">õ >÷)Aõ )AóVñ4Gà ñGàAE÷Gô GñSØ-1ðSØDHñSØ_c÷Sô Sð* ÷Eñ Eó ðE÷Mõ Mð  ÷Vñ Vó ðVñ €MÙ!€Nà÷Lñ Ló ðLð ÷Uñ Uó ðUñ Ð÷"ò "÷7ò 7ð ÷~ñ ~ó ð~÷dò d÷"Mõ M÷$õ ð& òó ð÷/õ /ð& Ð÷/õ /÷0dò d÷5ò 5ð0 Ðà÷Lñ Ló ðLð ÷ñ ó ðð ÷nñ nó ðn÷Bò B÷Võ V÷6^õ ^÷$ò ÷
ò ð( ÷Oñ Oó ðO÷Gò G÷Rò R÷"4ò 4ð ÷ñ ó ð÷N!ò N!÷`Iò Ið ÷cñ có ðc÷
Bò B÷
,Wò ,Wð\ ÷Gñ Gó ðG÷ò ÷ò ñ4ð  CG÷ ô ÷*<ò *<÷X-bò -b÷^Arò Ar÷FSò Sñ. 	™¨r¹;ÐQVÐWÙ™¨r¹>ÐQVÐWÙÑ)¨r¹<ÐQVÐWÙ™¨r¹;ÐQVÐWÙ™±¨y¹;ÐQUÐVÙ™±¨zÑ;MÐQUÐVÙÑ-±¨y¹<ÐQUÐVÙÑ-±¨zÑ;NÐQUÐVÙ™±¨y¹:ÐQUÐVÙ™±¨zÑ;LÐQUÐVð
XÐ÷4nò 4n÷lò ð ÷ñ ó ð÷0]ó ]÷~Jó Jð ÷ñ ó ñ÷Ró R÷nó n÷nö nð ÷3ñ 3ó ñ3ô!g÷F+6÷ +6ñ +6÷ZKg÷ Kgñ Kg÷Z%*÷ %*ñ %*÷N%ó %÷$ó ÷
g÷ 
gñ 
g÷ *÷  *ñ  *÷Dj÷ jñ j÷@gö gð" ÷
_ñ 
_ó ñ
_÷	}ó 	}÷
ó 
ñ" ×#Ò#÷)ñ )ó $ñ)÷*'ó '÷ó ÷$ó ÷Bó B÷Hö H÷8Ió I÷*c$ó c$ðJ ÷ñ ó ñ÷2
Mó 
M÷Nó N÷Xó X÷1ó 1÷Nó N÷eó e÷
ó 
÷Zó Z÷\ó \÷nó n÷Nó N÷
Zó Z÷Wó W÷Pó P÷
ó ÷Mó Mð$ ÷Uñ Uó ñUð ÷Fñ Fó ñFð ÷Yñ Yó ñY÷Só Sð ÷Hñ Hó ñHð$  ŸZšZÑ(=¸r¿}¹}ÓMÑÙ %Ñ÷Pó P÷Ló L÷Nó N÷kó kñ?¸5÷ ?õ ?ð& #'Ñ÷fó fð ÷hñ hó ñhð
 ÷Gñ Gó ñGð ÷Fñ Fó ñFð ÷+'ô +'ó ñ+'ðZ ÷ñ ó ñ÷ó ÷>4ó 4÷"ó ÷3ó 3÷Só S÷ó ÷ó ÷
ó 
÷Có Cô4[÷Vó V÷	Só 	S÷ló l÷&$ó $ñ %,©[×->Ò->ÁÉ×IZÒIZÑ\cÑep×evÒevÐ#wÑ ÷ó ÷.só s÷$7ó 7÷	9ó 	9÷"ó "ð ÷=ñ =ó ñ=÷
ö ÷>cö c÷0	Pó 	P÷Jó Jñ%?Èe÷ %?õ %?÷N}ó }÷,^ó ^ñ=©g¯oªoñ =ÑK^÷ =õ =÷
ó ÷Eó E÷có c÷)ó )÷&Yó Y÷F.ö .÷
ö ÷'%ö '%÷R.ó .÷mó m÷kó k÷zó z÷	Kó 	K÷
mó 
m÷Pó Pð ÷ñ ó ñ÷ó ÷4ó ð ÷#ñ #ó ñ#÷Qó Q÷f8)ó 8)÷tuó u÷}ó }÷!Ló !L÷FZó Z÷0ó ÷0ró rð ÷ñ ó ñð ÷Bñ Bó ñBð0 ÷ñ ó ñ÷('ó ('÷T*ó *÷6*[ö *[ðX ÷
Wñ 
Wó ñ
W÷
Có 
C÷ó ÷Có C÷Hó H÷Bó B÷yP ‡ ƒ r   rz  c                ó$   € V ^8„  d   QhR\         /# r�   rž   )r   s   "r   r   r   ;  s   € ÷ ñ ¤Sñ r   c                 óT  € \         P                  ! RR4      p V '       gM    ^ RIHp ^ RIHp V! V! 4       RRRR4      pVR9  d(   \        V4      P                  4       P                  4       p T ;'       g    R	p V R9  d   \        P                  R
V 4       R	p V #   \         d     L:i ; i)zfNotification mode (all/important) from env, else config.yaml display.platforms.telegram.notifications.ÚHERMES_TELEGRAM_NOTIFICATIONSr!   )Úload_gateway_config)Úcfg_getr  r¹  r<   Únotificationsr³  z[Unknown telegram notifications mode '%s', defaulting to 'important' (valid: all, important)>   Nr!   >   rE  r³  )rö   r‰  Úgateway.configr1  Úgateway.runr2  r   r  rø   r*   r7   r-  )rF  r1  r2  Ú_raws       r   Ú_resolve_notifications_moder7  ;  sŸ   € ä�9Š9Ð4°bÓ9€Dßð	Ý:Ý+ÙÑ.Ó0°)¸[È*ÐVeÓfˆDØ˜:Ô%Ü˜4“y—‘Ó(×.Ñ.Ó0�ð ×Ð�;€DØÐ'Ô'Ü�‰ÐtÐvzÔ{ØˆØ€Køô ô 	Ùð	ús   ¡AB ÂB'Â&B'c                ón   € \        V 4      p \        4       Vn        V#   \         d    RTn         T# i ; i)z:Construct TelegramAdapter and apply the notification mode.r³  )rz  r7  r  r*   )rš  r£  s   & r   Ú_build_adapterr9  N  sA   € ä˜fÓ%€Gð2Ü&AÓ&CˆÔ#ð €Nøô ô 2Ø&1ˆÕ#Ø€Nð2ús   � ž4³4c                ó$   € V ^8„  d   QhR\         /# r�   r.  )r   s   "r   r   r   X  s   € ÷ $ñ $œTñ $r   c                ó²   € \        V RR4      pV'       g"   ^ RIHp VP                  R4      ;'       g    Rp\	        \        V4      P                  4       4      # )zÀConnected when a bot token is configured (env or PlatformConfig.token); the SDK being importable is
not enough or the plugin-enable pass would enable Telegram on any machine with it installed.r  NÚTELEGRAM_BOT_TOKENr!   )r]   Úhermes_cli.gatewayr#  Úget_env_valuerB   r   r  )rš  r  Úgateway_mods   &  r   Ú_is_connectedr@  X  sI   € ô �F˜G TÓ*€EßÝ0Ø×)Ñ)Ð*>Ó?×EÐEÀ2ˆÜ”�E“
× Ñ Ó"Ó#Ð#r   rx  Úmedia_filesÚforce_documentc          
   ƒ  ó  "  € \        V RR4      pV'       g   ^ RIHp V! RR4      ;'       g    Rp\        \        V R/ 4      ;'       d    V P                  P                  R4      4      p^ RIHp	 V	! WaW$VW…R	7      G Rj  x€L
 #  L5i)
zšOut-of-process delivery (standalone_sender_fn) so deliver=telegram cron jobs succeed without the
gateway; delegates to the REST ``_send_telegram`` sender.r  N)Ú
get_secretr<  r!   r·  r   )Ú_send_telegram)rA  rx  r   rB  )r]   Úagent.secret_scoperD  rB   r·  r  Útools.send_message_toolrE  )
Úpconfigr±  r%  rx  rA  rB  r  rD  r   rE  s
   &&&$$$    r   Ú_standalone_sendrI  b  s„   é € ô �G˜W dÓ+€EßÝ1ÙÐ/°Ó4×:Ð:¸ˆÜ ¤¨°'¸2Ó!>×!mÐ!mÀ7Ç=Á=×CTÑCTÐUlÓCmÓnÐÝ6ÙØ˜ÀIØ3ôT÷ Tð Tñ Tùs   ‚+B®BÁ
5BÁ?BÂ Bc                ó   € V ^8„  d   QhRR/# rd   rQ   )r   s   "r   r   r   p  s   € ÷ &ñ &˜4ñ &r   c                 ó<   € ^ RI Hp  \        P                  ! 4        R# )zTConfigure Telegram credentials and allowlist via the CLI setup wizard (lazy import).)ÚsetupN)Ú
hermes_clirL  r   Ú_setup_telegram)Ú
_setup_mods    r   Úinteractive_setuprP  p  s   € å.Ü×#Ò#Ö%r   c                óJ   € V ^8„  d   QhR\         R\         R\         R,          /# )r   Úyaml_cfgÚtelegram_cfgr   Nrœ  )r   s   "r   r   r   v  s*   € ÷ Jñ J¤ð J´Tð J¼dÀT½kñ Jr   c                ó®  aaa€ ^ RI p^ RIHp / oV! 4       oR VVV3R llpRR/R VV3R lllpR F%  pVS9   g   K  SP                  VSV,          4       K'  	  SP	                  R	V P	                  R	4      4      pVe!   S! R
\        V4      P                  4       4       RS9   d    S! RVP                  SR,          4      4       R F  w  r‰V! W‰4       K  	  R F   w  r‰p
V! W‰SP	                  V4      V
R7       K"  	  V! RR4       RS9   dX   SP                  R\        SR,          4      P                  4       4       S! R\        SR,          4      P                  4       4       \        SP	                  R4      \        4      '       d   SP	                  R4      M/ pRS9   d
   SR,          MVP	                  R4      pVe)   S! RVRJ d   RM\        V4      P                  4       4       V! RRSP	                  R4      4       T! RRSP	                  R4      ;'       g    VP	                  R4      4       T! RRSP	                  R4      ;'       g    VP	                  R4      4       R F%  pVS9   g   K  SP                  VSV,          4       K'  	  0 R mpVP                  4        F   w  ppWþ9  g   K  SP                  VV4       K"  	  S;'       g    R# )!aE  Translate config.yaml telegram: keys into TELEGRAM_* env vars and PlatformConfig.extra. Env vars
take precedence over YAML. Returns extras to merge into PlatformConfig.extra, or None.

Implements the apply_yaml_config_fn contract (#24849). Mirrors the legacy telegram_cfg block from
gateway/config.py::load_gateway_config().
N)Úyaml_env_setterc                ó4   € V ^8„  d   QhR\         R\         RR/# )r   r¤   râ	  r   Nrž   )r   s   "r   r   Ú(_apply_yaml_config.<locals>.__annotate__…  s!   € ÷ :ñ :œ3ð :¤Sð :¨Tñ :r   c                 óš   <€ V S9   dC   SP                  V SV ,          4       S! V\        SV ,          4      P                  4       4       R # R # rP   )r¦  r   rø   )r¤   râ	  Ú_set_envÚextrasrS  s   &&€€€r   Ú_bridge_lowerÚ)_apply_yaml_config.<locals>._bridge_lower…  sB   ø€ Ø�,ÔØ×Ñ˜c <°Õ#4Ô5Ù�Sœ#˜l¨3Õ/Ó0×6Ñ6Ó8Ö9ñ r   Ú
seed_extraFc          
      óL   € V ^8„  d   QhR\         R\         R\        R\        RR/# )r   r¤   râ	  rH   r]  r   N)r   r   rB   )r   s   "r   r   rW  Š  s0   € ÷ ñ œ#ð ¤Cð ´ð ÄDð ÐUYñ r   c               óV   <€ Vf   R# V'       d   SP                  W4       S! W4       R# )uZ   CSV allowlist gate: list â†’ comma-joined; env write skipped under multiplex secret scope.N)r¦  )r¤   râ	  rH   r]  rY  rZ  s   &&&$€€r   Ú_bridge_gateÚ(_apply_yaml_config.<locals>._bridge_gateŠ  s$   ø€ àŠ=ÙßØ×Ñ˜cÔ)Ù�Ör   r„  r…  rÙ  rØ  )r]  r  r  r£  r¢  r·  rž  ÚTELEGRAM_REPLY_TO_MODErô  rÄ  rn  rÃ  r«  r¿  r¬  )Údisable_topic_auto_renameÚdm_topic_auto_transfer))r˜  r™  )Ú
allow_botsÚTELEGRAM_ALLOW_BOTS)rž  rŸ  )r’  r“  )r‹  rŒ  ))r¥  r¦  T)r¬  r­  F)r¹  rº  F)rÊ  rË  F)rÐ  rÑ  T)r’  r   r‹  r¬  >   Ú	dm_policyrÄ  Úgroup_policyÚreply_prefixrž  Úchannel_promptsÚnotice_deliveryÚreply_in_threadr„  Úallow_admin_fromÚchannel_skill_bindingsr¹  Úgateway_restart_notification)r  Úgateway.platforms._sharedrU  r¦  r  r   rø   Údumpsr  r5  r  r
  )rR  rS  Ú_jsonrU  r[  r`  Ú
_topic_keyÚ_effective_rmr¤   râ	  ÚseedÚ_telegram_extraÚ_telegram_rtmÚ_keyÚ_GENERIC_MERGE_KEYSÚ_kÚ_vrY  rZ  s   &f               @@r   Ú_apply_yaml_configr|  v  sÒ  ú€ ó Ý9Ø€Fñ Ó €H÷:ò :ð
È5÷ ó ó Nˆ
Ø˜Ö%Ø×Ñ˜j¨,°zÕ*BÖCñ Nð !×$Ñ$Ð%6¸¿¹ÐEVÓ8WÓX€MØÒ ÙÐ+¬S°Ó-?×-EÑ-EÓ-GÔHØ˜\Ô)ÙÐ,¨e¯k©k¸,ÐGYÕ:ZÓ.[Ô\óH‰ˆñ 	�cÖñ	Hó?‰ˆ�$ñ 	�S˜|×/Ñ/°Ó4À×Fñ	?ñ
 �+Ð3Ô4Ø�lÔ"à×Ñ˜+¤s¨<¸Õ+DÓ'E×'KÑ'KÓ'MÔNÙÐ!¤3 |°KÕ'@Ó#A×#GÑ#GÓ#IÔJÜ3=¸l×>NÑ>NÈwÓ>WÔY]×3^Ò3^�l×&Ñ& wÔ/Ðdf€OØ5DÈÔ5T�L Ö1ÐZi×ZmÑZmÐn}ÓZ~€MØÒ ÙÐ)°MÀUÓ4J©5ÔPSÐTaÓPb×PhÑPhÓPjÔkÙ�Ð7¸×9IÑ9IÈ,Ó9WÔXÙÐ#Ð%CÀ\×EUÑEUÐVhÓEi÷  FUð  FUÐm|÷  nAñ  nAð  BTó  nUô  VÙØÐ=Ø×ÑÐ.Ó/×]Ð]°?×3FÑ3FÐG\Ó3]ô_ó vˆØ�<ÖØ×Ñ˜d L°Õ$6Ö7ñ vò
9Ðð "×'Ñ'Ö)‰ˆˆBØÖ(Ø×Ñ˜b "Ö%ñ *ð �>ˆ>�TÐr   c                ó   € V ^8„  d   QhRR/# rd   rQ   )r   s   "r   r   r   Ã  s   € ÷ ñ �Tñ r   c                ód  € ^RI Hp ^RIHp ^RIHp V P                  ! R'RRRRR\        R	\        /VB/ R
\        bR\        bRR.bR\        R4      bR\        bR\        bRRbR\        bRRbRRbRRbRVbRRbRRR R!R"/bR#\        bR$VP                   bR%VP"                  bBVP$                  B  R&# )(u:   Plugin entry point â€” called by the Hermes plugin system.)ÚPLATFORM_HINT)ÚDASHBOARD_CARD)Úgateway_envr„  r<   r;   rÚ  Úadapter_factoryÚcheck_fnÚensure_deps_fnÚis_connectedÚrequired_envr<  Úinstall_hintzplatform.telegram.install_hintÚsetup_fnÚapply_yaml_config_fnÚcron_deliver_env_varÚTELEGRAM_HOME_CHANNELÚstandalone_sender_fnÚmax_message_lengthr|  r*  u   âœˆï¸�Úallow_update_commandTÚplatform_hintÚdisplay_tierÚhighÚdisplay_overridesÚtool_progressrô  Úbusy_ack_detailFÚtarget_ref_syntax_fnÚenv_overridesÚenv_enable_credentialsNrQ   )Úadapter_hintr  Údashboard_cardr€  r!   r�  Úregister_platformr9  r1  rI  r@  rŠ   rP  r|  rI  r¾   ÚENV_OVERRIDESÚENV_ENABLE_CREDENTIALSÚAUTHZ)Úctxr  r€  r�  s   &   r   ÚregisterrŸ  Ã  s,  € å+Ý.ÝØ×Òñ ØðØ)ðÜ;IðÜTiðà
òõ 3ðõ BOðð _sÑ]sðô Ð7Ô8ð	õ DUð	õ l~ð	ñ Ulð	õ
 .ðñ
 CGðñ
 OWðñ
 nrðñ $ðñ ðð +¨EÐ3DÀeÑLðõ /ðð "×/Ò/ðð  +×AÒAðð FQ×EVÑEVôr   c                ól   € V ^8„  d   Qh/ ^ \         9   d    \        \        \        ,          ,          ;R&   # )r   r   )Ú__conditional_annotations__r   r   rÚ   )r   s   "r   r   r      s'   € × iÑ i÷j qÒ pœZ¬´­Õ6Ñ pòk jr   >   rÎ   rË   rÊ   rÌ   rÍ   )Ár¡  rv  r0   r%  ry  rø  r¤  r  rŽ  rö   Úhtmlr®   rU  r}  Úcontextvarsr   r   r   r   r"  r   r   r   r	   r
   r   r   r   rM  r   Ú	getLoggerr(   r7   Úagent.deadliner   Úagent.ssl_verifyr   rp  r   r~  r   rv  r   rä  r   rq  r,   r9   rK   rb   rm   r<   ro   rp   rq   rr   rs   rt   rD  Útelegram.extru   rv   rw   rx   ry   rC  rz   r{   r|   Útelegram.constantsr}   r~   Útelegram.requestr   r0  r�   rÂ  Úpathlibr‡   Ú_Pathrã   Úinsertr   Ú__file__r¬	  ÚparentsÚgateway.authz_mixinrˆ   Ú
agent.i18nr‰   rŠ   r4  r‹   rŒ   ru
  r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r¡   rò  r¢   r¨   r²   rÐ  Úgateway.platforms.eventr¸   r¹   rº   Ú,plugins.platforms.telegram.telegram_entitiesr»   Ú0plugins.platforms.telegram.telegram_held_inboundr¼   Ú'plugins.platforms.telegram.telegram_idsr½   r¾   r¿   Ú2plugins.platforms.telegram.telegram_topic_transferrÀ   rÁ   Ú+plugins.platforms.telegram.telegram_networkrÂ   rÃ   rÄ   rÅ   rÆ   Ú1plugins.platforms.telegram.telegram_topic_routingrÇ   ÚutilsrÈ   rÉ   rz  r]  r  rÖ   ry  r{  rà   r
  r  r,  r1  rI  r(  rM  rP  rW  rZ  r[  Úgateway.platforms.helpersr\  r»  r]  r^  rd  re  rb  rj  r$  r7  rÃ  r   ra  r9  rh  r]  rV  rC
  r3  rN  r   r  rt  rx  rz  r7  r9  r@  rI  rP  r|  rŸ  r   )r¡  s   @r   Ú<module>rº     sï  øðæ iã Û Û Û Û Û Û Û 	Û Û 	Û Ý "ß ,Ñ ,ß P× PÓ PÝ &à	×	Ò	˜8Ó	$€å ,Ý 1÷ó õ+õYðØ-1ðØ@JðØim÷õ0wõVð*%ßYÕYð"Ý/÷,÷ ,ó ,÷ 7Ý-ØÐó Ý !Ø ‡�‡��‘3‘u˜X“×.Ñ.Ó0×8Ñ8¸Õ;Ó<Ô =å 1ß &ß 3÷÷ ÷ ÷ ð €Ø!$Ð õHõ+õ
@ð Ð;¸WÐFjØÐ9¸<ÐImØÐ6ð8Ð ÷
 QÑ PÝ MÝ Uß |Ñ |ß l÷~õ ~å Wß $âGÐ ð "Ð ð '*Ð #õ]ð
  +¨F°LÀ&È+ÐW]Ð_kÐmtð  wBð  DJð  KÐ Ø% {°F¸LÈ'ÐS_ÐahÐjvÐx~ð  ALð  MÐ õ&õ õFõBõBõ"ðL —*“*Ð<Ó=€õ.õ
ð  "Ÿz›zÐ*_Ó`Ð õI÷|ñ |ð
 ŸJ›Jðð ‡L‚LóÐ õð" Ð ØÐ ØÐ ð %)Ð !ð €ð %*Ð !Ø Ð ð Ð ð &'Ð "ð  Ð ð Ð ð Ð Ù9CÐDaÐkoÔ9pÐ Ó pôH˜\ô Hô˜ô ôhhBÐ.Ð0IÐK^ô hhBõjQò&õ$ðTÀ4ð TÐUYð TÐjoô Tõ&õJ÷ZøðYb ô "Ø!Óð"ûð ô 	%ØÐØY\Ð\€FÐ\ˆSÐ\�7Ð\Ð1Ð\Ð4HÈ;ØwzÐz€NÐzÐ)ÐzÐ,>ÐzÀÐzÐOeÐhtØ:>Ð>ÐÐ>˜Ð> 9¨x÷ñ à$ƒLð	%ús6   Â0L Â?K> Ã$L Ë>	LÌL Ì
LÌL Ì5MÍM