§
    Ìtºfx0  ã                  óÀ  — d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
Z
ddlmZmZmZmZmZmZmZ 	 ddlZn# e$ r dZY nw xY w e
j        d¬¦  «         G d	„ d
¦  «        ¦   «         Zd:d„Zd;d„Zd<d„Zd=d„Z e
j        d¬¦  «         G d„ d¦  «        ¦   «         Z e
j        d¬¦  «         G d „ d!¦  «        ¦   «         Z e
j        d¬¦  «         G d"„ d#¦  «        ¦   «         Z e
j        d¬¦  «         G d$„ d%¦  «        ¦   «         Zeeeeef         Z	 e	 G d&„ d'e¦  «        ¦   «         Z  e
j        d(d¬)¦  «         G d*„ d+¦  «        ¦   «         Z! e
j        d¬¦  «         G d,„ d-¦  «        ¦   «         Z" e
j        d(d¬)¦  «         G d.„ d/¦  «        ¦   «         Z# e
j        d(d¬)¦  «         G d0„ d1¦  «        ¦   «         Z$d>d5„Z%d?d7„Z&e' (                    d8d9¦  «        Z)dS )@z
Common verification code.
é    )ÚannotationsN)ÚProtocolÚSequenceÚUnionÚruntime_checkableé   )ÚCertificateErrorÚDNSMismatchÚIPAddressMismatchÚMismatchÚSRVMismatchÚURIMismatchÚVerificationErrorT)Úslotsc                  ód   — e Zd ZU dZ ej        ¦   «         Zded<    ej        ¦   «         Zded<   dS )ÚServiceMatchz<
    A match of a service id and a certificate pattern.
    Ú	ServiceIDÚ
service_idÚCertificatePatternÚcert_patternN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚattrÚibr   Ú__annotations__r   © ó    úV/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/service_identity/hazmat.pyr   r      sP   € € € € € € ðð ð $˜DœG™IœI€JÐ%Ð%Ð%Ñ%Ø'. t¤w¡y¤y€LÐ0Ð0Ð0Ñ0Ð0Ð0r   r   Úcert_patternsúSequence[CertificatePattern]Úobligatory_idsúSequence[ServiceID]Úoptional_idsÚreturnúlist[ServiceMatch]c                óœ  — | st          d¦  «        ‚g }t          | |¦  «        t          | |¦  «        z   }d„ |D ¦   «         }|D ]/}||vr)|                     |                     |¬¦  «        ¦  «         Œ0|D ]D}||vr>t	          | |j        ¦  «        r)|                     |                     |¬¦  «        ¦  «         ŒE|rt          |¬¦  «        ‚|S )zä
    Verify whether *cert_patterns* are valid for *obligatory_ids* and
    *optional_ids*.

    *obligatory_ids* must be both present and match.  *optional_ids* must match
    if a pattern of the respective type is present.
    z3Certificate does not contain any `subjectAltName`s.c                ó   — g | ]	}|j         ‘Œ
S r   )r   )Ú.0Úmatchs     r    ú
<listcomp>z+verify_service_identity.<locals>.<listcomp>?   s   € Ð9Ð9Ð9¨�5Ô#Ð9Ð9Ð9r   )Úmismatched_id)Úerrors)r	   Ú_find_matchesÚappendÚerror_on_mismatchÚ_contains_instance_ofÚpattern_classr   )r!   r#   r%   r.   ÚmatchesÚmatched_idsÚis          r    Úverify_service_identityr7   )   s  € ð ð 
ÝØAñ
ô 
ð 	
ð €FÝ˜M¨>Ñ:Ô:½]Ø�|ñ>ô >ñ €Gð :Ð9°Ð9Ñ9Ô9€KØð @ð @ˆØ�KÐÐØ�MŠM˜!×-Ò-¸AÐ-Ñ>Ô>Ñ?Ô?Ð?øàð @ð @ˆð
 �KÐÐÕ$9Ø˜1œ?ñ%
