Ë
    oj)A  ã                   ó¾   — d Z ddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ dd„Z G d	„ d
ej"                  «      Z G d„ de«      Z G d„ de«      Zy)z
Authoritative resolvers.
é    N)Údefer)ÚcommonÚdnsÚerror)Úfailure)ÚexecfileÚnativeString)ÚFilePathc                 ó–  — t        j                  d«      }t        j                  d«      }	 t        j                  j                  | «      s)t        | d«      5 }|j                  |dz   «       ddd«       t        j                  |«       t        | «      5 }|j                  «       j                  «       \  }}ddd«       |k(  xr t        «      dz   xs d}t        | d«      5 }|j                  d||fz  «       ddd«       |d	|fz  z   }|S # 1 sw Y   Œ¢xY w# t        j                  |«       w xY w# 1 sw Y   Œ~xY w# 1 sw Y   ŒFxY w)
aÛ  
    Return a monotonically increasing (across program runs) integer.

    State is stored in the given file.  If it does not exist, it is
    created with rw-/---/--- permissions.

    This manipulates process-global state by calling C{os.umask()}, so it isn't
    thread-safe.

    @param filename: Path to a file that is used to store the state across
        program runs.
    @type filename: L{str}

    @return: a monotonically increasing number
    @rtype: L{str}
    z%Y%m%dé   Úwz 0Né   r   z%s %dz%02d)ÚtimeÚstrftimeÚosÚumaskÚpathÚexistsÚopenÚwriteÚreadlineÚsplitÚint)ÚfilenameÚserialÚoÚfÚ
serialFileÚ
lastSerialÚzoneIDs          ú9/usr/lib/python3/dist-packages/twisted/names/authority.pyÚ	getSerialr"      s)  € ô" �]‰]˜8Ó$€Fä
�‰�‹€AðÜ�w‰w�~‰~˜hÔ'Ü�h Ó$ð '¨Ø—‘˜ ™Ô&÷'ô 	�‰�Œä	ˆh‹ð ;˜:Ø'×0Ñ0Ó2×8Ñ8Ó:Ñˆ
�F÷;ð ˜FÑ"Ò9¬¨V«°q©Ò>¸Q€Fä	ˆh˜Ó	ð 5 
Ø×Ñ˜ F¨FÐ#3Ñ3Ô4÷5ð �v  	Ñ)Ñ*€FØ€M÷'ð 'ûô 	�‰��ú÷;ð ;ú÷
5ð 5ús;   ¬+D ÁDÁ,D Â"D3Ã#D?ÄDÄD ÄD0Ä3D<Ä?Ec                   ó¼   — e Zd ZdZej
                  ej                  ej                  fZej                  ej                  fZdZdZd„ Zd„ Zd„ Zd„ Zd
