+
    kHàj‡B ã                  óN  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHtHt ^ RIH t H!t! ]	PD                  ! ]#4      t$^xt% ^ RI&t&]&RJt( ^ RI)H*t* ^ R	I+H,t,H-t-H.t. ],RJt/^ R
I0H1t1H2t2 ^ RI3H4t4H5t5H6t6 ^ RI7H8t8 ^ RI9H:t: ^ RI;H<t<H=t=H>t>H?t?H@t@HAtAHBtBHCtC ^ RIDHEtEHFtF ^ RIGHHtH ^ RIIHJtJ ^ RIKHLtLHMtNHOtP ^ RIQHRtRHStS RÐR R lltTRtURtVRRRÑutWtXtYRRRutZt[t\RRut]t^R R!ut_t`RÒw  tatbtctd^^^utetftgRÓRÔuthtiR"tjRÕw  tktltmtnRÖw  totptqtrts^^utttu^^utvtw/ txR#]yR$&   ]Pô                  ! R%4      t{]Pô                  ! R&4      t|]Pô                  ! R'4      t}R( R) lt~R* R+ ltR, R- lt€R. R/ lt�R0 R1 lt‚R2 R3 ltƒR×R4 R5 llt„RØR6 R7 llt…R8 R9 lt†R: R; lt‡R< R= ltˆR> R? lt‰R@ RA ltŠRBR/RC RD llt‹RE RF ltŒ ! RG RH4      t� ! RI RJ4      tŽRK RL lt�RM RN lt�ROR/RP RQ llt‘RR RS lt’RT RU lt“RV RW lt”RX RY lt•RZ R[ lt–R\ R] lt—R^ R_ lt˜R` Ra lt™RbRc/Rd Re lltš]›! 0 RÙm4      tœRf]yRg&   Rh Ri lt�Rj Rk l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¤Rx Ry lt¥Rz R{ lt¦RÚR} R~ llt§RÛR R€ llt¨R� R‚ lt©Rƒ]FEPT                  3R„]FEPV                  3R…]FEPX                  33t­R† R‡ lt®Rˆ R‰ lt¯RŠ R‹ lt°RŒ R� lt±RŽ R� lt²R�R‘RbR’/R“ R” llt³]rR•R– 3]pR—R˜ 3]sR™Rš 3]qR›Rœ 3/t´R�]yRž&   RŸ R  ltµ]! ]µ]r4      ]! ]µ]p4      ut¶t·]! ]µ]s4      ]! ]µ]q4      ut¸t¹]pR—R¡R¢ R£R¤3]sR™R¥R¦ R§R¨3]rR•RcR© RRª3]qR›RcR« R¬R­3/tºR®]yR¯&   ]›! 0 RÜm4      R°R±3]=R²R³3]<R´Rµ33t»R¶]yR·&   0 RÝmt¼ ! R¸ R¹]8]?4      t½Rº R» lt¾R¼R/R½ R¾ llt¿R¿tÀ]L! RÀRÁ4      tÁRÂ RÃ ltÂRÄ RÅ ltÃRÆRR¼RRÇR|/RÈ RÉ lltÄ^ RÞ^Rß^Rà/tÅRátÆRÊ RË ltÇRÌtÈ]Pô                  ! RÍ4      tÉRÎ RÏ ltÊR#   ]' d    Rt& ELƒi ; i  ]' d    R;t*;t,;t-t. EL„i ; i)âa  Weixin (WeChat personal account) adapter over Tencent's iLink Bot API. Long-poll ``getupdates`` drives inbound
delivery; every outbound reply must echo the peer's latest ``context_token``; media moves through an AES-128-ECB
encrypted CDN; ``qr_login`` backs the gateway setup wizard.)ÚannotationsN)Údatetime)Úpartial)ÚPath)ÚAnyÚ	AwaitableÚCallableÚDictÚListÚOptionalÚTuple)ÚquoteÚurlparse)Údefault_backend)ÚCipherÚ
algorithmsÚmodes)ÚPlatformÚPlatformConfig)ÚMessageDeduplicatorÚcancel_taskÚgreedy_pack_blocks)ÚOwnAccessPolicyMixin)Út)Ú_IMAGE_EXTSÚ_VIDEO_EXTSÚgateway_trust_envÚBasePlatformAdapterÚ
SendResultÚcache_audio_from_bytes_asyncÚcache_document_from_bytes_asyncÚcache_image_from_bytes_async)ÚMessageEventÚMessageType)Úget_hermes_home)Úatomic_json_write)Úenv_is_connectedÚextra_or_secretÚget_scoped_secret)ÚStandaloneSendPolicyÚregex_groups_parserÚ c               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Úextraúdict[str, Any]ÚkeyÚstrÚdefaultÚreturn© )Úformats   "ÚE/home/ubuntu/.hermes/hermes-agent/plugins/platforms/weixin/adapter.pyÚ__annotate__r7   -   s.   € ÷ Tñ T˜Nð T°ð T¸sð TÈCñ Tó    c           	     ól   € \        \        WRVP                  4        2V4      4      P                  4       # )zH``config.extra[key]`` first, else the scoped ``WEIXIN_<KEY>``; stripped.ÚWEIXIN_)r1   Ú_extra_or_envÚupperÚstrip)r.   r0   r2   s   &&&r6   Ú_extra_or_secretr>   -   s,   € äŒ}˜U¨7°3·9±9³;°-Ð)@À'ÓJÓK×QÑQÓSÐSr8   zhttps://ilinkai.weixin.qq.comz%https://novac2c.cdn.weixin.qq.com/c2cÚbotz2.2.0zilink/bot/getupdateszilink/bot/sendmessagezilink/bot/sendtypingzilink/bot/getconfigzilink/bot/getuploadurlzilink/bot/get_bot_qrcodezilink/bot/get_qrcode_statusi,  r/   Ú_LIVE_ADAPTERSz^(#{1,6})\s+(.+?)\s*$z3^\s*\|?(?:\s*:?-{3,}:?\s*\|)+\s*:?-{3,}:?\s*\|?\s*$z^```([^\n`]*)\s*$c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   ÚretzOptional[int]ÚerrcodeÚerrmsgúOptional[str]r3   Úboolr4   )r5   s   "r6   r7   r7   F   s)   € ÷ ñ ˜}ð °}ð Èmð Ð`dñ r8   c                ó€   € V \         8H  ;'       g    V\         8H  ;'       d    T;'       g    RP                  4       R9   # )zRRecognize stale-session variants of iLink's ``-2`` response, not real rate limits.r+   >   úunknown errorúprepare failed)ÚRATE_LIMIT_ERRCODEÚlower©rB   rC   rD   s   &&&r6   Ú_is_stale_session_retrM   F   sF   € àÔ%Ñ%×FÐF¨Ô4FÑ)F÷ ð ÈVÏ\È\ÐWY×L`ÑL`ÓLbð gñ Mð r8   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   Úrespr/   rB   r   rC   r3   rF   r4   )r5   s   "r6   r7   r7   N   s.   € ÷ Cñ C˜nð C°3ð CÀð CÈñ Cr8   c                óŽ   € \         W39   ;'       g5    \        YV P                  R 4      ;'       g    V P                  R4      4      # )rD   Úmsg)ÚSESSION_EXPIRED_ERRCODErM   Úget)rO   rB   rC   s   &&&r6   Ú_is_session_expiredrT   N   s]   € Ü" s nÑ4÷  Cð  CÔ8MÈcÐ\`×\dÑ\dÐemÓ\n÷  ]Bð  ]BÐrv×rzÑrzð  |Aó  sBó  9Cð  Cr8   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rB   r   rC   rD   r3   ÚRuntimeErrorr4   )r5   s   "r6   r7   r7   R   s.   € ÷ Hñ H #ð H°ð H¸Sð HÀ\ñ Hr8   c           	     ó@   € \        RT  RT RT;'       g    R R24      # )uƒ  The stale-session ``-2`` after the tokenless re-send is exhausted (or with no token to drop): iLink will not
prepare a bot-initiated send until this peer messages the bot again. Deterministic, so it is neither retried nor
fed to the rate-limit breaker (#80125). The text must not contain "rate limit" â€” ``classify_send_error`` would
route it back into the rate-limited redelivery lane.z)iLink sendmessage session not ready: ret=ú	 errcode=ú errmsg=rH   u<    â€” the user must send the bot a message first (or re-pair))rV   rL   s   &&&r6   Ú_session_not_ready_errorrZ   R   s:   € ô
 Ø
3°C°5¸	À'ÀÈ(ÐSY×SlÐSlÐ]lÐRmØFð	GóHð Hr8   c               ó   € V ^8„  d   QhRR/# )r-   r3   zOptional[aiohttp.TCPConnector]r4   )r5   s   "r6   r7   r7   \   s   € ÷ @ñ @Ð;ñ @r8   c                 óÄ   €  ^ RI p ^ RIHp \        '       g   R# T! 4       pTf   R# \
        P                  ! T P                  TR7      ^RR7      #   \         d     R# i ; i)aÔ  TCPConnector with certifi's CA bundle (``ilinkai.weixin.qq.com`` fails some system stores, e.g. Homebrew
OpenSSL); None when no certifi bundle resolves (absent, or deleted by an install-environment rotation and
not re-derivable), so aiohttp's default (honors ``SSL_CERT_FILE`` under trust_env) applies.
``keepalive_timeout=2`` + ``enable_cleanup_closed`` drain idle CLOSE_WAIT sockets behind proxies like Warp.

Uses a tight ``keepalive_timeout=2`` (default aiohttp: 30s) so idle connections drain promptly behind
proxies like Cloudflare Warp that leave peer-initiated FIN in ``CLOSE_WAIT`` (same class as #18451).
``enable_cleanup_closed=True`` helps the connector clean up sockets that the remote side has already
closed.
N)Úcertifi_bundle_path)ÚcafileT)ÚsslÚkeepalive_timeoutÚenable_cleanup_closed)r_   Úagent.ssl_verifyr]   ÚImportErrorÚAIOHTTP_AVAILABLEÚaiohttpÚTCPConnectorÚcreate_default_context)r_   r]   r^   s      r6   Ú_make_ssl_connectorrh   \   sc   € ðÛå8÷ ÓÙñ !Ó"€FØ‚~ÙÜ×Ò C×$>Ñ$>ÀfÐ$>Ó$MÐabÐz~ÔÐøô ô Úðús   ‚
A ÁAÁAc               ó    € V ^8„  d   QhRRRR/# )r-   Úkwargsr   r3   úaiohttp.ClientSessionr4   )r5   s   "r6   r7   r7   w   s   € ÷ kñ k˜3ð kÐ#8ñ kr8   c                 óV   € \         P                  ! RR \        4       R\        4       /V B # )Ú	trust_envÚ	connectorr4   )re   ÚClientSessionr   rh   )rj   s   ,r6   Ú_new_sessionrp   w   s)   € Ü× Ò ÑjÔ+<Ó+>ÐjÔJ]ÓJ_ÐjÐciÑjÐjr8   c               ó   € V ^8„  d   QhRR/# ©r-   r3   rF   r4   )r5   s   "r6   r7   r7   {   s   € ÷ 2ñ 2 4ñ 2r8   c                 ó*   € \         ;'       d    \        # ©N)rd   ÚCRYPTO_AVAILABLEr4   r8   r6   Úcheck_weixin_requirementsrv   {   s   € Ü×1Ð1Ô!1Ð1r8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   ÚvaluerE   ÚkeepÚintr3   r1   r4   )r5   s   "r6   r7   r7      s!   € ÷ &ñ &�Mð &¨ð &°Sñ &r8   c                óf   € \        T ;'       g    R 4      P                  4       pV'       d   VRV # R# )r+   NÚ?)r1   r=   )rx   ry   Úraws   && r6   Ú_safe_idr~      s.   € Ü
ˆe�kˆk�rÓ
×
 Ñ
 Ó
"€Cßˆ3ˆu�ˆ:Ð% #Ð%r8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   ÚdataÚbytesÚ
block_sizerz   r3   r4   )r5   s   "r6   r7   r7   „   s!   € ÷ -ñ -�Uð -¨ð -°Uñ -r8   c                óh   € V\        V 4      V,          ,
          pV \        V.V,          4      ,           # rt   )Úlenr�   )r€   r‚   Úpad_lens   && r6   Ú
_pkcs7_padr†   „   s,   € ØœC ›I¨
Õ2Õ3€GØ”%˜˜	 GÕ+Ó,Õ,Ð,r8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   Ú	plaintextr�   r0   r3   r4   )r5   s   "r6   r7   r7   ‰   s&   € ÷ Jñ J 5ð J¨uð J¸ñ Jr8   c                óö   € \        \        P                  ! V4      \        P                  ! 4       \        4       R 7      P                  4       pVP                  \        V 4      4      VP                  4       ,           # )©Úbackend)
r   r   ÚAESr   ÚECBr   Ú	encryptorÚupdater†   Úfinalize)rˆ   r0   rŽ   s   && r6   Ú_aes128_ecb_encryptr‘   ‰   sO   € Ü”z—~’~ cÓ*¬E¯IªI«KÄÓARÔS×]Ñ]Ó_€IØ×ÑœJ yÓ1Ó2°Y×5GÑ5GÓ5IÕIÐIr8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   Ú
ciphertextr�   r0   r3   r4   )r5   s   "r6   r7   r7   Ž   s!   € ÷ ñ  Eð °ð ¸%ñ r8   c                ó�  € \        \        P                  ! V4      \        P                  ! 4       \        4       R7      P                  4       pVP                  V 4      VP                  4       ,           pV'       d
   VR,          M^ p^Tu;8:  d   ^8:  d3   M V# VP                  \        V.4      V,          4      '       d   VRV)  # V# )z[Decrypt and strip PKCS#7 padding when it is well-formed (else return the raw block output).rŠ   Néÿÿÿÿ)r   r   rŒ   r   r�   r   Ú	decryptorr�   r�   Úendswithr�   )r“   r0   r–   Úpaddedr…   s   &&   r6   Ú_aes128_ecb_decryptr™   Ž   s™   € ä”z—~’~ cÓ*¬E¯IªI«KÄÓARÔS×]Ñ]Ó_€IØ×Ñ˜jÓ)¨I×,>Ñ,>Ó,@Õ@€Fß"ˆf�RŽj¨€GØˆGÖ�rÖà€Mð %Ÿo™o¬e°W°IÓ.>ÀÕ.H×IÒIØ�i˜�xÐ Ð Ø€Mr8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   ÚtokenrE   Úbodyr1   r3   údict[str, str]r4   )r5   s   "r6   r7   r7   ˜   s!   € ÷ ñ �Mð ¨ð °ñ r8   c                óp  € \         P                  ! \        \        P	                  \
        P                  ! ^4      R4      4      P                  R4      4      P                  R4      pRRRRR\        \        VP                  R4      4      4      R	VR
\        R\        \        4      /V '       d	   RRV  2/C# / C# )é   Úbigzutf-8ÚasciiúContent-Typezapplication/jsonÚAuthorizationTypeÚilink_bot_tokenzContent-LengthzX-WECHAT-UINúiLink-App-IdúiLink-App-ClientVersionÚAuthorizationzBearer )Úbase64Ú	b64encoder1   rz   Ú
from_bytesÚsecretsÚtoken_bytesÚencodeÚdecoder„   ÚILINK_APP_IDÚILINK_APP_CLIENT_VERSION)r›   rœ   Úuins   && r6   Ú_headersr²   ˜   s¯   € Ü
×
Ò
œ3œsŸ~™~¬g×.AÒ.AÀ!Ó.DÀeÓLÓM×TÑTÐU\Ó]Ó
^×
eÑ
eÐfmÓ
n€CàÐ*Ð,?ÐARØœ#œc $§+¡+¨gÓ"6Ó7Ó8¸.È#ØœÐ&?ÄÔE]ÓA^ð÷ 49ˆO˜w u gÐ.Ð/ð	ð ð ?Að	ð r8   c               ó    € V ^8„  d   QhRRRR/# )r-   Úhermes_homer1   r3   r   r4   )r5   s   "r6   r7   r7   ¢   s   € ÷ ñ ˜cð  dñ r8   c                ó^   € \        V 4      R ,          R,          pVP                  RRR7       V# )ÚweixinÚaccountsT)ÚparentsÚexist_ok)r   Úmkdir)r´   Úpaths   & r6   Ú_account_dirr¼   ¢   s+   € Ü�Ó˜xÕ'¨*Õ4€DØ‡J�J�t d€JÔ+Ø€Kr8   c               ó    € V ^8„  d   QhRRRR/# )r-   r»   r   r3   r   r4   )r5   s   "r6   r7   r7   ¨   s   € ÷ ñ �Tð ˜cñ r8   c                ó¤   €  V P                  4       '       d'   \        P                  ! V P                  R R7      4      # R#   \         d     R# i ; i)ú	utf-8-sig©ÚencodingN)ÚexistsÚjsonÚloadsÚ	read_textÚ	Exception)r»   s   &r6   Ú
_read_jsonrÇ   ¨   sC   € ðàCGÇ;Á;Ç=Â=Œt�zŠz˜$Ÿ.™.°+˜.Ó>Ó?ÐZÐVZÐZøÜô Úðús   ‚A  ˜%A  ¾A  Á AÁAÚuser_idc               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r-   r´   r1   Ú
account_idr›   Úbase_urlrÈ   r3   ÚNoner4   )r5   s   "r6   r7   r7   °   s9   € ÷ ñ  Sð ¸ð ÀSð ÐTWð Ðbeð Ðosñ r8   c               óL  € \        V 4      V R 2,          p\        P                  ! R\        P                  ! 4       4      p\	        VRVRVRVRV/4       \
        P                  ! \        4      ;_uu_ 4        VP                  R4       RRR4       R#   + '       g   i     R# ; i)ú.jsonz%Y-%m-%dT%H:%M:%SZr›   rË   rÈ   Úsaved_ati€  N)	r¼   ÚtimeÚstrftimeÚgmtimer%   Ú
contextlibÚsuppressÚOSErrorÚchmod)r´   rÊ   r›   rË   rÈ   r»   rÏ   s   &$$$$  r6   Úsave_weixin_accountr×   °   sx   € Ü˜Ó$¨*¨°UÐ';Õ;€DÜ�}Š}Ð1´4·;²;³=ÓA€HÜ�d˜W e¨Z¸À9ÈgÐWaÐckÐlÔmÜ	×	Ò	œW×	%Õ	%Ø�
‰
�5Ô÷ 
&×	%×	%Ò	%ús   Á6BÂB#	c               ó$   € V ^8„  d   QhRRRRRR/# )r-   r´   r1   rÊ   r3   úOptional[dict[str, Any]]r4   )r5   s   "r6   r7   r7   ¸   s'   € ÷ Hñ H Sð H°cð HÐ>Vñ Hr8   c                ó>   € \        \        V 4      V R 2,          4      # )rÎ   )rÇ   r¼   )r´   rÊ   s   &&r6   Úload_weixin_accountrÛ   ¸   s   € Ü”l ;Ó/°Z°LÀÐ2FÕFÓGÐGr8   c                  ól   € ] tR t^¼tRtR R lt]R R l4       tR R ltR R	 lt	R
 R lt
R R ltRtR# )ÚContextTokenStorez<Disk-backed ``context_token`` cache keyed by account + peer.c               ó   € V ^8„  d   QhRR/# )r-   r´   r1   r4   )r5   s   "r6   r7   ÚContextTokenStore.__annotate__¿   s   € ÷ ,ñ , Cñ ,r8   c                	óh   € \        V4      V n        / V n        \        P                  ! 4       V n        R # rt   )r¼   Ú_rootÚ_cacheÚasyncioÚLockÚ_persist_lock)Úselfr´   s   &&r6   Ú__init__ÚContextTokenStore.__init__¿   s%   € Ü! +Ó.ˆŒ
Ø&(ˆŒô %Ÿ\š\›^ˆÖr8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rÊ   r1   rÈ   r3   r4   )r5   s   "r6   r7   rß   È   s!   € ÷ )ñ )˜ð ) sð )¨sñ )r8   c                	ó   € V  R V 2# )Ú:r4   )rÊ   rÈ   s   &&r6   Ú_keyÚContextTokenStore._keyÇ   s   € à�˜Q˜w˜iÐ(Ð(r8   c               ó    € V ^8„  d   QhRRRR/# )r-   rÊ   r1   r3   rÌ   r4   )r5   s   "r6   r7   rß   Ë   s   € ÷ lñ l #ð l¨$ñ lr8   c                	ót  € V P                   V R 2,          pVP                  4       '       g   R#  \        P                  ! VP	                  RR7      4      pTP                  4        UUu/ uF9  w  rV\        T\        4      '       g   K  T'       g   K'  T P                  Y4      TbK;  	  pppT P                  P                  T4       T'       d,   \        P                  R\!        T4      \        T4      4       R# R#   \
         d,   p\        P                  R\        T4      T4        Rp?R# Rp?ii ; iu uppi )ú.context-tokens.jsonNr¿   rÀ   z3weixin: failed to restore context tokens for %s: %sz+weixin: restored %d context token(s) for %s)rá   rÂ   rÃ   rÄ   rÅ   rÆ   ÚloggerÚwarningr~   ÚitemsÚ
isinstancer1   rì   râ   r�   Úinfor„   )ræ   rÊ   r»   r€   ÚexcÚur   Úrestoreds   &&      r6   ÚrestoreÚContextTokenStore.restoreË   sî   € Ø�z‰z˜z˜lÐ*>Ð?Õ?ˆØ�{‰{�}Š}Ùð	Ü—:’:˜dŸn™n°k˜nÓBÓCˆDð =A¿J¹J¼LÔe¹L±D°AÌJÐWXÔZ]×L^Ô/ÔcdÔ/�D—I‘I˜jÓ,¨aÒ/¹LˆÑeØ�‰×Ñ˜8Ô$ßÜ�K‰KÐEÄsÈ8Ã}ÔV^Ð_iÓVjÖkñ øô ô 	Ü�N‰NÐPÔRZÐ[eÓRfÐhkÔlÝûð	üó fs)   °&C; Á)D4ÂD4ÂD4Ã;D1Ä D,Ä,D1c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rÊ   r1   rÈ   r3   rE   r4   )r5   s   "r6   r7   rß   Ù   s!   € ÷ ?ñ ?˜cð ?¨Cð ?°Mñ ?r8   c                	óV   € V P                   P                  V P                  W4      4      # rt   )râ   rS   rì   )ræ   rÊ   rÈ   s   &&&r6   rS   ÚContextTokenStore.getÙ   s   € Ø�{‰{�‰˜tŸy™y¨Ó=Ó>Ð>r8   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rÊ   r1   rÈ   r›   r3   rÌ   r4   )r5   s   "r6   r7   rß   Ü   s.   € ÷ Hñ H Cð H°#ð H¸cð HÀdñ Hr8   c           
   ƒ  	óö  "  € W0P                   V P                  W4      &   V P                  ;_uu_4       GR j  x€L
  V R2pV P                   P                  4        UUu/ uF-  w  rVVP	                  V4      '       g   K  V\        V4      R  VbK/  	  ppp\        P                  ! V P                  W4      G R j  x€L
  R R R 4      GR j  x€L
  R #  L—u uppi  L L  + GR j  x€L 
 '       g   i     R # ; i5i)Nrë   )	râ   rì   rå   ró   Ú
startswithr„   rã   Ú	to_threadÚ_persist)ræ   rÊ   rÈ   r›   Úprefixr0   rx   Úpayloads   &&&&    r6   ÚsetÚContextTokenStore.setÜ   s·   é € Ø6;�‰�D—I‘I˜jÓ2Ñ3ð ×%×%×%Ó%Ø"�| 1Ð%ˆFØBFÇ+Á+×BSÑBSÔBUÔpÑBU±J°CÐY\×YgÑYgÐhn×YoÔ/�sœ3˜v›;˜<Ð(¨%Ò/ÑBUˆGÑpÜ×#Ò# D§M¡M°:ÓG×GÐG÷ &×%Ó%ùãpÙG÷ &×%×%Ó%üsn   ‚6C9¸C¹C9¼#CÁC
Á?C
Â'CÂ9CÂ:CÂ>C9Ã	CÃ
C9ÃCÃC9ÃC6	Ã"C%Ã#
C6	Ã.C6	Ã0	C9c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rÊ   r1   r  r�   r3   rÌ   r4   )r5   s   "r6   r7   rß   å   s&   € ÷ mñ m 3ð m°ð mÀDñ mr8   c                	óº   €  \        V P                  V R 2,          V4       R#   \         d,   p\        P	                  R\        T4      T4        Rp?R# Rp?ii ; i)rð   z3weixin: failed to persist context tokens for %s: %sN)r%   rá   rÆ   rñ   rò   r~   )ræ   rÊ   r  rö   s   &&& r6   r  ÚContextTokenStore._persistå   sR   € ð	mÜ˜dŸj™j¨j¨\Ð9MÐ+NÕNÐPWÖXøÜô 	mÜ�N‰NÐPÔRZÐ[eÓRfÐhk×lÒlûð	mús   ‚ $ ¤A¯ AÁA)râ   rå   rá   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rç   Ústaticmethodrì   rù   rS   r  r  Ú__static_attributes__r4   r8   r6   rÝ   rÝ   ¼   s;   † ÙFõ,ð ô)ó ð)õlõ?õH÷mñ mr8   rÝ   c                  óB   € ] tR t^ìtRtR
R R lltR R ltR R ltRtR	# )ÚTypingTicketCachez3Short-lived typing ticket cache from ``getconfig``.c               ó   € V ^8„  d   QhRR/# )r-   Úttl_secondsÚfloatr4   )r5   s   "r6   r7   ÚTypingTicketCache.__annotate__ï   s   € ÷ 7ñ 7 Eñ 7r8   c                	ó    € Wn         / V n        R # rt   )Ú_ttl_secondsrâ   )ræ   r  s   &&r6   rç   ÚTypingTicketCache.__init__ï   s   € Ø'ÔØ46ˆŽr8   c               ó    € V ^8„  d   QhRRRR/# )r-   rÈ   r1   r3   rE   r4   )r5   s   "r6   r7   r  ó   s   € ÷ ñ ˜3ð  =ñ r8   c                	óú   € V P                   P                  V4      pV'       d<   \        P                  ! 4       V^,          ,
          V P                  8  d
   V^ ,          # V P                   P	                  VR4       R# )é   N)râ   rS   rÐ   r  Úpop)ræ   rÈ   Úentrys   && r6   rS   ÚTypingTicketCache.getó   sQ   € Ø—‘—‘ Ó(ˆß”T—Y’Y“[ 5¨¥8Õ+¨d×.?Ñ.?Ô?Ø˜•8ˆOØ�‰�‰˜ Ô&Ùr8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rÈ   r1   Úticketr3   rÌ   r4   )r5   s   "r6   r7   r  ú   s!   € ÷ 5ñ 5˜3ð 5¨ð 5°ñ 5r8   c                	óN   € V\         P                   ! 4       3V P                  V&   R # rt   )rÐ   râ   )ræ   rÈ   r!  s   &&&r6   r  ÚTypingTicketCache.setú   s   € Ø &¬¯	ª	«Ð4ˆ�‰�GÓr8   )râ   r  N)g     À‚@)	r
  r  r  r  r  rç   rS   r  r  r4   r8   r6   r  r  ì   s   † Ù=÷7õ÷5ñ 5r8   r  c               ó    € V ^8„  d   QhRRRR/# )r-   Úaes_key_b64r1   r3   r�   r4   )r5   s   "r6   r7   r7   þ   s   € ÷ Rñ R ð R¨ñ Rr8   c                óz  € \         P                  ! V 4      p\        V4      ^8X  d   V# \        V4      ^ 8X  d   VP                  RRR7      MRpV'       dP   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   \
        P                  V4      # \        R\        V4       R	24      h)
é   r¡   Úignore)Úerrorsr+   c              3  ó*   "  € T F	  qR 9   x € K  	  R# 5i)Ú0123456789abcdefABCDEFNr4   )Ú.0Úchs   & r6   Ú	<genexpr>Ú!_parse_aes_key.<locals>.<genexpr>  s   é € ÐB¹T°rÐ2Ö2»Tùs   ‚FTzunexpected aes_key format (z decoded bytes))r¨   Ú	b64decoder„   r®   Úallr�   ÚfromhexÚ
ValueError)r%  ÚdecodedÚtexts   &  r6   Ú_parse_aes_keyr6  þ   s�   € Ü×Ò˜{Ó+€GÜ
ˆ7ƒ|�rÔØˆÜ7:¸7³|ÀrÔ7Iˆ7�>‰>˜'¨(ˆ>Ô3Èr€Dß—“ÑB¹TÓB——’ÑB¹TÓB×BÒBÜ�}‰}˜TÓ"Ð"Ü
Ð2´3°w³<°.ÀÐPÓ
QÐQr8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   Úmessager/   rÊ   r1   r3   útuple[str, str]r4   )r5   s   "r6   r7   r7     s!   € ÷ 8ñ 8˜nð 8¸#ð 8À/ñ 8r8   c                ó$  € \        V P                  R 4      ;'       g    V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g    R4      P                  4       pV'       g-   V'       d_   V'       dW   W18w  dQ   V P                  R4      ^8X  d;   RT;'       g/    T;'       g%    \        V P                  R4      ;'       g    R4      3# R\        V P                  R4      ;'       g    R4      3# )Úroom_idÚchat_room_idr+   Ú
to_user_idÚmsg_typeÚgroupÚfrom_user_idÚdm)r1   rS   r=   )r8  rÊ   r;  r=  s   &&  r6   Ú_guess_chat_typerB    sÌ   € Ü�'—+‘+˜iÓ(×MÐM¨G¯K©K¸Ó,G×MÐMÈ2ÓN×TÑTÓV€GÜ�W—[‘[ Ó.×4Ð4°"Ó5×;Ñ;Ó=€Jß—:§*°Ô1IÈgÏkÉkÐZdÓNeÐijÔNjØ˜×WÐW :×WÐW´°W·[±[ÀÓ5P×5VÐ5VÐTVÓ1WÐWÐWØ”�W—[‘[ Ó0×6Ð6°BÓ7Ð7Ð7r8   rœ   c               ó8   € V ^8„  d   QhRRRRRRRRRRR	R
RRRR/# )r-   Úsessionrk   Úmethodr1   rË   ÚendpointÚheadersr�   Ú
timeout_msrz   rœ   rE   r3   r/   r4   )r5   s   "r6   r7   r7     sZ   € ÷ 
Dñ 
DØ"ð
DØ,/ð
DØ>Að
DØMPð
DØ[ið
DØwzð
Dð CPð
Dàñ
Dr8   c             ƒ  óŽ   a aaaaa"  € R  VVVVVV 3R llp\         P                  ! V! 4       VR,          R7      G Rj  x€L
 #  L5i)c               ó   € V ^8„  d   QhRR/# )r-   r3   r/   r4   )r5   s   "r6   r7   Ú"_api_request.<locals>.__annotate__  s   € ÷ #ñ #�~ñ #r8   c               “  óê  <"  € Se   RS/M/ p \        SSP                  4       4      ! SP                  R4       RS 23RS/V B ;_uu_4       GR j  x€L
 pVP                  4       G R j  x€L
 pVP                  '       g)   \        RS RS RVP                   RVR,           24      h\        P                  ! V4      uuR R R 4      GR j  x€L
  #  L~ Lh L	  + GR j  x€L 
 '       g   i     R # ; i5i)	Nr€   Ú/rG  ziLink Ú z HTTP ú: ºNéÈ   N)	ÚgetattrrK   Úrstripr5  ÚokrV   ÚstatusrÃ   rÄ   )	rj   Úresponser}   rË   rœ   rF  rG  rE  rD  s	      €€€€€€r6   Ú_doÚ_api_request.<locals>._do  sË   øé € Ø#'Ò#3�&˜$‘¸ˆÜ˜7 F§L¡L£NÔ3°x·±ÀsÓ7KÐ6LÈAÈhÈZÐ4XÑtÐbiÐtÐms×t×tÒtð  yAØ Ÿ™›×'ˆCØ—;—;�;Ü" V¨F¨8°1°X°J¸fÀXÇ_Á_ÐDUÐUWÐX[Ð\`ÕXaÐWbÐ#cÓdÐdÜ—:’:˜c“?÷	 u×tÔtÙ'÷ u×t×tÓtüsf   ƒAC3ÁCÁC3ÁCÁ)CÁ*CÂ =CÂ=C3Ã
CÃC3ÃCÃC3ÃC0	ÃCÃ
C0	Ã(C0	Ã*	C3iè  ©ÚtimeoutN©rã   Úwait_for)rD  rE  rË   rF  rG  rH  rœ   rW  s   ffddd$d r6   Ú_api_requestr]    s2   ýé € ÷#õ #ô ×!Ò!¡#£%°¸dÕ1BÔC×CÐCÑCùs   ˆ6A¾A¿Ac               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r-   rD  rk   rË   r1   rF  r  r/   r›   rE   rH  rz   r3   r4   )r5   s   "r6   r7   r7     sQ   € ÷ Vñ VØ"ðVØ14ðVØ@CðVØN\ðVØerðVð ADðVàñVr8   c          
   ƒ  óš   "  € \         P                  ! / VCR R\        //CRRR7      p\        V RW\	        WF4      WVR7      G Rj  x€L
 #  L5i)Ú	base_infoÚchannel_versionF)Úensure_asciiÚ
separatorsÚPOST)rË   rF  rG  rH  rœ   N)Ú,rë   )rÃ   ÚdumpsÚCHANNEL_VERSIONr]  r²   )rD  rË   rF  r  r›   rH  rœ   s   &$$$$$ r6   Ú	_api_postrh    sb   é € ô �:Š:ÐT˜ÐT +Ð0AÄ?Ð/SÑTÐchÐuô  A€DÜ˜g v¸Ô]eÐfkÓ]rð  @Jô  V÷  Vð  Vñ  Vùs   ‚AAÁA	ÁAc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r-   rD  rk   rË   r1   rF  rH  rz   r3   r/   r4   )r5   s   "r6   r7   r7   &  s9   € ÷ |ñ |Ð1ð |Àð |Èsð |Ð`cð |Ðhvñ |r8   c          	   ƒ  ój   "  € R \         R\        \        4      /p\        V RWWCR7      G Rj  x€L
 #  L5i)r¥   r¦   ÚGET)rË   rF  rG  rH  N)r¯   r1   r°   r]  )rD  rË   rF  rH  rG  s   &$$$ r6   Ú_api_getrl  &  s2   é € Øœ|Ð-FÌÔLdÓHeÐf€GÜ˜g u°xÐ\cÔ{×{Ð{Ñ{ùs   ‚*3¬1­3c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r-   rD  rk   rË   r1   r›   Úsync_bufrH  rz   r3   r/   r4   )r5   s   "r6   r7   r7   +  sG   € ÷ Cñ CÐ 5ð CÀCð CÐPSð CÐ_bð CÐpsð Cð  yGñ Cr8   c          	   ƒ  ó|   "  €  \        W\        R V/W$R7      G Rj  x€L
 #  L  \         d    R^ R. R T/u # i ; i5i)Úget_updates_buf©rË   rF  r  r›   rH  NrB   Úmsgs)rh  ÚEP_GET_UPDATESÚTimeoutError)rD  rË   r›   rn  rH  s   &$$$$r6   Ú_get_updatesru  +  s^   é € ðCÜ˜wÄNÐ]nÐpxÐ\yð  BGô  _÷  _ð  	_ñ  _øÜô CØ�q˜& "Ð&7¸ÐBÒBðCüs(   ‚<„# œ!�#  <¡# £9¶<¸9¹<c               ó8   € V ^8„  d   QhRRRRRRRRRRR	R
RRRR/# )r-   rD  rk   rË   r1   r›   ÚtoÚ	item_listúlist[dict[str, Any]]Úcontext_tokenrE   Ú	client_idr3   r/   r4   )r5   s   "r6   r7   r7   2  s^   € ÷ Sñ SØ"ðSØ14ðSØ=@ðSØFIðSØVjðSð |IðSð VYðSàñSr8   c             ƒ  ó–   "  € R RRVRVR\         R\        RV/pV'       d   WWR&   \        W\        RV/V\        R	7      G R
j  x€L
 #  L5i)r@  r+   r=  r{  Úmessage_typeÚmessage_staterx  rz  rQ   rq  N)ÚMSG_TYPE_BOTÚMSG_STATE_FINISHrh  ÚEP_SEND_MESSAGEÚAPI_TIMEOUT_MS)rD  rË   r›   rw  rx  rz  r{  r8  s   &$$$$$$ r6   Ú_send_itemsrƒ  2  sn   é € ð 	˜˜L¨"¨k¸9ÀnÔVbÐdsô  vFØ�Yð €G÷ Ø#0�Ñ Ü˜7ÄÐZ_ÐahÐYiÐqvô  DRô  S÷  Sð  Sñ  Sùs   ‚A A	ÁAÁA	c               ó8   € V ^8„  d   QhRRRRRRRRRRRR	R
RRR/# )r-   rD  rk   rË   r1   r›   rw  r5  rz  rE   r{  r3   r/   r4   )r5   s   "r6   r7   r7   =  sZ   € ÷ Tñ TØ"ðTØ14ðTØ=@ðTØFIðTØQTðTØerðTð @CðTàñTr8   c          
   ƒ  ó¨   "  € V'       d   VP                  4       '       g   \        R 4      hR\        RRV//.p\        WW#WuVR7      G Rj  x€L
 #  L5i)z%_send_message: text must not be emptyÚtypeÚ	text_itemr5  ©rË   r›   rw  rx  rz  r{  N)r=   r3  Ú	ITEM_TEXTrƒ  )rD  rË   r›   rw  r5  rz  r{  rx  s   &$$$$$$ r6   Ú_send_messagerŠ  =  s^   é € ÷ �t—z‘z—|’|ÜÐ@ÓAÐAØœ) [°6¸4°.ÐAÐB€IÜ˜W¸uÐW`ð  JSô  T÷  Tð  Tñ  Tùs   ‚A¡*AÁAÁAc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r-   rD  rk   rË   r1   r›   rÈ   rz  rE   r3   r/   r4   )r5   s   "r6   r7   r7   F  sF   € ÷ Kñ KÐ4ð KÀ3ð KÈsð KÐ]`ð KÐq~ð Kð  DRñ Kr8   c          	   ƒ  ól   "  € R V/pV'       d   WER&   \        W\        WR\        R7      G Rj  x€L
 #  L5i)Úilink_user_idrz  rq  N)rh  ÚEP_GET_CONFIGÚCONFIG_TIMEOUT_MS)rD  rË   r›   rÈ   rz  r  s   &$$$$ r6   Ú_get_configr�  F  sC   é € Ø.°Ð8€GßØ#0�Ñ Ü˜7ÄÐW^ô  yJô  K÷  Kð  Kñ  Kùs   ‚+4­2®4c               óD   € V ^8„  d   QhRRRRRRRRRRR	RR
RRRRRRRRR/# )r-   rD  rk   rË   r1   r›   r=  Ú
media_typerz   ÚfilekeyÚrawsizeÚ
rawfilemd5ÚfilesizeÚ
aeskey_hexr3   r/   r4   )r5   s   "r6   r7   r7   M  ss   € ÷ Lñ LØ"ðLØ14ðLØ=@ðLØNQðLØ_bðLØmpðLØ{~ðLàðLà"ðLà03ðLð ñLr8   c       	      ƒ  óp   "  € R VRVRVRVRVRVRRRV	/p
\        W\        W¢\        R	7      G R
j  x€L
 #  L5i)r“  r’  r=  r”  r•  r–  Úno_need_thumbTÚaeskeyrq  N)rh  ÚEP_GET_UPLOAD_URLr‚  )rD  rË   r›   r=  r’  r“  r”  r•  r–  r—  r  s   &$$$$$$$$$ r6   Ú_get_upload_urlrœ  M  sa   é € ð
 	�7˜L¨*°lÀJÐPYÐ[bÐdpÐr|Ø�H˜o¨t°X¸zðK€Gô ˜7Ô@QÐ[bô  }Kô  L÷  Lð  Lñ  Lùs   ‚-6¯4°6c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rD  rk   r“   r�   Ú
upload_urlr1   r3   r4   )r5   s   "r6   r7   r7   W  s+   € ÷ 	6ñ 	6Ð&;ð 	6ÈEð 	6Ð_bð 	6Ðgjñ 	6r8   c             ƒ  ót   a aa"  € R  VV V3R llp\         P                  ! V! 4       ^xR7      G Rj  x€L
 #  L5i)c               ó   € V ^8„  d   QhRR/# )r-   r3   r1   r4   )r5   s   "r6   r7   Ú(_upload_ciphertext.<locals>.__annotate__X  s   € ÷ añ a�sñ ar8   c               “  ó  <"  € SP                  SSR R/R7      ;_uu_4       GRj  x€L
 p V P                  ^È8X  d   V P                  P                  R4      MRpV'       d-   V P	                  4       G Rj  x€L
  TuuRRR4      GRj  x€L
  # V P                  4       G Rj  x€L
 R,          p\        V P                  ^È8X  d
   RV 24      hRV P                   RV 24      h Lº Ln L] LF  + GRj  x€L 
 '       g   i     R# ; i5i)	r¢   úapplication/octet-stream)r€   rG  Nzx-encrypted-paramrP  z-CDN upload missing x-encrypted-param header: zCDN upload HTTP rO  )ÚpostrU  rG  rS   Úreadr5  rV   )rV  Úencrypted_paramr}   r“   rD  rž  s      €€€r6   rW  Ú_upload_ciphertext.<locals>._doX  s  øé € Ø—<‘< 
°ÀnÐVpÐEq�<×r×rÔrÐv~ØKSÏ?É?Ð^aÔKa˜h×.Ñ.×2Ñ2Ð3FÔGÐgkˆOßØ—m‘m“o×%Ð%Ø&÷	 s×rÒrð
 "Ÿ™›×(¨$Õ/ˆCÜÐX`×XgÑXgÐknÔXnÐ!NÈsÈeÐTó  að  að  wGð  HP÷  HWñ  HWð  GXð  XZð  [^ð  Z_ð  u`ó  að  añ sñ &ñ sñ
 )÷ s×r×rÑrüs�   ƒ#D¦C!§Dª6C)Á!C)Á4C#Á5C)Á:DÂC%ÂDÂC)Â C'Â!A C)Ã!DÃ#C)Ã%DÃ'C)Ã)D	Ã/C2Ã0
D	Ã;D	Ã=	DrY  Nr[  )rD  r“   rž  rW  s   fdd r6   Ú_upload_ciphertextr¨  W  s/   úé € ÷aò aô ×!Ò!¡#£%°Ô5×5Ð5Ñ5ùs   …,8±6²8Útimeout_secondsg      N@c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r-   rD  rk   Úurlr1   r©  r  r3   r�   r4   )r5   s   "r6   r7   r7   c  s1   € ÷ Bñ BÐ#8ð BÀ#ð BÐX]ð BÐinñ Br8   c             ƒ  óp   a a"  € R  V V3R llp\         P                  ! V! 4       VR7      G Rj  x€L
 #  L5i)c               ó   € V ^8„  d   QhRR/# )r-   r3   r�   r4   )r5   s   "r6   r7   Ú%_download_bytes.<locals>.__annotate__d  s   € ÷ )ñ )�uñ )r8   c               “  ó
  <"  € SP                  S4      ;_uu_4       GR j  x€L
 p V P                  4        V P                  4       G R j  x€L
 uuR R R 4      GR j  x€L
  #  L> L L	  + GR j  x€L 
 '       g   i     R # ; i5irt   )rS   Úraise_for_statusr¥  )rV  rD  r«  s    €€r6   rW  Ú_download_bytes.<locals>._dod  sN   øé € Ø—;‘;˜s×#×#Ô# xØ×%Ñ%Ô'Ø!Ÿ™›×(÷ $×#Ô#á(÷ $×#×#Ó#üs\   ƒB¡A ¢B¥$A&Á	A"Á
A&ÁBÁA$ÁBÁ"A&Á$BÁ&B 	Á,A/Á-
B 	Á8B 	Á:	BrY  Nr[  )rD  r«  r©  rW  s   fd$ r6   Ú_download_bytesr²  c  s-   ùé € ÷)ñ )ô ×!Ò!¡#£%°ÔA×AÐAÑAùs   „+6¯4°6zfrozenset[str]Ú_WEIXIN_CDN_ALLOWLISTc               ó    € V ^8„  d   QhRRRR/# )r-   r«  r1   r3   rÌ   r4   )r5   s   "r6   r7   r7   o  s   € ÷ 	|ñ 	| ð 	|¨ñ 	|r8   c                ó&  €  \        V 4      pVP                  P                  4       VP                  ;'       g    R r2TR9  d   \        RT: R24      hT\        9  d   \        RT: R24      hR#   \         d   p\        RT : 24      ThRp?ii ; i)r+   zUnparseable media URL: Nz Media URL has disallowed scheme z ; only http/https are permitted.zMedia URL host zG is not in the WeChat CDN allowlist. Refusing to fetch to prevent SSRF.>   ÚhttpÚhttps)r   ÚschemerK   ÚhostnamerÆ   r3  r³  )r«  Úparsedr¸  Úhoströ   s   &    r6   Ú_assert_weixin_cdn_urlr¼  o  sž   € ðEÜ˜#“ˆØ—}‘}×*Ñ*Ó,¨f¯o©o×.CÐ.CÀ�ð Ð&Ô&ÜÐ;¸F¹:ÐEeÐfÓgÐgØÔ(Ô(Ü˜?¨4©(Ð2yÐzÓ{Ð{ñ )øô	 ô EÜÐ2°3±'Ð:Ó;ÀÐDûðEús   ‚6A0 ¹A0 Á0BÁ;BÂBc               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r-   rD  rk   Úcdn_base_urlr1   Úencrypted_query_paramrE   r%  Úfull_urlr©  r  r3   r�   r4   )r5   s   "r6   r7   r7   {  sO   € ÷ Yñ YØ"ðYØ58ðYØQ^ðYØmzðYàðYà.3ðYð ñYr8   c             ƒ  ó  "  € V'       d#   VP                  R 4       R\        VRR7       2pM!V'       d   \        V4       TpM\        R4      h\	        WVR7      G Rj  x€L
 pV'       d   \        V\        V4      4      # T#  L#5i)rM  z /download?encrypted_query_param=r+   ©Úsafez7media item had neither encrypt_query_param nor full_url©r«  r©  N)rS  r   r¼  rV   r²  r™   r6  )rD  r¾  r¿  r%  rÀ  r©  r«  r}   s   &$$$$$  r6   Ú_download_and_decrypt_mediarÅ  {  s}   é € ÷ Ø×$Ñ$ SÓ)Ð*Ð*JÌ5ÐQfÐmoÔKpÐJqÐr‰ß	Ü˜xÔ(Ø‰äÐTÓUÐUÜ À/ÔR×
R€CßDOÔ˜s¤N°;Ó$?Ó@ÐXÐUXÐXñ Sùs   ‚2Bµ)BÁBÁBÁ+Bc               ó   € V ^8„  d   QhRR/# )r-   Úcontentr1   r4   )r5   s   "r6   r7   r7   Š  s   € ÷ .ñ . #ñ .r8   c              #  óæ   "  € RpV P                  4        FV  pVP                  4       p\        \        P	                  VP                  4       4      4      pW4V3x € V'       g   KO  V'       * pKX  	  R# 5i)zyYield ``(rstripped line, is_fence, in_code_block)`` per line; ``in_code_block`` is the state *before* a fence toggles it.FN)Ú
splitlinesrS  rF   Ú	_FENCE_REÚmatchr=   )rÇ  Úin_code_blockÚraw_lineÚlineÚis_fences   &    r6   Ú_walk_markdown_linesrÐ  Š  sZ   é € à€MØ×&Ñ&Ö(ˆØ�‰Ó ˆÜœ	Ÿ™¨¯
©
«Ó5Ó6ˆØ˜mÐ+Ò+ß‰8Ø -Ô-ŠMó )ùs   ‚AA1Á$A1c               ó    € V ^8„  d   QhRRRR/# ©r-   rÇ  r1   r3   r4   )r5   s   "r6   r7   r7   •  s   € ÷ %ñ %¨ð %°ñ %r8   c                óJ  € . p^ p\        V 4       Fr  w  r4pV'       gB   V'       g:   VP                  4       '       g$   V^,          pV^8:  d   VP                  R4       KO  V'       g	   V'       g   ^ pVP                  V4       Kt  	  RP                  V4      P                  4       # )zKrstrip lines and collapse blank runs to one, leaving fenced code untouched.r+   Ú
)rÐ  r=   ÚappendÚjoin)rÇ  ÚresultÚ	blank_runrÎ  rÏ  rÌ  s   &     r6   Ú_normalize_markdown_blocksrÙ  •  s   € à€FØ€IÜ)=¸gÖ)FÑ%ˆ˜ß§°d·j±j·l²lØ˜�NˆIØ˜AŒ~Ø—‘˜bÔ!ÙßŸ=ØˆIØ�‰�dÖñ *Gð �9‰9�VÓ×"Ñ"Ó$Ð$r8   c               ó    € V ^8„  d   QhRRRR/# rÒ  r4   )r5   s   "r6   r7   r7   ¥  s   € ÷ &ñ &°#ð &¸#ñ &r8   c                ó  € V '       g   V # . p\        V 4       FÔ  w  r#pVP                  4       pT;'       gE    T;'       g;    \        V4      \        8*  ;'       g!    V'       * ;'       g    VP	                  R4      pV'       g   \
        P                  V4      '       d   VP                  V4       Kš  TP                  \        P                  ! V\        RRRRR7      ;'       g    V.4       KÖ  	  RP                  V4      P                  4       # )zWWrap long display lines that are hard to copy in WeChat clients (not code/table lines).Ú|FT)ÚwidthÚbreak_long_wordsÚbreak_on_hyphensÚreplace_whitespaceÚdrop_whitespacerÔ  )rÐ  r=   r„   ÚWEIXIN_COPY_LINE_WIDTHr   Ú_TABLE_RULE_RErË  rÕ  ÚextendÚtextwrapÚwraprÖ  )rÇ  ÚwrappedrÎ  rÏ  rÌ  Ústrippedry   s   &      r6   Ú$_wrap_copy_friendly_lines_for_weixinré  ¥  sß   € çØˆØ€GÜ)=¸gÖ)FÑ%ˆ˜Ø—:‘:“<ˆØ×{Ð{˜=×{Ð{¬C°«IÔ9OÑ,O×{Ð{ÐW_ÔS_×{Ð{Ðck×cvÑcvÐwzÓc{ˆß”>×'Ñ'¨×1Ò1Ø�N‰N˜4Ö à�N‰Nœ8Ÿ=š=ØÔ2ÀUÐ]bÐw|Ø $ô&÷ 0ð 0à*.¨ö1ñ *Gð �9‰9�WÓ×#Ñ#Ó%Ð%r8   c               ó    € V ^8„  d   QhRRRR/# ©r-   rÇ  r1   r3   ú	list[str]r4   )r5   s   "r6   r7   r7   ¶  s   € ÷ 0ñ 0 Cð 0¨Iñ 0r8   c                ó|  aa€ . o. oR  VV3R llp\        V 4       Fw  w  r#pV'       d   V'       g   V! 4        V'       g   V'       g   VP                  4       '       d   SP                  V4       MV! 4        V'       g   Kf  V'       g   Kp  V! 4        Ky  	  V! 4        S Uu. uF  qU'       g   K  VNK  	  up# u upi )c               ó   € V ^8„  d   QhRR/# ©r-   r3   rÌ   r4   )r5   s   "r6   r7   Ú,_split_markdown_blocks.<locals>.__annotate__º  s   € ÷ ñ �4ñ r8   c                 ó˜   <€ S'       dA   S P                  R P                  S4      P                  4       4       SP                  4        R# R# )rÔ  N)rÕ  rÖ  r=   Úclear)ÚblocksÚcurrents   €€r6   ÚflushÚ%_split_markdown_blocks.<locals>.flushº  s2   ø€ ßØ�M‰M˜$Ÿ)™) GÓ,×2Ñ2Ó4Ô5Ø�M‰MŽOñ r8   )rÐ  r=   rÕ  )rÇ  rõ  rÎ  rÏ  rÌ  Úblockró  rô  s   &     @@r6   Ú_split_markdown_blocksrø  ¶  s‰   ù€ Ø€FØ€G÷ñ ô *>¸gÖ)FÑ%ˆ˜ßŸMÙŒGß—}¨¯
©
¯ªØ�N‰N˜4Õ áŒGß‰8Ÿ™ÙŽGñ *Gñ 
„GÙ%Ó/™v�e«�EˆE™vÑ/Ð/ùÒ/s   Â"	B9Â0B9c               ó    € V ^8„  d   QhRRRR/# rë  r4   )r5   s   "r6   r7   r7   Ë  s   € ÷ ,ñ ,¨cð ,°iñ ,r8   c                óà  € . p\        V 4       EF=  p\        P                  VP                  4       ^ ,          P	                  4       4      '       d   VP                  V4       KU  . pVP                  4        F¤  pVP                  4       pV'       dA   VP	                  4       '       d+   VP                  R4      '       d   VP                  V4       K[  VP                  RP                  V4      P	                  4       4       VP	                  4       '       d   V.M. pK¦  	  VP                  RP                  V4      P	                  4       4       EK@  	  V Uu. uF  qf'       g   K  VNK  	  up# u upi )zpTop-level lines become units; fenced code stays intact; indented continuation lines attach to the previous line.rÔ  ©rN  Ú	)	rø  rÊ  rË  rÉ  r=   rÕ  rS  r   rÖ  )rÇ  Úunitsr÷  rô  rÍ  rÎ  Úunits   &      r6   Ú _split_delivery_units_for_weixinrÿ  Ë  s
  € à€EÜ'¨×0ˆÜ�?‰?˜5×+Ñ+Ó-¨aÕ0×6Ñ6Ó8×9Ò9Ø�L‰L˜ÔÙØˆØ×(Ñ(Ö*ˆHØ—?‘?Ó$ˆDß˜4Ÿ:™:Ÿ<š<¨H×,?Ñ,?À×,LÒ,LØ—‘˜tÔ$ÙØ�L‰L˜Ÿ™ 7Ó+×1Ñ1Ó3Ô4Ø $§
¡
§¢�t‘f°"ŠGñ +ð 	�‰�T—Y‘Y˜wÓ'×-Ñ-Ó/×0ñ 1ñ #Ó+™U�T£d�DˆD™UÑ+Ð+ùÒ+s   Å	E+Å"E+c               ó    € V ^8„  d   QhRRRR/# )r-   rÎ  r1   r3   rF   r4   )r5   s   "r6   r7   r7   Þ  s   € ÷ Gñ G¨Sð G°Tñ Gr8   c                ó°  € V P                  4       p\        T;'       dµ    \        V4      ^08*  ;'       dŸ    V P                  R4      '       * ;'       d�    VP                  R4      '       * ;'       dc    \        P                  V4      '       * ;'       dA    \        P
                  ! RV4      '       * ;'       d    \        P
                  ! RV4      '       * 4      # )é0   z^\*\*[^*]+\*\*$z^\d+\.\srû  )Ú>Ú-Ú*u   ã€�Ú#rÜ  )r=   rF   r„   r   rã  rË  Úre)rÎ  rè  s   & r6   Ú"_looks_like_chatty_line_for_weixinr  Þ  sã   € Ø�z‰z‹|€HÜØ÷ 	Fð 	F”S˜“] bÑ(÷ 	Fð 	F°·±ÀÓ1MÔ-M÷ 	Fð 	FÐV^×ViÑVið  kKó  WLô  SL÷ 	Fð 	FÜ×$Ñ$ XÓ.Ô.÷	Fð 	FÜ79·x²xÐ@RÐT\Ó7]Ô3]÷	Fð 	FÜfh×fnÒfnÐozð  }Eó  gFô  cFóGð Gr8   c               ó    € V ^8„  d   QhRRRR/# )r-   r÷  r1   r3   rF   r4   )r5   s   "r6   r7   r7   å  s   € ÷ Kñ K°Sð K¸Tñ Kr8   c                óÒ  € V P                  4        Uu. uF  qP                  4       '       g   K  VNK  	  pp^\        V4      u;8:  d
   ^8:  g    R#  R# V^ ,          P                  4       p\        P	                  V4      '       g(   \        V4      ^8:  d   VP                  R4      '       d   R# \        ;QJ d    R V 4       F  '       d   K   R# 	  R# ! R V 4       4      # u upi )ziSplit only chat-like multiline blocks (2-6 chatty lines, first line not a heading) into separate bubbles.Fc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5irt   )r  )r,  rÎ  s   & r6   r.  Ú<_should_split_short_chat_block_for_weixin.<locals>.<genexpr>í  s   é € ÐJÁE¸DÔ1°$×7Ð7ÃEùs   ‚T)rë   u   ï¼š)rÉ  r=   r„   Ú
_HEADER_RErË  r—   r1  )r÷  rÎ  ÚlinesÚfirsts   &   r6   Ú)_should_split_short_chat_block_for_weixinr  å  s±   € à#×.Ñ.Ô0ÓAÑ0�d·J±J·L�TˆTÑ0€EÐAØ”�E“
Ö˜aÕÙð  ÙØ�!�H�N‰NÓ€EÜ×Ñ˜×Ò¤3 u£:°Ô#3¸¿¹À|×8TÒ8TÙß‹3ÑJÁEÓJ�3Œ3ÐJŠ3ÐJˆ3ÑJÁEÓJÓJÐJùò Bs
   “C$¯C$c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rÇ  r1   Ú
max_lengthrz   r3   rì  r4   )r5   s   "r6   r7   r7   ð  s&   € ÷ ^ñ ^¨cð ^¸sð ^Àyñ ^r8   c                ód   a€ \        V 4      S8:  d   V .# V3R  lp\        \        V 4      SVR7      # )c                ó2   <€ \         P                  ! V S4      # rt   )r   Útruncate_message)r÷  r  s   &€r6   Ú<lambda>Ú2_pack_markdown_blocks_for_weixin.<locals>.<lambda>ô  s   ø€ Ô0×AÒAÀ%ÈÔTr8   )Úoverflow)r„   r   rø  )rÇ  r  r  s   &f r6   Ú _pack_markdown_blocks_for_weixinr  ð  s2   ø€ Ü
ˆ7ƒ|�zÔ!ØˆyÐäT€HÜÔ4°WÓ=¸zÐT\Ô]Ð]r8   Fc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r-   rÇ  r1   r  rz   Úsplit_per_linerF   r3   rì  r4   )r5   s   "r6   r7   r7   ø  s0   € ÷ zñ z¨Sð z¸cð zÐSWð zÐdmñ zr8   c                óÊ  € V '       g   . # V'       dƒ   \        V 4      V8:  d   RV 9  d   V .# \        V 4      pV UUu. uF)  p\        V4      V8:  d   V.M
\        WA4       F  qUNK  	  K+  	  pppV Uu. uF  qU'       g   K  VNK  	  up;'       g    V .# \        V 4      V8”  d   \        W4      ;'       g    V .# \        V 4      '       d   \        V 4      # V .# u uppi u upi )a   Compact (default): one message when it fits, unless it reads as a short chatty exchange (separate
bubbles). Per-line (legacy ``extra.split_multiline_messages`` / ``WEIXIN_SPLIT_MULTILINE_MESSAGES``):
top-level line breaks become separate messages. Oversized units use block-aware packing.rÔ  )r„   rÿ  r  r  )rÇ  r  r  rý  r÷   ÚcÚchunkss   &&&    r6   Ú_split_text_for_weixin_deliveryr  ø  s×   € ÷ Øˆ	ßÜˆw‹<˜:Ô%¨$°gÔ*=Ø�9ÐÜ0°Ó9ˆÙ"Ô™U˜´C¸³F¸jÔ4H¨a©SÔNnÐopÓN}Ò-} q’!Ñ-}‘!™UˆÑÙ!Ó'™6�a£Q—�™6Ñ'×4Ð4¨G¨9Ð4Ü
ˆ7ƒ|�jÔ Ü/°ÓD×QÐQÈÈ	ÐQÜ8aÐbi×8jÒ8jÔ+¨GÓ4ÐyÐqxÐpyÐyùó	 @ùÚ's   ½/CÁ3	C ÂC c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rx   r   r2   rF   r3   r4   )r5   s   "r6   r7   r7   	  s&   € ÷ uñ u˜ð u dð u°dñ ur8   c                óÒ   € V f   V# \        V \        \        34      '       d   \        V 4      # \	        V 4      P                  4       P                  4       pVR9   d   R# VR9   d   R# T# )zZCoerce a config value to bool, tolerating strings like ``"true"``; unknown -> ``default``.TF>   Ú1ÚonÚyesÚtrue>   Ú0ÚnoÚoffÚfalse)rô   rz   r  rF   r1   r=   rK   )rx   r2   r5  s   && r6   Ú_coerce_boolr*  	  sc   € à‚}ØˆÜ�%œ#œu˜×&Ò&Ü�E‹{ÐÜˆu‹:×ÑÓ×#Ñ#Ó%€DØÐ5Ô5ˆ4ÐtÀDÐLgÔDg¸5ÐtÐmtÐtr8   c               ó    € V ^8„  d   QhRRRR/# )r-   rx  ry  r3   r1   r4   )r5   s   "r6   r7   r7     s   € ÷ ñ Ð1ð °cñ r8   c                ór  € V  EF”  pVP                  R 4      \        8X  g   K   \        VP                  R4      ;'       g    / P                  R4      ;'       g    R4      pVP                  R4      ;'       g    / pVP                  R4      ;'       g    / pVP                  R 4      \        \        \
        \        09   dQ   VP                  R4      ;'       g    RpV'       d   RV RV 2P                  4       u # R	V 2P                  4       u # V'       d   VP                  R4      '       d   \        VR,          4      MR\        V.4      3 Uu. uF  qf'       g   K  VNK  	  ppV'       d(   R
RP                  V4       RV 2P                  4       u # Vu # 	  V  F�  pVP                  R 4      \        8X  g   K  VP                  R4      ;'       g    / p\        VP                  R4      ;'       g    R4      p	VP                  R4      '       d   Kw  / '       d   K�  V	'       g   K‹  RV	 2u # 	  R# u upi )r†  r‡  r5  r+   Úref_msgÚmessage_itemÚtitleu   [å¼•ç”¨åª’ä½“: z]
u   [å¼•ç”¨åª’ä½“]
u	   [å¼•ç”¨: z | Ú
voice_itemÚmediaz)[Voice transcription provided by Weixin]
)
rS   r‰  r1   Ú
ITEM_IMAGEÚ
ITEM_VIDEOÚ	ITEM_FILEÚ
ITEM_VOICEr=   Ú_extract_textrÖ  )
rx  Úitemr5  ÚrefÚref_itemr/  ÚpÚpartsr0  Ú
voice_texts
   &         r6   r6  r6    sÓ  € ÜˆØ�8‰8�FÓœyÖ(Ü˜Ÿ™ Ó-×3Ð3°×8Ñ8¸Ó@×FÐFÀBÓGˆDØ—(‘(˜9Ó%×+Ð+¨ˆCØ—w‘w˜~Ó.×4Ð4°"ˆHØ�|‰|˜FÓ#¬
´JÄ	Ì:Ð'VÔVØŸ™ Ó(×.Ð.¨B�ßEJ˜¨¨¨s°4°&Ð9×?Ñ?ÓAÒqÐRbÐcgÐbhÐPi×PoÑPoÓPqÒqßØ:=¿'¹'À'×:JÒ:J¤S¨¨W­Ô%6ÐPRÔTaÐckÐblÓTmÑ$nÓtÑ$n˜qÓrsŸ˜Ñ$n�ÐtßØ& u§z¡z°%Ó'8Ð&9¸¸T¸FÐC×IÑIÓKÒKØŠKñ ó ˆØ�8‰8�FÓœzÖ)ð Ÿ™ ,Ó/×5Ð5°2ˆJô ˜ZŸ^™^¨FÓ3×9Ð9°rÓ:ˆJØ—N‘N 7×+Ô+¯r©r·z±zØCÀJÀ<ÐPÒPñ ñ ùò' us   Å	H4ÅH4úimage/úvideo/zaudio/c               ó$   € V ^8„  d   QhRRRRRR/# )r-   Úmedia_typesrì  r5  r1   r3   r#   r4   )r5   s   "r6   r7   r7   6  s&   € ÷ vñ v¨)ð v¸3ð vÀ;ñ vr8   c                óJ  a€ \          FJ  w  op\        ;QJ d    V3R  lV  4       F  '       g   K   RM	  RM! V3R  lV  4       4      '       g   KH  Vu # 	  V '       d   \        P                  # VP	                  R4      '       d   \        P
                  # \        P                  # )c              3  óD   <"  € T F  qP                  S4      x € K  	  R # 5irt   )r   )r,  Úmr  s   & €r6   r.  Ú+_message_type_from_media.<locals>.<genexpr>8  s   øé € Ð9©[¨�|‰|˜F×#Ð#«[ùs   ƒ TFrM  )Ú_MIME_PREFIX_TYPESÚanyr#   ÚDOCUMENTr   ÚCOMMANDÚTEXT)r@  r5  r}  r  s   && @r6   Ú_message_type_from_mediarJ  6  so   ø€ ß 2Ñˆ�ß‹3Ô9©[Ó9�3�3Š3Ô9©[Ó9×9Ô9ØÒñ !3÷ $/Œ;×ÑÐuÈ4Ï?É?Ð[^×K_ÒK_´K×4GÑ4GÐuÔep×euÑeuÐur8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   r´   r1   rÊ   r3   r4   )r5   s   "r6   r7   r7   =  s&   € ÷ Mñ M ð M°ð M¸ñ Mr8   c                ó’   € \        \        V 4      V R 2,          4      p\        V\        4      '       d   VP	                  RR4      # R# )ú
.sync.jsonrp  r+   )rÇ   r¼   rô   ÚdictrS   )r´   rÊ   r€   s   && r6   Ú_load_sync_bufrO  =  s@   € Ü”l ;Ó/°Z°LÀ
Ð2KÕKÓL€DÜ.8¸¼t×.DÒ.Dˆ4�8‰8Ð% rÓ*ÐLÈ"ÐLr8   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   r´   r1   rÊ   rn  r3   rÌ   r4   )r5   s   "r6   r7   r7   B  s.   € ÷ lñ l ð l°ð lÀð lÈñ lr8   c                óH   € \        \        V 4      V R 2,          RV/4       R# )rM  rp  N)r%   r¼   )r´   rÊ   rn  s   &&&r6   Ú_save_sync_bufrR  B  s$   € Ü”l ;Ó/°Z°LÀ
Ð2KÕKÐN_ÐaiÐMjÖkr8   c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rD  rk   Úbot_typer1   r3   r9  r4   )r5   s   "r6   r7   r7   F  s'   € ÷ Zñ ZÐ2ð Z¸cð ZÀoñ Zr8   c              ƒ  óî   "  € \        V \        \         R V 2\        R7      G Rj  x€L
 p\	        VP                  R4      ;'       g    R4      \	        VP                  R4      ;'       g    R4      3#  LL5i)z