ô %
Ðð �MŠM˜!×-Ò-¸AÐ-Ñ>Ô>Ñ?Ô?Ð?øàð /Ý vÐ.Ñ.Ô.Ð.à€Nr   Úservice_idsc                ó�   — g }|D ]@}| D ];}|                      |¦  «        r$|                     t          ||¬¦  «        ¦  «         Œ<ŒA|S )z„
    Search for matching certificate patterns and service_ids.

    Args:
        service_ids: List of service IDs like DNS_ID.
    )r   r   )Úverifyr0   r   )r!   r8   r4   ÚsidÚcids        r    r/   r/   T   sk   € ð €GØð Oð OˆØ ð 	Oð 	OˆCØ�zŠz˜#‰Œð OØ—’�|¸ÈÐMÑMÔMÑNÔNÐNøð	Oð €Nr   ÚseqúSequence[object]ÚclÚtypeÚboolc                ó:   ‡— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S ©N)Ú
isinstance)r*   Úer?   s     €r    ú	<genexpr>z(_contains_instance_of.<locals>.<genexpr>g   s-   øè è € Ð.Ð. Q�z˜!˜RÑ Ô Ð.Ð.Ð.Ð.Ð.Ð.r   )Úany)r=   r?   s    `r    r2   r2   f   s&   ø€ ÝÐ.Ð.Ð.Ð.¨#Ð.Ñ.Ô.Ñ.Ô.Ð.r   Úpatternústr | bytesc                ó:  — t          | t          ¦  «        r(	 |                      d¦  «        } n# t          $ r Y dS w xY w	 t	          | ¦  «         dS # t
          $ r Y nw xY w	 t          j        |                      dd¦  «        ¦  «         n# t
          $ r Y dS w xY wdS )zÆ
    Check whether *pattern* could be/match an IP address.

    Args:
        pattern: A pattern for a host name.

    Returns:
        `True` if *pattern* could be an IP address, else `False`.
    ÚasciiFTÚ*Ú1)	rE   ÚbytesÚdecodeÚUnicodeErrorÚintÚ
ValueErrorÚ	ipaddressÚ
ip_addressÚreplace©rI   s    r    Ú_is_ip_addressrX   j   sÕ   € õ �'�5Ñ!Ô!ð ð	Ø—n’n WÑ-Ô-ˆGˆGøÝð 	ð 	ð 	Ø�5�5ð	øøøðÝˆG‰ŒˆØˆtøÝð ð ð ØˆðøøøðÝÔ˜WŸ_š_¨S°#Ñ6Ô6Ñ7Ô7Ð7Ð7øÝð ð ð Øˆuˆuðøøøð ˆ4s/   —- ­
;º;¿A Á
AÁAÁ!(B
 Â

BÂBc                  ót   — e Zd ZU dZ ej        ¦   «         Zded<    ej	        d¦  «        Z
edd„¦   «         ZdS )	Ú
DNSPatternz7
    A DNS pattern as extracted from certificates.
    rO   rI   ó   ^[a-z0-9\-_.]+$r&   c                ó<  — t          |t          ¦  «        st          d¦  «        ‚|                     ¦   «         }|dk    st	          |¦  «        sd|v rt          d|›d�¦  «        ‚|                     t          ¦  «        }d|v rt          |¦  «          | |¬¦  «        S )Nz'The DNS pattern must be a bytes string.r   ó    zInvalid DNS pattern ú.ó   *rW   )	rE   rO   Ú	TypeErrorÚstriprX   r	   Ú	translateÚ_TRANS_TO_LOWERÚ_validate_pattern)ÚclsrI   s     r    Ú
from_byteszDNSPattern.from_bytes“   s§   € å˜'¥5Ñ)Ô)ð 	GÝÐEÑFÔFÐFà—-’-‘/”/ˆà�cŠ>ˆ>�^¨GÑ4Ô4ˆ>¸ÀÐ8HÐ8HÝ"Ð#F¸'Ð#FÐ#FÐ#FÑGÔGÐGà×#Ò#¥OÑ4Ô4ˆØ�7ˆ?ˆ?Ý˜gÑ&Ô&Ð&àˆs˜7Ð#Ñ#Ô#Ð#r   N)rI   rO   r&   rZ   )r   r   r   r   r   r   rI   r   ÚreÚcompileÚ_RE_LEGAL_CHARSÚclassmethodrf   r   r   r    rZ   rZ   ˆ   sk   € € € € € € ðð ð
 �T”W‘Y”Y€GÐÐÐÑà �b”jÐ!4Ñ5Ô5€Oàð$ð $ð $ñ „[ð$ð $ð $r   rZ   c                  óT   — e Zd ZU dZ ej        ¦   «         Zded<   ed	d„¦   «         Z	dS )
ÚIPAddressPatternz?
    An IP address pattern as extracted from certificates.
    ú-ipaddress.IPv4Address | ipaddress.IPv6AddressrI   ÚbsrO   r&   c                ó„   — 	  | t          j        |¦  «        ¬¦  «        S # t          $ r t          d|›d�¦  «        d ‚w xY w)NrW   zInvalid IP address pattern r^   )rT   rU   rS   r	   )re   rn   s     r    rf   zIPAddressPattern.from_bytes­   sc   € ð	Ø�3�yÔ3°BÑ7Ô7Ð8Ñ8Ô8Ð8øÝð 	ð 	ð 	Ý"Ø5¨bÐ5Ð5Ð5ñô àðð	øøøs   ‚   ?N)rn   rO   r&   rl   )
r   r   r   r   r   r   rI   r   rj   rf   r   r   r    rl   rl   ¤   sZ   € € € € € € ðð ð
 >E¸T¼W¹Y¼Y€GÐFÐFÐFÑFàðð ð ñ „[ðð ð r   rl   c                  ó|   — e Zd ZU dZ ej        ¦   «         Zded<    ej        ¦   «         Zded<   e	d
d„¦   «         Z
d	S )Ú
URIPatternz8
    An URI pattern as extracted from certificates.
    rO   Úprotocol_patternrZ   Údns_patternrI   r&   c                óp  — t          |t          ¦  «        st          d¦  «        ‚|                     ¦   «                              t
          ¦  «        }d|vsd|v st          |¦  «        rt          d|›d�¦  «        ‚|                     d¦  «        \  }} | |t           
                    |¦  «        ¬¦  «        S )Nz'The URI pattern must be a bytes string.ó   :r_   zInvalid URI pattern r^   )rr   rs   ©rE   rO   r`   ra   rb   rc   rX   r	   ÚsplitrZ   rf   )re   rI   rr   Úhostnames       r    rf   zURIPattern.from_bytesÂ   s¼   € å˜'¥5Ñ)Ô)ð 	GÝÐEÑFÔFÐFà—-’-‘/”/×+Ò+­OÑ<Ô<ˆà�wÐÐ $¨' / /µ^ÀGÑ5LÔ5L /Ý"Ð#F¸'Ð#FÐ#FÐ#FÑGÔGÐGà%,§]¢]°4Ñ%8Ô%8Ñ"Ð˜(àˆsØ-Ý"×-Ò-¨hÑ7Ô7ð
ñ 
ô 
ð 	
r   N)rI   rO   r&   rq   )r   r   r   r   r   r   rr   r   rs   rj   rf   r   r   r    rq   rq   ·   ss   € € € € € € ðð ð
 &˜dœg™iœiÐÐ'Ð'Ð'Ñ'à%˜dœg™iœi€KÐ'Ð'Ð'Ñ'àð