d„Zdd„Zd	„ Zy)ÚFileAuthoritya­  
    An Authority that is loaded from a file.

    This is an abstract class that implements record search logic. To create
    a functional resolver, subclass it and override the L{loadFile} method.

    @ivar _ADDITIONAL_PROCESSING_TYPES: Record types for which additional
        processing will be done.

    @ivar _ADDRESS_TYPES: Record types which are useful for inclusion in the
        additional section generated during additional processing.

    @ivar soa: A 2-tuple containing the SOA domain name as a L{bytes} and a
        L{dns.Record_SOA}.

    @ivar records: A mapping of domains (as lowercased L{bytes}) to records.
    @type records: L{dict} with L{bytes} keys
    Nc                 ór   — t         j                  j                  | «       | j                  |«       i | _        y ©N)r   ÚResolverBaseÚ__init__ÚloadFileÚ_cache©Úselfr   s     r!   r(   zFileAuthority.__init__V   s)   € Ü×Ñ×$Ñ$ TÔ*Ø�‰�hÔØˆ�ó    c                 ó   — || _         y r&   )Ú__dict__)r,   Ústates     r!   Ú__setstate__zFileAuthority.__setstate__[   s	   € Øˆ�r-   c                  ó   — y)ab  
        Load DNS records from a file.

        This method populates the I{soa} and I{records} attributes. It must be
        overridden in a subclass. It is called once from the initializer.

        @param filename: The I{filename} parameter that was passed to the
        initilizer.

        @returns: L{None} -- the return value is ignored
        N© r+   s     r!   r)   zFileAuthority.loadFile^   s   � r-   c           
   #   ó¨  K  — ||z   D ]Æ  }|j                   | j                  v sŒ|j                  j                  j                  }| j                  j                  |j                  «       d«      D ]^  }|j                  | j                  v sŒt        j                  ||j                  t        j                  |j                  xs ||d¬«      –— Œ` ŒÈ y­w)aW  
        Find locally known information that could be useful to the consumer of
        the response and construct appropriate records to include in the
        I{additional} section of that response.

        Essentially, implement RFC 1034 section 4.3.2 step 6.

        @param answer: A L{list} of the records which will be included in the
            I{answer} section of the response.

        @param authority: A L{list} of the records which will be included in
            the I{authority} section of the response.

        @param ttl: The default TTL for records for which this is not otherwise
            specified.

        @return: A generator of L{dns.RRHeader} instances for inclusion in the
            I{additional} section.  These instances represent extra information
            about the records in C{answer} and C{authority}.
        r3   T©ÚauthN)ÚtypeÚ_ADDITIONAL_PROCESSING_TYPESÚpayloadÚnameÚrecordsÚgetÚlowerÚTYPEÚ_ADDRESS_TYPESr   ÚRRHeaderÚINÚttl)r,   ÚanswerÚ	authorityrB   Úrecordr:   Úrecs          r!   Ú_additionalRecordsz FileAuthority._additionalRecordsk   s©   è ø€ ð* ˜yÑ(ò 	ˆFØ�{‰{˜d×?Ñ?Ò?Ø—~‘~×*Ñ*×/Ñ/�ØŸ<™<×+Ñ+¨D¯J©J«L¸"Ó=ò �CØ—x‘x 4×#6Ñ#6Ò6Ü!Ÿl™lØ  #§(¡(¬C¯F©F°C·G±G²N¸sÀCÈdôó ññ	ùs   ‚!C¤A%CÂ
ACc                 ón  — g }g }g }g }t        | j                  d   j                  | j                  d   j                  «      }	| j                  j                  |j                  «       «      }
|
�r/|
D �]q  }|j                  �|j                  }n|	}|j                  t        j                  k(  rq|j                  «       | j                  d   j                  «       k7  rC|j                  t        j                  ||j                  t        j                  ||d¬«      «       nd|j                  |k(  s|t        j                  k(  rB|j                  t        j                  ||j                  t        j                  ||d¬«      «       |j                  t        j                  k(  s�Œ0|j                  t        j                  ||j                  t        j                  ||d¬«      «       �Œt |s|}| j!                  |||	«      }|r|j#                  |«       n|j#                  |«       |sb|s`|j                  t        j                  | j                  d   t        j$                  t        j                  | j                  d   d¬«      «       t'        j(                  |||f«      S t        j*                  || j                  d   «      r;t'        j,                  t/        j0                  t        j2                  |«      «      «      S t'        j,                  t/        j0                  t5        j6                  |«      «      «      S )a   
        Determine a response to a particular DNS query.

        @param name: The name which is being queried and for which to lookup a
            response.
        @type name: L{bytes}

        @param cls: The class which is being queried.  Only I{IN} is
            implemented here and this value is presently disregarded.
        @type cls: L{int}

        @param type: The type of records being queried.  See the types defined
            in L{twisted.names.dns}.
        @type type: L{int}

        @param timeout: All processing is done locally and a result is
            available immediately, so the timeout value is ignored.

        @return: A L{Deferred} that fires with a L{tuple} of three sets of
            response records (to comprise the I{answer}, I{authority}, and
            I{additional} sections of a DNS response) or with a L{Failure} if
            there is a problem processing the query.
        r   r   Fr5   T)ÚmaxÚsoaÚminimumÚexpirer;   r<   r=   rB   r>   r   ÚNSÚappendr@   rA   ÚALL_RECORDSÚCNAMErG   ÚextendÚSOAr   ÚsucceedÚ_isSubdomainOfÚfailr   ÚFailureÚAuthoritativeDomainErrorr   ÚDomainError)r,   r:   Úclsr7   ÚtimeoutÚcnamesÚresultsrD   Ú
