JFIF$        dd7 

Viewing File: /usr/lib/python3.9/site-packages/acme/_internal/tests/__pycache__/challenges_test.cpython-39.pyc

a

}|�gJ�@s�dZddlZddlZddlmZddlmZddlZddl	m
Z
ddlZddlZddl
Z
ddlmZddlmZe�d�Zeje�d�d	�ZGd
d�dej�ZGdd
�d
ej�ZGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�dej�ZGdd�dej�Z Gdd�dej�Z!Gdd�dej�Z"Gd d!�d!ej�Z#e$d"k�r�e�%e�&ej'd#d�e(g��dS)$zTests for acme.challenges.�N)�mock)�JWKEC)�errors)�	test_util�cert.pem�rsa512_key.pem��keyc@seZdZdd�ZdS)�
ChallengeTestcCs<ddlm}ddlm}|ddi�}||�|j�ks8J�dS)Nr)�	Challenge��UnrecognizedChallenge�type�foo)�acme.challengesrr
�	from_json�jobj)�selfrr
�chall�r�H/usr/lib/python3.9/site-packages/acme/_internal/tests/challenges_test.py�test_from_json_unrecognizedsz)ChallengeTest.test_from_json_unrecognizedN)�__name__�
__module__�__qualname__rrrrrr
sr
c@s$eZdZdd�Zdd�Zdd�ZdS)�UnrecognizedChallengeTestcCs&ddlm}ddi|_||j�|_dS)Nrrrr)rr
rr�rr
rrr�setUps
zUnrecognizedChallengeTest.setUpcCs|j|j��ksJ�dS�N)rr�to_partial_json�rrrr�test_to_partial_json$sz.UnrecognizedChallengeTest.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS)Nrr)rr
rrrrrrr�test_from_json'sz(UnrecognizedChallengeTest.test_from_jsonN)rrrrr!r"rrrrrsrc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�%KeyAuthorizationChallengeResponseTestcCs dd�}t��|_||jj_dS)NcSs|dksJ�dS)N�tokenrr)�namerrr�_encode/sz<KeyAuthorizationChallengeResponseTest.setUp.<locals>._encode)rZMockr�encode�side_effect)rr&rrrr.s
z+KeyAuthorizationChallengeResponseTest.setUpcCs0ddlm}|dd�}|�|jt���s,J�dS)Nr��!KeyAuthorizationChallengeResponsez/foo.oKGqedy-b-acd5eoybm2f-NVFxvyOoET5CNy3xnv8WY��key_authorization�rr*�verifyr�KEY�
public_key�rr*�responserrr�test_verify_ok5s
�z4KeyAuthorizationChallengeResponseTest.test_verify_okcCs0ddlm}|dd�}|�|jt���r,J�dS)Nrr)z/bar.oKGqedy-b-acd5eoybm2f-NVFxvyOoET5CNy3xnv8WYr+r-r1rrr�test_verify_wrong_token;s
�z=KeyAuthorizationChallengeResponseTest.test_verify_wrong_tokencCs0ddlm}|dd�}|�|jt���r,J�dS)Nrr)zfoo.oKGqedy-b-acd5eoybm2f-NVFxvr+r-r1rrr�test_verify_wrong_thumbprintAs
�zBKeyAuthorizationChallengeResponseTest.test_verify_wrong_thumbprintcCs0ddlm}|dd�}|�|jt���r,J�dS)Nrr)z0.foo.oKGqedy-b-acd5eoybm2f-NVFxvyOoET5CNy3xnv8WYr+r-r1rrr�test_verify_wrong_formGs
�z<KeyAuthorizationChallengeResponseTest.test_verify_wrong_formN)rrrrr3r4r5r6rrrrr#,s
r#c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�DNS01ResponseTestcCsPddlm}|dd�|_dddd�|_ddlm}|d	d
�|_|j�t�|_dS)Nr��
DNS01Responserr+�	challenge�dns-01��resourcerZkeyAuthorization��DNS01�xxxxxxxxxxxxxxxx�r$)rr9�msg�jmsgr?rr2r/)rr9r?rrrrQs�zDNS01ResponseTest.setUpcCsi|j��ksJ�dSr�rBrr rrrr!^sz&DNS01ResponseTest.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrr8)rr9rBrrC�rr9rrrr"asz DNS01ResponseTest.test_from_jsoncCs ddlm}t|�|j��dSrE)rr9�hashrrCrFrrr�test_from_json_hashableesz)DNS01ResponseTest.test_from_json_hashablecCs8tj�t�d��}|��}|j�|jd|�}|r4J�dS�Nzrsa256_key.pem�local)	�jose�JWKRSA�loadr�load_vectorr0r2�
simple_verifyr)r�key2r0�verifiedrrr�test_simple_verify_failureisz,DNS01ResponseTest.test_simple_verify_failurecCs&t��}|j�|jd|�}|s"J�dS�NrJ)r/r0r2rOr)rr0rQrrr�test_simple_verify_successosz,DNS01ResponseTest.test_simple_verify_successN)	rrrrr!r"rHrRrTrrrrr7Os
r7c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�	DNS01TestcCs.ddlm}|t�d�d�|_ddd�|_dS)Nrr>�+evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ+PCt92wr+oArAr;�+evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA�rr$)rr?rK�decode_b64joserBrC�rr?rrrrws�
�zDNS01Test.setUpcCsd|j�d�ksJ�dS)Nz_acme-challenge.www.example.comzwww.example.com�rBZvalidation_domain_namer rrr�test_validation_domain_name�s
�z%DNS01Test.test_validation_domain_namecCsd|j�t�ksJ�dS)NZ+rAa7iIg4K2y63fvUhCfy8dP1Xl7wEhmQq0oChTcE3Zk)rB�
validationr/r rrr�test_validation�s
�zDNS01Test.test_validationcCs|j|j��ksJ�dSr�rCrBrr rrrr!�szDNS01Test.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrr>)rr?rBrrCrZrrrr"�szDNS01Test.test_from_jsoncCs ddlm}t|�|j��dSr`)rr?rGrrCrZrrrrH�sz!DNS01Test.test_from_json_hashableN)	rrrrr\r^r!r"rHrrrrrUus	rUc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	d�dd
��Z
e�	d�dd��Ze�	d�dd��Ze�	d�dd��Z
e�	d�dd��Ze�	d�dd��ZdS)�HTTP01ResponseTestcCsPddlm}|dd�|_dddd�|_ddlm}|d	d
�|_|j�t�|_dS)Nr��HTTP01Responserr+r:�http-01r<��HTTP01r@rA)rrcrBrCrfrr2r/)rrcrfrrrr�s�zHTTP01ResponseTest.setUpcCsi|j��ksJ�dSrrDr rrrr!�sz'HTTP01ResponseTest.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrrb)rrcrBrrC�rrcrrrr"�sz!HTTP01ResponseTest.test_from_jsoncCs ddlm}t|�|j��dSrg)rrcrGrrCrhrrrrH�sz*HTTP01ResponseTest.test_from_json_hashablecCs,tj�t�d��}|j�|jd|���dSrI�	rKrLrMrrNr2rOrr0�rrPrrr�(test_simple_verify_bad_key_authorization�sz;HTTP01ResponseTest.test_simple_verify_bad_key_authorizationzacme.challenges.requests.getcCsR|j�t�}tj|d�|_|j�|jdt���s4J�|j	|j�
d�dtjd�dS)N��textrJF�r.�timeout)rr]r/r�	MagicMock�return_valuer2rOr0�assert_called_once_with�uri�ANY)r�mock_getr]rrr�"test_simple_verify_good_validation�s��z5HTTP01ResponseTest.test_simple_verify_good_validationcCs,tjdd�|_|j�|jdt���r(J�dS)N�!rlrJ)rrprqr2rOrr/r0�rrurrr�!test_simple_verify_bad_validation�s�z4HTTP01ResponseTest.test_simple_verify_bad_validationcCs`ddlm}tj|j�t�|jd�|_|j	�
|jdt���sBJ�|j|j�
d�dtjd�dS)NrrbrlrJFrn)rrcrrprr]r/ZWHITESPACE_CUTSETrqr2rOr0rrrsrt)rrurcrrr�(test_simple_verify_whitespace_validation�s
����z;HTTP01ResponseTest.test_simple_verify_whitespace_validationcCs(tjj|_|j�|jdt���r$J�dSrS)	�requests�
exceptionsZRequestExceptionr(r2rOrr/r0rxrrr�#test_simple_verify_connection_error�s
�z6HTTP01ResponseTest.test_simple_verify_connection_errorcCs@|jj|jdt��dd�dt�|jddd�jks<J�dS)NrJi�)�domainZaccount_public_key�portz
local:8080r�)	r2rOrr/r0�urllib_parse�urlparseZ
mock_calls�netlocrxrrr�test_simple_verify_port�s��z*HTTP01ResponseTest.test_simple_verify_portcCsl|j�|jdt���|j|j�d�ddd�|��|jj|jdt��dd�|j|j�d�ddd�dS)NrJF�rni�)ro)r2rOrr/r0rrrsZ
reset_mockrxrrr�test_simple_verify_timeout�s��z-HTTP01ResponseTest.test_simple_verify_timeoutN)rrrrr!r"rHrkr�patchrvryrzr}r�r�rrrrra�s"






