+
    Wi]                        R 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Ht ^ RIHtHt ^ RIt^ RIt^ RIHt ^RIHtH t H!t!H"t"H#t#H$t$ ^R	I%H&t& ^R
I'H(t( ^RI)H*t*H+t+H,t,H-t- ^RIH.t.H/t/ ]P`                  ! ]Pb                  ! 4       R7      t2R R lt3R R lt4R R lt5R R lt6R R lt7R R lt8R R lt9R R lt:R R lt;R  R! lt< ! R" R#4      t=R# )$zCommunicate with the service. Only the Communicate class should be used by
end-users. The other classes and functions are for internal use only.N)nullcontext)TextIOWrapperQueue)AsyncGeneratorContextManagerDict	GeneratorListOptionalTupleUnion)escapeunescape)Literal)DEFAULT_VOICEMP3_BITRATE_BPSSEC_MS_GEC_VERSIONTICKS_PER_SECONDWSS_HEADERSWSS_URL)	TTSConfig)DRM)NoAudioReceivedUnexpectedResponseUnknownResponseWebSocketError)CommunicateStateTTSChunk)cafilec          	          V ^8  d   QhR\         R\        R\        \        \         \         3,          \         3,          /# )   dataheader_lengthreturn)bytesintr   r   )formats   "S/home/ubuntu/hermes-agent/venv/lib/python3.14/site-packages/edge_tts/communicate.py__annotate__r)   2   s7     . .
. #.
4uu$%.    c                    \        V \        4      '       g   \        R4      h/ pV RV P                  R4       F  pVP                  R^4      w  rEWRV&   K  	  W V^,           R 3# )z
Returns the headers and data from the given data.

Args:
    data (bytes): The data to be parsed.
    header_length (int): The length of the header.

Returns:
    tuple: The headers and data to be used in the request.
zdata must be bytesNs   
   :)
isinstancer%   	TypeErrorsplit)r"   r#   headerslinekeyvalues   &&    r(   get_headers_and_datar4   2   so     dE"",--G^m$**73ZZa(
 4 *,---r*   c                R    V ^8  d   QhR\         \        \        3,          R\        /# )r!   stringr$   )r   strr%   )r'   s   "r(   r)   r)   J   s#      5e+<  r*   c                ~   \        V \        4      '       d   V P                  R4      p \        V \        4      '       g   \	        R4      h\        V 4      p\        V4       FK  w  r#\        V4      p^ Tu;8:  d   ^8:  g)   M ^Tu;8:  d   ^8:  g   M ^Tu;8:  d
   ^8:  g   KC  M KG  RW&   KM  	  RP                  V4      # )a/  
The service does not support a couple character ranges.
Most important being the vertical tab character which is
commonly present in OCR-ed PDFs. Not doing this will
result in an error from the service.

Args:
    string (str or bytes): The string to be cleaned.

Returns:
    str: The cleaned string.