additionalÚdefault_ttlÚdomain_recordsrE   rB   ÚadditionalInformations                 r!   Ú_lookupzFileAuthority._lookup‰   sg  € ð0 ˆØˆØˆ	Øˆ
Ü˜$Ÿ(™( 1™+×-Ñ-¨t¯x©x¸©{×/AÑ/AÓBˆàŸ™×)Ñ)¨$¯*©*«,Ó7ˆâØ(ó �Ø—:‘:Ð)Ø Ÿ*™*‘Cà%�Cà—;‘;¤#§&¡&Ò(¨T¯Z©Z«\¸T¿X¹XÀa¹[×=NÑ=NÓ=PÒ-Pð ×$Ñ$ÜŸ™ T¨6¯;©;¼¿¹ÀÀVÐRWÔXõð —[‘[ DÒ(¨D´C·O±OÒ,CØ—N‘NÜŸ™ T¨6¯;©;¼¿¹ÀÀVÐRVÔWôð —;‘;¤#§)¡)Ô+Ø—M‘MÜŸ™ T¨6¯;©;¼¿¹ÀÀVÐRVÔWöð%ñ* Ø �ð %)×$;Ñ$;Ø˜ Kó%Ð!ñ Ø—‘Ð4Õ5à×!Ñ!Ð"7Ô8á¡9ð × Ñ Ü—L‘LØŸ™ ™¤S§W¡W¬c¯f©f°c¸4¿8¹8ÀA¹;ÈTôôô
 —=‘= '¨9°jÐ!AÓBÐBä×!Ñ! $¨¯©°©Ô4ô —z‘z¤'§/¡/´#×2NÑ2NÈtÓ2TÓ"UÓVÐVô
 —z‘z¤'§/¡/´%×2CÑ2CÀDÓ2IÓ"JÓKÐKr-   c                 ó"  — t        j                  |«      }| j                  d   j                  «       |j                  «       k(  �r‘t	        | j                  d   j
                  | j                  d   j                  «      }| j                  d   j                  �| j                  d   j                  }n|}t        j                  | j                  d   t         j                  t         j                  || j                  d   d¬«      g}| j                  j                  «       D ]‡  \  }}|D ]}  }|j                  �|j                  }	n|}	|j                  t         j                  k7  sŒ<|j                  t        j                  ||j                  t         j                  |	|d¬«      «       Œ Œ‰ |j                  |d   «       t        j                   |ddf«      S t        j"                  t%        j&                  t        j(                  |«      «      «      S )Nr   r   Tr5   r3   )r   ÚdomainStringrJ   r=   rI   rK   rL   rB   r@   rR   rA   r;   Úitemsr>   rN   r   rS   rU   r   rV   rX   )
r,   r:   rZ   r^   Úsoa_ttlr\   ÚkÚrrF   rB   s
             r!   Ú
lookupZonezFileAuthority.lookupZoneâ   s…  € Ü×Ñ Ó%ˆØ�8‰8�A‰;×ÑÓ $§*¡*£,Ó.ä˜dŸh™h q™k×1Ñ1°4·8±8¸A±;×3EÑ3EÓFˆKØ�x‰x˜‰{�‰Ð*ØŸ(™( 1™+Ÿ/™/‘à%�ä—‘Ø—H‘H˜Q‘K¤§¡¬#¯&©&°'¸4¿8¹8ÀA¹;ÈTôðˆGð
 Ÿ™×*Ñ*Ó,ò 	‘��1Øò �CØ—w‘wÐ*Ø!Ÿg™g™à)˜Ø—x‘x¤3§7¡7Ó*ØŸ™ÜŸL™L¨¨C¯H©H´c·f±f¸cÀ3ÈTÔRõñð	ð �N‰N˜7 1™:Ô&Ü—=‘= '¨2¨rÐ!2Ó3Ð3Ü�z‰zœ'Ÿ/™/¬#¯/©/¸$Ó*?Ó@ÓAÐAr-   c                 ó¼   — g g g }}}|D ]M  }|d   sŒ	|j                  |d   d   «       |j                  |d   d   «       |j                  |d   d   «       ŒO |||fS )Nr   r   é   )rQ   )r,   r\   Úansr6   ÚaddÚress         r!   Ú_cbAllRecordszFileAuthority._cbAllRecordsþ   so   € Ø˜R �3ˆTˆØò 	&ˆCØ�1‹vØ—
‘
˜3˜q™6 !™9Ô%Ø—‘˜C ™F 1™IÔ&Ø—
‘
˜3˜q™6 !™9Õ%ð		&ð
 �D˜#ˆ~Ðr-   r&   )é
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rP   ÚMXrM   r8   ÚAÚAAAAr?   rJ   r;   r(   r1   r)   rG   ra   rh   rn   r3   r-   r!   r$   r$   ;   se   „ ñð( %(§I¡I¨s¯v©v°s·v±vÐ#>Ð Ø—e‘e˜SŸX™XÐ&€Nà
€CØ€Gòò
òòó<WLórBó8r-   r$   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚPySourceAuthorityzC
    A FileAuthority that is built up from Python source code.
    c                 óN  — | j                  «       i }}t        |||«       d|vrt        d|z   «      ‚i | _        |d   D ]e  }t	        |d   t
        j                  «      r|| _        | j                  j                  |d   j                  «       g «      j                  |d   «       Œg y )NÚzonezNo zone defined in r   r   )ÚsetupConfigNamespacer   Ú