rac@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�
HTTP01TestcCs.ddlm}|t�d�d�|_ddd�|_dS)NrrerVrArdrWrX)rrfrKrYrBrC�rrfrrrr�s���zHTTP01Test.setUpcCs|jjdksJ�dS)NzG/.well-known/acme-challenge/evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA)rB�pathr rrr�	test_path�szHTTP01Test.test_pathcCsd|j�d�ksJ�dS)NzYhttp://example.com/.well-known/acme-challenge/evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA�example.com)rBrsr rrr�test_uri�s
�zHTTP01Test.test_uricCs|j|j��ksJ�dSrr_r rrrr!�szHTTP01Test.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrre)rrfrBrrCr�rrrr"�szHTTP01Test.test_from_jsoncCs ddlm}t|�|j��dSr�)rrfrGrrCr�rrrrHsz"HTTP01Test.test_from_json_hashablecCs$|jjsJ�|jjdd�jr J�dS)Ns..rA)rBZ
good_token�updater rrr�test_good_tokenszHTTP01Test.test_good_tokenN)
rrrrr�r�r!r"rHr�rrrrr��s
r�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zej
ddd�dd��Ze�
d�e�
d�dd���Ze�
d�dd��ZdS) �TLSALPN01ResponseTestcCsNddlm}|t�d�d�|_d|_d|_|j�t�|_dd|jj	d	�|_
dS)
Nr��	TLSALPN01s a82d5ff8ef740d12881f6d3c2277ab2erAr�zexample2.comr:�tls-alpn-01r<)rr�rK�	b64decoderr~�domain2r2r/r,rC�rr�rrrrs��zTLSALPN01ResponseTest.setUpcCsi|j��ksJ�dSr)r2rr rrrr!sz*TLSALPN01ResponseTest.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nr)�TLSALPN01Response)rr�r2rrC�rr�rrrr"sz$TLSALPN01ResponseTest.test_from_jsoncCs ddlm}t|�|j��dSr�)rr�rGrrCr�rrrrH!sz-TLSALPN01ResponseTest.test_from_json_hashablecCsBt�d�}|j�|j|�\}}||ks*J�|j�|j|�s>J�dS�Nr)r�load_pyopenssl_private_keyr2�gen_certr~�verify_cert�rZkey1�certrPrrr�test_gen_verify_cert%s
z*TLSALPN01ResponseTest.test_gen_verify_certcCs<|j�|j�\}}t|tjj�s$J�|j�|j|�s8J�dSr)r2r�r~�
isinstance�OpenSSLZcryptoZPKeyr�)rr�r	rrr�test_gen_verify_cert_gen_key+sz2TLSALPN01ResponseTest.test_gen_verify_cert_gen_keycCs|j�|jt�d��rJ�dS)Nr)r2r�r~rZ	load_certr rrr�test_verify_bad_cert0s
�z*TLSALPN01ResponseTest.test_verify_bad_certcCsBt�d�}|j�|j|�\}}||ks*J�|j�|j|�r>J�dSr�)rr�r2r�r~r�r�r�rrr�test_verify_bad_domain4s
z,TLSALPN01ResponseTest.test_verify_bad_domaincCs,tj�t�d��}|j�|jd|���dSrIrirjrrrrk:sz>TLSALPN01ResponseTest.test_simple_verify_bad_key_authorizationz-acme.challenges.TLSALPN01Response.verify_certT)ZautospeccCsPtjj|_tjj|jj|j|jt�	�tjj
d�ks6J�|�|j|jtjj
�dS)N)r�)r�sentinelZverificationrqr2rOrr~r/r0r�rr)rZmock_verify_certrrr�test_simple_verify>s
��z(TLSALPN01ResponseTest.test_simple_verifyz$acme.challenges.socket.gethostbynamez%acme.challenges.crypto_util.probe_snicCs^d|_|j�d�|�d�|jd|jjddgd�|jjddd�|jd	tjddgd�dS)
Nz	127.0.0.1zfoo.coms	127.0.0.1sfoo.coms
acme-tls/1)�hostrr%Zalpn_protocolsz8.8.8.8)r�s8.8.8.8)rqr2Z
probe_certrrZPORTZassert_called_withrrt)rZmock_probe_sniZmock_gethostbynamerrr�test_probe_certGs