ð 
ð 
ñ „[ð
ð 
ð 
r   rq   c                  ó|   — e Zd ZU dZ ej        ¦   «         Zded<    ej        ¦   «         Zded<   e	d
d„¦   «         Z
d	S )Ú
SRVPatternz8
    An SRV pattern as extracted from certificates.
    rO   Úname_patternrZ   rs   rI   r&   c                óš  — t          |t          ¦  «        st          d¦  «        ‚|                     ¦   «                              t
          ¦  «        }|d         dk    sd|vsd|v st          |¦  «        rt          d|›d�¦  «        ‚|                     dd¦  «        \  }} | |dd …         t           
                    |¦  «        ¬	¦  «        S )
Nz'The SRV pattern must be a bytes string.r   é_   ó   .r_   zInvalid SRV pattern r^   r   )r{   rs   rv   )re   rI   Únamerx   s       r    rf   zSRVPattern.from_bytesß   sÛ   € å˜'¥5Ñ)Ô)ð 	GÝÐEÑFÔFÐFà—-’-‘/”/×+Ò+­OÑ<Ô<ˆð �AŒJ˜'Ò!Ð!Ø˜7Ð"Ð"Ø�wˆˆÝ˜gÑ&Ô&ð õ #Ð#F¸'Ð#FÐ#FÐ#FÑGÔGÐGà Ÿš t¨QÑ/Ô/‰ˆˆhØˆsØ˜a˜b˜bœ­z×/DÒ/DÀXÑ/NÔ/Nð
ñ 
ô 
ð 	
r   N)rI   rO   r&   rz   )r   r   r   r   r   r   r{   r   rs   rj   rf   r   r   r    rz   rz   Ô   sr   € € € € € € ðð ð
 "˜$œ'™)œ)€LÐ#Ð#Ð#Ñ#à%˜dœg™iœi€KÐ'Ð'Ð'Ñ'àð
ð 
ð 
ñ „[ð
ð 
ð 
r   rz   c                  óF   — e Zd Zedd„¦   «         Zedd„¦   «         Zdd	„Zd
S )r   r&   útype[CertificatePattern]c                ó   — d S rD   r   ©Úselfs    r    r3   zServiceID.pattern_classÿ   ó   € àˆr   útype[Mismatch]c                ó   — d S rD   r   rƒ   s    r    r1   zServiceID.error_on_mismatch  r…   r   rI   r   rA   c                ó   — d S rD   r   ©r„   rI   s     r    r:   zServiceID.verify  s   € Øˆr   N)r&   r�   )r&   r†   ©rI   r   r&   rA   )r   r   r   Úpropertyr3   r1   r:   r   r   r    r   r   ý   sf   € € € € € àðð ð ñ „Xðð ðð ð ñ „Xððð ð ð ð ð r   r   F)Úinitr   c                  ót   — e Zd ZU dZ ej        ¦   «         Zded<    ej	        d¦  «        Z
eZeZdd„Zdd„ZdS )ÚDNS_IDz)
    A DNS service ID, aka hostname.
    rO   rx   r[   Ústrc                ó  — t          |t          ¦  «        st          d¦  «        ‚|                     ¦   «         }|rt	          |¦  «        rt          d¦  «        ‚t          d„ |D ¦   «         ¦  «        r+t          rt          j        |¦  «        }n$t          d¦  «        ‚|                     d¦  «        }| 
                    t          ¦  «        | _        | j                             | j        ¦  «        €t          d¦  «        ‚d S )NzDNS-ID must be a text string.zInvalid DNS-ID.c              3  ó<   K  — | ]}t          |¦  «        d k    V — ŒdS )é   N)Úord)r*   Úcs     r    rG   z"DNS_ID.__init__.<locals>.<genexpr>   s,   è è € Ð.Ð. �s�1‰vŒv˜Š|Ð.Ð.Ð.Ð.Ð.Ð.r   z+idna library is required for non-ASCII IDs.rL   )rE   r�   r`   ra   rX   rS   rH   ÚidnaÚencodeÚImportErrorrb   rc   rx   ri   r+   )r„   rx   Úascii_ids      r    Ú__init__zDNS_ID.__init__  sý   € Ý˜(¥CÑ(Ô(ð 	=ÝÐ;Ñ<Ô<Ð<à—>’>Ñ#Ô#ˆØð 	0�>¨(Ñ3Ô3ð 	0ÝÐ.Ñ/Ô/Ð/åÐ.Ð. XÐ.Ñ.Ô.Ñ.Ô.ð 	0Ýð Ýœ; xÑ0Ô0��å!ØAñô ð ð  —’ wÑ/Ô/ˆHà ×*Ò*­?Ñ;Ô;ˆŒØÔ×%Ò% d¤mÑ4Ô4Ð<ÝÐ.Ñ/Ô/Ð/ð =Ð<r   rI   r   r&   rA   c                ód   — t          || j        ¦  «        rt          |j        | j        ¦  «        S dS )zC
        https://tools.ietf.org/search/rfc6125#section-6.4
        F)rE   r3   Ú_hostname_matchesrI   rx   r‰   s     r    r:   zDNS_ID.verify.  s3   € õ �g˜tÔ1Ñ2Ô2ð 	EÝ$ W¤_°d´mÑDÔDÐDàˆur   N)rx   r�   rŠ   )r   r   r   r   r   r   rx   r   rg   rh   ri   rZ   r3   r
   r1   r™   r:   r   r   r    rŽ   rŽ     s‚   € € € € € € ðð ð �d”g‘i”i€HÐÐÐÑð !�b”jÐ!4Ñ5Ô5€OØ€MØ#Ðð0ð 0ð 0ð 0ð,ð ð ð ð ð r   rŽ   c                  óZ   — e Zd ZU dZ ej        ej        ¬¦  «        Zde	d<   e