?bot_type=©rË   rF  rH  NÚqrcoder+   Úqrcode_img_content)rl  ÚILINK_BASE_URLÚEP_GET_BOT_QRÚQR_TIMEOUT_MSr1   rS   )rD  rT  Úqr_resps   && r6   Ú	_fetch_qrr]  F  sp   é € Ü˜W¬~Ì=È/ÐYcÐdlÐcmÐHnô  |Iô  J÷  J€GÜˆw�{‰{˜8Ó$×*Ð*¨Ó+¬S°·±Ð=QÓ1R×1XÐ1XÐVXÓ-YÐYÐYñ Jùs   ‚$A5¦A3§ A5Á"A5Á+	A5c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   Úqrcode_valuer1   Ú
qrcode_urlÚreport_render_errorrF   r3   rÌ   r4   )r5   s   "r6   r7   r7   K  s/   € ÷ mñ m˜Cð m¨Sð mÈ$ð mÐSWñ mr8   c               ó@  € V'       d   \        V4        ^ RIpVP                  4       pTP                  T;'       g    T 4       VP	                  RR7       VP                  RR7       R#   \         d)   pT'       d   \        RT R24        Rp?R#  Rp?R# Rp?ii ; i)zsPrint the QR URL + ASCII render; WeChat must scan the liteapp URL (``qrcode_img_content``), not the bare hex token.NT)Úfit)Úinvertu    ï¼ˆç»ˆç«¯äºŒç»´ç �æ¸²æŸ“å¤±è´¥: u-   ï¼Œè¯·ç›´æŽ¥æ‰“å¼€ä¸Šé�¢çš„äºŒç»´ç �é“¾æŽ¥ï¼‰)ÚprintrW  ÚQRCodeÚadd_dataÚmakeÚprint_asciirÆ   )r_  r`  ra  rW  ÚqrÚ_qr_excs   &&$   r6   Ú	_print_qrrl  K  s�   € çÜˆjÔðmÛØ�]‰]‹_ˆØ
�‰�J×.Ð. ,Ô/Ø
�‰�DˆÔØ
�‰˜dˆÖ#øÜô mßÜÐ4°W°IÐ=jÐk×lÒlõ ûðmús   •'A* ½+A* Á*BÁ5BÂBrT  Ú3ià  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   r´   r1   rT  r©  rz   r3   zOptional[dict[str, str]]r4   )r5   s   "r6   r7   r7   Z  s)   € ÷ 7ñ 7 ð 7°#ð 7Ècð 7Ð\tñ 7r8   c             ƒ  óº  "  € \         '       g   \        R 4      h\        4       ;_uu_4       GRj  x€L
 p \        W14      G Rj  x€L
 w  rET'       g)   \
        P                  R4        RRR4      GRj  x€L
  R# \        R4       \        YERR7       \        P                  ! 4       T,           p\        ^ r˜\        P                  ! 4       T8  EdC    \        Y8\         RT 2\        R7      G Rj  x€L
 p
\)        T
P+                  R
4      ;'       g    R4      pTR8X  d   \        RRRR7       EMÂTR8X  d   \        R4       EM®TR8X  d&   T
P+                  R4      '       d   RT
R,           2pEM‚TR8X  dc   T	^,          p	T	^8”  d   \        R4        RRR4      GRj  x€L
  R# \        RT	 R24        \        Y14      G Rj  x€L
 w  rE\        YERR7       EMTR8X  Ed   R\)        T
P+                  R4      ;'       g    R4      R\)        T
P+                  R4      ;'       g    R4      R\)        T
P+                  R 4      ;'       g    \        4      R!\)        T
P+                  R"4      ;'       g    R4      /pTR,          '       d   TR,          '       g)   \
        P                  R#4        RRR4      GRj  x€L
  R# \-        T 3/ TB  \        R$TR,           24       TuuRRR4      GRj  x€L
  # \         P&                  ! ^4      G Rj  x€L
  EK]  \        R%4        RRR4      GRj  x€L
  R#  EL ELð  \         d3   p\
        P                  RT4        Rp?RRR4      GRj  x€L 
  R# Rp?ii ; i EL ELŠ  \         db   p\        T\         P"                  4      '       g   \
        P%                  R	T4       \         P&                  ! ^4      G Rj  x€L 
   Rp?EK.  Rp?ii ; i ELN EL,  \         d3   p\
        P                  RT4        Rp?RRR4      GRj  x€L 
  R# Rp?ii ; i EL| ELI EL- EL  + GRj  x€L 
 '       g   i     R# ; i5i)&z'aiohttp is required for Weixin QR loginNz#weixin: failed to fetch QR code: %sz"weixin: QR response missing qrcodeu(   
è¯·ä½¿ç”¨å¾®ä¿¡æ‰«æ��ä»¥ä¸‹äºŒç»´ç �ï¼šT)ra  z?qrcode=rV  zweixin: QR poll error: %srU  ÚwaitÚ.r+   )Úendrõ  Úscanedu%   
å·²æ‰«ç �ï¼Œè¯·åœ¨å¾®ä¿¡é‡Œç¡®è®¤...Úscaned_but_redirectÚredirect_hostúhttps://Úexpiredu1   
äºŒç»´ç �å¤šæ¬¡è¿‡æœŸï¼Œè¯·é‡�æ–°æ‰§è¡Œç™»å½•ã€‚u'   
äºŒç»´ç �å·²è¿‡æœŸï¼Œæ­£åœ¨åˆ·æ–°... (z/3)Fzweixin: QR refresh failed: %sÚ	confirmedrÊ   Úilink_bot_idr›   Ú	bot_tokenrË   ÚbaseurlrÈ   r�  z:weixin: QR confirmed but credential payload was incompleteu!   
å¾®ä¿¡è¿žæŽ¥æˆ�åŠŸï¼Œaccount_id=u   
å¾®ä¿¡ç™»å½•è¶…æ—¶ã€‚)rd   rV   rp   r]  rÆ   rñ   Úerrorre  rl  rÐ   Ú	monotonicrY  rl  ÚEP_GET_QR_STATUSr[  rô   rã   rt  rò   Úsleepr1   rS   r×   )r´   rT  r©  rD  r_  r`  rö   ÚdeadlineÚcurrent_base_urlÚrefresh_countÚstatus_resprU  Úcredss   &$$          r6   Úqr_loginr…  Z  s�  é € ßÓÜÐDÓEÐEÜ�~�~Œ~ ð	Ü-6°wÓ-I×'IÑ$ˆL÷ Ü�L‰LÐ=Ô>Ø÷ �~‰~ô 	Ð9Ô:Ü�,ÀÕEÜ—>’>Ó# oÕ5ˆÜ*8¸!˜-Ü�nŠnÓ Õ)ðÜ$,¨WÔ]mÐ\nÐnvð  xDð  wEð  [Fô  S`ô  %a÷  a�ô ˜Ÿ™¨Ó2×<Ð<°fÓ=ˆFØ˜ÔÜ�c˜r¨×.Ø˜8Ô#ÜÐ>Ö?ØÐ0Ô0°[·_±_À_×5UÒ5UØ%-¨k¸/Õ.JÐ-KÐ#LÒ Ø˜9Ô$Ø Õ"�Ø  1Ô$ÜÐNÔOØ÷A �~‰~ôB Ð@ÀÀÈsÐSÔTð Ü5>¸wÓ5Q×/QÑ,�LÜ˜lÈE×Rð ˜;Õ&à ¤# k§o¡o°nÓ&E×&KÐ&KÈÓ"LÈgÔWZÐ[f×[jÑ[jÐkvÓ[w×[}Ð[}Ð{}ÓW~Ø¤ K§O¡O°IÓ$>×$PÐ$PÄ.Ó QÐS\Ô^aÐbm×bqÑbqð  sBó  cC÷  cIð  cIð  GIó  _JðK�ð ˜\×*Ô*°%¸·.´.Ü—L‘LÐ!]Ô^Ø÷] �~‰~ô^ $ KÑ9°5Ò9ÜÐ:¸5ÀÕ;NÐ:OÐPÔQØ÷c �~Š~ôd —-’- Ó"×"Ó"ÜÐ'Ô(Ø÷i �~Œ~â'IøÜô 	Ü�L‰LÐ>ÀÔDÛ÷ �~Š~ûð	úò ò aøÜô Ü! #¤w×';Ñ';×<Ò<Ü—N‘NÐ#>ÀÔDÜ—m’m AÓ&×&Ñ&Þûð	úò! òF 0Røä ô  Ü—L‘LÐ!@À#ÔFÛ÷O �~Š~ûðJ úõK òd #÷e �~�~Œ~üsð  ‚.Q°L1±Q´P>¶L7ÁL4ÁL7ÁP>ÁP>Á)QÁ4M7Á5QÁ;AP>ÃM=Ã0M:Ã1M=Ã5P>ÄAP>Å"1P>ÆQÆO,ÆQÆ%P>Æ5O2ÇO/ÇO2Ç'P>Ç?#P>È##P>É'P>É/P>ÊP>ÊP>Ê+QÊ6P2Ê7QÊ="P>ËQË,P5Ë-QË2P>ÌP8ÌP>ÌQÌ*P;Ì+QÌ4L7Ì7M4ÍM/ÍP>ÍQÍ'M*Í(QÍ/M4Í4P>Í7QÍ:M=Í=O)ÎAO$ÏO
ÏO$ÏP>Ï$O)Ï)P>Ï,QÏ/O2Ï2P/Ï=P*ÐP>ÐQÐ"P%Ð#QÐ*P/Ð/P>Ð2QÐ5QÐ8P>Ð;QÐ>Q	ÑQÑ
Q	ÑQ	Ñ	QÚ	file_itemc                ó<   € R V R,          R\        V R,          4      /# )Ú	file_nameÚfilenamer„   Úplaintext_size)r1   ©Úkws   &r6   r  r  –  s   € ¨°b¸µnÀeÌSÐQSÐTdÕQeÓMfÑ(gr8   Ú
image_itemc                ó   € R V R,          /# )Úmid_sizeÚciphertext_sizer4   r‹  s   &r6   r  r  —  s   € ¨:°rÐ:KÕ7LÑ*Mr8   Ú
video_itemc           	     ó`   € R V R,          RV P                  R^ 4      RV P                  RR4      /# )Ú
video_sizer�  Úplay_lengthÚ	video_md5r•  r+   ©rS   r‹  s   &r6   r  r  ˜  s8   € Ø�bÐ*Õ+¨]¸B¿F¹FÀ=ÐRSÓ<TÐVaÐce×ciÑciÐjvÐxzÓc{ñ+}r8   r0  c                ó�   € R V P                  R 4      RV P                  R4      RV P                  R4      RV P                  R^ 4      /# )Úencode_typeÚbits_per_sampleÚsample_rateÚplaytimer–  r‹  s   &r6   r  r  š  sJ   € Ø�r—v‘v˜mÓ,Ð.?ÀÇÁÐHYÓAZÐ\iÐkm×kqÑkqÐró  lAØ�B—F‘F˜: qÓ)ñ++r8   zAdict[int, tuple[str, Callable[[dict[str, Any]], dict[str, Any]]]]Ú_ITEM_SHAPESc               ó$   € V ^8„  d   QhRRRRRR/# )r-   Ú	item_typerz   rŒ  r   r3   r/   r4   )r5   s   "r6   r7   r7      s&   € ÷ Dñ D˜3ð D cð D¨nñ Dr8   c                ój   € \         V ,          w  r#R VR ,          RVR,          R^/pRWRV/V! V4      C/# )Úencrypt_query_paramÚaes_keyÚaes_key_for_apiÚencrypt_typer†  r1  )rœ  )rž  rŒ  r0   Úfieldsr1  s   &,   r6   Ú_media_itemr¥     sI   € Ü˜yÕ)�K€CØ" BÐ'<Õ$=¸yÈ"ÐM^ÕJ_ÐaoÐqrÐs€EØ�I W¨eÐ$B±v¸b³zÐ$BÐCÐCr8   g      >@c                ó   € \        V R 4      # )ú.jpg)r!   ©r€   Ú_names   &&r6   r  r  ­  s   € Ô9UÐVZÐ\bÔ9cr8   z
image/jpegÚimageg      ^@c                ó   € \        V R 4      # )z	video.mp4©r    r¨  s   &&r6   r  r  ®  s   € Ô:YÐZ^Ð`kÔ:lr8   z	video/mp4Úvideoc                ó   € \        W4      # rt   r¬  )r€   Únames   &&r6   r  r  ¯  s   € Ô6UÐVZÔ6ar8   Úfilec                ó   € \        V R 4      # )ú.silk)r   r¨  s   &&r6   r  r  °  s   € Ô9UÐVZÐ\cÔ9dr8   z
audio/silkÚvoicezXdict[int, tuple[str, float, Callable[[bytes, str], Awaitable[str]], Optional[str], str]]Ú_INBOUND_MEDIAÚ
send_voiceÚ
audio_pathÚ
send_videoÚ
video_pathÚsend_image_fileÚ
image_pathz&tuple[tuple[frozenset, str, str], ...]Ú_OUTBOUND_BY_EXTc                  óä  a € ] tR tRtRtRtRtRtRtRt	R V 3R llt
]R	 R
 l4       tRR/R R lltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR  R! ltR" R# ltR$ R% ltRGR& R' lltR( R) ltR* R+ ltRHR, R- lltR. R/ ltRGR0 R1 lltRIR2 R3 llt R4 R5 lt!RJR6 R7 llt"RIR8 R9 llt#RIR: R; llt$R< R= lt%RKR> R? llt&RKR@ RA llt'RB RC lt(RD RE lt)RFt*V ;t+# )LÚWeixinAdapteri¼  ÚWEIXINTiÐ  Fi  c               ó   € V ^8„  d   QhRR/# )r-   Úconfigr   r4   )r5   s   "r6   r7   ÚWeixinAdapter.__annotate__Ä  s   € ÷ #bñ #b˜~ñ #br8   c           
     	óŒ  <€ \         SV `  V\        P                  4       VP                  ;'       g    / p\        \        4       4      ;V n        p\        V4      V n	        \        4       V n        R ;V n        V n        R V n        \        \         R7      V n        \%        VR4      V n        \        VP(                  ;'       g&    VP+                  R4      ;'       g    \-        RR4      4      P/                  4       V n        \%        VR\2        4      P5                  R4      V n        \%        VR\8        4      P5                  R4      V n        \=        \%        VR	R
4      4      V n        \A        \%        VRR4      4      V n!        \=        \%        VRR4      4      V n"        \F        PH                  ! 4       V n%        \M        ^\A        \%        VRR4      4      4      V n'        \=        \%        VRR4      4      V n(        \=        \%        VRR4      4      V n)        R. uV n*        V n+        \%        VRR4      PY                  4       V n-        \%        VRR4      PY                  4       V n.        VP+                  R4      VP+                  R4      rTT P_                  Vf   \-        RR4      MT4      V n0        T P_                  Vf   \-        RR4      MT4      V n1        \e        \%        VRR4      RR7      V n3        V Pi                  4        V P&                  '       d(   V P0                  '       g   \k        W0P&                  4      MR pV'       dŠ   \        VP+                  R4      ;'       g    R4      P/                  4       V n        \        VP+                  R4      ;'       g    V P6                  4      P/                  4       P5                  R4      V n        R # R # ) N)r  rÊ   r›   ÚWEIXIN_TOKENr+   rË   rM  r¾  Úsend_chunk_delay_secondsz1.5Úsend_chunk_retriesÚ4Úsend_chunk_retry_delay_secondsz1.0Úrate_limit_circuit_thresholdr"  Ú!rate_limit_circuit_window_secondsz30.0Úrate_limit_circuit_open_secondsç        Ú	dm_policyÚpairingÚgroup_policyÚdisabledÚ
allow_fromÚgroup_allow_fromÚWEIXIN_ALLOWED_USERSÚWEIXIN_GROUP_ALLOWED_USERSÚsplit_multiline_messagesF)r2   )6Úsuperrç   r   r¾  r.   r1   r$   Ú_hermes_homerÝ   Ú_token_storer  Ú_typing_cacheÚ_poll_sessionÚ_send_sessionÚ
_poll_taskr   ÚMESSAGE_DEDUP_TTL_SECONDSÚ_dedupr>   Ú_account_idr›   rS   Ú
_wx_secretr=   Ú_tokenrY  rS  Ú	_base_urlÚWEIXIN_CDN_BASE_URLÚ_cdn_base_urlr  Ú_send_chunk_delay_secondsrz   Ú_send_chunk_retriesÚ_send_chunk_retry_delay_secondsrã   rä   Ú_send_text_gateÚmaxÚ_rate_limit_circuit_thresholdÚ"_rate_limit_circuit_window_secondsÚ _rate_limit_circuit_open_secondsÚ_rate_limit_circuit_untilÚ_rate_limit_eventsrK   Ú
_dm_policyÚ_group_policyÚ_coerce_listÚ_allow_fromÚ_group_allow_fromr*  Ú_split_multiline_messagesÚ_configure_text_batch_delaysrÛ   )ræ   rÀ  r.   r´   rÐ  rÑ  Ú	persistedÚ	__class__s   &&     €r6   rç   ÚWeixinAdapter.__init__Ä  s  ø€ Ü‰Ñ˜¤§¡Ô1Ø—‘×"Ð" ˆÜ*-¬oÓ.?Ó*@Ð@ˆÔ˜KÜ-¨kÓ:ˆÔÜ.Ó0ˆÔØ26Ð6ˆÔ˜TÔ/Ø26ˆŒÜ)Ô6OÔPˆŒÜ+¨E°<Ó@ˆÔÜ˜&Ÿ,™,×^Ð^¨%¯)©)°GÓ*<×^Ð^Ä
È>Ð[]Ó@^Ó_×eÑeÓgˆŒÜ)¨%°¼^ÓL×SÑSÐTWÓXˆŒÜ-¨e°^ÔEXÓY×`Ñ`ÐadÓeˆÔä).Ô/?ÀÐGaÐchÓ/iÓ)jˆÔ&Ü#&Ô'7¸Ð?SÐUXÓ'YÓ#ZˆÔ Ü/4Ô5EÀeÐMmÐotÓ5uÓ/vˆÔ,Ü&Ÿ|š|›~ˆÔÜ-0°´CÔ8HÈÐPnÐpsÓ8tÓ4uÓ-vˆÔ*Ü27Ô8HÈÐPsÐu{Ó8|Ó2}ˆÔ/Ü05Ô6FÀuÐNoÐqwÓ6xÓ0yˆÔ-ØBEÀrÐ?ˆÔ&¨Ô(?Ü*¨5°+¸yÓI×OÑOÓQˆŒÜ-¨e°^ÀZÓP×VÑVÓXˆÔà',§y¡y°Ó'>ÀÇ	Á	ÐJ\Ó@]Ð$Ø×,Ñ,ÐWaÒWi¬ZÐ8NÐPRÔ-SÐoyÓzˆÔØ!%×!2Ñ!2ÐcsÒc{´:Ð>ZÐ\^Ô3_ð  BRó  "SˆÔÜ)5Ô6FÀuÐNhÐjlÓ6mÐw|Ô)}ˆÔ&ð 	×)Ñ)Ô+ØJN×JZ×JZÐJZÐcg×cn×cnÐcnÔ'¨×5EÑ5EÔFÐtxˆ	ßÜ˜iŸm™m¨GÓ4×:Ð:¸Ó;×AÑAÓCˆDŒKÜ  §¡¨zÓ!:×!LÐ!L¸d¿n¹nÓM×SÑSÓU×\Ñ\Ð]`ÓaˆDŽNñ r8   c               ó    € V ^8„  d   QhRRRR/# )r-   rx   r   r3   rì  r4   )r5   s   "r6   r7   rÁ  ê  s   € ÷ Jñ J˜Cð J Iñ Jr8   c                	óF  € V f   . # \        V \        4      '       d   V P                  R4      M%\        V \        \        \
        34      '       d   T MV .pV Uu. uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       NK?  	  up# u upi )Nre  )rô   r1   ÚsplitÚlistÚtupler  r=   )rx   ró   r7  s   &  r6   rð  ÚWeixinAdapter._coerce_listé  sx   € àŠ=ØˆIÜ$.¨u´c×$:Ò$:�—‘˜CÔ ÌÐTYÔ\`ÔbgÔilÐ[m×InÒInÁÐuzÐt{ˆÙ.3ÓI©e d´s¸4³y·±×7HÔ!”�D“	—‘Ö!©eÑIÐIùÒIs   Á!BÁ>BÚis_reconnectc               ó    € V ^8„  d   QhRRRR/# )r-   rþ  rF   r3   r4   )r5   s   "r6   r7   rÁ  ð  s   € ÷  ñ  ¨Tð  ¸dñ  r8   c          	   ƒ  	ó0  "  € \        4       R R3V P                  RR3V P                  RR33pV FI  w  r4pV'       d   K  V P                  VRV 2RR7       \        P                  R	V P                  V4        R# 	   V P                  R