��z%TLSALPN01ResponseTest.test_probe_certz,acme.challenges.TLSALPN01Response.probe_certcCs(tj|_|j�|j|jt���r$J�dSr)	r�Errorr(r2rOrr~r/r0)rZmock_probe_certrrr�'test_simple_verify_false_on_probe_errorVs�z=TLSALPN01ResponseTest.test_simple_verify_false_on_probe_errorN)rrrrr!r"rHr�r�r�r�rkrr�r�r�r�rrrrr�
s 

r�c@sFeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	d�dd
��Z
dS)�
TLSALPN01TestcCs.ddlm}|t�d�d�|_ddd�|_dS)Nrr�Z a82d5ff8ef740d12881f6d3c2277ab2erAr�rX)rr�rKr�rBrCr�rrrr_s��zTLSALPN01Test.setUpcCs|j|j��ksJ�dSrr_r rrrr!hsz"TLSALPN01Test.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrr�)rr�rBrrCr�rrrr"kszTLSALPN01Test.test_from_jsoncCs ddlm}t|�|j��dSr�)rr�rGrrCr�rrrrHosz%TLSALPN01Test.test_from_json_hashablecCsXddlm}t�d�|jd<t�tj��|�|j�Wd�n1sJ0YdS)Nrr�sabcdr$)	rr�rKZencode_b64joserC�pytestZraisesZDeserializationErrorrr�rrr�#test_from_json_invalid_token_lengthssz1TLSALPN01Test.test_from_json_invalid_token_lengthz*acme.challenges.TLSALPN01Response.gen_certcCsBd|_d|jjttjjtjjd�ks(J�|jtjjtjjd�dS)N)r�r	)�cert_keyr~)r	r~)	rqrBr]r/rr�r�r~rr)rZ
mock_gen_certrrrr^ys�
�zTLSALPN01Test.test_validationN)rrrrr!r"rHr�rr�r^rrrrr�]s	r�c@sdeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dS)�DNSTestcCs.ddlm}|t�d�d�|_ddd�|_dS)Nr��DNS�+evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oArA�dnsrWrX)rr�rKr�rBrC�rr�rrrr�s�
�z
DNSTest.setUpcCs|j|j��ksJ�dSrr_r rrrr!�szDNSTest.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrr�)rr�rBrrCr�rrrr"�szDNSTest.test_from_jsoncCs ddlm}t|�|j��dSr�)rr�rGrrCr�rrrrH�szDNSTest.test_from_json_hashablec	Cs�tt�d�d�}ttjf|tjffD]X\}}|j||d��2|j�	|jj
||d�|���s^J�Wd�q$1sr0Yq$dS)N�ec_secp384r1_key.pemr)r	�alg�r�)rr�load_ecdsa_private_keyr/rK�RS256�ES384ZsubTestrB�check_validation�gen_validationr0)r�ec_key_secp384r1r	r�rrr�test_gen_check_validation�s�z!DNSTest.test_gen_check_validationcCs4tj�t�d��}|j�|j�t�|�	��r0J�dS)Nzrsa1024_key.pem)
rKrLrMrrNrBr�r�r/r0rjrrr�#test_gen_check_validation_wrong_key�s�z+DNSTest.test_gen_check_validation_wrong_keycCs6tdd�dD��}|D]}|j�|t���rJ�qdS)Ncss"|]}tjj|tjtd�VqdS)��payloadr�r	N)rK�JWS�signr�r/)�.0r�rrr�	<genexpr>�s�z>DNSTest.test_check_validation_wrong_payload.<locals>.<genexpr>)��{})�tuplerBr�r/r0)rZvalidationsr]rrr�#test_check_validation_wrong_payload�s��z+DNSTest.test_check_validation_wrong_payloadcCsBtjj|jjdd����d�tjtd�}|j�	|t�
��r>J�dS)NsxxxxxxxxxxxxxxxxxxxxrAzutf-8r�)rKr�r�rBr��
json_dumpsr'r�r/r�r0)rZbad_validationrrr�"test_check_validation_wrong_fields�s�
��z*DNSTest.test_check_validation_wrong_fieldscCspt�d��&}tjj|_|j�t�}Wd�n1s60Yddlm	}t
||�sZJ�|jtjjkslJ�dS)Nz"acme.challenges.DNS.gen_validationr��DNSResponse)rr�r�r]rqrBZgen_responser/rr�r�)rZmock_genr2r�rrr�test_gen_response�s
*zDNSTest.test_gen_responsecCsd|j�d�ksJ�dS)Nz_acme-challenge.le.wtfzle.wtfr[r rrrr\�sz#DNSTest.test_validation_domain_namecCs<tt�d�d�}|j�|jj|tjd�|���dus8J�dS)Nr�rr�T)	rrr�rBr�r�rKr�r0)rr�rrr�!test_validation_domain_name_ecdsa�s��z)DNSTest.test_validation_domain_name_ecdsaN)rrrrr!r"rHr�r�r�r�r�r\r�rrrrr��s		r�c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�DNSResponseTestcCs�ddlm}|t�d�d�|_tjj|jjdd���t	tj
d�|_ddlm}||jd	�|_
d
|ji|_dd|j��d
�|_dS)Nrr�r�rAT)Z	sort_keys)r�r	r�r�)r]r]r:r�)r=rr])rr�rKr�rr�r�r�r'r/r�r]r�rB�jmsg_toZto_json�	jmsg_from)rr�r�rrrr�s �
���zDNSResponseTest.setUpcCs|j|j��ksJ�dSr)r�rBrr rrrr!�sz$DNSResponseTest.test_to_partial_jsoncCs&ddlm}|j|�|j�ks"J�dS�Nrr�)rr�rBrr��rr�rrrr"�szDNSResponseTest.test_from_jsoncCs ddlm}t|�|j��dSr�)rr�rGrr�r�rrrrH�sz'DNSResponseTest.test_from_json_hashablecCs|j�|jt���sJ�dSr)rBr�rr/r0r rrr�test_check_validation�sz%DNSResponseTest.test_check_validationN)rrrrr!r"rHr�rrrrr��s
r�c@seZdZdZdd�ZdS)�JWSPayloadRFC8555CompliantzFTest for RFC8555 compliance of JWS generated from resources/challengescCs2ddlm}|�}|jdd���}|dks.J�dS)Nrrb�)�indentr�)rrcr�r')rrcZchallenge_bodyrrrr�test_challenge_payload�sz1JWSPayloadRFC8555Compliant.test_challenge_payloadN)rrr�__doc__r�rrrrr��sr��__main__r�))r��sysZunittestr�urllib.parse�parser�ZjosepyrKZ
josepy.jwkrr�r�r{ZacmerZacme._internal.testsrZload_comparable_certZCERTrLZload_rsa_private_keyr/ZTestCaser
rr#r7rUrar�r�r�r�r�r�r�exit�main�argv�__file__rrrr�<module>s6
	#&Q%S%D$

Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg