ggdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl m Z mZddlmZej"Z ddlZddlmZmZmZmZd Zd Ze j8Zd Zd gZe ed rd Zed gz Zej2dk(rd Zed gz ZefdZ!dZ"dZ#dZ$dZ%GddZ&er Gdde&Z'Gdde&Z(Gdde)Z*dEdZ+ej2dk7rdFdZ,ndFdZ,Gdde)Z-d Z.ej2dk(rGd!d"e)Z/d#Z0d$Z1d%Z2d&Z3d'Z4e5hd(Z6e7d)e6DZ8d*Z9d+Z:e9e:fZ;d,ed/Z?d0Z@dGd1eZLej2dk(r3d?ZQd@ZReje(eQdAZTdBZUeje'eTydCZQdDZReje(eQy#e$rej2dk(rdZYwxYw)I)ClientListenerPipewaitN)util)AuthenticationErrorBufferTooShort) reduction) WAIT_OBJECT_0WAIT_ABANDONED_0 WAIT_TIMEOUTINFINITEwin32i g4@AF_INETAF_UNIXAF_PIPEc0tj|zSNtime monotonic)timeouts A/opt/alt/python312/lib64/python3.12/multiprocessing/connection.py _init_timeoutr<s >> g %%c0tj|kDSrr)ts r_check_timeoutr?s >> a rc|dk(ry|dk(r)tjdtjS|dk(r;tjdt j t tfzdStd ) z? Return an arbitrary free address for the given family r) localhostrrz listener-)prefixdirrz\\.\pipe\pyc-%d-%d-zunrecognized family) tempfilemktempr get_temp_dirosgetpidnext _mmap_counter ValueErrorfamilys rarbitrary_addressr/Fsy 9 kt7H7H7JKK 9 &< " T--@A'BGIK K.//rctjdk7r|dk(rtd|ztjdk(r%|dk(rtt|std|zyyy)zD Checks if the family is valid for the current environment. rrzFamily %s is not recognized.rN)sysplatformr,hasattrsocketr-s r_validate_familyr5Tsc ||w6Y#67&@AA ||w6Y#6vv&;fDE E'$7rct|tk(ryt|tur|jdryt|tust j |ryt d|z)z] Return the types of the address This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' rz\\rrzaddress type of %r unrecognized)typetuplestr startswithris_abstract_socket_namespacer,)addresss r address_typer=`s\  G} g# '"4"4V"< g# !B!B7!K:WDEErceZdZdZddZdZdZdZdZdZ e dZ e d Z e d Z d Zd Zdd ZdZddZddZdZddZdZdZy)_ConnectionBaseNc|j}|dkr td|s |s td||_||_||_y)Nrzinvalid handlez6at least one of `readable` and `writable` must be True) __index__r,_handle _readable _writable)selfhandlereadablewritables r__init__z_ConnectionBase.__init__vsO!!# A:-. .HJ J !!rc>|j|jyyrrB_closerEs r__del__z_ConnectionBase.__del__s << # KKM $rc2|j tdy)Nhandle is closed)rBOSErrorrMs r _check_closedz_ConnectionBase._check_closeds << ,- - rc2|js tdy)Nzconnection is write-only)rCrQrMs r_check_readablez_ConnectionBase._check_readables~~45 5rc2|js tdy)Nzconnection is read-only)rDrQrMs r_check_writablez_ConnectionBase._check_writables~~34 4rct|jrd|_td|jtd)NFzbad message length)rDrCcloserQrMs r_bad_message_lengthz#_ConnectionBase._bad_message_lengths5 >>"DN*++ JJL*++rc|jduS)z True if the connection is closedNrBrMs rclosedz_ConnectionBase.closeds||t##rc|jS)z"True if the connection is readable)rCrMs rrGz_ConnectionBase.readable~~rc|jS)z"True if the connection is writable)rDrMs rrHz_ConnectionBase.writabler^rc:|j|jS)z+File descriptor or handle of the connection)rRrBrMs rfilenoz_ConnectionBase.filenos ||rcf|j |jd|_yy#d|_wxYw)zClose the connectionNrKrMs rrXz_ConnectionBase.closes1 << # $ # $ $ s' 0cv|j|jt|}|jdkDr|j d}|j }|dkr t d||kr t d|||z }n#|dkr t d||z|kDr t d|j||||zy) z,Send the bytes data from a bytes-like objectrBrzoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rRrV memoryviewitemsizecastnbytesr, _send_bytes)rEbufoffsetsizemns r send_bytesz_ConnectionBase.send_bytess   sO ::>s A HH A:12 2 v:56 6 <v:D AX/0 0 d]Q <= = 6&4-01rc|j|j|jtj |y)zSend a (picklable) objectN)rRrVri_ForkingPicklerdumpsrEobjs rsendz_ConnectionBase.sends3   ..s34rc|j|j||dkr td|j|}||j |j S)z7 Receive bytes data as a bytes object. rznegative maxlength)rRrTr, _recv_bytesrYgetvalue)rE maxlengthrjs r recv_bytesz_ConnectionBase.recv_bytessa    Y]12 2y) ;  $ $ &||~rc|j|jt|5}|j}|t |z}|dkr t d||kDr t d|j }|j}|||zkrt|j|jd|j|||z||z|z|cdddS#1swYyxYw)zq Receive bytes data into a writeable bytes-like object. Return the number of bytes read. rznegative offsetzoffset too largeN) rRrTrerflenr,rwtellr rxseekreadinto)rErjrkrmrfbytesizeresultrls rrecv_bytes_intoz_ConnectionBase.recv_bytes_intos   _zzH#a&(Hz !233(" !344%%'F;;=D&4-'$V__%677 KKN OOAf0%}9; <!__s B+C!!C*c|j|j|j}tj |j S)zReceive a (picklable) object)rRrTrwrqloads getbuffer)rErjs rrecvz_ConnectionBase.recvs?   $$S]]_55rcd|j|j|j|S)z/Whether there is any input available to be read)rRrT_pollrErs rpollz_ConnectionBase.polls)  zz'""rc|SrrMs r __enter__z_ConnectionBase.__enter__ rc$|jyrrXrEexc_type exc_valueexc_tbs r__exit__z_ConnectionBase.__exit__  r)TT)rNr)r)g)__name__ __module__ __qualname__rBrIrNrRrTrVrYpropertyr\rGrHrarXrorurzrrrrrrrrr?r?ssG ".65,$$ $2(5 26# rr?cPeZdZdZdZdZejfdZdZ d dZ dZ dZ y) PipeConnectionz Connection class based on a Windows named pipe. Overlapped I/O is used, so the handles must have been created with FILE_FLAG_OVERLAPPED. FNcd|j}||j||jyr)_send_ovcancelrB)rE _CloseHandleovs rrLzPipeConnection._closes%B~  &rc>|j tdtj|j|d\}}||_ |tj k(r1tj |jgdt}|tk(sJd|_|jd\}}|tjk(rttjd|dk(sJ|t!|k(sJy#|jxYw#d|_|jd\}}wxYw)Nz/concurrent send_bytes() calls are not supportedT overlappedFrPr)rr,_winapi WriteFilerBERROR_IO_PENDINGWaitForMultipleObjectseventrr rGetOverlappedResultERROR_OPERATION_ABORTEDrQerrnoEPIPEr|)rErjrerrwaitresnwrittens rrizPipeConnection._send_bytess }}( "566'' cdKGBDM ='222%<< E85G"m333 !% " 6 6t < #g555ekk+=>>!8O8s3x' ''   $ " 6 6t < #sAC))C<<C??Dc|jrd|_tjS|dn t|d} t j |j |d\}} |tjk(r1t j|jgdt}|tk(sJ|jd\}}|dk(r5tj}|j|j|S|tj k(r|j#||S t-d#|jxYw#|jd\}}|dk(r9tj}|j|j|ccYS|tj k(r|j#||ccYSwxYw#t$$r)}|j&tj(k(rt*d}~wwxYw)NFTrrz.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminrReadFilerBrrrrr rrwriterERROR_MORE_DATA_get_more_datarQwinerrorERROR_BROKEN_PIPEEOFError RuntimeError) rEmaxsizebsizerrrnreadfes rrwzPipeConnection._recv_bytes6s&&*/'zz|#&C4E%..t||U;?AGBD'":"::&-&D&D!# E8'=G#*m#;;#; &(%;%;D%A s!8 " AGGBLLN3#$H G$;$;;#'#6#6r7#CC<OP P! %'%;%;D%A s!8 " AGGBLLN3#$H G$;$;;#'#6#6r7#CC<zzW%>%>>& s\%F8AD"#A F81$F8"D55D88AF5 F8 'F52F84F55F88 G*$G%%G*c|js%tj|jddk7ryt t |g|S)NrT)rr PeekNamedPiperBboolrrs rrzPipeConnection._pollVs>''--dll;A>!CdVW-. .rc|j}tj}|j|t j |j d}|dkDsJ|!t||z|kDr|jt j|j |d\}}|jd\}}|dk(sJ||k(sJ|j|j|S)NrrTr) rrrrrrrBr|rYrr)rErrrjrleftrrbytess rrzPipeConnection._get_more_data\s,,.C A GGCL((6q9D!8O8"s3x$'@((*&&t||TdKGB006KFC!8O8T> !> GGBLLN #Hrr) rrr__doc__rrr CloseHandlerLrirwrrrrrrr s8 #&-&9&9 ' (4 Q@ / rrceZdZdZer(ej fdZejZ ejZ n'e jfdZe jZ e jZ e fdZe fdZdZd dZd Zy) Connectionzo Connection class based on an arbitrary file descriptor (Unix only), or a socket handle (Windows). c(||jyrr[rErLs rrLzConnection._closes 4<< rc(||jyrr[rs rrLzConnection._closexrrcbt|} ||j|}||z}|dk(ry||d}$Nr)r|rB)rErjr remainingrns r_sendzConnection._send}sAH dllC(A NIA~ab'C rctj}|j}|}|dkDrK|||}t|}|dk(r||k(rtt d|j |||z}|dkDrK|S)Nrzgot end of file during message)rrrBr|rrQr)rErlreadrjrFrchunkrns r_recvzConnection._recvs|jjl !m+EE AAv$"N!"BCC IIe  NI!m rct|}|dkDr`tjdd}tjd|}|j||j||j|ytjd|}|dkDr#|j||j|y|j||zy)Ni!i!Qi@)r|structpackr)rErjrn pre_headerheaders rrizConnection._send_bytess H z>T2.J[[q)F JJz " JJv  JJsO[[q)F5y 6" 3  6C<(rNc|jd}tjd|j\}|dk(r7|jd}tjd|j\}|||kDry|j|S)Nrrr)rrunpackrx)rErrjrls rrwzConnection._recv_bytessqjjm dCLLN3 2:**Q-CMM$ 7ED  4'>zz$rc2t|g|}t|Sr)rr)rErrs rrzConnection._polls $ !Awrr)rrrrr_multiprocessing closesocketrLru_writer_readr(rXrrrrrirwrrrrrrlso  0 < < !!&& %% " !% % ). rrcPeZdZdZd dZdZdZedZedZ dZ d Z y) rz Returns a listener object. This is a wrapper for a bound socket which is 'listening' for connections, or for a Windows named pipe. Nc|xs|xr t|xst}|xs t|}t||dk(rt |||_nt ||||_|t|ts td||_ y)Nrauthkey should be a byte string) r=default_familyr/r5 PipeListener _listenerSocketListener isinstancebytes TypeError_authkey)rEr<r.backlogauthkeys rrIzListener.__init__s#G= W(=#" 6.v6 Y )'7;DN+GVWEDN  z'5'A=> > rc|j td|jj}|j,t ||jt ||j|S)zz Accept a connection on the bound socket or named pipe of `self`. Returns a `Connection` object. zlistener is closed)rrQacceptrdeliver_challengeanswer_challenge)rEcs rrzListener.acceptsW >> !./ / NN ! ! # == $ a / Q .rcP|j}|d|_|jyy)zA Close the bound socket or named pipe of `self`. N)rrX)rElisteners rrXzListener.closes)>>  !DN NN  rc.|jjSr)r_addressrMs rr<zListener.addresss~~&&&rc.|jjSr)r_last_acceptedrMs r last_acceptedzListener.last_accepteds~~,,,rc|SrrrMs rrzListener.__enter__rrc$|jyrrrs rrzListener.__exit__rr)NNrN) rrrrrIrrXrr<rrrrrrrrsH  ''--rrc|xs t|}t||dk(r t|}n t|}|t |t s t d|t||t|||S)z= Returns a connection to the address of a `Listener` rr) r=r5 PipeClient SocketClientrrrrr)r<r.rrs rrrsq ,|G,FV  w   !:gu#=9::G$!W% HrcN|rotj\}}|jd|jdt|j }t|j }||fSt j \}}t|d}t|d}||fS)L Returns pair of connection objects at either end of a pipe TFrHrG)r4 socketpair setblockingrdetachr(pipe)duplexs1s2c1c2fd1fd2s rrrs &&(FB NN4 NN4 BIIK(BBIIK(B 2v wwyHCC%0BC%0B2v rc td}|r>tj}tjtjz}t t }}n(tj }tj}dt }}tj||tjztjztjtjztjzd||tjtj}tj||dtjtj tjtj}tj"|tjddtj$|d}|j'd\} } | dk(sJt)||} t)||} | | fS) r rrrNTrr r )r/rPIPE_ACCESS_DUPLEX GENERIC_READ GENERIC_WRITEBUFSIZEPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE PIPE_WAITNMPWAIT_WAIT_FOREVERNULL CreateFile OPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPiperr) rr<openmodeaccessobsizeibsizeh1h2r_rrrs rrr(si$I. 11H))G,A,AAF$gFF22H**FFF  $ $ X < <<  1 12  % %(E(E E     vvw;; LL   VQ g.C.C  ( (',, '' --tT --bTB //53axx B 0 B 02v rc$eZdZdZddZdZdZy)rzO Representation of a socket which is bound to an address and listening ctjtt||_ tjdk(r9|jj tj tjd|jjd|jj||jj||jj|_ ||_d|_|dk(rCt#j$|s.t#j&|tj(|fd|_yd|_y#t$r|jjwxYw)NposixrTrrargs exitpriority)r4getattr_socketr(name setsockopt SOL_SOCKET SO_REUSEADDRrbindlisten getsocknamerrQrX_familyrrr;Finalizeunlink_unlink)rEr<r.rs rrIzSocketListener.__init__Xs }}WVV%<=  ww'! ''(9(9(.(;(;Q@ LL $ $T * LL  g & LL   ( LL446DM " Y t'H'H'Q==biiwjqDL DL  LL    s B!?D "&D  NN=t}} Ml::(($--8qDJrc ~tjtjz}|r|tjz}tj|j |tj tjztjztjtttjtjSr) rrr r!rrr"r#r$PIPE_UNLIMITED_INSTANCESrr%r&)rErMflagss rrNzPipeListener._new_handles..1M1MME>>>** u))G,I,II!!"00'7,,gll  rch|jj|j|jjd} t j |d} t j |jgdt} |jd\}}|dk(sJt|S#|jt j|xYw#|jd\}}|dk(sJwxYw#t$r2}|jtjk7rYd}~t|Sd}~wwxYw)NrTrF)rOappendrNpoprr*rrrrrrrQr ERROR_NO_DATAr)rErFrresr1rrs rrzPipeListener.accepts    % %d&6&6&8 9''++A.F $--fF $!88 E85C 33D9FAs!8O8!&) )IIK''/33D9FAs!8O8 ::!6!667"&) )! s0C6&B++(CCC36 D1?D,,D1chtjd||D]}tj|y)Nz closing listener with address=%r)rrPrr)queuer<rFs rrQz$PipeListener._finalize_pipe_listeners) NN=w G##F+ rr)F) rrrrrIrNr staticmethodrQrrrrrs*    *.  ,  ,rrc .t} tj|dtj|tjtj zdtj tjtjtj } tj|tjddt!|S#t$rB}|jtjtjfvs t|rYd}~nd}~wwxYw )zU Return a connection object connected to the pipe given by `address` rN)rr WaitNamedPiper'rrr&r(r rQrERROR_SEM_TIMEOUTERROR_PIPE_BUSYrr)r#r)r<rhrs rrrs O %%gt4&&W11G4I4IIw||W%:%:00',, '' w,,dD a   ::g&?&?&-&=&=&??BPQRBSCT sBC D8D  D(s #CHALLENGE#s #WELCOME#s #FAILURE#>md5sha256sha384sha3_256sha3_384c#2K|]}t|ywr)r|).0r1s r rkFs7&6c!f&6smessagereturnct|tvrd|fS|jdrG|jddtdzx}dkDr(|d|}|t vr||dzd}|j d|fStd |) aReturns a digest name and the payload for a response hash. If a legacy protocol is detected based on the message length or contents the digest name returned will be empty to indicate legacy mode where MD5 and no digest prefix should be sent. r${}rrNasciizRunsupported message length, missing digest prefix, or unsupported digest: message=)r|_LEGACY_LENGTHSr:find_MAX_DIGEST_LEN_ALLOWED_DIGESTSdecoder )rncurlydigestpayloads r_get_digest_name_and_payloadr}Qs 7|& 7{4 ,,tQ(9: :a?5! % %eAgh'G==)72 2  /&-Z 1 22rcddl}t|d}|s" |j||djS|j|||j}d|j d|fzS#t$rd}YDwxYw)aCreate a MAC based on authkey and message The MAC algorithm defaults to HMAC-MD5, unless MD5 is not available or the message has a '{digest_name}' prefix. For legacy HMAC-MD5, the response is the raw MAC, otherwise the response is prefixed with '{digest_name}', e.g. b'{sha256}abcdefg...' Note: The MAC protects the entire message including the digest_name prefix. rNmd5sha256{%s}%srt)hmacr}newr{r,encode)rrnr digest_nameresponses r_create_responserks.w7:K  #88GWe4;;= =xx+6==?H  **73X> >> ##K  #s A.. A<;A<c dddl}t|\}}|xsd} |j|||j}t |t |k7r&t d|dt |dt ||j||s t d y#t$rt d|dwxYw) a`Verify MAC challenge If our message did not include a digest_name prefix, the client is allowed to select a stronger digest_name from _ALLOWED_DIGESTS. In case our message is prefixed, a client cannot downgrade to a weaker algorithm, because the MAC is calculated over the entire message including the '{digest_name}' prefix. rNrzresponse_digest=z unsupportedz expected z of length z got zdigest received was wrong)rr}rr{r,r r|compare_digest)rrnrrresponse_digest response_macexpecteds r_verify_challengers$@$J!O\%.OE88GWo>EEG 8}L))!O.k#h-I<()+, ,   x 6!"=>> 7 E!%5_$6l"CDDEs !BB/rct|ts#tdjt |t t kDsJdtjt }d|jd|fz}|jt|z|jd} t||||jty#t$r|jt wxYw)N Authkey must be bytes, not {0!s}zprotocol constraintrrt)rrr,formatr7MESSAGE_LENGTH_MD5ONLY_MESSAGE_LENGTHr(urandomrro _CHALLENGErzr_WELCOMEr _FAILURE) connectionrrrnrs rrrs gu % . 5 5d7m DF F 3 3J5JJ 3jj(G;--g6@@G*w./$$S)H('7H5 h' h' s ! C C$ct|ts#tdjt ||j d}|j tstd||ttd}t|tkrtdt|dt||}|j||j d}|tk7r tdy)Nrrz,Protocol error, expected challenge: message=zchallenge too short: z byteszdigest sent was rejected)rrr,rr7rzr:rr r|rrror)rrrnr{rs rrrs gu % . 5 5d7m DF F##C(G   j )!?wjAC Cc*o&'G 7|--!$9#g,v"NOO gw /F&!$$S)H8!"<==rceZdZdZdZdZy)ConnectionWrappercn||_||_||_dD]}t||}t |||y)N)rarXrrzro)_conn_dumps_loadsr8setattr)rEconnrrrattrrts rrIzConnectionWrapper.__init__s:   KD$%C D$ $Lrc\|j|}|jj|yr)rrro)rErtrGs rruzConnectionWrapper.sends" KK  a rcX|jj}|j|Sr)rrzrrFs rrzConnectionWrapper.recvs" JJ ! ! #{{1~rN)rrrrIrurrrrrrs%!rrcTtj|fddddjdS)Nrutf-8) xmlrpclibrrr)rts r _xml_dumpsrs& ??C64tQ 7 > >w GGrcXtj|jd\\}}|S)Nr)rrry)rGrtmethods r _xml_loadsrs$__QXXg%67NFSF JrceZdZdZy) XmlListenercbddlmatj |}t |t tSr) xmlrpc.clientclientrrrrrrrss rrzXmlListener.accepts")ood# j*==rN)rrrrrrrrrs>rrcJddlmatt |i|t t Sr)rrrrrrr)r6kwdss r XmlClientrs% VT2T2J KKrct|}g}|rtj|d|}|tk(r |St|cxkrtt |zkr nn |tz}nAt |cxkrt t |zkrn td|t z}n td|j||||dzd}d}|r|S)NFzShould not get hererr) listrrrr r|r rrV)handlesrLreadyrYs r_exhaustive_waitrs M00E7CCl" #> A(>>}$!SD+;c!f+DD##899''"#899 LL3 #a%& AG rcV |t}n|dkrd}nt|dzdz}t|}i g}t}t} |D]} t |d} t j |dd\}}|t jk(r!|j|| |j<d|rDtjdddk\r* |jd \} }|st!|d rd|_|j%|d}t+ j-|}|D]}|j/|D]e} |jd\} }|t j0k7s, |j}|j%||dk(sRt!|d s_d|_g |j3 fd |D|Dcgc] }||vs| c}S#t$r"} d| j}}|tvrYd} ~ d} ~ wwxYw#t$r} | j}Yd} ~ >d} ~ wwxYw#t&$r| |j)<YwxYw#t$r } | j}|tvrYd} ~ d} ~ wwxYw#|D]}|j/|D]} |jd\} }n+#t$r} | j}|tvrYd} ~ nd} ~ wwxYw|t j0k7sX |j}|j%||dk(s~t!|d sd|_wxYwcc}w) Wait till an object in object_list is ready/readable. Returns list of those objects in object_list which are ready/readable. Nrr^g?raTrs)rsFrc3(K|] }| ywrr)rjrbwaithandle_to_objs rrkzwait..SsI=a.q1=s)rintrsetr8rrrQr _ready_errorsrrVrr1getwindowsversionrr3raddAttributeErrorrArkeysrrupdate) object_listrov_list ready_objects ready_handlesorarrrr1rs @rrrs- ?G q[G'D.3./G;'   6 8 $$Q1F "")"2"268Q"EC g666r*67)"((3 #"7"7"9"1"="G1)+)?)?)F3$'716J+K7; 4%))!,"#=!@-->-C-C-EwOM 33D9FAs '999)"((3A!%%a(ax#1&:;37A0 I=II&=;a!}*<;==_#""& Cm3!4" $+1&'jj1-&978%akkm49N**C-/0 33D9FAs**C-/0'999)"((3A!%%a(ax#1&:;37A0">sI4 H%G:AI4 HAI4I L& L& G?G:4I4:G??I4 H" HI4H""I4%II4II4 I1I,,I14L#J'&L#' K 0K L# K L#&%L# L# L# PollSelectorct5}|D]"}|j|tj$|t j |z} |j |}|r(|Dcgc]\}}|jc}}cdddS|'t j z }|dkr |cdddSecc}}w#1swYyxYw)rNr) _WaitSelectorregister selectors EVENT_READrrselectfileobj)rrselectorrtdeadlinerkeyeventss rrrbs _"!!#y';';<#">>+g5 0=BCUMS&CKKUC_*"*T^^-="="Q;#(_D_s$AB8%B2;B8B81B88Cc |j}tj|tjtj5}ddlm}|j|}t||j|jffcdddS#1swYyxYw)Nr)resource_sharer) rar4fromfdr SOCK_STREAMr$r DupSocketrebuild_connectionrGrH)rrFrGrdss rreduce_connectionr~s` ]]66>>63E3E F! ) **1-B%DMM4=='IIG F Fs 6BB cX|j}t|j||Srrr)rrGrHsocks rrrs"yy{$++-8<rs 3 1**OO  !  ; 69N  H<<7N  H-&  0 F F&TTn ]]@MMh;v;| *<<7&&X)V)X&<<76,v6,p!>   r@B7&677 *O<2%2S%L24?8?2(5(*>%>*  H>(>L<<7(..0M0MNML>` y.)!.. !00 )6<<7J =Iz#45K :I~'=>F2Iz#45s# ||w GsH??II