V P                  R4      '       g   R#  \        4       V n        \        \        P                  ! RRRRR7      R7      V n        V P                  P!                  V P                  4       \"        P$                  ! V P'                  4       RR7      V n        V P+                  4        V \,        V P                  &   \        P/                  RV P                  \1        V P                  4      V P2                  4       V P4                  R8w  d,   \        P                  RV P                  V P4                  4       V P7                  R4       R#   \         d-   p\        P                  RT P                  T4        Rp?ELkRp?ii ; i5i)Úweixin_missing_dependencyz%aiohttp and cryptography are requiredÚweixin_missing_tokenzWEIXIN_TOKEN is requiredÚweixin_missing_accountzWEIXIN_ACCOUNT_ID is requiredzWeixin startup failed: F)Ú	retryablez[%s] Weixin startup failed: %szweixin-bot-tokenzWeixin bot tokenz+[%s] Token lock unavailable (non-fatal): %sN)ÚtotalÚconnectÚsock_connectÚ	sock_readrY  zweixin-poll)r¯  z![%s] Connected account=%s base=%srÏ  a�  [%s] WEIXIN_GROUP_POLICY=%s is set, but QR-login connects an iLink bot identity (e.g. ...@im.bot) which typically cannot be invited into ordinary WeChat groups. iLink usually does not deliver ordinary-group events for these accounts, so group messages may never reach Hermes regardless of this policy. If group delivery doesn't work, the limitation is on the iLink side, not in Hermes.T)rv   rà  rÞ  Ú_set_fatal_errorrñ   rò   r¯  Ú_acquire_platform_lockrÆ   Údebugrp   rÙ  re   ÚClientTimeoutrÚ  r×  rù   rã   Úcreate_taskÚ
_poll_looprÛ  Ú_mark_connectedr@   rõ   r~   rá  rï  Ú_wire_plugin_handlers)ræ   rþ  Ú	preflightrT  ÚcodeÚreasonrö   s   &$     r6   r  ÚWeixinAdapter.connectð  sÕ  é € ä&Ó(Ð*EÐGnÐoØ�[‰[Ð0Ð2LÐMØ×ÑÐ7Ð9XÐYð[ˆ	ó !*ÑˆB�fß‘2Ø×%Ñ% dÐ.EÀfÀXÐ,NÐZ_Ð%Ô`Ü—‘Ð?ÀÇÁÈFÔSÚñ	 !*ð
	XØ×.Ñ.Ð/AÀ4Ç;Á;ÐPb×cÒcÙð dô *›^ˆÔô *´'×2GÒ2GÈdÐ\`Ðosð  @Dô  3Eô  FˆÔØ×Ñ×!Ñ! $×"2Ñ"2Ô3Ü!×-Ò-¨d¯o©oÓ.?ÀmÔTˆŒØ×ÑÔØ&*Œ�t—{‘{Ñ#Ü�‰Ð7¸¿¹ÄHÈT×M]ÑM]ÓD^Ð`d×`nÑ`nÔoØ×Ñ Ô+Ü�N‰Nðsð —	‘	˜4×-Ñ-ô/ð 	×"Ñ" 4Ô(Ùøô' ô 	XÜ�L‰LÐFÈÏ	É	ÐSV×WÒWûð	Xüs5   ‚8H¿=HÁ="G Â D<HÇHÇ'!HÈHÈHÈHc               ó   € V ^8„  d   QhRR/# rï  r4   )r5   s   "r6   r7   rÁ    s   € ÷ 4ñ 4 $ñ 4r8   c              ƒ  	óÊ  "  € \         P                  V P                  R 4       RV n        V P                  P                  4        F+  pVP                  4       '       d   K  VP                  4        K-  	  V P                  P                  4        V P                  P                  4        \        V P                  4      G R j  x€L
  R V n        R FL  p\        W4      pV'       d+   VP                  '       g   VP                  4       G R j  x€L
  \        WR 4       KN  	  V P!                  4        V P#                  4        \$        P'                  RV P(                  4       R #  LŸ LX5i)NFz[%s] Disconnected)rÙ  rÚ  )r@   r  rà  Ú_runningÚ_pending_text_batch_tasksÚvaluesÚdoneÚcancelÚ_pending_text_batchesrò  r   rÛ  rR  ÚclosedÚcloseÚsetattrÚ_release_platform_lockÚ_mark_disconnectedrñ   rõ   r¯  )ræ   ÚtaskÚattrrD  s   &   r6   Ú
disconnectÚWeixinAdapter.disconnect  sû   é € Ü×Ñ˜4Ÿ;™;¨Ô-ØˆŒØ×2Ñ2×9Ñ9Ö;ˆDØ—9‘9—;”;Ø—‘–ñ <ð 	×"Ñ"×(Ñ(Ô*Ø×&Ñ&×,Ñ,Ô.Ü˜$Ÿ/™/Ó*×*Ð*ØˆŒÛ6ˆDÜ˜dÓ)ˆGß˜wŸ~Ÿ~˜~Ø—m‘m“o×%Ð%Ü�D Ö%ñ	 7ð
 	×#Ñ#Ô%Ø×ÑÔ!Ü�‰Ð'¨¯©Ö3ñ 	+ñ
 &ùs2   ‚AE#ÁA E#Â?EÃ 4E#Ã5E#ÄE!Ä	AE#Å!E#c               ó   € V ^8„  d   QhRR/# rï  r4   )r5   s   "r6   r7   rÁ  %  s   € ÷ 77ñ 77 $ñ 77r8   c           
   ƒ  	ó  a
"  € V P                   f   Q h\        V P                  V P                  4      p\        p^ o
R V
3R llpV P
                  '       Ed
    \        V P                   V P                  V P                  WR7      G R j  x€L
 pVP                  R4      p\        V\        4      '       d
   V^ 8”  d   TpVP                  R^ 4      VP                  R^ 4      rvVR9  g   VR9  d¨   \        WFV4      '       dC   \        P                  RV P                  4       \         P"                  ! R4      G R j  x€L
  ^ o
Kþ  S
^,          o
\        P%                  R	V P                  WgVP                  R
R4      S
\&        4       V! 4       G R j  x€L
 o
EKQ  ^ o
VP                  R4      ;'       g    .  F(  p\         P(                  ! V P+                  V4      4       K*  	  VP                  R4      '       di   \-        VR,          4      V8w  dO   \-        VR,          4      p\         P.                  ! \0        V P                  V P                  V4      G R j  x€L
  EK  EK  EK  R #  ELÚ EL, LÚ L  \         P2                   d     R # \4         dt   p	S
^,          o
\        P                  RT P                  S
\&        T	4       T! 4       G R j  x€L 
 o
S
^ 8X  d!   T P7                  4       G R j  x€L 
   R p	?	EK±   R p	?	EK¸  R p	?	ii ; i5i)Nc               ó   € V ^8„  d   QhRR/# )r-   r3   rz   r4   )r5   s   "r6   r7   Ú.WeixinAdapter._poll_loop.<locals>.__annotate__+  s   € ÷ 	>ñ 	>˜sñ 	>r8   c               “  óš   <"  € S\         8¬  p \        P                  ! V '       d   \        M\        4      G Rj  x€L
  V '       d   ^ # S#  L5i)zSSleep for the failure streak; returns the new streak count (0 after a full streak).N)ÚMAX_CONSECUTIVE_FAILURESrã   r  ÚBACKOFF_DELAY_SECONDSÚRETRY_DELAY_SECONDS)Ústreak_doneÚconsecutive_failuress    €r6   ÚbackoffÚ)WeixinAdapter._poll_loop.<locals>.backoff+  s=   øé € à.Ô2JÑJˆKÜ—-’-¿Õ 5ÔJ]Ó^×^Ð^ß#�1Ð=Ð)=Ð=ñ _ùs   ƒ5A¸A	¹AÁA)rË   r›   rn  rH  Úlongpolling_timeout_msrB   rC   z,[%s] Session expired; pausing for 10 minutesiX  z:[%s] getUpdates failed ret=%s errcode=%s errmsg=%s (%d/%d)rD   r+   rr  rp  z[%s] poll error (%d/%d): %s>   Né    )rÙ  rO  rÖ  rÞ  ÚLONG_POLL_TIMEOUT_MSr  ru  rá  rà  rS   rô   rz   rT   rñ   r|  r¯  rã   r  rò   r+  r  Ú_process_message_safer1   r  rR  ÚCancelledErrorrÆ   Ú_recycle_poll_session)ræ   rn  rH  r0  rV  Úsuggested_timeoutrB   rC   r8  rö   r/  s   &         @r6   r  ÚWeixinAdapter._poll_loop%  s“  øé € Ø×!Ñ!Ò-Ð-Ð-Ü! $×"3Ñ"3°T×5EÑ5EÓFˆÜ)ˆ
Ø Ð÷	>ð 	>ð �m�m‰mð*7Ü!-¨d×.@Ñ.@È4Ï>É>Ðae×alÑalÐwô  "X÷  X�Ø$,§L¡LÐ1IÓ$JÐ!ÜÐ/´×5Ò5Ð:KÈaÔ:OØ!2�JØ'Ÿ|™|¨E°1Ó5°x·|±|ÀIÈqÓ7Q�WØ˜iÔ'¨7¸)Ô+CÜ*¨8¸'×BÒBÜŸ™Ð%SÐUY×U^ÑU^Ô_Ü%Ÿmšm¨CÓ0×0Ð0Ø/0Ð,Ù Ø(¨AÕ-Ð(Ü—N‘NÐ#_Ðae×ajÑajÐloØ#+§<¡<°¸"Ó#=Ð?SÔUmôoá18³¯?Ð(ÚØ'(Ð$ð  (Ÿ|™|¨FÓ3×9Ð9°rÒ9�GÜ×'Ò'¨×(BÑ(BÀ7Ó(KÖLñ  :ð —<‘<Ð 1×2Ò2´s¸8ÐDUÕ;VÓ7WÐ[cÔ7cÜ" 8Ð,=Õ#>Ó?�HÜ!×+Ò+¬N¸D×<MÑ<MÈt×O_ÑO_ÐaiÓj×jÓjò 8dÒ2ñ3 ò Xò 1ñ ,;ñ køÜ×)Ñ)ô ÚÜô 7Ø$¨Õ)Ð$Ü—‘Ð:¸D¿I¹IÐG[Ô]uÐwzÔ{Ù-4«Y§ Ð$Ø'¨1Ô,ð ×4Ñ4Ó6×6×6Ð6ö -ûð	7üsÊ   ƒALÁ0I- Â	I#Â
B0I- Ä:I&Ä;I- ÅLÅAI- ÆI)ÆI- ÆLÆI- Æ0AI- Ç6AI- ÉI+ÉI- ÉLÉ#I- É&I- É)I- É+I- É-LÊLÊLÊLÊ:K=Ë	KË
K=Ë)K,Ë*K=Ë/LË=LÌLc               ó   € V ^8„  d   QhRR/# rï  r4   )r5   s   "r6   r7   rÁ  ^  s   € ÷ 	Wñ 	W¨Tñ 	Wr8   c              ƒ  óZ  "  € V P                   '       d	   \        f   R# V P                  \        4       uqn        Ve0   VP                  '       g    VP                  4       G Rj  x€L
  R# R# R#  L
  \         d-   p\        P                  RT P                  T4        Rp?R# Rp?ii ; i5i)zkSwap in a fresh ``_poll_session`` *then* close the old one, so concurrent tasks never see a closed session.Nz&[%s] old poll session close failed: %s)
r  re   rÙ  rp   r  r  rÆ   rñ   r  r¯  )ræ   Úoldrö   s   &  r6   r7  Ú#WeixinAdapter._recycle_poll_session^  s€   é € à�}�}ˆ}¤¢ÙØ"&×"4Ñ"4´l³nÐˆÔØŠ? 3§:§: :ðWØ—i‘i“k×!Ò!ñ $.‰?á!øÜô WÜ—‘ÐEÀtÇyÁyÐRU×VÒVûðWüsB   ‚AB+ÁA1 Á$A/Á%A1 Á)B+Á/A1 Á1B(Á<!B#ÂB+Â#B(Â(B+c               ó    € V ^8„  d   QhRRRR/# ©r-   r8  r/   r3   rÌ   r4   )r5   s   "r6   r7   rÁ  i  s   € ÷ Kñ K°>ð KÀdñ Kr8   c           
   ƒ  	óð   "  €  V P                  V4      G R j  x€L
  R #  L  \         dH   p\        P                  RT P                  \        TP                  R4      4      TRR7        R p?R # R p?ii ; i5i)Nz([%s] unhandled inbound error from=%s: %sr@  T©Úexc_info)Ú_process_messagerÆ   rñ   r|  r¯  r~   rS   )ræ   r8  rö   s   && r6   r5  Ú#WeixinAdapter._process_message_safei  sm   é € ð	KØ×'Ñ'¨Ó0×0Ô0øÜô 	KÜ�L‰LÐCÀTÇYÁYÔPXÐY`×YdÑYdÐesÓYtÓPuÐwzð  FJˆL÷  Kò  Kûð	Küs6   ‚A6„! ˜™! �A6Ÿ! ¡A3¬<A.Á(A6Á.A3Á3A6c               ó    € V ^8„  d   QhRRRR/# r?  r4   )r5   s   "r6   r7   rÁ  o  s   € ÷ &-ñ &-¨nð &-Àñ &-r8   c              ƒ  	óþ  "  € V P                   f   Q h\        VP                  R4      ;'       g    R4      P                  4       p\        VP                  R4      ;'       g    R4      P                  4       pV'       d:   W P                  8X  g*   V'       d$   V P
                  P                  V4      '       d   R # VP                  R4      ;'       g    . p\        V4      pV'       d{   V P
                  P                  RV R\        P                  ! VP                  4       4      P                  4        24      '       d$   \        P                  RV P                  V4       R # \        WP                  4      w  rgVR8X  d   V P!                  V4      '       g   R # MV P#                  V4      '       g   R # \        VP                  R	4      ;'       g    R4      P                  4       pV'       d/   V P$                  P'                  V P                  W(4      G R j  x€L
  V P                   '       do   V P(                  '       d]   V P*                  P                  V4      '       g<   \,        P.                  ! T P1                  V P                   Y(;'       g    R R
4      4       . . r©V Fj  pVP                  R4      ;'       g    / P                  R4      p\3        V\4        4      '       d   W¼3MV3 F  pV P7                  WÙV
4      G R j  x€L
  K  	  Kl  	  V'       g   V	'       g   R # V P9                  WvW"R7      p\;        T\=        W¥4      YáT;'       g    R Wš\>        P@                  ! 4       R7      p\        PC                  RV P                  \E        V4      VPF                  \I        V	4      4       VPJ                  \L        PN                  8X  d   V PQ                  V4       R # V PS                  V4      G R j  x€L
  R #  ELà L÷ L5i)Nr@  r+   Ú
message_idrx  zcontent:rë   z6[%s] Content-dedup: skipping duplicate message from %sr?  rz  zgetConfig failedr-  r.  )Úchat_idÚ	chat_typerÈ   Ú	user_name)r5  r}  ÚsourceÚraw_messagerG  Ú
media_urlsr@  Ú	timestampz%[%s] inbound from=%s type=%s media=%d)*rÙ  r1   rS   r=   rÞ  rÝ  Úis_duplicater6  ÚhashlibÚmd5r­   Ú	hexdigestrñ   r  r¯  rB  Ú_is_group_allowedÚ_is_dm_intake_allowedr×  r  rà  rØ  rã   r  Ú_fetch_typing_ticketrô   rN  Ú_collect_mediaÚbuild_sourcer"   rJ  r   Únowrõ   r~   rI  r„   r}  r#   rI  Ú_enqueue_text_eventÚhandle_message)ræ   r8  Ú	sender_idrG  rx  r5  rI  Úeffective_chat_idrz  Úmedia_pathsr@  r7  r9  Ú	candidaterK  Úevents   &&              r6   rC  ÚWeixinAdapter._process_messageo  s.  é € Ø×!Ñ!Ò-Ð-Ð-Ü˜Ÿ™ NÓ3×9Ð9°rÓ:×@Ñ@ÓBˆ	Ü˜Ÿ™ \Ó2×8Ð8°bÓ9×?Ñ?ÓAˆ
ß˜I×)9Ñ)9Ô9¿jÈTÏ[É[×MeÑMeÐfp×MqÒMqÙà—K‘K Ó,×2Ð2°ˆ	Ü˜YÓ'ˆß�D—K‘K×,Ñ,¨x¸	°{À!ÄGÇKÂKÐPT×P[ÑP[ÓP]ÓD^×DhÑDhÓDjÐCkÐ-l×mÒmÜ�L‰LÐQÐSW×S\ÑS\Ð^gÔhÙÜ'7¸×AQÑAQÓ'RÑ$ˆ	Ø˜ÔØ×)Ñ)Ð*;×<Ò<Ùð =à×+Ñ+¨I×6Ò6ÙÜ˜GŸK™K¨Ó8×>Ð>¸BÓ?×EÑEÓGˆßØ×#Ñ#×'Ñ'¨×(8Ñ(8¸)ÓS×SÐSØ××Ð $§+§+ +°d×6HÑ6H×6LÑ6LÈY×6WÒ6WÜ×Ò × 9Ñ 9¸$×:LÑ:LÈi×YnÐYnÐjnð  qCó  !Dô  EØ#% r�[ÛˆDØŸ™ Ó+×1Ð1¨r×6Ñ6°~ÓFˆHÜ1;¸HÄd×1KÒ1K˜dÑ-ÐRVÐQXÒX�	Ø×)Ñ)¨)À+ÓN×NÒNó Yñ ÷ ŸKÙØ×"Ñ"Ð+<Ð[dÐ"ÓzˆÜØÔ$<¸[Ó$OÐX^Ø!×)Ð) T°kÔfn×frÒfrÓftôvˆô 	�‰Ð;¸T¿Y¹YÌÐQZÓH[Ð]c×]mÑ]mÔorÐs~Óoô  	AØ×Ñ¤×!1Ñ!1Ô1Ø×$Ñ$ UÖ+à×%Ñ% eÓ,×,Ò,ò% Tñ Oñ -ùs¤   ‚-O=°1O=Á"O=Á?O=Â O=Â8O=ÃA,O=Ä?AO=ÆO=Æ1O=ÇO=Ç-)O=ÈO6ÈO=È-O=È? O=É .O=Ê+O=Ê;AO=ÌO9ÌO=ÌO=ÌCO=Ï/O;Ï0O=Ï9O=Ï;O=c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   r7  r/   r]  rì  r@  r3   rÌ   r4   )r5   s   "r6   r7   rÁ  —  s*   € ÷ %ñ %¨ð %Àið %Ð^gð %Ðlpñ %r8   c              ƒ  	óü   "  € \         P                  VP                  R 4      4      pV'       d   V P                  W4      G Rj  x€L
 MRw  rVV'       d%   VP                  V4       VP                  V4       R# R#  L65i)r†  N©Nr+   )r´  rS   Ú_download_mediarÕ  )ræ   r7  r]  r@  Úspecr»   Úmimes   &&&&   r6   rV  ÚWeixinAdapter._collect_media—  sc   é € Ü×!Ñ! $§(¡(¨6Ó"2Ó3ˆß?C˜4×/Ñ/°Ó;×;Ð;È‰
ˆßØ×Ñ˜tÔ$Ø×Ñ˜tÖ$ñ ñ <ùs   ‚AA<ÁA:Á7A<c               ó$   € V ^8„  d   QhRRRRRR/# )r-   r7  r/   re  ztuple[Any, ...]r3   ztuple[Optional[str], str]r4   )r5   s   "r6   r7   rÁ  ž  s"   € ÷ ñ ¨.ð Àð ÐTmñ r8   c           	   ƒ  óz  "  € Vw  r4rVpVP                  V4      ;'       g    / pVP                  R4      ;'       g    / p	\        VP                  R4      ;'       g    R4      p
T;'       g(    \        P                  ! V
4      ^ ,          ;'       g    Rp V	P                  R4      pVR8X  dr   VP                  R4      '       d[   \        P
                  ! \        P                  \        VP                  R4      4      4      4      P                  R4      ;'       g    Tp\        V P                  V P                  V	P                  R	4      W¹P                  R
4      VR7      G Rj  x€L
 pV! WÊ4      G Rj  x€L
 V3#  L L  \         d0   p\        P                  RT P                  Y}4       RT3u Rp?# Rp?ii ; i5i)zÀDownload + decrypt one inbound media item -> (cached path or None, mime). Voice is always downloaded
(never trust Tencent's ``voice_item.text``) so gateway/run.py's central STT re-transcribes.r1  rˆ  zdocument.binr£  r¡  r�  rš  r¡   r   rÀ  )r¾  r¿  r%  rÀ  r©  Nz[%s] %s download failed: %s)rS   r1   Ú	mimetypesÚ
guess_typer¨   r©   r�   r2  r®   rÅ  rÙ  rã  rÆ   rñ   rò   r¯  )ræ   r7  re  Úitem_keyr©  Úcache_fnrf  Úlabelr  r1  r‰  r%  r€   rö   s   &&&           r6   rd  ÚWeixinAdapter._download_mediaž  sv  é € ð <@Ñ8ˆ 8°5Ø—(‘(˜8Ó$×*Ð*¨ˆØ—‘˜GÓ$×*Ð*¨ˆÜ�w—{‘{ ;Ó/×AÐA°>ÓBˆØ×VÐV”y×+Ò+¨HÓ5°aÕ8×VÐVÐ<Vˆð	ØŸ)™) IÓ.ˆKØ˜<Ô'¨G¯K©K¸×,AÒ,AÜ$×.Ò.¬u¯}©}¼SÀÇÁÈXÓAVÓ=WÓ/XÓY×`Ñ`ÐahÓi×xÐxÐmx�ô 5Ø×"Ñ"°×1CÑ1CÐ[`×[dÑ[dÐezÓ[{Ø'·)±)¸JÓ2GÐYhôj÷ jˆDñ " $Ó1×1°4Ð7Ð7ñjñ 2øÜô 	Ü�N‰NÐ8¸$¿)¹)ÀUÔPØ˜�:Õûð	üs~   ‚9F;¼F;ÁF;Á,$F;ÂF;Â.E> ÃAE> ÄAE> Å#E:Å$E> Å3E<Å4E> Å9F;Å:E> Å<E> Å>F8Æ	$F3Æ-F8Æ.F;Æ3F8Æ8F;c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r-   rD  r   rÈ   r1   rz  rE   Úfailure_labelr3   r4   )r5   s   "r6   r7   rÁ  ·  s6   € ÷ 	ñ 	°#ð 	Àð 	ÐTað 	Ðruð 	ð  {Hñ 	r8   c           	   ƒ  	ó†  "  €  \        WP                  V P                  W#R 7      G Rj  x€L
 p\        VP	                  R4      ;'       g    R4      pV'       d   V P
                  P                  W&4       V#  R#  LP  \         d8   p\        P                  RT P                  T\        T4      T4        Rp?R# Rp?ii ; i5i))rË   r›   rÈ   rz  NÚtyping_ticketr+   z[%s] %s for %s: %s)r�  rá  rà  r1   rS   rØ  r  rÆ   rñ   r  r¯  r~   )ræ   rD  rÈ   rz  rq  rV  rs  rö   s   &&&&&   r6   rU  Ú"WeixinAdapter._fetch_typing_ticket·  s¯   é € ð	aÜ(¨¿>¹>ÐQU×Q\ÑQ\Ðfmô  L÷  LˆHÜ §¡¨_Ó =× CÐ CÀÓDˆMßØ×"Ñ"×&Ñ& wÔ>Ø$Ð$ð ñ
 ñ Løô
 ô 	aÜ�L‰LÐ-¨t¯y©y¸-ÌÐRYÓIZÐ\_×`Ð`Ùûð	aüsJ   ‚C„%A< ©A:ª A< ÁA< ÁA< Á6CÁ:A< Á<B>Â,B9Â3CÂ9B>Â>Cc               ó    € V ^8„  d   QhRRRR/# rë  r4   )r5   s   "r6   r7   rÁ  Â  s   € ÷ qñ q 3ð q¨9ñ qr8   c                	óB   € \        WP                  V P                  4      # rt   )r  ÚMAX_MESSAGE_LENGTHró  ©ræ   rÇ  s   &&r6   Ú_split_textÚWeixinAdapter._split_textÂ  s   € Ü.¨w×8OÑ8OÐQU×QoÑQoÓpÐpr8   c               ó   € V ^8„  d   QhRR/# )r-   r3   r  r4   )r5   s   "r6   r7   rÁ  Å  s   € ÷ Kñ K°ñ Kr8   c                	ób   € \        R V P                  \        P                  ! 4       ,
          4      # )rË  )rè  rì  rÐ   r}  )ræ   s   &r6   Ú_rate_limit_cooldown_remainingÚ,WeixinAdapter._rate_limit_cooldown_remainingÅ  s!   € Ü�3˜×6Ñ6¼¿ºÓ9IÕIÓJÐJr8   c               ó   € V ^8„  d   QhRR/# rr   r4   )r5   s   "r6   r7   rÁ  È  s   € ÷ 9ñ 9¨$ñ 9r8   c                	óÊ  € \         P                  ! 4       pV P                   Uu. uF  q"WP                  ,
          8¼  g   K  VNK  	  upV.,           V n        \	        V P                  4      V P
                  8  d   R # V P                  ^ 8”  d@   \        V P                  \         P                  ! 4       V P                  ,           4      V n        V P                  4       ^ 8„  # u upi ©F)
rÐ   r}  rí  rê  r„   ré  rë  rè  rì  r}  )ræ   rX  Útss   &  r6   Ú_record_rate_limit_eventÚ&WeixinAdapter._record_rate_limit_eventÈ  sÐ   € Ü�nŠnÓˆØ04×0GÒ0GÓ"Ñ0G¨"ÐQT×W~ÑW~ÕQ~ÑK~§2 2Ñ0GÑ"ð  DGð  CHõ  #HˆÔÜˆt×&Ñ&Ó'¨$×*LÑ*LÔLÙØ×0Ñ0°1Ô4Ü-0°×1OÑ1OÔQU×Q_ÒQ_ÓQaÐdh÷  eJñ  eJõ  RJó  .KˆDÔ*Ø×2Ñ2Ó4°qÑ8Ð8ùò #@s   ¤C ÁC c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r-   rH  r1   Úchunkrz  rE   r{  r3   rÌ   r4   )r5   s   "r6   r7   rÁ  Ñ  s2   € ÷ :ñ :°ð :¸Sð :ÐQ^ð :Ðknð :Ðswñ :r8   c             ƒ  ó  "  € V P                   ;_uu_4       GRj  x€L
  RpRp^ p V P                  4       ^ 8”  d   \        RV P                  4       R R24      h \        V P                  V P
                  V P                  WW4R7      G Rj  x€L
 pV'       d9   \        V\        4      '       d#   VP                  R4      VP                  R	4      3MRw  ršV	e   V	^ 8w  g   V
Ee   V
^ 8w  Edú   VP                  R
4      ;'       g    VP                  R4      p\        W‰V
4      '       d‹   V'       gƒ   V'       d{   RRr6V P                  P                  P                  V P                  P                  V P                  V4      R4       \         P#                  RV P$                  \'        V4      4       EK�  \)        WšV4      '       d   \+        WšV4      pEMGV	\,        8w  d*   V
\,        8w  d   \        RT	 RT
 RT;'       g    R 24      h\        RT	 RT
 RT;'       g    R 24      pV P/                  4       '       d3   \        RT	 RT
 RT;'       g    R RV P                  4       R R2	4      pM­WpP0                  8¼  d   MœV^,          pV P2                  ^,          p\         P#                  RV P$                  \'        V4      V4       \4        P6                  ! V4      G Rj  x€L
  EKÀ  V P8                  P;                  4        RV n         RRR4      GRj  x€L
  R# Vf   Q hVh EL EL™ LI L  \>         d«   pTpYpP0                  8¼  d    Rp?K5  T^,          pT P2                  T,          p\         P#                  RT P$                  \'        T4      YpP0                  ^,           YÍ4       T^ 8”  d'   \4        P6                  ! T4      G Rj  x€L 
   Rp?EK¯   Rp?EK¶  Rp?ii ; i  + GRj  x€L 
 '       g   i     R# ; i5i)u›  Send one text chunk with retry/backoff under the adapter-wide text gate. A stale-session response (``-14``,
or ``-2`` with ``prepare failed``/``unknown error``) is re-sent once *without* ``context_token`` â€” iLink accepts
tokenless sends as a degraded fallback, which keeps cron pushes working when no user message refreshed the
session. A ``-2`` that survives that fails fast via ``_session_not_ready_error``.NFTz4iLink sendmessage rate limited; cooldown active for z.1fÚs)rË   r›   rw  r5  rz  r{  rB   rC   rD   rQ   z;[%s] session expired for %s; retrying without context_tokenúiLink sendmessage error: ret=rX   rY   rH   z$iLink sendmessage rate limited: ret=zrate limitedz$iLink sendmessage rate limited (ret=z); cooldown active for z8[%s] rate limited for %s; backing off %.1fs before retryrË  zA[%s] send chunk failed to=%s attempt=%d/%d, retrying in %.2fs: %s©NN) rç  r}  rV   rŠ  rÚ  rá  rà  rô   rN  rS   rT   r×  râ   r  rì   rÞ  rñ   rò   r¯  r~   rM   rZ   rJ   rƒ  rå  ræ  rã   r  rí  rò  rì  rÆ   )ræ   rH  r†  rz  r{  Ú
last_errorÚretried_without_tokenÚattemptrO   rB   rC   rD   rp  rö   s   &$$$$         r6   Ú_send_text_chunkÚWeixinAdapter._send_text_chunkÑ  s  é € ð
 ×'×'×'Ó'Ø.2ˆJØ$)Ð!ØˆGØØ×6Ñ6Ó8¸1Ô<Ü&Ð)]Ð^b÷  _Bñ  _Bó  _Dð  EHð  ^Ið  IJð  (Kó  Lð  Lð,2Ü!.Ø×*Ñ*°T·^±^È4Ï;É;Ð[bØ&3ô"J÷ J�D÷ NRÔV`ÐaeÔgk×VlÒVl D§H¡H¨U£O°T·X±X¸iÓ5HÑ#IÐr~‘L�CØš¨C°1¬H¸'Ó:MÐRYÐ]^ÕR^Ø!%§¡¨(Ó!3×!FÐ!F°t·x±xÀ³˜Ü.¨t¸'×BÒB×K`×erØCGÈ°=Ø ×-Ñ-×4Ñ4×8Ñ8¸×9JÑ9J×9OÑ9OÐPT×P`ÑP`ÐbiÓ9jÐlpÔqÜ"ŸN™NÐ+hÐjn×jsÑjsÔu}ð  Fó  vGô  HÚ$Ü0°¸v×FÒFä)AÀ#ÐPVÓ)W˜JÙ!ØÔ"4Ô4¸ÔDVÔ9VÜ".Ð1NÈsÈeÐS\Ð]dÐ\eÐemÐnt÷  oHð  oHð  yHð  nIð  0Jó  #Kð  Kä%1Ð4XÐY\ÐX]Ð]fÐgnÐfoÐowÐx~÷  yQð  yQð  CQð  xRð  3Só  &T˜
Ø×8Ñ8×:Ò:Ü)5Ø"FÀsÀeÈ9ÐU\ÐT]Ð]eÐfl×f~Ðf~Ðp~Ðeð @7Ø7;×7ZÑ7ZÓ7\Ð]`Ð6aÐabð!dó*e˜Jð "Ø"×&>Ñ&>Ô>Ø!Ø 1�˜Ø#×CÑCÀaÕG˜ÜŸ™Ð'aÐcg×clÑclÔnvÐw~Ónð  BFô  GÜ%Ÿmšm¨DÓ1×1Ð1Ú Ø×+Ñ+×1Ñ1Ô3Ø58�DÔ2Ø÷S (×'Ñ'ðh Ò)Ð)Ð)ØÐòk (òJñ: 2ñK (øôT !ô 	2Ø!$�JØ×":Ñ":Ô:ÝØ˜q•L�GØ×?Ñ?À'ÕI�DÜ—N‘NÐ#fØ#'§9¡9¬h°wÓ.?À×JbÑJbÐefÕJfÐhlôsà˜a”xÜ%Ÿmšm¨DÓ1×1×1Ð1ö  ûð	2ú÷U (×'×'Ñ'üs&  ‚P›L"œPŸ;O$Á1L,ÂL%ÂL,ÂA+L,Ä+L,Ä1L,Ä9A7L,Æ0O$Æ3L,ÇO$Ç*L,Ç>L,ÈL,È;L,ÉL,É,O$É-L,É=O$É>A L,ËL(ËL,Ë#O$Ë&!L,ÌPÌL*ÌPÌO$Ì"PÌ%L,Ì(L,Ì*PÌ,O!Ì7OÍ	O$ÍA9OÏO
Ï	OÏO$ÏO!Ï!O$Ï$O>	Ï*O-Ï+
O>	Ï6O>	Ï8	Pc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r-   rH  r1   rÇ  Úreply_torE   ÚmetadatarÙ   r3   r   r4   )r5   s   "r6   r7   rÁ    s5   € ÷ =ñ = #ð =°ð =¸}ð =Ð_wð =ð  DNñ =r8   c           	   ƒ  	óª  aa"  € V P                   '       d   V P                  '       g   \        R RR7      # V P                  P	                  V P
                  V4      pRpV P                  V P                  VR7      4      ;_uu_ 4        V P                  V4      w  rxV P                  V P                  V4      ^,          4      w  ršV P                  V4       UUu. uF	  w  r¼W¼R3NK  	  pppYÐP                  V	4       Uu. uF  q»R R3NK	  	  up,          pRRR4        X Fi  w  pop\        V4      P                  P                  4       o\!        VV3R l\"         4       R4      w  pp \%        V V4      ! RRVR	V/VV/B G Rj  x€L
  Kk  	  V P/                  V P1                  X
4      4       Uu. uF'  pV'       g   K  VP3                  4       '       g   K%  VNK)  	  pp\5        V4       F›  w  ppR\6        P8                  ! 4       P:                   2pV P=                  VVVVR7      G Rj  x€L
  TpV\?        V4      ^,
          8  g   K`  V P@                  ^ 8”  g   Ks  \B        PD                  ! V P@                  4      G Rj  x€L
  K�  	  \        RVR7      # u uppi u upi   + '       g   i     EL”; i EL0  \&         d/   p\(        P+                  R
T P,                  YþT4        Rp?EKË  Rp?ii ; iu upi  LÎ Lz  \&         dL   p\(        PG                  RT P,                  \I        T4      T4       \        R \K        T4      R7      u Rp?# Rp?ii ; i5i)FúNot connected©Úsuccessr|  N)rH  r1  z
local filec              3  óR   <"  € T F  w  rpS'       g
   SV9   g   K  W#3x € K  	  R # 5irt   r4   )r,  ÚextsrC  ÚkÚextÚis_voices   &   €€r6   r.  Ú%WeixinAdapter.send.<locals>.<genexpr>  s'   øé € Ð#iÑ=M©z¨t¸×QYÐ]`ÐdhÑ]h¤F Q¥FÓ=Mùs   ƒ'œ'rH  r’  z"[%s] %s delivery failed for %s: %súhermes-weixin-)rH  r†  rz  r{  T©r–  rG  z[%s] send failed to=%s: %s)Úsend_documentÚ	file_pathr4   )&rÚ  rà  r   r×  rS   rÞ  Ú_media_delivery_scoperW  Úextract_mediaÚextract_local_filesÚextract_imagesÚfilter_media_delivery_pathsÚfilter_local_delivery_pathsr   ÚsuffixrK   Únextr»  rR  rÆ   rñ   rò   r¯  ry  Úformat_messager=   Ú	enumerateÚuuidÚuuid4ÚhexrŽ  r„   rä  rã   r  r|  r~   r1   )ræ   rH  rÇ  r‘  r’  rz  Úlast_message_idÚmedia_filesÚcleaned_contentÚlocal_filesÚfinal_contentr:  ÚvÚ
deliveriesr»   rn  Úsenderr0   rö   r  r  Úidxr†  r{  rš  r›  s   &&&&&                   @@r6   ÚsendÚWeixinAdapter.send  sá  ùé € Ø×!×!Ð!¨¯¯¨Ü e°?ÔCÐCØ×)Ñ)×-Ñ-¨d×.>Ñ.>ÀÓHˆØ)-ˆð ×'Ñ'¨×(9Ñ(9À'Ð(9Ó(J×KÕKØ+/×+=Ñ+=¸gÓ+FÑ(ˆKØ)-×)AÑ)AÀ$×BUÑBUÐVeÓBfÐghÕBiÓ)jÑ&ˆKØ6:×6VÑ6VÐWbÔ6cÔdÑ6c©d¨a˜1 ›/Ñ6cˆJÑdØ×=]Ñ=]Ð^iÔ=jÓkÑ=j¸˜u lÓ3Ñ=jÑkÕkˆJ÷	 Lð
	=Û)3Ñ%��h Ü˜4“j×'Ñ'×-Ñ-Ó/�Ü"Õ#iÕ=MÓ#ið  lJó  K‘�˜ðfÜ! $¨Ô/Ñb¸ÐbÈ(ÐbÐWZÐ\`ÐVaÑb×bÒbñ	 *4ð "&×!1Ñ!1°$×2EÑ2EÀmÓ2TÔ!UÓiÑ!U˜AÔYZ”aÐ_`×_fÑ_f×_h—a�aÑ!UˆFÐiÜ'¨Ö/‘
��UØ,¬T¯ZªZ«\×-=Ñ-=Ð,>Ð?�	Ø×+Ñ+°GÀ5ÐXeÐqzÐ+Ó{×{Ð{Ø"+�Øœ˜V› q�Ö(¨T×-KÑ-KÈaÖ-OÜ!Ÿ-š-¨×(FÑ(FÓG×GÒGñ 0ô  d°ÔGÐGùó# eùÚk÷	 L×KÐKúò cøÜ ô fÜ—N‘NÐ#GÈÏÉÐTYÐad×eÓeûðfüâiñ |ñ Høäô 	=Ü�L‰LÐ5°t·y±yÄ(È7ÓBSÐUXÔYÜ e´3°s³8Ô<Õ<ûð	=üsó   „$M©AMÂAJÃJ
Ã'JÃ=J
Ä
	JÄMÄA
K: Å'J5ÆJ2ÆJ5Æ&K: Æ-
K1Æ<K1ÇK1ÇAK: È'K6È(K: ÉK: É#K: É=K8É>K: ÊMÊJÊJ/	Ê)	MÊ2J5Ê5K.Ë "K)Ë"K: Ë)K.Ë.	K: Ë8K: Ë:MÌA MÍMÍMÍMÍMc               ó    € V ^8„  d   QhRRRR/# )r-   rH  r1   r3   rE   r4   )r5   s   "r6   r7   rÁ  -  s   € ÷ {ñ {°3ð {¸=ñ {r8   c              ƒ  óF  "  € V P                   P                  V4      pV'       g%   V P                  '       d   V P                  '       g   T;'       g    R# V P	                  V P                  WP
                  P                  V P                  V4      R4      G Rj  x€L
 #  L5i)uª   Return a valid typing ticket, refreshing via getConfig once the 600s TTL evicts it â€”
otherwise ``stop_typing`` no-ops and the WeChat client shows the indicator forever.Nztyping ticket refresh failed)rØ  rS   rÚ  rà  rU  r×  rÞ  )ræ   rH  r!  s   && r6   Ú_ensure_typing_ticketÚ#WeixinAdapter._ensure_typing_ticket-  sˆ   é € ð ×#Ñ#×'Ñ'¨Ó0ˆß˜×+×+Ð+°4·;·;°;Ø—>�>˜TÐ!Ø×.Ñ.Ø×Ñ ×):Ñ):×)>Ñ)>¸t×?OÑ?OÐQXÓ)YÐ[yó{÷ {ð 	{ñ {ùs#   ‚5B!¸B!Á
B!ÁAB!ÂBÂB!c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rH  r1   rU  rz   rn  r3   rÌ   r4   )r5   s   "r6   r7   rÁ  6  s.   € ÷ 	gñ 	g¨ð 	g°cð 	gÀ#ð 	gÈ$ñ 	gr8   c              ƒ  	ór  "  € V P                  V4      G R j  x€L
 pV'       g   R #  \        V P                  V P                  \        V P
                  \        RVRVRV/R7      G R j  x€L
  R #  LV L  \         d8   p\        P                  RT P                  T\        T4      T4        R p?R # R p?ii ; i5i)Nr�  rs  rU  )rË   rF  r›   rH  r  z [%s] typing %s failed for %s: %s)r»  rh  rÚ  rá  ÚEP_SEND_TYPINGrà  r�  rÆ   rñ   r  r¯  r~   )ræ   rH  rU  rn  rs  rö   s   &&&&  r6   Ú_set_typingÚWeixinAdapter._set_typing6  s®   é € Ø"×8Ñ8¸ÓA×AˆßÙð	gÜØ×"Ñ"¨T¯^©^ÄnÐ\`×\gÑ\gô  uFØ(¨'°?ÀMÐS[Ð]cÐdôf÷ fò fñ	 Bñføô ô 	gÜ�L‰LÐ;¸T¿Y¹YÈÌxÐX_ÓO`Ðbe×fÒfûð	güsP   ‚B7—A.˜B7¤B7§A A2 Á'A0Á(A2 Á,B7Á0A2 Á2B4Á=,B/Â)B7Â/B4Â4B7c               ó$   € V ^8„  d   QhRRRRRR/# )r-   rH  r1   r’  rÙ   r3   rÌ   r4   )r5   s   "r6   r7   rÁ  A  s#   € ÷ ?ñ ?¨ð ?Ð8Pð ?Ð\`ñ ?r8   c              ƒ  	óP   "  € V P                  V\        R 4      G Rj  x€L
  R#  L5i)ÚstartN)rÀ  ÚTYPING_START)ræ   rH  r’  s   &&&r6   Úsend_typingÚWeixinAdapter.send_typingA  s   é € Ø×Ñ˜w¬°gÓ>×>Ô>ùó   ‚&�$ž&c               ó    € V ^8„  d   QhRRRR/# )r-   rH  r1   r3   rÌ   r4   )r5   s   "r6   r7   rÁ  D  s   € ÷ =ñ =¨ð =°ñ =r8   c              ƒ  	óP   "  € V P                  V\        R 4      G Rj  x€L
  R#  L5i)ÚstopN)rÀ  ÚTYPING_STOP©ræ   rH  s   &&r6   Ústop_typingÚWeixinAdapter.stop_typingD  s   é € Ø×Ñ˜w¬°VÓ<×<Ô<ùrÈ  c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r-   rH  r1   Ú	image_urlÚcaptionr‘  rE   r3   r   r4   )r5   s   "r6   r7   rÁ  G  s5   € ÷ 
)ñ 
)¨ð 
)¸ð 
)Àcð 
)ÐUbð 
)ð  ~Hñ 
)r8   c           	   ƒ  	ó¤  "  € VP                  R4      pV'       d   V P                  V4      G Rj  x€L
 MVP                  RR4      pV'       gE   \        P                  P                  V4      '       g    \        P                  P                  V4      p V P                  WW5R7      G Rj  x€L
 V'       dr   V'       di   \        P                  P                  V4      '       dC   \        P                  ! \        4      ;_uu_ 4        \        P                  ! V4       RRR4       # # # #  L÷ L  + '       g   i     # ; i  T'       d…   T'       d|   \        P                  P                  T4      '       dV   \        P                  ! \        4      ;_uu_ 4        \        P                  ! T4       RRR4       i   + '       g   i     i ; ii i i ; i5i)úhttp://Nzfile://r+   )rÒ  r’  )rÔ  rv  )r   Ú_download_remote_mediaÚreplaceÚosr»   ÚisabsÚabspathrŸ  rÂ   rÓ   rÔ   rÕ   Úunlink)ræ   rH  rÑ  rÒ  r‘  r’  Úcleanupr   s   &&&&&&  r6   Ú
