Ë
    oj;  ã                   ó`  — d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZ ddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$  G d„ de
«      Z% G d„ de	«      Z& G d„ de
«      Z' G d„ de
«      Z( G d„ dejR                  «      Z* G d„ de	«      Z+y)z 
Tests for L{twisted.web.util}.
é    N)Údefer)ÚnetworkString)ÚFailure)ÚSynchronousTestCaseÚTestCase)ÚresourceÚutil)ÚFlattenerError)ÚFOUND)ÚRequest)Ú	TagLoaderÚflattenStringÚtags)ÚDummyChannelÚDummyRequest)	ÚDeferredResourceÚFailureElementÚParentRedirectÚ_FrameElementÚ_SourceFragmentElementÚ_SourceLineElementÚ_StackElementÚformatFailureÚ
redirectToc                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚRedirectToTestsz"
    Tests for L{redirectTo}.
    c                 óF  — t        t        «       d«      }d|_        d}t        ||«       | j	                  |j
                  t        «       | j	                  |j                  j                  d«      |g«       | j	                  |j                  j                  d«      dg«       y)z¾
        L{redirectTo} will set the C{Location} and C{Content-Type} headers on
        its request, and set the response code to C{FOUND}, so the browser will
        be redirected.
        Tó   GETs   http://target.example.com/4321s   locations   content-types   text/html; charset=utf-8N)	r   r   Úmethodr   ÚassertEqualÚcoder   ÚresponseHeadersÚgetRawHeaders©ÚselfÚrequestÚ	targetURLs      ú</usr/lib/python3/dist-packages/twisted/web/test/test_util.pyÚtest_headersAndCodez#RedirectToTests.test_headersAndCode&   sŒ   € ô œ,›.¨$Ó/ˆØˆŒØ5ˆ	Ü�9˜gÔ&Ø×Ñ˜Ÿ™¤uÔ-Ø×ÑØ×#Ñ#×1Ñ1°+Ó>ÀÀô	
ð 	×ÑØ×#Ñ#×1Ñ1°/ÓBØ(Ð)õ	
ó    c                 óv   — t        t        «       d«      }d|_        d}| j                  t        t
        ||«       y)zW
        L{redirectTo} will raise TypeError if unicode object is passed in URL
        Tr   zhttp://target.example.com/4321N)r   r   r   ÚassertRaisesÚ	TypeErrorr   r$   s      r(   Útest_redirectToUnicodeURLz)RedirectToTests.test_redirectToUnicodeURL9   s2   € ô œ,›.¨$Ó/ˆØˆŒØ4ˆ	Ø×Ñœ)¤Z°¸GÕDr*   c                 ó\   — t        dg«      }t        d|«      }d}| j                  ||«       y)zq
        Legitimate URLs are fully interpolated in the `redirectTo` response body without transformation
        r*   s   https://twisted.org/sÚ   
<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=https://twisted.org/">
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    <a href="https://twisted.org/">click here</a>
    </body>
</html>
N©r   r   r    ©r%   r&   ÚhtmlÚexpecteds       r(   Útest_legitimateRedirectz'RedirectToTests.test_legitimateRedirectB   s6   € ô  ˜uÓ%ˆÜÐ1°7Ó;ˆð	ˆð 	×Ñ˜˜xÕ(r*   c                 ó\   — t        dg«      }t        d|«      }d}| j                  ||«       y)zm
        Malicious URLs are HTML-escaped before interpolating them in the `redirectTo` response body
        r*   s?   https://twisted.org/"><script>alert(document.location)</script>sX  
<html>
    <head>
        <meta http-equiv="refresh" content="0;URL=https://twisted.org/&quot;&gt;&lt;script&gt;alert(document.location)&lt;/script&gt;">
    </head>
    <body bgcolor="#FFFFFF" text="#000000">
    <a href="https://twisted.org/&quot;&gt;&lt;script&gt;alert(document.location)&lt;/script&gt;">click here</a>
    </body>
</html>
Nr0   r1   s       r(   Útest_maliciousRedirectz&RedirectToTests.test_maliciousRedirectT   s9   € ô  ˜uÓ%ˆÜØNÐPWó
ˆð	ˆð 	×Ñ˜˜xÕ(r*   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r.   r4   r6   © r*   r(   r   r   !   s   „ ñò
ò&Eò)ó$)r*   r   c                   ó2   — e Zd ZdZdedefd„Zd„ Zd„ Zd„ Zy)	ÚParentRedirectTestsz!
    Test L{ParentRedirect}.
    ÚrequestPathÚreturnc                 ó  — t        t        «       d«      }d|_        |j                  d«      j	                  d«      |_        t        «       } |j                  |«       |j                  j                  d«      }|€J ‚|\  }|S )zÉ
        Render a response to a request with path *requestPath*

        @param requestPath: A slash-separated path like C{b'/foo/bar'}.

        @returns: The value of the I{Location} header.
        Tr   ó   /s   Location)
r   r   r   ÚlstripÚsplitÚprepathr   Úrenderr"   r#   )r%   r>   r&   r   ÚheadersÚlocations         r(   ÚdoLocationTestz"ParentRedirectTests.doLocationTestn   sz   € ô œ,›.¨$Ó/ˆØˆŒØ%×,Ñ,¨TÓ2×8Ñ8¸Ó>ˆŒä!Ó#ˆØˆ�‰˜Ô à×)Ñ)×7Ñ7¸ÓDˆØÐ"Ð"Ð"Ø‰
ˆØˆr*   c                 óˆ   — | j                  d| j                  d«      «       | j                  d| j                  d«      «       y)zi
        At the URL root issue a redirect to the current URL, removing any query
        string.
        ó   http://10.0.0.1/rA   s   /?biff=baffN©r    rH   ©r%   s    r(   Útest_locationRootz%ParentRedirectTests.test_locationRoot‚   s<   € ð
 	×ÑÐ,¨d×.AÑ.AÀ$Ó.GÔHØ×ÑÐ,¨d×.AÑ.AÀ.Ó.QÕRr*   c                 óˆ   — | j                  d| j                  d«      «       | j                  d| j                  d«      «       y)zt
        A request for a resource one level down from the URL root produces
        a redirect to the root.
        rJ   s   /foos   /foo?bar=sproiiingNrK   rL   s    r(   Útest_locationToRootz'ParentRedirectTests.test_locationToRootŠ   s?   € ð
 	×ÑÐ,¨d×.AÑ.AÀ'Ó.JÔKØ×ÑØ ×!4Ñ!4Ð5JÓ!Kõ	
r*   c                 óÊ   — | j                  d| j                  d«      «       | j                  d| j                  d«      «       | j                  d| j                  d«      «       y)zp
        Requests for resources directly under the path C{/foo/} produce
        redirects to C{/foo/}.
        s   http://10.0.0.1/foo/s   /foo/s   /foo/bars   /foo/bar?biz=bazNrK   rL   s    r(   Útest_locationUpOnez&ParentRedirectTests.test_locationUpOne”   s[   € ð
 	×ÑÐ0°$×2EÑ2EÀhÓ2OÔPØ×ÑÐ0°$×2EÑ2EÀkÓ2RÔSØ×ÑØ# T×%8Ñ%8Ð9LÓ%Mõ	
r*   N)	r7   r8   r9   r:   ÚbytesrH   rM   rO   rQ   r;   r*   r(   r=   r=   i   s*   „ ñð¨%ð °Eó ò(Sò
ó	
r*   r=   c                   óR   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zy)ÚFailureElementTestszn
    Tests for L{FailureElement} and related helpers which can render a
    L{Failure} as an HTML string.
    c                 óÒ   — d„ }|j                   j                  dz   | _        	  |«        y# t        $ r2 t	        d¬«      | _        | j
                  j                  d   | _        Y yw xY w)zO
        Create a L{Failure} which can be used by the rendering tests.
        c                  ó   — d} t        | «      ‚)NzThis is a problem)Ú	Exception)Úmessages    r(   ÚlineNumberProbeAlsoBrokenz<FailureElementTests.setUp.<locals>.lineNumberProbeAlsoBroken«   s   € Ø)ˆGÜ˜GÓ$Ð$r*   é   T)ÚcaptureVarséÿÿÿÿN)Ú__code__Úco_firstlinenoÚbaseÚBaseExceptionr   ÚfailureÚframesÚframe)r%   rY   s     r(   ÚsetUpzFailureElementTests.setUp¦   s]   € ò
	%ð
 .×6Ñ6×EÑEÈÑIˆŒ	ð	1Ù%Õ'øÜò 	1Ü"¨tÔ4ˆDŒLØŸ™×,Ñ,¨RÑ0ˆDŽJð	1ús   £+ «8A&Á%A&c           
      ó  — t        t        t        j                  t        j                  d¬«      t        j                  d¬«      «      «      dd«      }t        d|«      }d}|j                  | j                  |j                  d«      «       |S )	zN
        L{_SourceLineElement} renders a source line and line number.
        Ú
lineNumber©rE   Ú
sourceLineé2   z    print 'hello'Nu:   <div><span>50</span><span> Â  Â print 'hello'</span></div>zutf-8)	r   r   r   ÚdivÚspanr   ÚaddCallbackr    Úencode)r%   ÚelementÚdr3   s       r(   Útest_sourceLineElementz*FailureElementTests.test_sourceLineElement¸   s{   € ô %ÜÜ—‘œŸ™¨,Ô7¼¿¹È,Ô9WÓXóð Øó
ˆô ˜$ Ó(ˆðOð 	ð 	
�‰�d×&Ñ&¨¯©¸Ó(@ÔAØˆr*   c           
      ó  — t        t        t        j                  t        j                  d¬«      t        j                  d¬«      d¬«      «      | j
                  «      }g d¢}t        d|«      }d}t        |«      D ]a  \  }}d}|d	k  r/||j                  dd
g|d	k(     | j                  |z   d|z   «      z  }Œ<||j                  d| j                  |z   d|z   «      z  }Œc |j                  d«      }|j                  | j                  |«       |S )zƒ
        L{_SourceFragmentElement} renders source lines at and around the line
        number indicated by a frame object.
        rf   rg   rh   ÚsourceLines)u#    Â  Â message = "This is a problem"u    Â  Â raise Exception(message)Ú Nrs   z?<div class="snippet{}Line"><span>{}</span><span>{}</span></div>rZ   Ú	Highlightu    Â  Â  Â  Â Úutf8)r   r   r   rj   rk   rc   r   Ú	enumerateÚformatr_   rm   rl   r    )	r%   rn   Úsourcero   ÚstringToCheckForrf   rh   ÚtemplateÚbytesToCheckFors	            r(   Útest_sourceFragmentElementz.FailureElementTests.test_sourceFragmentElementË   s  € ô
 )ÜÜ—‘Ü—I‘I \Ô2Ü—I‘I \Ô2Ø(ôóð �J‰Jó	
ˆò
ˆô
 ˜$ Ó(ˆàÐÜ&/°Ó&7ò 	Ñ"ˆJ˜
ØXˆHØ˜QŠØ  H§O¡OØ˜Ð% j°A¡oÑ6Ø—I‘I 
Ñ*Ø.°Ñ;ó%ñ Ñ ð ! H§O¡OØ˜Ÿ	™	 JÑ.°°j±ó%ñ Ñ ð	ð +×1Ñ1°&Ó9ˆà	�‰�d×&Ñ&¨Ô8Øˆr*   c           	      ó   — t        t        t        j                  d¬«      «      | j                  «      }t        d|«      }|j                  | j                  dt        t        j                  d«      «      z   dz   «       |S )z­
        The I{filename} renderer of L{_FrameElement} renders the filename
        associated with the frame object used to initialize the
        L{_FrameElement}.
        Úfilenamerg   Nó   <span>Úcó   </span>)r   r   r   rk   rc   r   rl   r    r   Ú__file__Úrstrip©r%   rn   ro   s      r(   Útest_frameElementFilenamez-FailureElementTests.test_frameElementFilenameõ   sg   € ô  ¤	¬$¯)©)¸:Ô*FÓ GÈÏÉÓTˆÜ˜$ Ó(ˆØ	�‰ð ×ÑØœ¤h§o¡o°cÓ&:Ó;Ñ;¸jÑHô		
ð ˆr*   c                 óÞ   — t        t        t        j                  d¬«      «      | j                  «      }t        d|«      }|j                  | j                  d| j                  dz   fz  «       |S )z²
        The I{lineNumber} renderer of L{_FrameElement} renders the line number
        associated with the frame object used to initialize the
        L{_FrameElement}.
        rf   rg   Ns   <span>%d</span>rZ   )	r   r   r   rk   rc   r   rl   r    r_   r„   s      r(   Útest_frameElementLineNumberz/FailureElementTests.test_frameElementLineNumber  sX   € ô  ¤	¬$¯)©)¸<Ô*HÓ IÈ4Ï:É:ÓVˆÜ˜$ Ó(ˆØ	�‰�d×&Ñ&Ð(:¸d¿i¹iÈ!¹mÐ=MÑ(MÔNØˆr*   c                 ó¼   — t        t        t        j                  d¬«      «      | j                  «      }t        d|«      }|j                  | j                  d«       |S )z°
        The I{function} renderer of L{_FrameElement} renders the line number
        associated with the frame object used to initialize the
        L{_FrameElement}.
        Úfunctionrg   Ns&   <span>lineNumberProbeAlsoBroken</span>)r   r   r   rk   rc   r   rl   r    r„   s      r(   Útest_frameElementFunctionz-FailureElementTests.test_frameElementFunction  sH   € ô  ¤	¬$¯)©)¸:Ô*FÓ GÈÏÉÓTˆÜ˜$ Ó(ˆØ	�‰�d×&Ñ&Ð(QÔRØˆr*   c                 óZ  — t        d| j                  «      }|j                  d«      }t        j                  «       } |d|«      }| j                  |t        «       | j                  |j                  | j                  «       | j                  |g|j                  j                  «       «       y)zÓ
        The I{source} renderer of L{_FrameElement} renders the source code near
        the source filename/line number associated with the frame object used to
        initialize the L{_FrameElement}.
        Nrx   )r   rc   ÚlookupRenderMethodr   rj   ÚassertIsInstancer   ÚassertIdenticalr    ÚloaderÚload©r%   rn   ÚrendererÚtagÚresults        r(   Útest_frameElementSourcez+FailureElementTests.test_frameElementSource  sƒ   € ô    d§j¡jÓ1ˆØ×-Ñ-¨hÓ7ˆÜ�h‰h‹jˆÙ˜$ Ó$ˆØ×Ñ˜fÔ&<Ô=Ø×Ñ˜VŸ\™\¨4¯:©:Ô6Ø×Ñ˜#˜ §¡× 2Ñ 2Ó 4Õ5r*   c                 óÔ  — t        d| j                  j                  dd «      }|j                  d«      }t	        j
                  «       } |d|«      }| j                  |t        «       | j                  |d   t        «       | j                  |d   j                  | j                  j                  d   «       | j                  |d   t        «       | j                  |d   j                  | j                  j                  d   «       | j                  |d   j                  j                  «       |d   j                  j                  «       «       | j                  dt        |«      «       y)zœ
        The I{frames} renderer of L{_StackElement} renders each stack frame in
        the list of frames used to initialize the L{_StackElement}.
        Né   rb   r   rZ   )r   ra   rb   rŒ   r   rj   r�   Úlistr   rŽ   rc   ÚassertNotEqualr�   r�   r    Úlenr‘   s        r(   Útest_stackElementz%FailureElementTests.test_stackElement)  s  € ô
    d§l¡l×&9Ñ&9¸"¸1Ð&=Ó>ˆØ×-Ñ-¨hÓ7ˆÜ�h‰h‹jˆÙ˜$ Ó$ˆØ×Ñ˜f¤dÔ+Ø×Ñ˜f Q™i¬Ô7Ø×Ñ˜V A™YŸ_™_¨d¯l©l×.AÑ.AÀ!Ñ.DÔEØ×Ñ˜f Q™i¬Ô7Ø×Ñ˜V A™YŸ_™_¨d¯l©l×.AÑ.AÀ!Ñ.DÔEà×Ñ˜F 1™I×,Ñ,×1Ñ1Ó3°V¸A±Y×5EÑ5E×5JÑ5JÓ5LÔMØ×Ñ˜œC ›KÕ(r*   c                 ól  — t        | j                  «      }|j                  d«      }t        j                  «       } |d|«      }| j                  |t        «       | j                  |j                  | j                  j                  «       | j                  |g|j                  j                  «       «       y)zƒ
        The I{traceback} renderer of L{FailureElement} renders the failure's
        stack frames using L{_StackElement}.
        Ú	tracebackN)r   ra   rŒ   r   rj   r�   r   rŽ   ÚstackFramesrb   r    r�   r�   r‘   s        r(   Útest_failureElementTracebackz0FailureElementTests.test_failureElementTraceback;  sˆ   € ô
 ! §¡Ó.ˆØ×-Ñ-¨kÓ:ˆÜ�h‰h‹jˆÙ˜$ Ó$ˆØ×Ñ˜f¤mÔ4Ø×Ñ˜V×/Ñ/°·±×1DÑ1DÔEØ×Ñ˜#˜ §¡× 2Ñ 2Ó 4Õ5r*   c                 óÌ   — t        | j                  t        t        j                  d¬«      «      «      }t        d|«      }d}|j                  | j                  d|z   dz   «       |S )zi
        The I{type} renderer of L{FailureElement} renders the failure's
        exception type.
        Útyperg   Ns   builtins.Exceptionr   r�   ©r   ra   r   r   rk   r   rl   r    )r%   rn   ro   Úexcs       r(   Útest_failureElementTypez+FailureElementTests.test_failureElementTypeH  sU   € ô
 ! §¡¬y¼¿¹È&Ô9QÓ/RÓSˆÜ˜$ Ó(ˆØ#ˆØ	�‰�d×&Ñ&¨	°C©¸*Ñ(DÔEØˆr*   c                 ó¼   — t        | j                  t        t        j                  d¬«      «      «      }t        d|«      }|j                  | j                  d«       |S )zi
        The I{value} renderer of L{FailureElement} renders the value's exception
        value.
        Úvaluerg   Ns   <span>This is a problem</span>r¢   r„   s      r(   Útest_failureElementValuez,FailureElementTests.test_failureElementValueS  sH   € ô
 ! §¡¬y¼¿¹È'Ô9RÓ/SÓTˆÜ˜$ Ó(ˆØ	�‰�d×&Ñ&Ð(IÔJØˆr*   N)r7   r8   r9   r:   rd   rp   r|   r…   r‡   rŠ   r•   r›   rŸ   r¤   r§   r;   r*   r(   rT   rT       s?   „ ñò
1ò$ò&(òTò 	ò	ò6ò)ò$6ò	ór*   rT   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚFormatFailureTestsz‰
    Tests for L{twisted.web.util.formatFailure} which returns an HTML string
    representing the L{Failure} instance passed to it.
    c                 óJ   — | j                  t        t        t        «       «       y)z}
        If there is an error flattening the L{Failure} instance,
        L{formatFailure} raises L{FlattenerError}.
        N)r,   r
   r   ÚobjectrL   s    r(   Útest_flattenerErrorz&FormatFailureTests.test_flattenerErrord  s   € ð
 	×Ñœ.¬-¼»ÕBr*   c                 óò   — 	 t        d«      ‚# t        $ r t        t        «       «      }Y nw xY w| j	                  |t
        «       | j                  t        d„ |D «       «      «       | j                  d|«       y)zÕ
        The return value of L{formatFailure} is a C{str} instance (not a
        C{unicode} instance) with numeric character references for any non-ASCII
        characters meant to appear in the output.
        zFake bugc              3   ó&   K  — | ]	  }|d k  –— Œ y­w)é€   Nr;   )Ú.0Úchs     r(   ú	<genexpr>z7FormatFailureTests.test_returnsBytes.<locals>.<genexpr>w  s   è ø€ Ò6¨˜B �HÑ6ùs   ‚s   &#160;N)	rW   r`   r   r   r�   rR   Ú
assertTrueÚallÚassertIn)r%   r”   s     r(   Útest_returnsBytesz$FormatFailureTests.test_returnsBytesk  sd   € ð	.Ü˜JÓ'Ð'øÜò 	.Ü"¤7£9Ó-ŠFð	.úð 	×Ñ˜f¤eÔ,Ø�‰œÑ6¨vÔ6Ó6Ô7à�‰�i Õ(s   ‚ �,«,N)r7   r8   r9   r:   r¬   r¶   r;   r*   r(   r©   r©   ^  s   „ ñò
Có)r*   r©   c                   ó   — e Zd Zd„ Zd„ Zy)Ú
SDResourcec                 ó   — || _         y ©N)Údefault)r%   r»   s     r(   Ú__init__zSDResource.__init__}  s	   € Øˆ�r*   c                 ó�   — t        j                  | j                  «      }t        j                  |«      } |j
                  ||«      S rº   )r   Úsucceedr»   r	   r   ÚgetChildWithDefault)r%   Únamer&   ro   r   s        r(   r¿   zSDResource.getChildWithDefault€  s9   € Ü�M‰M˜$Ÿ,™,Ó'ˆÜ×(Ñ(¨Ó+ˆØ+ˆx×+Ñ+¨D°'Ó:Ð:r*   N)r7   r8   r9   r¼   r¿   r;   r*   r(   r¸   r¸   |  s   „ òó;r*   r¸   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚDeferredResourceTestsz(
    Tests for L{DeferredResource}.
    c                 óÒ   — t        j                  «       }d|_        t        |«      }t	        g d¢«      }t        j
                  ||«       | j                  |j                  ddg«       y )NrZ   )ÚfooÚbarÚbazrÅ   rÆ   )r   ÚResourceÚisLeafr¸   r   ÚgetChildForRequestr    Úpostpath)r%   ÚrÚsro   s       r(   ÚtestDeferredResourcez*DeferredResourceTests.testDeferredResource‹  sS   € Ü×ÑÓˆØˆŒÜ�q‹MˆÜÒ.Ó/ˆÜ×#Ñ# A qÔ)Ø×Ñ˜Ÿ™ e¨U ^Õ4r*   c                 óì   — g }t        g «      }|j                  |_        t        j                  «       }t        t        j                  |«      «      }|j                  |«       | j                  ||g«       y)z­
        L{DeferredResource} uses the request object's C{render} method to
        render the resource which is the result of the L{Deferred} being
        handled.
        N)	r   ÚappendrE   r   rÇ   r   r   r¾   r    )r%   Úrenderedr&   r”   ÚdeferredResources        r(   Útest_renderz!DeferredResourceTests.test_render“  s`   € ð ˆÜ˜rÓ"ˆØ!Ÿ™ˆŒä×"Ñ"Ó$ˆÜ+¬E¯M©M¸&Ó,AÓBÐØ×Ñ Ô(Ø×Ñ˜ F 8Õ,r*   c                 óx  — t        g «      }|j                  «       }t        t        «       «      }t	        t        j                  |«      «      }|j                  |«       | j                  | j                  |«      |«       ~t        j                  «        | j                  t        «      }| j                  |g «       y)z°
        If the L{Deferred} fails, L{DeferredResource} reports the failure via
        C{processingFailed}, and does not cause an unhandled error to be
        logged.
        N)r   ÚnotifyFinishr   ÚRuntimeErrorr   r   ÚfailrE   r    ÚfailureResultOfÚgcÚcollectÚflushLoggedErrors)r%   r&   ro   ra   rÑ   Úerrorss         r(   Útest_renderNoFailurez*DeferredResourceTests.test_renderNoFailure¢  s‘   € ô ˜rÓ"ˆØ× Ñ Ó"ˆÜœ,›.Ó)ˆÜ+¬E¯J©J°wÓ,?Ó@ÐØ×Ñ Ô(Ø×Ñ˜×-Ñ-¨aÓ0°'Ô:ØÜ
�
‰
ŒØ×'Ñ'¬Ó5ˆØ×Ñ˜ Õ$r*   N)r7   r8   r9   r:   rÍ   rÒ   rÜ   r;   r*   r(   rÂ   rÂ   †  s   „ ñò5ò-ó%r*   rÂ   ),r:   rØ   Útwisted.internetr   Útwisted.python.compatr   Útwisted.python.failurer   Útwisted.trial.unittestr   r   Útwisted.webr   r	   Útwisted.web.errorr
   Útwisted.web.httpr   Útwisted.web.serverr   Útwisted.web.templater   r   r   Útwisted.web.test.requesthelperr   r   Útwisted.web.utilr   r   r   r   r   r   r   r   r   r   r=   rT   r©   rÇ   r¸   rÂ   r;   r*   r(   ú<module>rè      s–   ðñó 
å "Ý /Ý *ß @ß &Ý ,Ý "Ý &ß ?Ñ ?ß E÷
÷ 
õ 
ôE)�hô E)ôP4
Ð-ô 4
ôn{˜(ô {ô|)˜ô )ô<;�×"Ñ"ô ;ô+%Ð/õ +%r*   