ZeZdd	„Zd
S )ÚIPAddress_IDz#
    An IP address service ID.
    )Ú	converterrm   ÚiprI   r   r&   rA   c                óP   — t          || j        ¦  «        r| j        |j        k    S dS )zC
        https://tools.ietf.org/search/rfc2818#section-3.1
        F)rE   r3   rŸ   rI   r‰   s     r    r:   zIPAddress_ID.verifyE  s-   € õ �g˜tÔ1Ñ2Ô2ð 	.Ø”7˜gœoÒ-Ð-àˆur   NrŠ   )r   r   r   r   r   r   rT   rU   rŸ   r   rl   r3   r   r1   r:   r   r   r    r�   r�   8  sv   € € € € € € ðð ð 9@¸¼ØÔ&ð9ñ 9ô 9€Bð ð ð ñ ð %€MØ)Ððð ð ð ð ð r   r�   c                  ó|   — e Zd ZU dZ ej        ¦   «         Zded<    ej        ¦   «         Zded<   e	Z
eZdd„Zdd„ZdS )ÚURI_IDz
    An URI service ID.
    rO   ÚprotocolrŽ   Údns_idÚurir�   c                óœ  — t          |t          ¦  «        st          d¦  «        ‚|                     ¦   «         }d|vst	          |¦  «        rt          d¦  «        ‚|                     d¦  «        \  }}|                     d¦  «                             t          ¦  «        | _
        t          |                     d¦  «        ¦  «        | _        d S )NzURI-ID must be a text string.ú:zInvalid URI-ID.rL   ú/)rE   r�   r`   ra   rX   rS   rw   r–   rb   rc   r£   rŽ   r¤   )r„   r¥   Úprotrx   s       r    r™   zURI_ID.__init__[  s§   € Ý˜#�sÑ#Ô#ð 	=ÝÐ;Ñ<Ô<Ð<à�iŠi‰kŒkˆØ�cˆ>ˆ>�^¨CÑ0Ô0ˆ>ÝÐ.Ñ/Ô/Ð/àŸš 3™œ‰ˆˆhàŸš GÑ,Ô,×6Ò6µÑGÔGˆŒÝ˜XŸ^š^¨CÑ0Ô0Ñ1Ô1ˆŒˆˆr   rI   r   r&   rA   c                óŽ   — t          || j        ¦  «        r/|j        | j        k    o| j                             |j        ¦  «        S dS )zE
        https://tools.ietf.org/search/rfc6125#section-6.5.2
        F)rE   r3   rr   r£   r¤   r:   rs   r‰   s     r    r:   zURI_ID.verifyh  sM   € õ �g˜tÔ1Ñ2Ô2ð 	àÔ(¨D¬MÒ9ð <Ø”K×&Ò& wÔ':Ñ;Ô;ðð
 ˆur   N)r¥   r�   rŠ   )r   r   r   r   r   r   r£   r   r¤   rq   r3   r   r1   r™   r:   r   r   r    r¢   r¢   O  s‡   € € € € € € ðð ð �d”g‘i”i€HÐÐÐÑØ�T”W‘Y”Y€FÐÐÐÑà€MØ#Ðð2ð 2ð 2ð 2ð
ð 
ð 
ð 
ð 
ð 
r   r¢   c                  ó|   — e Zd ZU dZ ej        ¦   «         Zded<    ej        ¦   «         Zded<   e	Z
eZdd„Zdd„ZdS )ÚSRV_IDz
    An SRV service ID.
    rO   r   rŽ   r¤   Úsrvr�   c                ó   — t          |t          ¦  «        st          d¦  «        ‚|                     ¦   «         }d|vst	          |¦  «        s|d         dk    rt          d¦  «        ‚|                     dd¦  «        \  }}|dd …                              d¦  «                             t          ¦  «        | _
        t          |¦  «        | _        d S )NzSRV-ID must be a text string.r^   r   Ú_zInvalid SRV-ID.r   rL   )rE   r�   r`   ra   rX   rS   rw   r–   rb   rc   r   rŽ   r¤   )r„   r­   r   rx   s       r    r™   zSRV_ID.__init__�  s³   € Ý˜#�sÑ#Ô#ð 	=ÝÐ;Ñ<Ô<Ð<à�iŠi‰kŒkˆØ�cˆ>ˆ>�^¨CÑ0Ô0ˆ>°C¸´F¸c²M°MÝÐ.Ñ/Ô/Ð/àŸš 3¨Ñ*Ô*‰ˆˆhà˜˜˜”H—O’O GÑ,Ô,×6Ò6µÑGÔGˆŒ	Ý˜XÑ&Ô&ˆŒˆˆr   rI   r   r&   rA   c                óŽ   — t          || j        ¦  «        r/| j        |j        k    o| j                             |j        ¦  «        S dS )zE
        https://tools.ietf.org/search/rfc6125#section-6.5.1
        F)rE   r3   r   r{   r¤   r:   rs   r‰   s     r    r:   zSRV_ID.verifyŽ  sQ   € õ �g˜tÔ1Ñ2Ô2ð 	Ø”9 Ô 4Ò4ð ¸¼×9KÒ9KØÔ#ñ:ô :ð ð ˆur   N)r­   r�   rŠ   )r   r   r   r   r   r   r   r   r¤   rz   r3   r   r1   r™   r:   r   r   r    r¬   r¬   u  s‡   € € € € € € ðð ð �$”'‘)”)€DÐÐÐÑØ�T”W‘Y”Y€FÐÐÐÑà€MØ#Ðð'ð 'ð 'ð 'ð	ð 	ð 	ð 	ð 	ð 	r   r¬   r   rO   Úactual_hostnamec                óÐ   — d| v r]|                       dd¦  «        \  }}|                      dd¦  «        \  }}||k    rdS |                     d¦  «        rdS |dk    p||k    S | |k    S )zT
    :return: `True` if *cert_pattern* matches *actual_hostname*, else `False`.
    r_   r~   r   Fs   xn--)rw   Ú