send_imageÚWeixinAdapter.send_imageG  s,  é € Ø×&Ñ&Ð'>Ó?ˆßDK˜$×5Ñ5°iÓ@×@Ð@ÐQZ×QbÑQbÐclÐnpÓQqˆ	ßœrŸw™wŸ}™}¨Y×7Ò7ÜŸ™Ÿ™¨	Ó2ˆIð	)Ø×+Ñ+¨GÈÐ+Óc×cçŸ9¬¯©¯©¸	×)BÒ)BÜ×(Ò(¬×1Õ1Ü—I’I˜iÔ(÷ 2Ð1ð *C˜9ˆwñ Añ d÷ 2×1û÷ Ÿ9¬¯©¯©¸	×)BÒ)BÜ×(Ò(¬×1Õ1Ü—I’I˜iÔ(÷ 2×1×1Ð1úð *C˜9ˆwüs�   ‚.G°D(±GÁ$GÁ4GÂD? Â*D*Â+D? Â.GÂ>$GÃ#"GÄD,ÄGÄ*D? Ä,D<Ä7GÄ?GÅ$GÅ5"GÆF7	Æ.	GÆ7GÇGÇGc               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rH  r1   rº  rÒ  rE   r3   r   r4   )r5   s   "r6   r7   rÁ  S  s3   € ÷ sñ s¨Sð s¸cð sÈMð sð  NXñ sr8   c              ‹  	óD   "  € V P                  WW5R 7      G Rj  x€L
 #  L5i))rH  r   rÒ  r’  N)rŸ  )ræ   rH  rº  rÒ  r‘  r’  rj   s   &&&&&&,r6   r¹  ÚWeixinAdapter.send_image_fileS  s"   é € Ø×'Ñ'°ÐW^Ð'Ór×rÐrÑrùs   ‚ ™š c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r-   rH  r1   r»   rÒ  rn  rj   r   r3   r   r4   )r5   s   "r6   r7   rÁ  V  s9   € ÷ =ñ =¨sð =¸#ð =Èð =ÐTWð =Ðcfð =Ðkuñ =r8   c           	   ‹  	ót  "  € V P                   '       d   V P                  '       g   \        R RR7      #  \        RV P                  ! WV3/ VB G Rj  x€L
 R7      #  L	  \         dM   p\
        P                  RT P                  T\        T4      T4       \        R \        T4      R7      u Rp?# Rp?ii ; i5i)Fr”  r•  TNrž  z[%s] %s failed to=%s: %s)
rÚ  rà  r   Ú
_send_filerÆ   rñ   r|  r¯  r~   r1   )ræ   rH  r»   rÒ  rn  rj   rö   s   &&&&&, r6   Ú_send_file_resultÚWeixinAdapter._send_file_resultV  s�   é € Ø×!×!Ð!¨¯¯¨Ü e°?ÔCÐCð	=Ü d¸T¿_º_ÈWÐ\cÑ=nÐgmÑ=n×7nÔoÐoÑ7nøÜô 	=Ü�L‰LÐ3°T·Y±YÀÄxÐPWÓGXÐZ]Ô^Ü e´3°s³8Ô<Õ<ûð	=üsL   ‚$B8§B8µA ÁA
ÁA ÁB8ÁA ÁB5Á)AB0Â*B5Â+B8Â0B5Â5B8c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r-   rH  r1   r   rÒ  rE   rˆ  r‘  r’  rÙ   r3   r   r4   )r5   s   "r6   r7   rÁ  _  sS   € ÷ `ñ `Øð`Ø'*ð`Ø5Bð`ØVcð`ð wDð`à*ð`ð 
ñ`r8   c              ‹  	óX   "  € T P                  YT;'       g    R R4      G Rj  x€L
 #  L5i)r+   rŸ  N©rä  )ræ   rH  r   rÒ  rˆ  r‘  r’  rj   s   &&&&&&&,r6   rŸ  ÚWeixinAdapter.send_document_  s(   é € ð ×+Ñ+¨GÀÇÀÈ2ÈÓ_×_Ð_Ñ_ùó   ‚!*£(¤*c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rH  r1   r¸  rÒ  rE   r3   r   r4   )r5   s   "r6   r7   rÁ  e  s3   € ÷ ^ñ ^¨ð ^¸ð ^À}ð ^ð  Iñ ^r8   c              ƒ  	óX   "  € T P                  YT;'       g    R R4      G Rj  x€L
 #  L5i)r+   r·  Nrè  )ræ   rH  r¸  rÒ  r‘  r’  s   &&&&&&r6   r·  ÚWeixinAdapter.send_videoe  s'   é € Ø×+Ñ+¨GÀÇÀÈBÐP\Ó]×]Ð]Ñ]ùrê  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r-   rH  r1   r¶  rÒ  rE   r3   r   r4   )r5   s   "r6   r7   rÁ  h  s3   € ÷ sñ s¨ð s¸ð sÀ}ð sð  ISñ sr8   c           	   ‹  	óŒ   "  € T P                  YT;'       g    V P                  \        R 4      4      RRR7      G Rj  x€L
 #  L5i)z#platform.weixin.voice_as_attachmentrµ  T©Úforce_file_attachmentN)rä  Úwarning_textr   )ræ   rH  r¶  rÒ  r‘  r’  rj   s   &&&&&&,r6   rµ  ÚWeixinAdapter.send_voiceh  si   é € à×+Ñ+¨GÀ÷  BHð  BHÈD×L]ÑL]Ô^_ð  aFó  _Gó  MHð  JVð  nrÐ+ó  s÷  sð  	sñ  sùs   ‚;A½A¾Ac               ó    € V ^8„  d   QhRRRR/# )r-   r«  r1   r3   r4   )r5   s   "r6   r7   rÁ  l  s   € ÷ ñ °ð ¸ñ r8   c           	   ƒ  	óÒ  "  € ^ RI Hp V! V4      '       g   \        RV 24      hV P                  f   Q h\	        V P                  V^R7      G Rj  x€L
 p\
        P                  ! R\        VP                  R^4      ^ ,          4      P                  ;'       g    RR7      ;_uu_ 4       pVP                  V4       VP                  uuRRR4       #  L€  + '       g   i     R# ; i5i)	r3  )Úis_safe_urlz&Blocked unsafe URL (SSRF protection): NrÄ  Fr|   z.bin)Údeleter§  )Útools.url_safetyrö  r3  rÚ  r²  ÚtempfileÚNamedTemporaryFiler   rú  r§  Úwriter¯  )ræ   r«  rö  r€   Úhandles   &&   r6   rÕ  Ú$WeixinAdapter._download_remote_medial  s·   é € Ý0Ù˜3×ÒÜÐEÀcÀUÐKÓLÐLØ×!Ñ!Ò-Ð-Ð-Ü$ T×%7Ñ%7¸SÐRTÔU×UˆÜ×(Ò(°¼dÀ3Ç9Á9ÈSÐRSÓCTÐUVÕCWÓ>X×>_Ñ>_×>iÐ>iÐci×jÕjÐntØ�L‰L˜ÔØ—;‘;÷ kÒjñ Vßj×jÐjüs1   ‚AC'ÁCÁAC'ÂC'Â)CÃC'ÃC$	Ã	C'c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r-   rH  r1   r»   rÒ  rñ  rF   r3   r4   )r5   s   "r6   r7   rÁ  v  s1   € ÷ 0ñ 0¨ð 0°3ð 0Àð 0Ð]að 0Ðnqñ 0r8   c              ƒ  	óJ	  "  € V P                   e   V P                  f   Q h\        V4      P                  4       pV P	                  W$R7      w  rg\
        P                  ! ^4      \
        P                  ! ^4      r˜\        V4      \        P                  ! V4      P                  4       rº\        V P                   V P                  V P                  WVW«V
^,           ^,          ^,          V	P                  4       R7
      G R j  x€L
 p\        VP!                  R4      ;'       g    R4      p\#        WY4      p\        VP!                  R4      ;'       g    R4      ;'       gD    T;'       d:    V P$                  P'                  R4       R\)        VRR7       R	\)        VRR7       2pV'       g   \+        R
V 24      h\-        V P                   WïR7      G R j  x€L
 pV P.                  P!                  V P0                  V4      pRVR\2        P4                  ! V	P                  4       P7                  R4      4      P9                  R4      R\        V4      RV
R\        V4      P:                  RV/pV\<        8X  d,   VP?                  R4      '       d   VPA                  ^R^R7       V! R$/ VB ..pV'       d-   VPC                  ^ R\D        RRV PG                  V4      //.4       RpV EFµ  pR\H        PJ                  ! 4       P                   2p \M        V P                   V P                  V P                  VVVVR7      G R j  x€L
 pV'       d9   \O        V\P        4      '       d#   VP!                  R4      VP!                  R4      3MR%w  ppVe   V^ 8X  d   Ve   V^ 8X  d   K¼  \S        VVV4      '       d‚   V'       dz   R pV P.                  PT                  PW                  V P.                  PY                  V P0                  V4      R 4       \Z        P]                  RV P:                  \_        V4      4       EK*  VP!                  R4      ;'       g    VP!                  R4      p\a        VVV4      '       d   \c        VVV4      h\+        R T R!T R"T;'       g    R# 24      h	  V#  ELœ ELÌ ELh5i)&Nrð  )	rË   r›   r=  r’  r“  r”  r•  r–  r—  Úupload_paramr+   Úupload_full_urlrM  z/upload?encrypted_query_param=rÂ  z	&filekey=z@getUploadUrl returned neither upload_param nor upload_full_url: )r“   rž  r   r¢  r¡   r�  rŠ  r‰  r•  r²  iÀ]  )r˜  rš  r™  r†  r‡  r5  r�  rˆ  rB   rC   zC[%s] session expired for %s; re-sending media without context_tokenrD   rQ   r‰  rX   rY   rH   r4   rŠ  )2rÚ  rà  r   Ú
read_bytesÚ_outbound_media_builderr«   Ú	token_hexr¬   r„   rP  rQ  rR  rœ  rá  r­  r1   rS   r‘   rã  rS  r   rV   r¨  r×  rÞ  r¨   r©   r­   r®   r¯  ÚMEDIA_VOICEr—   r�   Úinsertr‰  r©  r«  r¬  rƒ  rô   rN  rT   râ   r  rì   rñ   rò   r~   rM   rZ   )ræ   rH  r»   rÒ  rñ  rˆ   r’  Úitem_builderr“  r¡  r”  r•  Úupload_responser   r“   rž  r¿  rz  Úitem_kwargsÚ
item_listsr®  rx  rO   rB   rC   rD   s   &&&&&                     r6   rã  ÚWeixinAdapter._send_filev  sn  é € Ø×!Ñ!Ò-°$·+±+Ò2IÐIÐIÜ˜“J×)Ñ)Ó+ˆ	Ø#'×#?Ñ#?ÀÐ#?Ó#rÑ ˆ
Ü"×,Ò,¨RÓ0´'×2EÒ2EÀbÓ2I�Ü! )›n¬g¯kªk¸)Ó.D×.NÑ.NÓ.P�Ü /Ø×Ñ¨¯©¸t¿{¹{ÐW^ð  @GØ¸wÈ½|ÐPRÕ>RÐVXÕ=XÐel×epÑepÓerô!t÷ tˆô ˜?×.Ñ.¨~Ó>×DÐDÀ"ÓEˆÜ(¨Ó<ˆ
ä˜×,Ñ,Ð->Ó?×EÐEÀ2ÓF÷ Pð PÈ<÷ LOð LOØ×!Ñ!×(Ñ(¨Ó-Ð.Ð.LÌUÐS_ÐfhÔMiÐLjÐjsÔtyð  {Bð  IKô  uLð  tMð  Nð 	çÜÐ!aÐbqÐarÐsÓtÐtÜ&8¸×9KÑ9KÐXbÔ&z× zÐØ×)Ñ)×-Ñ-¨d×.>Ñ.>ÀÓHˆð "Ð#8Ð:KÌV×M]ÒM]Ð^e×^iÑ^iÓ^k×^rÑ^rÐszÓ^{ÓM|÷  NDñ  NDð  ELó  NMØœs :›Ð0@À'È:ÔW[Ð\`ÓWa×WfÑWfÐhtð  wAðBˆð œÔ$¨¯©°w×)?Ò)?Ø×Ñ¨1¸%ÐQSÐÔTÙ3?Ñ3NÀ+Ñ3NÐ2OÐ1Pˆ
ßØ×Ñ˜a 6¬9°kÀFÈD×L_ÑL_Ð`gÓLhÐCiÐ"jÐ!kÔlØˆÜ#ˆIØ .¬t¯zªz«|×/?Ñ/?Ð.@ÐAˆOØÜ(Ø×&Ñ&°·±ÀtÇ{Á{ÐW^ÐjsØ"/¸?ôL÷ L�÷ JNÔR\Ð]aÔcg×RhÒRh §¡¨£°·±¸)Ó1DÑEÐnz‘��WØ’K 3¨!¤8°'²/ÀWÐPQÄ\Ùô ' t¨S°'×:Ò:¿}Ø$(�MØ×%Ñ%×,Ñ,×0Ñ0°×1BÑ1B×1GÑ1GÈ×HXÑHXÐZaÓ1bÐdhÔiÜ—N‘NÐ#hÐjn×jsÑjsÔu}ð  Fó  vGô  HÚØŸ™ (Ó+×>Ð>¨t¯x©x¸«�Ü(¨¨g°v×>Ò>Ü2°3¸ÀÓHÐHÜ"Ð%BÀ3À%ÀyÐQXÐPYÐYaÐbh×b{Ðb{Ðl{Ða|Ð#}Ó~Ð~ñ' $ð( ÐòUtò !{òLùsx   ‚C<R#Ã>RÃ? R#Ä <R#Å	R#Å'AR#Æ)(R#ÇRÇB5R#Ê%R#Ê.B
R#Ì8R Ì9R#ÍA/R#Î5BR#ÑAR#ÒR#ÒR#Ò R#c               ó    € V ^8„  d   QhRRRR/# )r-   r»   r1   rñ  rF   r4   )r5   s   "r6   r7   rÁ  ¨  s   € ÷ &ñ &¨Cð &Èñ &r8   c                	óJ  € \         P                  ! V4      ^ ,          ;'       g    RpVP                  R4      '       d   \        \        3# VP                  R4      '       d   \
        \        3# VP                  R4      '       d   V'       g   \        \        3# \        \        3# )r3  r£  r=  r>  r²  )rj  rk  r   ÚMEDIA_IMAGEÚ_image_itemÚMEDIA_VIDEOÚ_video_itemr—   r  Ú_voice_itemÚ
MEDIA_FILEÚ
_file_item)ræ   r»   rñ  rf  s   &&& r6   r  Ú%WeixinAdapter._outbound_media_builder¨  s|   € Ü×#Ò# DÓ)¨!Õ,×JÐJÐ0JˆØ�?‰?˜8×$Ò$Ü¤Ð+Ð+Ø�?‰?˜8×$Ò$Ü¤Ð+Ð+Ø�=‰=˜×!Ò!×*?Ü¤Ð+Ð+Üœ:Ð%Ð%r8   c               ó    € V ^8„  d   QhRRRR/# )r-   rH  r1   r3   r/   r4   )r5   s   "r6   r7   rÁ  ²  s   € ÷ qñ q¨3ð q°>ñ qr8   c              ƒ  	óR   "  € R TRVP                  R4      '       d   RRV/# RRV/# 5i)r¯  r†  z	@chatroomr?  rA  rH  )r—   rÍ  s   &&r6   Úget_chat_infoÚWeixinAdapter.get_chat_info²  s9   é € Ø˜ °G×4DÑ4DÀ[×4QÒ4Q¨Ð]fÐhoÐpÐpÐW[Ð]fÐhoÐpÐpùs   ‚%'c               ó    € V ^8„  d   QhRRRR/# )r-   rÇ  rE   r3   r1   r4   )r5   s   "r6   r7   rÁ  µ  s   € ÷ tñ t mð t¸ñ tr8   c                	ó6   € Vf   R# \        \        V4      4      # rc  )ré  rÙ  rx  s   &&r6   r©  ÚWeixinAdapter.format_messageµ  s   € Ø’_ˆrÐsÔ*NÔOiÐjqÓOrÓ*sÐsr8   )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Š  rt   )NNN)NNNNr�  ),r
  r  r  r  ÚALLOW_ALL_ENV_PREFIXÚsupports_code_blocksÚsplits_long_messagesrw  ÚSUPPORTS_MESSAGE_EDITINGÚ_SPLIT_THRESHOLDrç   r  rð  r  r$  r  r7  r5  rC  rV  rd  rU  ry  r}  rƒ  rŽ  r·  r»  rÀ  rÆ  rÎ  rÜ  r¹  rä  rŸ  r·  rµ  rÕ  rã  r  r  r©  r  Ú__classcell__)rö  s   @r6   r½  r½  ¼  sú   ø† Ø#ÐØÐØÐØÐØ$ÐØÐ÷#bð #bðJ ôJó ðJð °E÷  õD4õ&77õr	WõKõ&-õP%õõ2	õqõKõ9õ:÷x=õ@{õ	g÷?õ=÷
)÷sõ=÷`÷^÷sõ÷0÷d&õq÷tó tr8   r½  c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r-   Úadapterr½  rH  r1   r8  r¯  ú Optional[list[tuple[str, bool]]]rz  rE   r3   r/   r4   )r5   s   "r6   r7   r7   ¹  sH   € ÷ Lñ LØðLØ%(ðLØ36ðLØEeðLð wDðLàñLr8   c              ƒ  ó2  "  € R pV P                  V4      pV'       d=   V P                  W4      G R j  x€L
 pVP                  '       g   RRVP                   2/# T;'       g    .  F~  w  rx\	        V4      P
                  P                  4       \        9   d   V P                  MV P                  p	V	! W4      G R j  x€L
 pVP                  '       d   Km  RRVP                   2/u # 	  V'       d   VP                  MR p
RRRRRVR	V
R
\        V4      /#  Là LZ5i)Nr|  úWeixin send failed: zWeixin media send failed: r–  TÚplatformr¶   rH  rG  Úcontext_token_used)r©  r·  r–  r|  r   r§  rK   Ú_DIRECT_IMAGE_EXTSr¹  rŸ  rG  rF   )r$  rH  r8  r¯  rz  Úlast_resultÚcleanedÚ
media_pathÚ	_is_voicerµ  rG  s   &&&&&      r6   Ú_deliver_directr/  ¹  s  é € ð )-€KØ×$Ñ$ WÓ-€GßØ#ŸL™L¨Ó:×:ˆØ×"×"Ð"ØÐ3°K×4EÑ4EÐ3FÐGÐHÐHØ!,×!2Ð!2°Ò!2Ñˆ
Ü,0°Ó,<×,CÑ,C×,IÑ,IÓ,KÔOaÔ,a�×(Ò(Ðgn×g|Ñg|ˆÙ" 7Ó7×7ˆØ×"×"Ò"ØÐ9¸+×:KÑ:KÐ9LÐMÐNÒNñ	 "3÷
 ,7�×'Ò'¸D€JØ�t˜Z¨°9¸gÀ|ÐU_ÐauÔw{ð  }Jó  xKð  Lð  Lñ ;ñ
 8ùs:   ‚0D²D³DÁ	DÁ#ADÂ:DÂ;DÃDÃ0$DÄDr¯  c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r-   r.   r/   r›   rE   rH  r1   r8  r¯  r%  r3   r4   )r5   s   "r6   r7   r7   Ë  sD   € ÷ \ñ \Øð\Ø%2ð\Ø=@ð\ØKNð\Ø]}ð\àñ\r8   c           
   ƒ  ó  "  € \        V R4      p\        V R\        4      P                  R4      p\        V R\        4      P                  R4      p\	        T;'       g&    V P                  R4      ;'       g    \        RR4      4      P                  4       pV'       g   RR	/# V'       g   RR
/# \        \	        \        4       4      4      p	V	P                  V4       V	P                  WR4      p
\        P                  V4      p\        VRR4      pVeK   VP                  '       g9   VP                  \        P                   ! 4       J d   \#        W²W4V
4      G Rj  x€L
 # \%        4       ;_uu_4       GRj  x€L
 p/ \'        T ;'       g    / 4      CRVRVRV/Cp\)        \+        RWŽR7      4      pV;Vn        Vn        WŸn        \#        WòW4V
4      G Rj  x€L
 uuRRR4      GRj  x€L
  #  L� Lv L L  + GRj  x€L 
 '       g   i     R# ; i5i)zqOne-shot send for ``send_message``/cron: reuse the live adapter's session on this loop, else a throwaway adapter.rÊ   rË   rM  r¾  r›   rÃ  r+   r|  zGWeixin token missing. Configure WEIXIN_TOKEN or platforms.weixin.token.z\Weixin account ID missing. Configure WEIXIN_ACCOUNT_ID or platforms.weixin.extra.account_id.rÚ  NT)Úenabledr›   r.   )r>   rY  rS  râ  r1   rS   rß  r=   rÝ   r$   rù   r@   rR  r  Ú_looprã   Úget_running_loopr/  rp   rN  r½  r   rÚ  Ú_sessionr×  )r.   r›   rH  r8  r¯  rÊ   rË   r¾  Úresolved_tokenÚtoken_storerz  Úlive_adapterÚsend_sessionrD  Úmergedr$  s   $$$$$           r6   Úsend_weixin_directr;  Ë  sª  é € ô " %¨Ó6€JÜ  z´>ÓB×IÑIÈ#ÓN€HÜ# E¨>Ô;NÓO×VÑVÐWZÓ[€LÜ˜×VÐV %§)¡)¨GÓ"4×VÐV¼
À>ÐSUÓ8VÓW×]Ñ]Ó_€NßØÐbÐcÐcßØÐwÐxÐxÜ#¤C¬Ó(9Ó$:Ó;€KØ×Ñ˜
Ô#Ø—O‘O JÓ8€MÜ!×%Ñ% nÓ5€LÜ˜<¨¸$Ó?€LØÒ¨×(;×(;Ð(;À×@RÑ@RÔV]×VnÒVnÓVpÓ@pÜ$ \¸GÐR_Ó`×`Ð`Ü�~�~Œ~ Øt”D˜Ÿ˜ "Ó%Ðt |°ZÀÈXÐWeÐgsÑtˆÜ¤°tÀ>Ô `ÓaˆØ3:Ð:ˆÔ Ô 0Ø*ÔÜ$ W°wÈ]Ó[×[÷ �~Š~ñ aÙñ
 \÷ �~�~‹~üsŒ   ‚A3HÁ6&HÂHÂ)A9HÄ#3HÅG&ÅHÅ1G(Å2HÅ5AG.ÇG*ÇG.ÇHÇ G,Ç!HÇ(HÇ*G.Ç,HÇ.H	Ç4G7Ç5