ValueErrorr;   Ú
isinstancer   Ú
Record_SOArJ   Ú
setdefaultr=   rN   )r,   r   ÚgÚlÚrrs        r!   r)   zPySourceAuthority.loadFile  sš   € Ø×(Ñ(Ó*¨Bˆ1ˆÜ�˜1˜aÔ Ø˜‰?ÜÐ2°XÑ=Ó>Ð>àˆŒØ�F‘)ò 	EˆBÜ˜"˜Q™%¤§¡Ô0Ø�”Ø�L‰L×#Ñ# B q¡E§K¡K£M°2Ó6×=Ñ=¸bÀ¹eÕDñ	Er-   c                 ó   ‡— ˆfd„}|S )Nc                 ó>   •— t        j                  | «       ‰|i |¤ŽfS r&   )r   rc   )r:   ÚargÚkwr7   s      €r!   ÚwrapRecordFuncz4PySourceAuthority.wrapRecord.<locals>.wrapRecordFunc  s#   ø€ Ü×$Ñ$ TÓ*©D°#Ð,<¸Ñ,<Ð=Ð=r-   r3   )r,   r7   r‡   s    ` r!   Ú
wrapRecordzPySourceAuthority.wrapRecord  s   ø€ ô	>ð Ðr-   c                 ó  — i }t         j                  j                  «       }|D �cg c]  }|j                  d«      sŒ|‘Œ c}D ]4  }t	        t         |«      }| j                  |«      }|||t        d«      d  <   Œ6 |S c c}w )NÚRecord_)r   r/   ÚkeysÚ
startswithÚgetattrrˆ   Úlen)r,   rg   rd   ÚxrE   r7   r   s          r!   r{   z&PySourceAuthority.setupConfigNamespace  s{   € ØˆÜ—‘×!Ñ!Ó#ˆØ"'ÖC˜Q¨1¯<©<¸	Õ+B’qÒCò 	,ˆFÜœ3 Ó'ˆDØ—‘ Ó%ˆAØ*+ˆAˆf”S˜“^Ð%Ð&Ò'ð	,ð ˆùò	 Ds
   ¥A<¼A<N)rp   rq   rr   rs   r)   rˆ   r{   r3   r-   r!   rx   rx     s   „ ñò
Eòór-   rx   c                   ó:   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚBindAuthorityz™
    An Authority that loads U{BIND zone files
    <https://en.wikipedia.org/wiki/Zone_file>}.

    Supports only C{$ORIGIN} and C{$TTL} directives.
    c                 ó   — t        |«      }t        |j                  «       dz   «      | _        |j	                  «       j                  d«      }| j                  |«      }| j                  |«      }| j                  |«       y)z}
        Load records from C{filename}.

        @param filename: file to read from
        @type filename: L{bytes}
        ó   .TN)	r
   r	   ÚbasenameÚoriginÚ
getContentÚ
splitlinesÚstripCommentsÚcollapseContinuationsÚ
parseLines)r,   r   ÚfpÚliness       r!   r)   zBindAuthority.loadFile1  si   € ô �hÓˆô # 2§;¡;£=°4Ñ#7Ó8ˆŒà—‘“×*Ñ*¨4Ó0ˆØ×"Ñ" 5Ó)ˆØ×*Ñ*¨5Ó1ˆØ�‰˜Õr-   c                 óV   — d„ |D �cg c]  }|j                  «       ‘Œ c}D «       S c c}w )z«
        Strip comments from C{lines}.

        @param lines: lines to work on
        @type lines: iterable of L{bytes}

        @return: C{lines} sans comments.
        c              3   óx   K  — | ]2  }|j                  d «      dk(  xr |xs |d|j                  d «       –— Œ4 y­w)ó   ;éÿÿÿÿN)Úfind)Ú.0Úas     r!   ú	<genexpr>z.BindAuthority.stripComments.<locals>.<genexpr>K  sA   è ø€ ò 