startswith)r   r±   Ú	cert_headÚ	cert_tailÚactual_headÚactual_tails         r    r›   r›   š  sŽ   € ð ˆ|ÐÐØ+×1Ò1°$¸Ñ:Ô:Ñˆ	�9Ø#2×#8Ò#8¸¸qÑ#AÔ#AÑ ˆ�[Ø˜Ò#Ð#Ø�5à×!Ò! 'Ñ*Ô*ð 	Ø�5à˜DÒ Ð< I°Ò$<Ð<à˜?Ò*Ð*r   ÚNonec                óˆ  — |                       d¦  «        }|dk    rt          d| ›d�¦  «        ‚|                      d¦  «        }t          |¦  «        dk     rt          d| ›d�¦  «        ‚d|d         vr"t          d	                     | ¦  «        ¦  «        ‚t          d
„ |D ¦   «         ¦  «        rt          d| ›d�¦  «        ‚dS )zh
    Check whether the usage of wildcards within *cert_pattern* conforms with
    our expectations.
    r_   r   zCertificate's DNS-ID z contains too many wildcards.r~   é   z0 has too few host components for wildcard usage.r   zDCertificate's DNS-ID {!r} has a wildcard outside the left-most part.c              3  ó6   K  — | ]}t          |¦  «         V — Œd S rD   )Úlen)r*   Úps     r    rG   z$_validate_pattern.<locals>.<genexpr>Â  s*   è è € Ð