utf-8zstring must be str or bytes  )	r-   r%   decoder7   r.   list	enumerateordjoin)r6   charsidxcharcodes   &    r(   remove_incompatible_charactersrE   J   s     &%  w'fc""566F|Eu%	INNd 0b 0bD6FB6F6FEJ &
 775>r*   c                $    V ^8  d   QhR\         /# r!   r$   r7   )r'   s   "r(   r)   r)   f   s      C r*   c                 @    \         P                  ! 4       P                  # )zJ
Returns a UUID without dashes.

Returns:
    str: A UUID without dashes.
)uuiduuid4hex r*   r(   
connect_idrN   f   s     ::<r*   c                <    V ^8  d   QhR\         R\        R\        /# )r!   textlimitr$   r%   r&   )r'   s   "r(   r)   r)   p   s!      5   r*   c                `    V P                  R^ V4      pV^ 8  d   V P                  R^ V4      pV# )a  
Finds the index of the rightmost preferred split character (newline or space)
within the initial `limit` bytes of the text.

This helps find a natural word or sentence boundary for splitting, prioritizing
newlines over spaces.

Args:
    text (bytes): The byte string to search within.
    limit (int): The maximum index (exclusive) to search up to.

Returns:
    int: The index of the last found newline or space within the limit,
         or -1 if neither is found in that range.
   
    )rfind)rP   rQ   split_ats   && r(   (_find_last_newline_or_space_within_limitrX   p   s4    " zz%E*H!|::dAu-Or*   c                0    V ^8  d   QhR\         R\        /# )r!   text_segmentr$   rR   )r'   s   "r(   r)   r)      s      e  r*   c                    \        V 4      pV^ 8  d    V RV P                  R4       V# V#   \         d    T^,          p K7  i ; i)a  
Finds the rightmost possible byte index such that the
segment `text_segment[:index]` is a valid UTF-8 sequence.

This prevents splitting in the middle of a multi-byte UTF-8 character.

Args:
    text_segment (bytes): The byte segment being considered for splitting.

Returns:
    int: The index of the safe split point. Returns 0 if no valid split
         point is found (e.g., if the first byte is part of a multi-byte
         sequence longer than the limit allows).
Nr9   )lenr<   UnicodeDecodeError)rZ   rW   s   & r(   _find_safe_utf8_split_pointr^      sU     < H
Q,	(#**73O
 O	 " 	MH	s   , AAc                <    V ^8  d   QhR\         R\        R\        /# )r!   rP   rW   r$   rR   )r'   s   "r(   r)   r)      s!      U c c r*   c                    V^ 8  d<   RV RV 9   d2   V P                  R^ V4      pV P                  RW!4      R8w  d    V# TpKB  V# )aq  
Adjusts a proposed split point backward to prevent splitting inside an XML entity.

For example, if `text` is `b"this &amp; that"` and `split_at` falls between
`&` and `;`, this function moves `split_at` to the index before `&`.

Args:
    text (bytes): The text segment being considered.
    split_at (int): The proposed split point index, determined by whitespace
                    or UTF-8 safety.

Returns:
    int: The adjusted split point index. It will be moved to the '&'
         if an unterminated entity is detected right before the original `split_at`.
         Otherwise, the original `split_at` is returned.
   &N   ;)rindexfind)rP   rW   ampersand_indexs   && r(   "_adjust_split_point_for_xml_entityrg      sS    " Q,44	?2++dAx899T?5;
 O #Or*   c          	      z    V ^8  d   QhR\         \        \        3,          R\        R\        \        RR3,          /# )r!   rP   byte_lengthr$   N)r   r7   r%   r&   r	   )r'   s   "r(   r)   r)      s>     B B
U

B*-BudD !Br*   c              #    "   \        V \        4      '       d   V P                  R4      p \        V \        4      '       g   \	        R4      hV^ 8:  d   \        R4      h\        V 4      V8  di   \        W4      pV^ 8  d   \        V 4      p\        W4      pV^ 8  d   \        R4      hV RV P                  4       pV'       d   Vx  Y^ 8  d   TM^R p Kx  V P                  4       pV'       d   Vx  R# R# 5i)a  
Splits text into chunks, each not exceeding a maximum byte length.

This function prioritizes splitting at natural boundaries (newlines, spaces)
while ensuring that:
1. No chunk exceeds `byte_length` bytes.
2. Chunks do not end with an incomplete UTF-8 multi-byte character.
3. Chunks do not split XML entities (like `&amp;`) in the middle.

Args:
    text (str or bytes): The input text. If str, it's encoded to UTF-8.
    byte_length (int): The maximum allowed byte length for any yielded chunk.
                       Must be positive.

Yields:
    bytes: Text chunks (UTF-8 encoded, stripped of leading/trailing whitespace)
           that conform to the byte length and integrity constraints.

Raises:
    TypeError: If `text` is not str or bytes.
    ValueError: If `byte_length` is not positive, or if a split point
                cannot be determined (e.g., due to extremely small byte_length
                relative to character/entity sizes).
r9   ztext must be str or bytesz"byte_length must be greater than 0zTMaximum byte length is too small or invalid text structure near '&' or invalid UTF-8N)r-   r7   encoder%   r.   
ValueErrorr\   rX   r^   rg   strip)rP   ri   rW   chunkremaining_chunks   &&   r(   split_text_by_byte_lengthrp      s     6 ${{7#dE""344a=>>
d)k
!;DNa<248H 6dEa< C  Yh%%'K 1H!56 jjlO s   B?C5*C5-C5c                ^    V ^8  d   QhR\         R\        \        \        3,          R\        /# )r!   tcescaped_textr$   )r   r   r7   r%   )r'   s   "r(   r)   r)     s*      y c5j(9 c r*   c                    \        V\        4      '       d   VP                  R4      pRV P                   RV P                   RV P
                   RV P                   RV R2# )z
Creates a SSML string from the given parameters.

Args:
    tc (TTSConfig): The TTS configuration.
    escaped_text (str or bytes): The escaped text. If bytes, it must be UTF-8 encoded.

Returns:
    str: The SSML string.
r9   z_<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'><voice name='z'><prosody pitch='z' rate='z
' volume='z'>z</prosody></voice></speak>)r-   r%   r<   voicepitchratevolume)rr   rs   s   &&r(   mkssmlry     sg     ,&&#**73	z "88*HRWWIZ		{".			r*   c                $    V ^8  d   QhR\         /# rG   rH   )r'   s   "r(   r)   r)      s       r*   c                 V    \         P                  ! R\         P                  ! 4       4      # )zW
Return Javascript-style date string.

Returns:
    str: Javascript-style date string.
z:%a %b %d %Y %H:%M:%S GMT+0000 (Coordinated Universal Time))timestrftimegmtimerM   r*   r(   date_to_stringr      s      ==Ddkkm r*   c                H    V ^8  d   QhR\         R\         R\         R\         /# )r!   
request_id	timestampssmlr$   rH   )r'   s   "r(   r)   r)   0  s(      s s # # r*   c                    RV  RV RV 2# )z|
Returns the headers and data to be used in the request.

Returns:
    str: The headers and data to be used in the request.
zX-RequestId:z1
Content-Type:application/ssml+xml
X-Timestamp:zZ
Path:ssml

rM   )r   r   r   s   &&&r(   ssml_headers_plus_datar   0  s)     zl # k "&		r*   c                      a  ] tR tRt o Rt]3RRRRRRRR	R
RRRR^
R^</V 3R lR llltV 3R lR ltV 3R lR ltV 3R lR lt	V 3R lR lt
R V 3R lR lltV 3R lR ltR V 3R lR lltRtV tR# )!CommunicateiA  z
Communicate with the service.
rw   z+0%rx   rv   z+0HzboundarySentenceBoundary	connectorNproxyconnect_timeoutreceive_timeoutc                   < V ^8  d   QhRS[ RS[ RS[ RS[ RS[ RS[R,          RS[S[P                  ,          RS[S[ ,          R	S[S[,          R
S[S[,          /
# )r!   rP   ru   rw   rx   rv   r   r   r   r   r   WordBoundaryr   )r7   r   r   aiohttpBaseConnectorr&   )r'   __classdict__s   "r(   r)   Communicate.__annotate__G  s     9
 9
9
 9

 9
 9
 9
 <=9
 G1129
 }9
 "#9
 "#9
r*   c               Z   \        W#WEV4      V n        \        V\        4      '       g   \	        R 4      h\        \        \        V4      4      R4      V n        Ve"   \        V\        4      '       g   \	        R4      hWn	        \        V	\        4      '       g   \	        R4      h\        V
\        4      '       g   \	        R4      h\        P                  ! RRV	V
R7      V n        Ve,   \        V\        P                  4      '       g   \	        R4      hWpn        RR	R
^ R^ RRR^ R^ /V n        R# )ztext must be stri   Nzproxy must be strzconnect_timeout must be intzreceive_timeout must be int)totalconnectsock_connect	sock_readz'connector must be aiohttp.BaseConnectorpartial_textr*   offset_compensationlast_duration_offsetstream_was_calledFchunk_audio_bytescumulative_audio_bytes)r   
tts_configr-   r7   r.   rp   r   rE   textsr   r&   r   ClientTimeoutsession_timeoutr   r   state)selfrP   ru   rw   rx   rv   r   r   r   r   r   s   &&&$$$$$$$$r(   __init__Communicate.__init__G  s    $EI $$$.// /1$78

 Zs%;%;/00$)
 /3//9::/3//9::&44(%	 
  Iw?T?T)U)UEFF:C C!1"A$a(

r*   c                &   < V ^8  d   QhRS[ RS[/# )r!   r"   r$   )r%   r   )r'   r   s   "r(   r)   r     s     C CU Cx Cr*   c                n   \         P                  ! V4      R ,           F  pVR,          pVR9   dc   VR,          R,          V P                  R,          ,           pVR,          R,          pRVRVRVR	\        VR,          R	,          R
,          4      /u # VR9   d   K~  \	        RV 24      h	  \        R4      h)MetadataTypeDataOffsetr   DurationtypeoffsetdurationrP   TextzUnknown metadata type: zNo WordBoundary metadata foundr   )
SessionEnd)jsonloadsr   r   r   r   )r   r"   meta_obj	meta_typecurrent_offsetcurrent_durations   &&    r(   __parse_metadataCommunicate.__parse_metadata  s    

4(44H (I@@V$X.<Q1RR  $,F#3J#? In 0HXf%5f%=f%EF	  O+!$;I;"GHH 5  !!ABBr*   c                   < V ^8  d   QhRR/# r!   r$   NrM   )r'   r   s   "r(   r)   r     s     , ,T ,r*   c                    V P                   R;;,          V P                   R,          ,          uu&   V P                   R,          ^,          \        ,          \        ,          V P                   R&   ^ V P                   R&   R# )a  Update inter-chunk offset_compensation from cumulative CBR audio bytes.

The output format is audio-24khz-48kbitrate-mono-mp3 (48 kbps CBR).
For any CBR stream the byte-to-tick conversion is exact integer
arithmetic:  ticks = total_bytes * 8 * 10_000_000 // 48_000.

This replaces the previous metadata-based accumulation which drifted
on long texts due to variable AI silence and Microsoft's integer
overflow in reported offsets.
r   r   r   N)r   r   r   )r   s   &r(   __compensate_offsetCommunicate.__compensate_offset  sj     	

+,

;N0OO,JJ/0  	

() +,

&'r*   c                4   < V ^8  d   QhRS[ S[R3,          /# r   r   r   )r'   r   s   "r(   r)   r     s      K Kx~ > Kr*   c               T  a a"   R  V V3R llpR V V3R llpRp\         P                  ! S P                  RS P                  R7      ;_uu_4       GRj  xL
 qDP	                  \
         R\        4        R	\        P                  ! 4        R
\         2^S P                  \        P                  ! \        4      \        R7      ;_uu_4       GRj  xL
 oV! 4       G Rj  xL
  V! 4       G Rj  xL
  S  Rj  xL
  pVP                  \         P                  P                   8X  d   VP"                  P%                  R4      p\'        WfP)                  R4      4      w  rxVP+                  RR4      p	V	R8X  d=   S P-                  V4      p
V
5x  V
R,          V
R,          ,           S P.                  R&   K  V	R8X  d   S P1                  4         EMV	R%9  d   \3        R4      hK  VP                  \         P                  P4                  8X  EdB   \7        VP"                  4      ^8  d   \9        R4      h\:        P=                  VP"                  R,          R4      pV\7        VP"                  4      8  d   \9        R4      h\'        VP"                  V4      w  rxVP+                  R4      R8w  d   \9        R4      hVP+                  RR4      pVR&9  d   \9        R4      hVf   \7        V4      ^ 8X  d   EK  \9        R4      h\7        V4      ^ 8X  d   \9        R4      hRpS P.                  R;;,          \7        V4      ,          uu&   R R!R"V/5x  EKX  VP                  \         P                  P>                  8X  g   EK  \A        VP"                  '       d   VP"                  4      hR#4      hV'       g   \C        R$4      hRRR4      GRj  xL
  RRR4      GRj  xL
  R#  EL EL EL EL ELEDLG L(  + GRj  xL 
 '       g   i     L?; i L6  + GRj  xL 
 '       g   i     R# ; i5i)'c                    V ^8  d   QhRR/# r   rM   )r'   s   "r(   r)   *Communicate.__stream.<locals>.__annotate__  s     	 	D 	r*   c            	        <"   SP                   P                  R8H  p V '       d   RMRpV '       g   RMRpSP                  R\        4        RV RV R24      G Rj  xL
  R#  L5i)	z)Sends the command request to the service.r   truefalsezX-Timestamp:z
Content-Type:application/json; charset=utf-8
Path:speech.config

{"context":{"synthesis":{"audio":{"metadataoptions":{"sentenceBoundaryEnabled":"z","wordBoundaryEnabled":"z9"},"outputFormat":"audio-24khz-48kbitrate-mono-mp3"}}}}
N)r   r   send_strr   )word_boundarywdsqr   	websockets      r(   send_command_request2Communicate.__stream.<locals>.send_command_request  sm      OO44FM(gB,'B$$~/0 1. /1T1J2$ O		 	 	s   -A$*A$A"A$c                    V ^8  d   QhRR/# r   rM   )r'   s   "r(   r)   r     s     	 	 	r*   c                    <"   SP                  \        \        4       \        4       \	        S P
                  S P                  R,          4      4      4      G Rj  xL
  R#  L5i)z&Sends the SSML request to the service.r   N)r   r   rN   r   ry   r   r   )r   r   s   r(   send_ssml_request/Communicate.__stream.<locals>.send_ssml_request  sL     $$&L"$

>2	 	 	s   AA!AA!FT)r   	trust_envtimeoutNz&ConnectionId=z&Sec-MS-GEC=z&Sec-MS-GEC-Version=)compressr   r0   sslr9   s   

s   Paths   audio.metadatar   r   r   s   turn.endzUnknown path receivedzBWe received a binary message, but it is missing the header length.:Nr!   Nbigz9The header length is greater than the length of the data.s   audioz3Received binary message, but the path is not audio.s   Content-Typez=Received binary message, but with an unexpected Content-Type.z<Received binary message with no Content-Type, but with data.z:Received binary message, but it is missing the audio data.r   r   audior"   zUnknown errorzFNo audio was received. Please verify that your parameters are correct.)s   responses
   turn.start)s
   audio/mpegN)"r   ClientSessionr   r   
ws_connectr   rN   r   generate_sec_ms_gecr   r   headers_with_muidr   _SSL_CTXr   	WSMsgTypeTEXTr"   rk   r4   re   get_Communicate__parse_metadatar   _Communicate__compensate_offsetr   BINARYr\   r   r&   
from_bytesERRORr   r   )r   r   r   audio_was_receivedsessionreceivedencoded_data
parametersr"   pathparsed_metadatar#   content_typer   s   f            @r(   __streamCommunicate.__stream  s    	 	 	 	  # ((nn((
 
 
 ((i~jl^32245"#5"68 **))+6 ) 
 
 
 &(((#%%%"+ Q Qh==G$5$5$:$::*2--*>*>w*GL';$&7&7&D($J &>>'48D00*.*?*?*E-- ,H5
8SS 

#9: , 002%AA-.EFF B]]g&7&7&>&>>8==)A-0` 
 %(NN8==3De$LM$s8=='990W 
 (< }($J
 "~~g.(:0Q  $.>>/4#HL#+@@0[ 
 $+t9>$ 1Z 
 4yA~0X 
 *.&JJ23s4y@3!7FD99]]g&7&7&=&==()1 <K  &%\ C
 
	
 
 

 )%Q)
 
 
 
	
 
 
 
s   AP(OP(A6POPO-	OO-	,O"-O-	3O(
7O%8O(
;I6O-	74O-	,O-	7PO+PP(P	P(PO-	"O-	%O(
(O-	+P-P3O64
P?PP	P(P%	P
P%	P%		P(c                4   < V ^8  d   QhRS[ S[R3,          /# r   r   )r'   r   s   "r(   r)   r   6  s     " "	$	'"r*   c                 "   V P                   R,          '       d   \        R4      hRV P                   R&   V P                   F?  V P                   R&   ^ V P                   R&    V P                  4         Rj  xL
  pV5x  K  	  R#  LDKJ    \        P
                   df   pTP                  R8w  d   h \        P                  ! T4       ^ T P                   R&   T P                  4         Rj  xL 
  pT5x  K  D Rp?K  Rp?ii ; i5i)a=  
Streams audio and metadata from the service.

Raises:
    NoAudioReceived: If no audio is received from the service.
    UnexpectedResponse: If the response from the service is unexpected.
    UnknownResponse: If the response from the service is unknown.
    WebSocketError: If there is an error with the websocket.
r   zstream can only be called once.Tr   r   Ni  )	r   RuntimeErrorr   _Communicate__streamr   ClientResponseErrorstatusr   handle_client_response_error)r   messagees   &  r(   streamCommunicate.stream6  s      ::)**@AA*.

&' +/**DJJ~&./DJJ*+
"%)]]_ " "'!M	 +5"_.. "88s?00323

./%)]]_ " "'!M &5"ss   AD	"B2B	6B7B	:	BD	B		B
D	D!AD(C:,C/
-C:1
D;D	DD	c                f   < V ^8  d   QhRS[ S[S[3,          RS[S[ S[S[3,          ,          RR/# r!   audio_fnamemetadata_fnamer$   Nr   r7   r%   r   )r'   r   s   "r(   r)   r   W  s@     ) )3:&) !sEz!23) 
	)r*   c           	     $  "   Ve   \        VRRR7      M	\        4       pT;_uu_ 4        \        VR4      ;_uu_ 4       pV P                  4         Rj  xL
  pVR,          R8X  d   VP                  VR,          4       K2  \	        V\
        4      '       g   KJ  VR,          R
9   g   KZ  \        P                  ! WS4       VP                  R	4       K   L~D RRR4       M  + '       g   i     M; iRRR4       R#   + '       g   i     R# ; i5i)z5
Save the audio and metadata to the specified files.
Nwr9   )encodingwbr   r   r"   
r   )openr   r   writer-   r   r   dump)r   r   r   metadatar   r   s   &&&   r(   saveCommunicate.saveW  s      ) w7 	
 XtK..%!% ) )g6?g-KK0-88WV_ Q > IIg0NN4() /...XXXXsc   'DC<C	C
CC
=C	C	))C	C
C		C<C/*C<2
D<D		Dc                6   < V ^8  d   QhRS[ S[RR3,          /# r   )r	   r   )r'   r   s   "r(   r)   r   o  s       Yxt';< r*   c              #    a "   R V 3R llp\        4       p\        P                  P                  4       ;_uu_ 4       pVP	                  W4        VP                  4       pVf   MVx  K  RRR4       R#   + '       g   i     R# ; i5i)z-Synchronous interface for async stream methodc                (    V ^8  d   QhR\         RR/# )r!   queuer$   Nr   )r'   s   "r(   r)   -Communicate.stream_sync.<locals>.__annotate__r  s     		 		U 		t 		r*   c                    <a  R  V V3R llp\         P                  ! 4       p\         P                  ! V4       VP                  V! 4       4       VP	                  4        R# )c                    V ^8  d   QhRR/# r   rM   )r'   s   "r(   r)   HCommunicate.stream_sync.<locals>.fetch_async_items.<locals>.__annotate__s  s        T  r*   c                     <"   SP                  4         R j  xL
  p SP                  V 4       K   LDSP                  R 4       R # 5iN)r   put)itemr  r   s    r(   	get_itemsECommunicate.stream_sync.<locals>.fetch_async_items.<locals>.get_itemss  s8     "&++- $ $$IIdO$-		$s   A313A3AN)asyncionew_event_loopset_event_looprun_until_completeclose)r  r  loopr   s   f  r(   fetch_async_items2Communicate.stream_sync.<locals>.fetch_async_itemsr  sD       
 ))+D""4(##IK0JJLr*   N)r   
concurrentfuturesThreadPoolExecutorsubmitr   )r   r   r  executorr  s   f    r(   stream_syncCommunicate.stream_synco  sf     		 		 w2244OO-5yy{<
 5444s   :B	.A5+
B	5B	 	B	c                f   < V ^8  d   QhRS[ S[S[3,          RS[S[ S[S[3,          ,          RR/# r   r   )r'   r   s   "r(   r)   r     s@     
 
3:&
 !sEz!23
 
	
r*   c           	     
   \         P                  P                  4       ;_uu_ 4       pVP                  \        P
                  V P                  W4      4      pVP                  4        RRR4       R#   + '       g   i     R# ; i)z,Synchronous interface for async save method.N)r"  r#  r$  r%  r  runr
  result)r   r   r   r&  futures   &&&  r(   	save_syncCommunicate.save_sync  sU     2244__TYY{CF MMO	 5444s   A A11B	)r   r   r   r   r   r   r  )__name__
__module____qualname____firstlineno____doc__r   r   r   r   r   r   r
  r'  r.  __static_attributes____classdictcell__)r   s   @r(   r   r   A  s      #9

 9
 9
 9
 AS9
 6:9
  $9
 *,9
 *,9
 9
vC C&, ,(K KZ" "B) )0 2
 
 
r*   r   )>r4  r  concurrent.futuresr"  r   r   r|   rJ   
contextlibr   ior   r  r   typingr   r   r   r	   r
   r   r   r   xml.sax.saxutilsr   r   r   certifityping_extensionsr   	constantsr   r   r   r   r   r   data_classesr   drmr   
exceptionsr   r   r   r   r   r   create_default_contextwherer   r4   rE   rN   rX   r^   rg   rp   ry   r   r   r   rM   r*   r(   <module>rD     s   I    
   "  	 	 	 .   %  $   /%%W]]_=.0808<BJ2 "Q Qr*   