àð �F‰F�4‹L˜BÑÒ$ 1Ò9¨¨.¨A¯F©F°4«LÐ(9Ó9ñ
ùs   ‚8:)Ústrip)r,   rœ   Úbs      r!   r˜   zBindAuthority.stripCommentsB  s(   € ñ
à).Ö/ A�a—g‘g•iÒ/ô
ð 	
ùâ/s   ‡&c           
      ór  — g }d}|D ]œ  }|dk(  rL|j                  d«      dk(  r|j                  |«       Œ.|j                  |d|j                  d«       «       d}ŒT|j                  d«      dk7  r%|dxx   d|d|j                  d«       z   z  cc<   d}Œ�|dxx   d|z   z  cc<   Œž t        dd„ |D «       «      S )	zÄ
        Transform multiline statements into single lines.

        @param lines: lines to work on
        @type lines: iterable of L{bytes}

        @return: iterable of continuous lines
        r   ó   (r    Nr   ó   )ó    c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr&   )r   )r¢   Úlines     r!   r¤   z6BindAuthority.collapseContinuations.<locals>.<genexpr>h  s   è ø€ Ò8¨d˜TŸZ™ZŸ\Ñ8ùs   ‚)r¡   rN   Úfilter)r,   rœ   r�   r0   r¬   s        r!   r™   z#BindAuthority.collapseContinuationsP  s¿   € ð ˆØˆØò 	)ˆDØ˜ŠzØ—9‘9˜T“? bÒ(Ø—H‘H˜T•Nà—H‘H˜TÐ"3 D§I¡I¨d£OÐ4Ô5Ø‘Eà—9‘9˜T“? bÒ(Ø�b“E˜T DÐ):¨4¯9©9°T«?Ð$;Ñ;Ñ;“EØ‘Eà�b“E˜T D™[Ñ(”Eð	)ô �dÑ8°aÔ8Ó9Ð9r-   c                 ó  — d}| j                   }i | _        |D ]j  }|d   dk(  rt        j                  |d   «      }Œ$|d   dk(  r|d   }Œ2|d   dk(  rt	        d«      ‚|d   dk(  rt	        d	«      ‚| j                  |||«       Œl || _         y
)zs
        Parse C{lines}.

        @param lines: lines to work on
        @type lines: iterable of L{bytes}
        i0*  r   s   $TTLr   s   $ORIGINs   $INCLUDEz"$INCLUDE directive not implementeds	   $GENERATEz#$GENERATE directive not implementedN)r•   r;   r   Ústr2timeÚNotImplementedErrorÚparseRecordLine)r,   rœ   rB   r•   r¬   s        r!   rš   zBindAuthority.parseLinesj  s¦   € ð ˆØ—‘ˆàˆŒàò 
	8ˆDØ�A‰w˜'Ò!Ü—l‘l 4¨¡7Ó+‘Ø�a‘˜JÒ&Ø˜a™‘Ø�a‘˜KÒ'Ü)Ð*NÓOÐOØ�a‘˜LÒ(Ü)Ð*OÓPÐPà×$Ñ$ V¨S°$Õ7ð
	8ð ˆ�r-   c                 ó    — |j                  d«      s|dz   |dd z   }n|dd }t        | d|› �d«      }|r |||||«       yt        d|›d�«      ‚)a  
        Add a record to our authority.  Expand domain with origin if necessary.

        @param owner: origin?
        @type owner: L{bytes}

        @param ttl: time to live for the record
        @type ttl: L{int}

        @param domain: the domain for which the record is to be added
        @type domain: L{bytes}

        @param type: record type
        @type type: L{str}

        @param cls: record class
        @type cls: L{str}

        @param rdata: record data
        @type rdata: L{list} of L{bytes}
        r“   Nr    Úclass_zRecord class ú not supported)Úendswithr�   r°   )r,   ÚownerrB   r7   ÚdomainrY   Úrdatar   s           r!   Ú	addRecordzBindAuthority.addRecord…  sh   € ð, �‰˜tÔ$Ø˜d‘] U¨3¨B ZÑ/‰Fà˜C˜R�[ˆFÜ�D˜F 3 %˜.¨$Ó/ˆÙÙˆc�4˜ Õ'ä%¨°c°W¸NÐ&KÓLÐLr-   c                 ó  — t        t        dt        |«      › �d«      }|rU ||Ž }||_        | j                  j                  |j                  «       g «      j                  |«       |dk(  r
||f| _        yyt        dt        |«      ›d�«      ‚)a>  
        Simulate a class IN and recurse into the actual class.

        @param ttl: time to live for the record
        @type ttl: L{int}

        @param type: record type
        @type type: str

        @param domain: the domain
        @type domain: bytes

        @param rdata:
        @type rdata: bytes
        rŠ   NrR   zRecord type r´   )