%Ð
%˜!�s�1‰vŒvˆ:Ð
%Ð
%Ð
%Ð
%Ð
%Ð
%r   z contains empty parts.N)Úcountr	   rw   r¼   ÚformatrH   )r   ÚcntÚpartss      r    rd   rd   ¬  s  € ð
 ×
Ò
˜TÑ
"Ô
"€CØ
ˆQ‚w€wÝØQ LÐQÐQÐQñ
ô 
ð 	
ð ×Ò˜tÑ$Ô$€EÝ
ˆ5�z„z�A‚~€~Ýð Lð ð ð ñ
ô 
ð 	
ð
 �5˜”8ÐÐÝðß’F˜<Ñ(Ô(ñ
ô 
ð 	
õ Ð
%Ð
%˜uÐ
%Ñ
%Ô
%Ñ%Ô%ð 
ÝØJ LÐJÐJÐJñ
ô 
ð 	
ð
ð 
r   s   ABCDEFGHIJKLMNOPQRSTUVWXYZs   abcdefghijklmnopqrstuvwxyz)r!   r"   r#   r$   r%   r$   r&   r'   )r!   r"   r8   r$   r&   r'   )r=   r>   r?   r@   r&   rA   )rI   rJ   r&   rA   )r   rO   r±   rO   r&   rA   )r   rO   r&   r¸   )*r   Ú
__future__r   rT   rg   Útypingr   r   r   r   r   Ú
exceptionsr	   r
   r   r   r   r   r   r•   r—   Úsr   r7   r/   r2   rX   rZ   rl   rq   rz   r   r   rŽ   r�   r¢   r¬   r›   rd   rO   Ú	maketransrc   r   r   r    ú<module>rÇ      sN  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø 	€	€	€	à ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?à €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðØ€K€K€K€KøØð ð ð Ø€D€D€Dðøøøð €„ˆdÐÑÔð1ð 1ð 1ð 1ð 1ñ 1ô 1ñ Ôð1ð(ð (ð (ð (ðVð ð ð ð$/ð /ð /ð /ðð ð ð ð< €„ˆdÐÑÔð$ð $ð $ð $ð $ñ $ô $ñ Ôð$ð6 €„ˆdÐÑÔðð ð ð ð ñ ô ñ Ôðð$ €„ˆdÐÑÔð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð8 €„ˆdÐÑÔð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð> Ø�
˜JÐ(8Ð8ôÐ ðð ð
ð 
ð 
ð 
ð 
�ñ 
ô 
ñ Ôð
ð €„ˆU˜$ÐÑÔð)ð )ð )ð )ð )ñ )ô )ñ  Ôð)ðX €„ˆdÐÑÔðð ð ð ð ñ ô ñ Ôðð, €„ˆU˜$ÐÑÔð"ð "ð "ð "ð "ñ "ô "ñ  Ôð"ðJ €„ˆU˜$ÐÑÔð!ð !ð !ð !ð !ñ !ô !ñ  Ôð!ðH+ð +ð +ð +ð$
ð 
ð 
ð 
ð: —/’/Ø!Ð#@ñô €€€s   ´9 ¹AÁA