H	È H	È	Hz*Weixin: aiohttp/cryptography not installedÚWEIXIN_ACCOUNT_IDrÃ  c               ó    € V ^8„  d   QhRRRR/# ©r-   rÀ  r   r3   rF   r4   )r5   s   "r6   r7   r7   ñ  s   € ÷ `ñ `˜cð ` dñ `r8   c                ó¸   € \        V P                  P                  R4      ;'       d0    V P                  ;'       g    V P                  P                  R4      4      # )z°``config_connected_fn``: account_id AND token in the merged PlatformConfig; a token alone is
not enough, so this platform opts out of the generic ``token or api_key`` shortcut.rÊ   r›   )rF   r.   rS   r›   )rÀ  s   &r6   Ú_config_connectedr@  ñ  sB   € ô �—‘× Ñ  Ó.×^Ð^°F·L±L×4]Ð4]ÀFÇLÁL×DTÑDTÐU\ÓD]Ó_Ð_r8   c               ó    € V ^8„  d   QhRRRR/# r>  r4   )r5   s   "r6   r7   r7   ÷  s   € ÷ >ñ >˜#ð > $ñ >r8   c                ó:  € \        V RR4      ;'       g    / p\        VR4      p\        \        V RR4      ;'       g&    VP                  R4      ;'       g    \	        RR4      4      P                  4       p\        T;'       d    T4      ;'       g    \        V 4      # )zøAccount ID AND token, from ``config`` or the scoped ``WEIXIN_*`` env (``gateway/config.py``'s
Weixin connected check reads the same pair), else ``.env``, which a plain CLI process never loads
into the environment (the old static setup row read it).r.   NrÊ   r›   rÃ  r+   )rR  r>   r1   rS   rß  r=   rF   Ú_env_configured)rÀ  r.   Úaccountr›   s   &   r6   Ú_is_connectedrE  ÷  s„   € ô �F˜G TÓ*×0Ð0¨b€EÜ˜u lÓ3€GÜ”˜ ¨Ó.×fÐf°%·)±)¸GÓ2D×fÐfÌ
ÐSaÐceÓHfÓg×mÑmÓo€EÜ�×!Ð!˜EÓ"×=Ð=¤o°fÓ&=Ð=r8   Ú	thread_idÚforce_documentc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r-   Úpconfigr   rH  r1   r8  rF  rE   r¯  zOptional[list]rG  rF   r3   r/   r4   )r5   s   "r6   r7   r7     sA   € ÷ 6ñ 6 Cð 6°#ð 6Àð 6ÐS`ð 6Ø(6ð6ØOSð6Ø`nñ6r8   c             ƒ  ó.  "  € ^ RI Hp \        4       '       g	   V! R4      #  \        \	        V RR4      ;'       g    / \	        V RR4      WVR7      G Rj  x€L
 #  L  \
         d-   p\        P                  RRR	7       T! R
T 24      u Rp?# Rp?ii ; i5i)a#  Out-of-process ``send_message``/cron sender: native text + media via :func:`send_weixin_direct`.
``thread_id``/``force_document`` are signature parity only (iLink has neither). Imports nothing from
other plugins, so an unrelated optional SDK (e.g. lark-oapi) can never block Weixin delivery.)Ú
send_errorz9Weixin requirements not met. Need aiohttp + cryptography.r.   Nr›   )r.   r›   rH  r8  r¯  zWeixin standalone send failedTrA  r'  )Úgateway.platforms._sharedrK  rv   r;  rR  rÆ   rñ   r  )rI  rH  r8  rF  r¯  rG  rK  Úes   &&&$$$  r6   Ú_standalone_sendrN    s›   é € õ
 5Ü$×&Ò&ÙÐUÓVÐVð6Ü'¬g°g¸wÈÓ.M×.SÐ.SÐQSÔ[bÐcjÐlsÐuyÓ[zØ07ÐVaôc÷ cð 	cñ cøäô 6Ü�‰Ð4¸tˆÔDÙÐ0°°Ð4Ó5Õ5ûð6üsK   ‚B¢A »A ÁAÁA ÁBÁA ÁBÁ&!BÂBÂBÂBÂBc               ó   € V ^8„  d   QhRR/# rï  r4   )r5   s   "r6   r7   r7      s   € ÷ V/ñ V/˜4ñ V/r8   c                 óà  € ^ RI Hp  ^ RIHpHpHpHpHp V! R4       \        4        V P                  RRRR4       V! RR	R
4      '       g   R# \        4       '       g%   V P                  R4       V P                  R4       R# \        4        V P                  RR4      '       g   V P                  R4       R#  V P                  P                  \!        \#        V P%                  4       4      4      4      pT'       g   T P)                  R4       R# TP-                  RR4      pTP-                  RR4      p	T P/                  R	T4       T P/                  R
TP-                  RR4      4       TP-                  RR4      '       d#   T P/                  RTP-                  RR4      4       T P/                  RT P1                  R4      ;'       g    \2        4       \        4        . R0Op
T P5                  RT
^ 4      pT^8X  d1   T! RT	;'       g    R4      pT! RRTR7       T P7                  R 4       Ml\8        P-                  T\8        ^,          4      w  rÞppT! YÞRR7       TR!8X  d   T P6                  MT P(                  ! T4       T^ 8X  d   T P                  R"4       \        4        T P                  ! \;          . R1OpT P5                  R#T^ 4      pT^ 8X  d   T! R$RR%7       T P                  R&4       MGT^8X  d   T! R'RR%7       T P)                  R(4       M$T! R)R4      pT! RTR%7       T P7                  R*4       T	'       d   \        4        T! R+T	R,4       \        4        T P7                  R-4       T P                  R.T 24       T	'       d   T P                  R/T	 24       R# R#   \&         d     \        4        T P)                  R4        R# \*         d    pT P                  RT 24        Rp?R# Rp?ii ; i)2a  ``hermes gateway setup`` flow for Weixin / WeChat personal accounts (QR login via :func:`qr_login`).
Helpers resolve through the ``hermes_cli.gateway`` facade so the prompts/output match every other
wizard and the facade seams tests patch keep intercepting.)Úgateway)Úconfirm_reconfigureÚoffer_home_channelÚprint_setup_headerÚ
prompt_csvÚsave_env_valuesu   ðŸ’¬ Weixin / WeChatz>  1. Hermes will open Tencent iLink QR login in this terminal.z0  2. Use WeChat to scan and confirm the QR code.zG  3. Hermes will store the returned account_id/token in ~/.hermes/.env.zL  4. This adapter supports native text, image, video, and document delivery.ÚWeixinr<  rÃ  Nz>  Missing dependencies: Weixin needs aiohttp and cryptography.z2  Install them, then rerun `hermes gateway setup`.z  Start QR login now?Tz  Cancelled.z  Weixin setup cancelled.z  QR login failed: z  QR login did not complete.rÊ   r+   rÈ   r›   rË   ÚWEIXIN_BASE_URLrâ  z+  How should direct messages be authorized?z+  Allowed Weixin user IDs (comma-separated)Ú	allowlistr)  )ÚWEIXIN_DM_POLICYÚWEIXIN_ALLOW_ALL_USERSrÒ  z  Weixin allowlist saved.r–  zY  Unknown DM users can request access and you approve them with `hermes pairing approve`.z$  How should group chats be handled?rÏ  )ÚWEIXIN_GROUP_POLICYrÓ  z  Group chats disabled.ÚopenzM  All group chats enabled (only takes effect if iLink delivers group events).z?  Allowed group chat IDs (comma-separated, not member user IDs)zK  Group allowlist saved (only takes effect if iLink delivers group events).ÚWEIXIN_HOME_CHANNELzyour Weixin user IDzWeixin configured!z  Account ID: z  User ID: )z%Use DM pairing approval (recommended)zAllow all direct messageszOnly allow listed user IDszDisable direct messages)z!Disable group chats (recommended)zAllow all group chatsz Only allow listed group chat IDs)Ú
hermes_clirQ  Úhermes_cli.gateway_setup_wizardrR  rS  rT  rU  rV  re  Ú_print_info_linesrv   Úprint_errorÚ
print_infoÚprompt_yes_norã   Úrunr…  r1   r$   ÚKeyboardInterruptÚprint_warningrÆ   rS   Úsave_env_valueÚget_env_valuerâ  Úprompt_choiceÚprint_successÚ_WEIXIN_DM_POLICIESÚ_WEIXIN_GROUP_NOTE)ÚgwrR  rS  rT  rU  rV  Úcredentialsrö   rÊ   rÈ   Úaccess_choicesÚ
access_idxrY  ÚpolicyÚ	allow_allÚlevelr8  Úgroup_choicesÚ	group_idxÚallow_groupss                       r6   Úinteractive_setuprx     sr  € õ )÷bõ bñ Ð-Ô.Ü	„GØ×ÑØHØ:ØQØVô	ñ ˜xÐ)<¸n×MÒMÙÜ$×&Ò&Ø
�‰ÐWÔXØ
�‰ÐJÔKÙÜ	„GØ×ÑÐ3°T×:Ò:Ø
�‰�nÔ%ÙðØ—j‘j—n‘n¤X¬c°"×2DÑ2DÓ2FÓ.GÓ%HÓIˆ÷ Ø
×ÑÐ7Ô8Ùà—‘ ¨rÓ2€JØ�o‰o˜i¨Ó,€GØ×ÑÐ)¨:Ô6Ø×Ñ�n k§o¡o°g¸rÓ&BÔCØ‡��z 2×&Ò&Ø
×ÑÐ+¨[¯_©_¸ZÈÓ-LÔMØ×ÑÐ+¨R×-=Ñ-=Ð>SÓ-T×-kÐ-kÔXkÔlä	„Gò€Nð ×!Ñ!Ð"OÐQ_ÐabÓc€JØ�Q„ÙÐLÈgÏmÈmÐY[Ó\ˆ	Ù¨ÈWÐktÕuØ
×ÑÐ4Õ5ä,?×,CÑ,CÀJÔPcÐdeÕPfÓ,gÑ)ˆ˜5 'Ù¨ÐhjÕkØ" iÔ/ˆ×	Ò	°R×5EÑ5EÐ	EÀwÔOØ˜Œ?Ø�M‰MÐuÔvä	„GØ×ÒÔ,Ñ-Úv€MØ× Ñ Ð!GÈÐXYÓZ€IØ�A„~Ù¨JÐSUÕVØ
�‰Ð/Õ0Ø	�aŒÙ¨FÈrÕRØ
×ÑÐhÕiá!Ð"cÐegÓhˆÙ¨KÐT`ÕaØ
×ÑÐfÔgçÜŒÙÐ0°'Ð;PÔQÜ	„GØ×ÑÐ)Ô*Ø‡M�M�N : ,Ð/Ô0ßØ
�‰˜ G 9Ð-Ö.ñ øôs ô ÜŒØ
×ÑÐ4Ô5ÚÜô Ø
�‰Ð,¨S¨EÐ2Ô3Ýûðús$   Â7;N Î&O-ÏO-ÏO-ÏO(Ï(O-aï  You are on Weixin/WeChat. Markdown formatting is supported, so you may use it when it improves readability, but keep the message compact and chat-friendly. You can send media files natively: include MEDIA:/absolute/path/to/file in your response. Images are sent as native photos, videos play inline when supported, and other files arrive as downloadable documents. You can also include image URLs in markdown format ![alt](url) and they will be downloaded and sent as native media when possible.zS^\s*((?:wxid|gh|v\d+|wm|wb)_[A-Za-z0-9_-]+|[A-Za-z0-9._-]+@chatroom|filehelper)\s*$c               ó   € V ^8„  d   QhRR/# rï  r4   )r5   s   "r6   r7   r7   „  s   € ÷ ñ �Tñ r8   c           
     óz  € ^RI Hp V P                  ! R*/ R\        \        RR7      bR\        RRR7      bR	R
bRRbR\        bR\        bRRbRRbRRbRR+bR\        bRRR.bR\        bR\        bR\        bRRbR\        bR ^ bR!R"bR#RbR$\        bR%R&bR'VP                  bR(VP                  bVP                   B  R)# ),u:   Plugin entry point â€” called by the Hermes plugin system.)Úgateway_envÚtarget_ref_syntax_fnF)Úthread_groupÚstandalone_sendrW  T)rn  r1  r¯  r¶   rn  zWeixin / WeChatÚadapter_factoryÚcheck_fnÚdashboard_labelzWeixin / WeChat (Personal)Údashboard_descriptionzBConnect a personal WeChat account through Tencent's iLink Bot API.Údocs_urlzGhttps://hermes-agent.nousresearch.com/docs/user-guide/messaging/weixin/Údashboard_env_varsr<  rÃ  Úis_connectedÚrequired_envÚinstall_hintÚconfig_connected_fnÚsetup_fnÚcron_deliver_env_varr^  Ústandalone_sender_fnÚmax_message_lengthÚemojiu   ðŸ’¬Úallow_update_commandÚplatform_hintÚdisplay_tierÚlowÚenv_overridesÚenv_enable_credentialsNr4   )r<  rÃ  rX  )r+   r{  Úregister_platformr*   Ú_SEND_TARGET_REr)   r½  rv   rE  Ú_INSTALL_HINTr@  rx  rN  Ú_PLATFORM_HINTÚENV_OVERRIDESÚENV_ENABLE_CREDENTIALSÚAUTHZ)Úctxr{  s   & r6   Úregisterrœ  „  s6  € åØ×Òò Ü0´ÈuÕUðä,°8À4ÕHðñ ðñ /ðõ ANðõ Yrðñ 5ð	ñ
 cðñ [ðñ Tðõ #ðð 3FÀ~Ñ1Vðõ fsðõ .ðõ #ðñ 3ðõ .ðñ CDðñ LRðñ imðõ %ðñ  ð!ð" "×/Ò/ð#ð$  +×AÒAÀ[×EVÑEVô%r8   )r+   i  )é¸ˆ  i˜:  i'  r�  iòÿÿÿéþÿÿÿ)r  r-   é   rŸ   )r  r-   rŸ  rŸ   é   )é   )r'  >   úwx.qlogo.cnúmmbiz.qpic.cnúres.wx.qq.comúmmbiz.qlogo.cnúthirdwx.qlogo.cnúilinkai.weixin.qq.comúnovac2c.cdn.weixin.qq.comr�  )T>   ú.m4aú.mp3ú.oggú.wavú.flacú.opus>   ú.bmpú.gifr§  ú.pngú.jpegú.webp)rÍ  r)  r–  z  DM pairing enabled.)r]  r%  rò   z$  Open DM access enabled for Weixin.)rÏ  r)  rò   z  Direct messages disabled.)zH  Note: QR login connects an iLink bot identity (e.g. ...@im.bot), not azM  scriptable personal WeChat account. Ordinary WeChat groups typically cannotzN  invite an @im.bot identity, and iLink does not deliver ordinary-group eventszI  to most bot accounts. The settings below only apply when iLink actuallyuO     delivers group events for your account type â€” otherwise DM remains the onlyz,  working channel regardless of this choice.)ËÚ__conditional_annotations__r  Ú
__future__r   rã   r¨   rÓ   rP  rÃ   Úloggingrj  r×  r  r«   rù  rå  rÐ   r«  r   Ú	functoolsr   Úpathlibr   Útypingr   r   r   r	   r
   r   r   Úurllib.parser   r   Ú	getLoggerr
  rñ   râ  re   rc   rd   Úcryptography.hazmat.backendsr   Ú&cryptography.hazmat.primitives.ciphersr   r   r   ru   Úgateway.configr   r   Úgateway.platforms.helpersr   r   r   Ú%gateway.platforms.access_policy_mixinr   Ú
agent.i18nr   Úgateway.platforms.baser   r   r   r   r   r   r    r!   Úgateway.platforms.eventr"   r#   Úhermes_constantsr$   Úutilsr%   rL  r&   r'   r;   r(   rß  Úgateway.platforms.send_targetsr)   r*   r>   rY  râ  r¯   rg  r°   rs  r�  r¿  rŽ  r›  rZ  r~  r4  r‚  r�  r[  r+  r-  r,  rR   rJ   rÜ  r  r  r  r  r‰  r2  r5  r4  r3  r  r€  rÅ  rÌ  r@   Ú__annotations__Úcompiler  rã  rÊ  rM   rT   rZ   rh   rp   rv   r~   r†   r‘   r™   r²   r¼   rÇ   r×   rÛ   rÝ   r  r6  rB  r]  rh  rl  ru  rƒ  rŠ  r�  rœ  r¨  r²  Ú	frozensetr³  r¼  rÅ  rÐ  rÙ  ré  rø  rÿ  r  r  r  r  r*  r6  ÚPHOTOÚVIDEOÚVOICErE  rJ  rO  rR  r]  rl  r…  rœ  r¥  r  r  r  r  r´  r»  r*  r½  r/  r;  r–  rC  r@  rE  rN  rl  rm  rx  r—  r•  rœ  )r´  s   @r6   Ú<module>rÍ     sa  øðô?õ #ç v× v× v× v× v× v× vÝ Ý Ý ß H× HÑ Hß (à	×	Ò	˜8Ó	$€ØÐ ðÛð  4Ð'Ð ð9Ý<ßPÑPð  Ð%Ð ç 3ß ZÑ ZÝ FÝ ÷÷ ó ÷ >Ý ,Ý #ß yÑ yß T÷Tð
 1€Ø=Ð Ø:?ÀÐJbÐ 7€ˆoÐ7Ø2HÐJaÐcyÐ /€� Ø#8Ð:RÐ  €Ð Ø"<Ð>[Ð €ÐØIgÑ FÐ �nÐ&7¸ØGHÈ!ÈRÐ DÐ Ð-Ð/DØ.1°2Ð +Ð Ð+ØÐ Ø4>Ñ 1€ˆ[˜* kØ;HÑ 8€	ˆ:�z 9¨jØ!" AÐ €ÐØ˜qÐ €ˆkØ!#€�Ó #Ø�ZŠZÐ0Ó1€
Ø—’ÐRÓS€Ø�JŠJÐ+Ó,€	õõCõHõ@õ6kõ2÷&÷
-õ
Jõ
õõõðÐhj÷ õH÷-mñ -m÷`5ñ 5õ$Rõ8ð
Dð SW÷
DõVõ|õ
CõSõTõKõLõ	6ðBÐ`d÷ Bñ )2ò 3Qó )RÐ �~ó Rõ	|õYõ.õ%õ &õ"0õ*,õ&GõKõ^÷z÷"uõð@   ×!2Ò!2Ð3°hÀ×@QÒ@QÐ5RÐU]Ð_j×_pÒ_pÐTqÐrÐ õvõMõ
lõZõ
mð7¸ð 7ÐTW÷ 7ðx �ÑgÐhØ�ÑMÐNØ�ñ  }ð ~à�ñ  +ð ,ðS€ÐOó õDñ " +¨yÓ9¹7À;ÐPZÓ;[Ð €
ˆKÙ" ;°
Ó;¹WÀ[ÐR\Ó=]Ð €ˆ[ð �˜tÑ%cÐeqÐszÐ{Ø�˜uÑ&lÐnyð  |Cð  DØ�˜TÑ#aÐcgÐioÐpØ�˜tÑ%dÐfrÐt{Ð|ð	l€Ðhó ñ ÒAÓBÀLÐR^Ð_Ø�, Ð-ØÐ# \Ð2ð<Ð Ð8ó ò
 HÐ ôztÐ(Ð*=ô ztõzLð$\ð AE÷\ð@ =€ñ #Ð#6¸ÓG€õ`õ>ð6Ðcgð 6Ø9=ð6ØV[÷6ð" ÐRØÐ]ØÐYð[Ð ðÐ õV/ðv]ð ð —*’*ÐsÓt€÷øðc+ ô ØƒGðûð ô 9Ø48Ð8€OÐ8�fÐ8˜z«Eð9ús$   ÂP ÂP Ð	PÐPÐP$Ð#P$