r�   r   r	   rB   r;   r   r=   rN   rJ   r°   )r,   rB   r7   r·   r¸   rE   rg   s          r!   Úclass_INzBindAuthority.class_IN¥  s�   € ô  œ ¬°TÓ(:Ð';Ð<¸dÓCˆÙÙ˜�ˆAØˆAŒEØ�L‰L×#Ñ# F§L¡L£N°BÓ7×>Ñ>¸qÔAà�uŠ}Ø" A˜;�•ð ô &Øœ|¨DÓ1Ð4°NÐCóð r-   c           	      ó  — t         j                  j                  «       D �ch c]  }|j                  d«      ’Œ }}t         j                  j                  «       D �ch c]  }|j                  d«      ’Œ }}||z  }d}	|}
|d   dk(  r|dd }|}
n$|d   j                  «       s|d   |vr
|d   }
|dd }|d   j                  «       s|d   |v r|
}|}
n
|d   }|dd }|d   |v r1|d   }	|dd }|d   j                  «       rKt        |d   «      }|dd }n7|d   j                  «       r$t        |d   «      }|dd }|d   |v r
|d   }	|dd }|d   }|dd }| j                  |
|t        |«      |t        |	«      |«       yc c}w c c}w )aƒ  
        Parse a C{line} from a zone file respecting C{origin} and C{ttl}.

        Add resulting records to authority.

        @param origin: starting point for the zone
        @type origin: L{bytes}

        @param ttl: time to live for the record
        @type ttl: L{int}

        @param line: zone file line to parse; split by word
        @type line: L{list} of L{bytes}
        Úasciis   INr   ó   @r   N)	r   ÚQUERY_CLASSESÚvaluesÚencodeÚQUERY_TYPESÚisdigitr   r¹   r	   )r,   r•   rB   r¬   ÚqcÚqueryClassesÚqtÚ
queryTypesÚmarkersrY   r¶   r·   r7   r¸   s                 r!   r±   zBindAuthority.parseRecordLineÂ  s¶  € ô 69×5FÑ5F×5MÑ5MÓ5OÖP¨r˜Ÿ	™	 'Õ*ÐPˆÐPÜ36·?±?×3IÑ3IÓ3KÖL¨R�b—i‘i Õ(ÐLˆ
ÐLà Ñ+ˆàˆØˆà�‰7�dŠ?Ø˜˜�8ˆDØ‰EØ�a‘—‘Ô" t¨A¡w°gÑ'=Ø˜‘GˆEØ˜˜�8ˆDà�‰7�?‰?Ô  Q¡¨7Ñ 2ØˆFØ‰Eà˜!‘WˆFØ˜˜�8ˆDà�‰7�lÑ"Ø�q‘'ˆCØ˜˜�8ˆDØ�A‰w�‰Ô Ü˜$˜q™'“l�Ø˜A˜B�x‘Ø�!‰W�_‰_ÔÜ�d˜1‘g“,ˆCØ˜˜�8ˆDØ�A‰w˜,Ñ&Ø˜1‘g�Ø˜A˜B�x�à�A‰wˆØ�Q�R�ˆà�‰�u˜c¤<°Ó#5°v¼|ÈCÓ?PÐRWÕXùòM QùÚLs   ¡E=ÁFN)rp   rq   rr   rs   r)   r˜   r™   rš   r¹   r»   r±   r3   r-   r!   r‘   r‘   )  s-   „ ñòò"
ò:ò4ò6Mò@ó:5Yr-   r‘   )z/tmp/twisted-names.serial)rs   r   r   Útwisted.internetr   Útwisted.namesr   r   r   Útwisted.pythonr   Útwisted.python.compatr   r	   Útwisted.python.filepathr
   r"   r'   r$   rx   r‘   r3   r-   r!   ú<module>rÎ      s\   ðñ
ó
 
Û å "ß ,Ñ ,Ý "ß 8Ý ,ó$ôNJ�F×'Ñ'ô JôZ˜ô ôBNY�Mõ NYr-   