§
    ÈtºfÃ! ã                  óÜ	  — d Z ddlmZ ddlZddlZddlZddlZddl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 dd	lmZ dd
lmZm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%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZD 	 ddlEmFZFmGZG n# eH$ r dZFdZGY nw xY wd„ ZI G d„ deD¦  «        ZJ G d„ d¦  «        ZK G d „ d!eC¦  «        ZL G d"„ d#eC¦  «        ZM G d$„ d%eD¦  «        ZN ee1jO        e1jP        e1jQ        ¦  «         G d&„ d'¦  «        ¦   «         ZR ee1jO        e1jP        ¦  «         G d(„ d)¦  «        ¦   «         ZS G d*„ d+e1jT        ¦  «        ZU G d,„ d-eUe1jV        ¦  «        ZW G d.„ d/e1jX        ¦  «        ZY G d0„ d1e1jZ        ¦  «        Z[ G d2„ d3¦  «        Z\ G d4„ d5e\eD¦  «        Z] G d6„ d7eC¦  «        Z^ G d8„ d9e\eD¦  «        Z_ ee"¦  «         G d:„ d;¦  «        ¦   «         Z` G d<„ d=¦  «        Za G d>„ d?e\eD¦  «        Zb G d@„ dAeD¦  «        Zc G dB„ dCe\eD¦  «        Zd G dD„ dEeD¦  «        Ze G dF„ dGe1jZ        ¦  «        Zf G dH„ dIe\eD¦  «        Zg G dJ„ dK¦  «        Zh G dL„ dMeh¦  «        Zi G dN„ dOeieC¦  «        Zj G dP„ dQeieC¦  «        Zk G dR„ dSeheC¦  «        Zl G dT„ dUeheC¦  «        Zm G dV„ dWeheC¦  «        Zn G dX„ dYeheD¦  «        Zo G dZ„ d[eheC¦  «        Zp G d\„ d]eheC¦  «        Zq G d^„ d_e1jX        ¦  «        Zr ee1js        ¦  «         G d`„ dae=jt        ¦  «        ¦   «         Zu G db„ dceDe\¦  «        Zv G dd„ deeD¦  «        Zw G df„ dgeDe\¦  «        Zx G dh„ die\eD¦  «        Zy ee1jz        ¦  «         G dj„ dkeDe\¦  «        ¦   «         Z{ G dl„ dm¦  «        Z| ee1j}        ¦  «         G dn„ do¦  «        ¦   «         Z~ ee1j        ¦  «         G dp„ dq¦  «        ¦   «         Z€ G dr„ dseD¦  «        Z� eeF dt¦  «         e e'j‚        e(d¦  «         du¦  «         G dv„ dwe\eD¦  «        ¦   «         ¦   «         Zƒ G dx„ dyeR¦  «        Z„ G dz„ d{e\eD¦  «        Z… G d|„ d}eD¦  «        Z† G d~„ d¦  «        Z‡ G d€„ d�eD¦  «        Zˆ G d‚„ dƒeD¦  «        Z‰ G d„„ d…¦  «        ZŠ G d†„ d‡eŠeC¦  «        Z‹ G dˆ„ d‰eŠeD¦  «        ZŒ G dŠ„ d‹eC¦  «        Z�dS )Œz"
Test case for twisted.mail.imap4
é    )ÚannotationsN)ÚOrderedDict©ÚBytesIO)Úchain)ÚOptionalÚType)ÚskipIf)Úimplementer)ÚverifyClassÚverifyObject)Ú'InMemoryUsernamePasswordDatabaseDontUse)ÚCramMD5CredentialsÚIUsernameHashedPasswordÚIUsernamePassword©ÚUnauthorizedLogin)ÚIRealmÚPortal)ÚdeferÚerrorÚ
interfacesÚreactor)ÚDeferred)ÚClock)ÚStringTransportÚ StringTransportWithDisconnection)Úimap4)Ú
MessageSet)ÚIChallengeResponseÚIClientAuthenticationÚICloseableMailboxIMAP)Úloopback)ÚfailureÚlogÚutil)Ú	iterbytesÚnativeStringÚnetworkString)ÚSynchronousTestCaseÚTestCase)ÚClientTLSContextÚServerTLSContextc                ó   — | fd„S )Nc                ó   —  |¦   «         S ©N© )ÚresultÚfs     úZ/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/mail/test/test_imap.pyú<lambda>zstrip.<locals>.<lambda>:   s   € ˜q˜q™sœs€ ó    r1   )r3   s    r4   Ústripr7   9   s   € ØÐ"Ð"Ð"Ð"r6   c                  óf   — e Zd Zddgddgddgddgd	d
ggZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ ZdS )ÚIMAP4UTF7TestsúHello worldó   Hello worldzHello & worlds   Hello &- worldõ   HelloÃ¿worldó   Hello&AP8-worldu   Ã¿Ã¾Ã½Ã¼s   &AP8A,gD9APw-u   ~peter/mail/æ—¥æœ¬èªž/å�°åŒ—s   ~peter/mail/&ZeVnLIqe-/&U,BTFw-c                ó„   — d}|                       |                     dd¦  «        |                     d¦  «        ¦  «         dS )z²
        Specifying an error policy to C{unicode.encode} with the
        I{imap4-utf-7} codec should produce the same result as not
        specifying the error policy.
        r:   úimap4-utf-7ÚstrictN©ÚassertEqualÚencode©ÚselfÚtexts     r4   Útest_encodeWithErrorsz$IMAP4UTF7Tests.test_encodeWithErrorsI   sJ   € ð ˆØ×ÒØ�KŠK˜ xÑ0Ô0°$·+²+¸mÑ2LÔ2Lñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó„   — d}|                       |                     dd¦  «        |                     d¦  «        ¦  «         dS )zO
        Similar to L{test_encodeWithErrors}, but for C{bytes.decode}.
        r;   r?   r@   N©rB   Údecode©rE   Úbytess     r4   Útest_decodeWithErrorsz$IMAP4UTF7Tests.test_decodeWithErrorsT   sJ   € ð ˆØ×ÒØ�LŠL˜¨Ñ1Ô1°5·<²<ÀÑ3NÔ3Nñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó\   — d}|                       |                     d¦  «        d¦  «         dS )z�
        Unicode strings that contain an ampersand (C{&}) can be
        encoded to bytes with the I{imap4-utf-7} codec.
        u
   &Hello&Â½&r?   s   &-Hello&-&AL0-&-NrA   rD   s     r4   Útest_encodeAmpersandz#IMAP4UTF7Tests.test_encodeAmpersand]   s=   € ð
 6ˆØ×ÒØ�KŠK˜Ñ&Ô&Øñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óX   — |                       d                     d¦  «        d¦  «         dS )zŠ
        An I{imap4-utf-7} encoded string that does not shift back to
        ASCII (i.e., it lacks a final C{-}) can be decoded.
        s   &AL0r?   õ   Â½NrI   ©rE   s    r4   Ú!test_decodeWithoutFinalASCIIShiftz0IMAP4UTF7Tests.test_decodeWithoutFinalASCIIShifth   s8   € ð
 	×ÒØ�NŠN˜=Ñ)Ô)Ø*ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óª   —  t          j        d¦  «        t          d¦  «        ¦  «        }|                      |                     ¦   «         d¦  «         dS )zl
        C{codecs.getreader('imap4-utf-7')} returns the I{imap4-utf-7} stream
        reader class.
        r?   r=   r<   N)ÚcodecsÚ	getreaderr   rB   Úread)rE   Úreaders     r4   Útest_getreaderzIMAP4UTF7Tests.test_getreaderr   sL   € ð
 1•Ô! -Ñ0Ô0µÐ9KÑ1LÔ1LÑMÔMˆØ×Ò˜Ÿš™œÐ(8Ñ9Ô9Ð9Ð9Ð9r6   c                óÖ   — t          ¦   «         } t          j        d¦  «        |¦  «        }|                     d¦  «         |                      |                     ¦   «         d¦  «         dS )zl
        C{codecs.getwriter('imap4-utf-7')} returns the I{imap4-utf-7} stream
        writer class.
        r?   r<   r=   N)r   rU   Ú	getwriterÚwriterB   Úgetvalue)rE   ÚoutputÚwriters      r4   Útest_getwriterzIMAP4UTF7Tests.test_getwriterz   sa   € õ
 ‘”ˆØ0•Ô! -Ñ0Ô0°Ñ8Ô8ˆØ�ŠÐ%Ñ&Ô&Ð&Ø×Ò˜ŸšÑ*Ô*Ð,>Ñ?Ô?Ð?Ð?Ð?r6   c                ór   — | j         D ].\  }}|                      |                     d¦  «        |¦  «         Œ/dS )zœ
        The I{imap4-utf-7} can be used to encode a unicode string into a byte
        string according to the IMAP4 modified UTF-7 encoding rules.
        r?   N)ÚtestsrB   rC   ©rE   Úinputr^   s      r4   Útest_encodezIMAP4UTF7Tests.test_encode„   sL   € ð
 "œZð 	Bð 	B‰MˆE�6Ø×Ò˜UŸ\š\¨-Ñ8Ô8¸&ÑAÔAÐAÐAð	Bð 	Br6   c                ór   — | j         D ].\  }}|                      ||                     d¦  «        ¦  «         Œ/dS )zœ
        The I{imap4-utf-7} can be used to decode a byte string into a unicode
        string according to the IMAP4 modified UTF-7 encoding rules.
        r?   N)rb   rB   rJ   rc   s      r4   Útest_decodezIMAP4UTF7Tests.test_decodeŒ   sL   € ð
 "œZð 	Bð 	B‰MˆE�6Ø×Ò˜U F§M¢M°-Ñ$@Ô$@ÑAÔAÐAÐAð	Bð 	Br6   c                ó"  — t          t          dd¦  «        t          dd¦  «        ¦  «        D ]�}t          |¦  «                             ¦   «         }|                      |t          |¦  «                             d¦  «        ¦  «         |                      t          |¦  «        |                     d¦  «        ¦  «         Œ�|                      d                     d¦  «        d¦  «         |                      d                     d¦  «        d¦  «         dS )	z™
        The IMAP4 modified UTF-7 implementation encodes all printable
        characters which are in ASCII using the corresponding ASCII byte.
        é    é&   é'   é   r?   ú&s   &-N)r   ÚrangeÚchrrC   rB   rJ   )rE   ÚoÚcharbytes      r4   Útest_printableSingletonsz'IMAP4UTF7Tests.test_printableSingletons”   sã   € õ •u˜T 4Ñ(Ô(­%°°dÑ*;Ô*;Ñ<Ô<ð 	Eð 	EˆAÝ˜1‘v”v—}’}‘”ˆHØ×Ò˜X¥s¨1¡v¤v§}¢}°]Ñ'CÔ'CÑDÔDÐDØ×Ò�S ™VœV X§_¢_°]Ñ%CÔ%CÑDÔDÐDÐDØ×Ò˜Ÿš MÑ2Ô2°EÑ:Ô:Ð:Ø×Ò˜Ÿš mÑ4Ô4°cÑ:Ô:Ð:Ð:Ð:r6   N)Ú__name__Ú
__module__Ú__qualname__rb   rG   rM   rO   rS   rY   r`   re   rg   rr   r1   r6   r4   r9   r9   =   sÙ   € € € € € à	˜Ð'Ø	Ð+Ð,Ø	Ð-Ð.Ø	Ð-Ð.à9Ø.ð	
ð	€Eð	
ð 	
ð 	
ð
ð 
ð 
ð	
ð 	
ð 	
ð
ð 
ð 
ð:ð :ð :ð@ð @ð @ðBð Bð BðBð Bð Bð;ð ;ð ;ð ;ð ;r6   r9   c                  ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚBufferingConsumerc                ó   — g | _         d S r0   )ÚbufferrR   s    r4   Ú__init__zBufferingConsumer.__init__£   s   € ØˆŒˆˆr6   c                ó~   — | j                              |¦  «         | j        r| j                             ¦   «          d S d S r0   )ry   ÚappendÚconsumerÚresumeProducingrK   s     r4   r\   zBufferingConsumer.write¦   sF   € ØŒ×Ò˜5Ñ!Ô!Ð!ØŒ=ð 	,ØŒM×)Ò)Ñ+Ô+Ð+Ð+Ð+ð	,ð 	,r6   c                óF   — || _         | j                              ¦   «          d S r0   )r}   r~   )rE   r}   Ú	streamings      r4   ÚregisterProducerz"BufferingConsumer.registerProducer«   s#   € Ø ˆŒØŒ×%Ò%Ñ'Ô'Ð'Ð'Ð'r6   c                ó   — d | _         d S r0   )r}   rR   s    r4   ÚunregisterProducerz$BufferingConsumer.unregisterProducer¯   s   € ØˆŒˆˆr6   N)rs   rt   ru   rz   r\   r�   rƒ   r1   r6   r4   rw   rw   ¢   sP   € € € € € ðð ð ð,ð ,ð ,ð
(ð (ð (ðð ð ð ð r6   rw   c                  ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚMessageProducerTestsc                ó"  ‡ ‡‡‡— dŠt          ¦   «         }d|d<   d|d<   d|d<   d|d	<   t          |d
d ‰dd ¦  «        }t          ¦   «         Št          j        |¦  «        Š‰                     ‰¦  «        }ˆˆˆˆ fd„}|                     |¦  «        S )Ns   This is body text.  Rar.úsender@hostÚfromúrecipient@domainÚtoúbooga booga booÚsubjectú
text/plainúcontent-typer1   é{   c                ó–   •— ‰                      | ‰¦  «         ‰                     d                     ‰j        ¦  «        d‰z   ¦  «         d S )Nr6   sf   {119}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: text/plain

)ÚassertIdenticalrB   Újoinry   )r2   ÚbodyÚcÚprE   s    €€€€r4   Ú
cbProducedz7MessageProducerTests.testSinglePart.<locals>.cbProducedÂ   s[   ø€ Ø× Ò  ¨Ñ+Ô+Ð+Ø×ÒØ—’˜œÑ"Ô"ðð
 ññô ð ð ð r6   ©r   ÚFakeyMessagerw   r   ÚMessageProducerÚbeginProducingÚaddCallback)rE   ÚheadersÚmsgÚdr–   r“   r”   r•   s   `    @@@r4   ÚtestSinglePartz#MessageProducerTests.testSinglePart´   s»   øøøø€ Ø*ˆÝ‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�Ñå˜7 B¨¨d°C¸Ñ>Ô>ˆåÑÔˆÝÔ! #Ñ&Ô&ˆØ×Ò˜QÑÔˆð
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð �}Š}˜ZÑ(Ô(Ð(r6   c                ó|  ‡ ‡‡‡	— d}dŠt          ¦   «         }d|d<   d|d<   d|d<   d	|d
<   t          ¦   «         }d|d<   d|d
<   t          |dd |dt          |dd ‰d d ¦  «        g¦  «        }t          ¦   «         Št          j        |¦  «        Š	‰	                     ‰¦  «        }ˆˆˆ	ˆ fd„}|                     |¦  «        S )Nr6   ó&   Contained body message text.  Squarge.r‡   rˆ   r‰   rŠ   r‹   rŒ   ú%multipart/alternative; boundary="xyz"rŽ   úthis is subject textr�   r1   r�   c                óœ   •— ‰                      | ‰¦  «         ‰                     d                     ‰j        ¦  «        d‰z   dz   ¦  «         d S )Nr6   sÅ   {239}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

ó   
--xyz--
©ÚfailUnlessIdenticalrB   r’   ry   ©r2   r”   Ú	innerBodyr•   rE   s    €€€€r4   r–   z<MessageProducerTests.testSingleMultiPart.<locals>.cbProducedé   se   ø€ Ø×$Ò$ V¨QÑ/Ô/Ð/à×ÒØ—’˜œÑ"Ô"ð
ð $ñ
$ð '9ñ
9ñô ð ð ð r6   r—   ©
rE   Ú	outerBodyrœ   ÚinnerHeadersr�   rž   r–   r”   r©   r•   s
   `      @@@r4   ÚtestSingleMultiPartz(MessageProducerTests.testSingleMultiPartÐ   sþ   øøøø€ Øˆ	Ø=ˆ	Ý‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�Ñå"‘}”}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÝØØØØØÝ˜,¨¨D°)¸TÀ4ÑHÔHÐIñ
ô 
ˆõ ÑÔˆÝÔ! #Ñ&Ô&ˆØ×Ò˜QÑÔˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð$ �}Š}˜ZÑ(Ô(Ð(r6   c                óÚ  ‡ ‡‡	‡
‡— d}dŠ	dŠ
t          ¦   «         }d|d<   d|d<   d|d	<   d
|d<   t          ¦   «         }d|d	<   d|d<   t          ¦   «         }d|d	<   d|d<   t          |dd |dt          |dd ‰	d d ¦  «        t          |dd ‰
d d ¦  «        g¦  «        }t          ¦   «         Št          j        |¦  «        Š‰                     ‰¦  «        }ˆˆ	ˆ
ˆˆ fd„}|                     |¦  «        S )Nr6   r¡   ó.   Secondary <i>message</i> text of squarge body.r‡   rˆ   r‰   rŠ   r‹   rŒ   r¢   rŽ   r£   r�   ú<b>this is subject</b>ú	text/htmlr1   r�   c                ó¨   •— ‰                      | ‰¦  «         ‰                     d                     ‰j        ¦  «        d‰z   dz   ‰z   dz   ¦  «         d S )Nr6   sÅ   {354}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="xyz"


--xyz
Subject: this is subject text
Content-Type: text/plain

sE   
--xyz
Subject: <b>this is subject</b>
Content-Type: text/html

r¥   r¦   )r2   r”   Ú
innerBody1Ú
innerBody2r•   rE   s    €€€€€r4   r–   z>MessageProducerTests.testMultipleMultiPart.<locals>.cbProduced  sy   ø€ Ø×$Ò$ V¨QÑ/Ô/Ð/à×ÒØ—’˜œÑ"Ô"ð
ð %ñ
%ð(ñð %ñ%ð (:ñ:ñô ð ð ð r6   r—   )rE   r«   rœ   r¬   ÚinnerHeaders2r�   rž   r–   r”   r³   r´   r•   s   `       @@@@r4   ÚtestMultipleMultiPartz*MessageProducerTests.testMultipleMultiPartý   s=  øøøøø€ Øˆ	Ø>ˆ
ØFˆ
Ý‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÝ"‘}”}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ý#™œˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%ÝØØØØØå˜\¨2¨t°ZÀÀtÑLÔLÝ˜]¨B°°jÀ$ÈÑMÔMðñ

ô 

ˆõ ÑÔˆÝÔ! #Ñ&Ô&ˆØ×Ò˜QÑÔˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð* �}Š}˜ZÑ(Ô(Ð(r6   c                óŒ  ‡ ‡‡‡	— d}dŠt          ¦   «         }d|d<   d|d<   d|d<   d	|d
<   t          ¦   «         }d|d<   d|d
<   t          |dd|dt          |dd‰dd¦  «        g¦  «        }t          ¦   «         Št          j        |¦  «        Š	d„ ‰	_        ‰	                     ‰¦  «        }ˆˆˆ	ˆ fd„}|                     |¦  «        S )z>
        A boundary is generated if none is provided.
        r6   r¡   r‡   rˆ   r‰   rŠ   r‹   rŒ   úmultipart/alternativerŽ   r£   r�   r1   Nr�   c                 ó*   — t          j        d¦  «        S )Nz$aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa)ÚuuidÚUUIDr1   r6   r4   r5   z?MessageProducerTests.test_multiPartNoBoundary.<locals>.<lambda>M  s   € �4œ9Ð%KÑLÔL€ r6   c                óœ   •— ‰                      | ‰¦  «         ‰                     d                     ‰j        ¦  «        d‰z   dz   ¦  «         d S )Nr6   s	  {341}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary="----=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"


------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Subject: this is subject text
Content-Type: text/plain

s-   
------=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--
r¦   r¨   s    €€€€r4   r–   zAMessageProducerTests.test_multiPartNoBoundary.<locals>.cbProducedQ  sg   ø€ Ø×$Ò$ V¨QÑ/Ô/Ð/Ø×ÒØ—’˜œÑ"Ô"ðð ñð GñGñô ð ð ð r6   )r   r˜   rw   r   r™   Ú_uuid4rš   r›   rª   s
   `      @@@r4   Útest_multiPartNoBoundaryz-MessageProducerTests.test_multiPartNoBoundary3  s
  øøøø€ ð ˆ	Ø=ˆ	Ý‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"9ˆ�Ñå"‘}”}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÝØØØØØÝ˜,¨¨D°)¸TÀ4ÑHÔHÐIñ
ô 
ˆõ ÑÔˆÝÔ! #Ñ&Ô&ˆØLÐLˆŒà×Ò˜QÑÔˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð* �}Š}˜ZÑ(Ô(Ð(r6   c                ó|  ‡ ‡‡‡	— d}dŠt          ¦   «         }d|d<   d|d<   d|d<   d	|d
<   t          ¦   «         }d|d<   d|d
<   t          |dd|dt          |dd‰dd¦  «        g¦  «        }t          ¦   «         Št          j        |¦  «        Š	‰	                     ‰¦  «        }ˆˆˆ	ˆ fd„}|                     |¦  «        S )z>
        A boundary without does not have them added.
        r6   r¡   r‡   rˆ   r‰   rŠ   r‹   rŒ   z#multipart/alternative; boundary=xyzrŽ   r£   r�   r1   Nr�   c                óœ   •— ‰                      | ‰¦  «         ‰                     d                     ‰j        ¦  «        d‰z   dz   ¦  «         d S )Nr6   sÃ   {237}
From: sender@host
To: recipient@domain
Subject: booga booga boo
Content-Type: multipart/alternative; boundary=xyz


--xyz
Subject: this is subject text
Content-Type: text/plain

r¥   r¦   r¨   s    €€€€r4   r–   z?MessageProducerTests.test_multiPartNoQuotes.<locals>.cbProduced„  se   ø€ Ø×$Ò$ V¨QÑ/Ô/Ð/Ø×ÒØ—’˜œÑ"Ô"ðð $ñ$ð '9ñ9ñô ð ð ð r6   r—   rª   s
   `      @@@r4   Útest_multiPartNoQuotesz+MessageProducerTests.test_multiPartNoQuotesh  s   øøøø€ ð ˆ	Ø=ˆ	Ý‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Gˆ�Ñå"‘}”}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$ÝØØØØØÝ˜,¨¨D°)¸TÀ4ÑHÔHÐIñ
ô 
ˆõ ÑÔˆÝÔ! #Ñ&Ô&ˆØ×Ò˜QÑÔˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð& �}Š}˜ZÑ(Ô(Ð(r6   N)rs   rt   ru   rŸ   r­   r¶   r¾   rÁ   r1   r6   r4   r…   r…   ³   sb   € € € € € ð)ð )ð )ð8+)ð +)ð +)ðZ4)ð 4)ð 4)ðl3)ð 3)ð 3)ðj/)ð /)ð /)ð /)ð /)r6   r…   c                  ó~   — 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d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚMessageSetTestsz"
    Tests for L{MessageSet}.
    c                óð  — t          ¦   «         }t          ¦   «         }|                      ||¦  «         |                      |d¦  «         |dz   }|                      t          |¦  «        d¦  «         |                      t	          |¦  «        dg¦  «         |dz   }|                      t          |¦  «        d¦  «         |                      t	          |¦  «        g d¢¦  «         |dz   }|                      ||¦  «         |                      t	          ||z   ¦  «        g d¢¦  «         |                     d¦  «         |                      t          |¦  «        d¦  «         |                      t	          |¦  «        g d¢¦  «         |                      ||¦  «         |                     d	d
¦  «         |                      t          |¦  «        d¦  «         |                      t	          |¦  «        g d¢¦  «         dS )a4  
        Test the following properties of L{MessageSet} addition and
        equality:

            1. Two empty L{MessageSet}s are equal to each other;

            2. A L{MessageSet} is not equal to any other object;

            2. Adding a L{MessageSet} and another L{MessageSet} or an
               L{int} representing a single message or a sequence of
               L{int}s representing a sequence of message numbers
               produces a new L{MessageSet} that:

            3. Has a length equal to the number of messages within
               each sequence of message numbers;

            4. Yields each message number in ascending order when
               iterated over;

            6. L{MessageSet.add} with a single message or a start and
               end message satisfies 3 and 4 above.
        r1   é   ©rÅ   é   rÇ   ©rÅ   é   rÇ   é   é   )rÅ   rÉ   rÇ   rÊ   é   é   é   )rÅ   rÉ   rÇ   rÊ   rÌ   rÎ   rÍ   N)r   rB   ÚassertNotEqualÚlenÚlistÚadd)rE   Úm1Úm2s      r4   Ú!test_equalityIterationAndAdditionz1MessageSetTests.test_equalityIterationAndAdditionŸ  sÄ  € õ. ‰\Œ\ˆÝ‰\Œ\ˆà×Ò˜˜RÑ Ô Ð Ø×Ò˜B Ñ#Ô#Ð#à�!‰VˆØ×Ò�˜R™œ !Ñ$Ô$Ð$Ø×Ò�˜b™œ A 3Ñ'Ô'Ð'à�&‰[ˆØ×Ò�˜R™œ !Ñ$Ô$Ð$Ø×Ò�˜b™œ 9 9 9Ñ-Ô-Ð-à�&‰[ˆØ×Ò˜˜RÑ Ô Ð Ø×Ò�˜b 2™g™œ¨	¨	¨	Ñ2Ô2Ð2à
�Šˆq‰	Œ	ˆ	Ø×Ò�˜R™œ !Ñ$Ô$Ð$Ø×Ò�˜b™œ < < <Ñ0Ô0Ð0à×Ò˜B Ñ#Ô#Ð#à
�Šˆq�!‰ŒˆØ×Ò�˜R™œ !Ñ$Ô$Ð$Ø×Ò�˜b™œÐ#8Ð#8Ð#8Ñ9Ô9Ð9Ð9Ð9r6   c                ód   — |                       t          t          t          dd¦  «        ¦  «         dS )z…
        A L{MessageSet} that has a range that ends with L{None} raises
        a L{TypeError} when its length is requested.
        rÅ   N)ÚassertRaisesÚ	TypeErrorrÐ   r   rR   s    r4   Útest_lengthWithWildcardRangez,MessageSetTests.test_lengthWithWildcardRangeÒ  s,   € ð
 	×Ò�)¥S­*°Q¸Ñ*=Ô*=Ñ>Ô>Ð>Ð>Ð>r6   c                ó@   — t          t          dd¦  «        ¦  «         dS )zD
        L{MessageSet.__repr__} does not raise an exception
        rÅ   rÉ   N)Úreprr   rR   s    r4   Útest_reprSanityzMessageSetTests.test_reprSanityÙ  s"   € õ 	�Z˜˜1ÑÔÑÔÐÐÐr6   c                ó   — t          j        d¦  «        t          j        d¦  «        t          j        dd¦  «        t          j        dd¦  «        g}g d¢}t          ||¦  «        D ](\  }}|                      t	          |¦  «        |¦  «         Œ)dS )z¬
        In a L{MessageSet}, in the presence of wildcards, if the
        highest message id is known, the wildcard should get replaced
        by that high value.
        ó   *ó   1:*s   3:*rÌ   s   *:2)Ú*ú1:*z3:6z2:6N©r   ÚparseIdListÚziprB   Ústr©rE   ÚinputsÚoutputsÚirp   s        r4   Ú&test_stringRepresentationWithWildcardsz6MessageSetTests.test_stringRepresentationWithWildcardsß  s    € õ Ô˜dÑ#Ô#ÝÔ˜fÑ%Ô%ÝÔ˜f aÑ(Ô(ÝÔ˜f aÑ(Ô(ð	
ˆð
ð 
ð 
ˆõ ˜ Ñ(Ô(ð 	(ð 	(‰DˆAˆqØ×Ò�S ™VœV QÑ'Ô'Ð'Ð'ð	(ð 	(r6   c                óÐ   — t          j        d¦  «        t          j        d¦  «        g}ddg}t          ||¦  «        D ](\  }}|                      t	          |¦  «        |¦  «         Œ)dS )z÷
        In a L{MessageSet}, inverting the high and low numbers in a
        range doesn't affect the meaning of the range.  For example,
        3:2 displays just like 2:3, because according to the RFC they
        have the same meaning.
        ó   2:3s   3:2ú2:3Nrâ   ræ   s        r4   Ú&test_stringRepresentationWithInversionz6MessageSetTests.test_stringRepresentationWithInversionö  s~   € õ Ô˜fÑ%Ô%ÝÔ˜fÑ%Ô%ð
ˆð Øð
ˆõ
 ˜ Ñ(Ô(ð 	(ð 	(‰DˆAˆqØ×Ò�S ™VœV QÑ'Ô'Ð'Ð'ð	(ð 	(r6   c                óø   — t          d¦  «        }|                      t          |¦  «        d¦  «         |                      t          |¦  «        d¦  «         |                      t	          |¦  «        dg¦  «         dS )zþ
        Creating a L{MessageSet} with a single message number adds
        only that message to the L{MessageSet}; its serialized form
        includes only that message number, its length is one, and it
        yields only that message number.
        rÅ   Ú1N©r   rB   rå   rÐ   rÑ   ©rE   Úms     r4   Ú"test_createWithSingleMessageNumberz2MessageSetTests.test_createWithSingleMessageNumber
  sk   € õ �q‰MŒMˆØ×Ò�˜Q™œ Ñ%Ô%Ð%Ø×Ò�˜Q™œ Ñ#Ô#Ð#Ø×Ò�˜a™œ 1 #Ñ&Ô&Ð&Ð&Ð&r6   c                óü   — t          dd¦  «        }|                      t          |¦  «        d¦  «         |                      t          |¦  «        d¦  «         |                      t	          |¦  «        g d¢¦  «         dS )a?  
        Creating a L{MessageSet} with both a start and end message
        number adds the sequence between to the L{MessageSet}; its
        serialized form consists that range, its length is the length
        of the sequence, and it yields the message numbers inclusively
        between the start and end.
        rÅ   é
   z1:10)
rÅ   rÉ   rÇ   rË   rÊ   rÌ   rÎ   rÍ   é	   rö   Nrñ   rò   s     r4   Útest_createWithSequencez'MessageSetTests.test_createWithSequence  st   € õ �q˜"ÑÔˆØ×Ò�˜Q™œ Ñ(Ô(Ð(Ø×Ò�˜Q™œ Ñ$Ô$Ð$Ø×Ò�˜a™œÐ"AÐ"AÐ"AÑBÔBÐBÐBÐBr6   c                óò   — t          d¦  «        }|                      t          |¦  «        d¦  «         |                      t          |¦  «        d¦  «         |                      t
          t          |¦  «         dS )zÿ
        Creating a L{MessageSet} with a single L{None}, representing
        C{*}, adds C{*} to the range; its serialized form includes
        only C{*}, its length is one, but it cannot be iterated over
        because its endpoint is unknown.
        Nrà   rÅ   )r   rB   rå   rÐ   r×   rØ   rÑ   rò   s     r4   Útest_createWithSingleWildcardz-MessageSetTests.test_createWithSingleWildcard#  sg   € õ �tÑÔˆØ×Ò�˜Q™œ Ñ%Ô%Ð%Ø×Ò�˜Q™œ Ñ#Ô#Ð#Ø×Ò�)¥T¨1Ñ-Ô-Ð-Ð-Ð-r6   c                óò   — t          d¦  «        }d|_        |                      t          |¦  «        dg¦  «         t          dd¦  «        }d|_        |                      t          |¦  «        g d¢¦  «         dS )z�
        Setting L{MessageSet.last} replaces L{None}, representing
        C{*}, with that number, making that L{MessageSet} iterable.
        Nrö   rÇ   rÅ   rÈ   )r   ÚlastrB   rÑ   )rE   ÚsingleMessageReplacedÚrangeReplaceds      r4   Útest_setLastSingleWildcardz*MessageSetTests.test_setLastSingleWildcard/  s{   € õ
 !+¨4Ñ 0Ô 0ÐØ%'ÐÔ"Ø×Ò�Ð3Ñ4Ô4°r°dÑ;Ô;Ð;å" 1 dÑ+Ô+ˆØˆÔØ×Ò�˜mÑ,Ô,¨i¨i¨iÑ8Ô8Ð8Ð8Ð8r6   c                óª   — t          dd¦  «        }|                     dd¦  «         d|_        |                      t	          |¦  «        g d¢¦  «         dS )zL
        Setting L{MessageSet.last} replaces L{None} in all ranges.
        rÅ   NrÉ   rÊ   ©rÅ   rÉ   rÇ   rË   rÊ   )r   rÒ   rü   rB   rÑ   rò   s     r4   Útest_setLastWithWildcardRangez-MessageSetTests.test_setLastWithWildcardRange<  sQ   € õ �q˜$ÑÔˆØ	�Šˆa�‰ŒˆØˆŒØ×Ò�˜a™œ / / /Ñ2Ô2Ð2Ð2Ð2r6   c                ó¨   — t          dd¦  «        }d|_        |                      t          ¦  «        5  d|_        ddd¦  «         dS # 1 swxY w Y   dS )z9
        L{MessageSet.last} cannot be set twice.
        rÅ   NrÉ   rÇ   )r   rü   r×   Ú
ValueErrorrò   s     r4   Útest_setLastTwiceFailsz&MessageSetTests.test_setLastTwiceFailsE  s™   € õ �q˜$ÑÔˆØˆŒØ×Ò�zÑ*Ô*ð 	ð 	ØˆAŒFð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ²AÁAÁAc                ól  — t          d¦  «        }d|_        |                     d¦  «         |                      t	          |¦  «        ddg¦  «         |                      t	          |dz   ¦  «        g d¢¦  «         |                     dd¦  «         |                      t	          |¦  «        g d¢¦  «         dS )a  
        Adding a L{None}, representing C{*}, or a sequence that
        includes L{None} to a L{MessageSet} whose
        L{last<MessageSet.last>} property has been set replaces all
        occurrences of L{None} with the value of
        L{last<MessageSet.last>}.
        rÅ   rË   N)NrÊ   )rÅ   rË   rÊ   rÇ   )rÅ   rÇ   rË   )r   rü   rÒ   rB   rÑ   )rE   ÚhasLasts     r4   Útest_lastOverridesNoneInAddz+MessageSetTests.test_lastOverridesNoneInAddN  s©   € õ ˜Q‘-”-ˆØˆŒà�Š�DÑÔÐØ×Ò�˜g™œ¨¨A¨Ñ/Ô/Ð/à×Ò�˜g¨	Ñ1Ñ2Ô2°I°I°IÑ>Ô>Ð>à�Š�A�tÑÔÐØ×Ò�˜g™œ¨	¨	¨	Ñ2Ô2Ð2Ð2Ð2r6   c                ój   — t          dd¦  «        }d|_        |                      |j        d¦  «         dS )zF
        Accessing L{MessageSet.last} returns the last value.
        rÅ   NrÉ   )r   rü   rB   rò   s     r4   Útest_getLastzMessageSetTests.test_getLasta  s8   € õ �q˜$ÑÔˆØˆŒØ×Ò˜œ Ñ#Ô#Ð#Ð#Ð#r6   c                óè  — t          ¦   «         }|                     d¦  «         |                      t          |¦  «        dg¦  «         t          ¦   «         }|                     d¦  «         |                      t	          |¦  «        d¦  «         t          ¦   «         }|                     d¦  «         |                      t          |¦  «        g d¢¦  «         t          ¦   «         }|                     d¦  «         |                      t	          |¦  «        d¦  «         t          ¦   «         }|                     t          dd¦  «        ¦  «         |                      t          |¦  «        g d¢¦  «         dS )zó
        L{MessageSet.extend} accepts as its arugment an L{int} or
        L{None}, or a sequence L{int}s or L{None}s of length two, or
        another L{MessageSet}, combining its argument with its
        instance's existing ranges.
        rÅ   Nrà   rÆ   rÈ   ©NNrÇ   )r   ÚextendrB   rÑ   rå   )rE   ÚextendWithIntÚextendWithNoneÚextendWithSequenceOfIntsÚextendWithSequenceOfNonesÚextendWithMessageSets         r4   Útest_extendzMessageSetTests.test_extendi  sK  € õ #™œˆØ×Ò˜QÑÔÐØ×Ò�˜mÑ,Ô,¨q¨cÑ2Ô2Ð2å#™œˆØ×Ò˜dÑ#Ô#Ð#Ø×Ò�˜^Ñ,Ô,¨cÑ2Ô2Ð2å#-¡<¤<Ð Ø ×'Ò'¨Ñ/Ô/Ð/Ø×Ò�Ð6Ñ7Ô7¸¸¸ÑCÔCÐCå$.¡L¤LÐ!Ø!×(Ò(¨Ñ6Ô6Ð6Ø×Ò�Ð6Ñ7Ô7¸Ñ=Ô=Ð=å)™|œ|ÐØ×#Ò#¥J¨q°!Ñ$4Ô$4Ñ5Ô5Ð5Ø×Ò�Ð2Ñ3Ô3°Y°Y°YÑ?Ô?Ð?Ð?Ð?r6   c                óÚ  — t          dd¦  «        }t          dd¦  «        t          dd¦  «        z   }|                      d|¦  «         |                      d|¦  «         |dz   }|                      t          ¦  «        5  d|v  ddd¦  «         n# 1 swxY w Y   |dz   }|                     dd¦  «         |                      t          ¦  «        5  d|v  ddd¦  «         dS # 1 swxY w Y   dS )	z¨
        A L{MessageSet} contains a number if the number falls within
        one of its ranges, and raises L{TypeError} if any range
        contains L{None}.
        rÅ   rÎ   rË   rÌ   rÊ   N)rö   é   rÍ   )r   ÚassertInÚassertNotInr×   rØ   rÒ   )rE   ÚhasFiveÚdoesNotHaveFiveÚhasFiveButHasNoneÚhasFiveButHasNoneInSequences        r4   Útest_containszMessageSetTests.test_contains„  s�  € õ ˜Q Ñ"Ô"ˆÝ$ Q¨Ñ*Ô*­Z¸¸1Ñ-=Ô-=Ñ=ˆà�Š�a˜Ñ!Ô!Ð!Ø×Ò˜˜OÑ,Ô,Ð,à# d™NÐØ×Ò�yÑ)Ô)ð 	#ð 	#ØÐ"Ð"Ð"ð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð '.°Ñ&8Ð#Ø#×'Ò'¨¨4Ñ0Ô0Ð0Ø×Ò�yÑ)Ô)ð 	-ð 	-ØÐ,Ð,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s$   Á=BÂBÂBÃC Ã C$Ã'C$c                óp  — t          dd¦  «        }t          dd¦  «        }||z   }|t          dd¦  «        z   }|                      t          |dz   ¦  «        g d¢¦  «         |                      t          |d	z   ¦  «        g d
¢¦  «         |                      t          |dz   ¦  «        g d¢¦  «         |                      t          |dz   ¦  «        g d¢¦  «         |                      t          |d	z   ¦  «        g d¢¦  «         |                      t          |t          d¦  «        z   ¦  «        g d¢¦  «         dS )zÖ
        Adding a sequence of message numbers to a L{MessageSet} that
        begins or ends immediately before or after an existing
        sequence in that L{MessageSet}, or overlaps one, merges the two.
        rÅ   rÇ   rÌ   rÍ   rÊ   rÎ   )rÉ   rË   )rÅ   rÉ   rÇ   rË   )rÇ   rÊ   r  )rÊ   rÎ   )rÊ   rÌ   rÎ   rÍ   )rË   rÌ   )rË   rÊ   rÌ   rÎ   rÍ   )rÅ   rÉ   rÇ   rË   rÊ   rÌ   rÎ   rÍ   rË   )rÅ   rÉ   rÇ   rË   rÊ   rÌ   rÎ   N)r   rB   rÑ   )rE   Ú
mergeAfterÚmergeBeforeÚmergeBetweenSequenceÚmergeBetweenNumbers        r4   Útest_rangesMergedz!MessageSetTests.test_rangesMerged™  sK  € õ    1Ñ%Ô%ˆ
Ý   AÑ&Ô&ˆà)¨KÑ7ÐØ'­*°Q¸Ñ*:Ô*:Ñ:Ðà×Ò�˜j¨6Ñ1Ñ2Ô2°L°L°LÑAÔAÐAØ×Ò�˜j¨6Ñ1Ñ2Ô2°O°O°OÑDÔDÐDà×Ò�˜k¨FÑ2Ñ3Ô3°\°\°\ÑBÔBÐBØ×Ò�˜k¨FÑ2Ñ3Ô3°_°_°_ÑEÔEÐEà×Ò�Ð2°VÑ;Ñ<Ô<Ð>VÐ>VÐ>VÑWÔWÐWØ×ÒÝÐ#¥j°¡m¤mÑ3Ñ4Ô4Ð6KÐ6KÐ6Kñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óH  — |                       t          dd¦  «        t          dd¦  «        ¦  «         |                       t          t          dd¦  «        ¦  «        g d¢¦  «         t          dd¦  «        }d|_        |                       t          |¦  «        ddg¦  «         dS )aÔ  
        Test the C{seq-range} examples from Section 9, "Formal Syntax"
        of RFC 3501::

            Example: 2:4 and 4:2 are equivalent and indicate values
                     2, 3, and 4.

            Example: a unique identifier sequence range of
                     3291:* includes the UID of the last message in
                     the mailbox, even if that value is less than 3291.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        rÉ   rË   ©rÉ   rÇ   rË   iÛ  NiÚ  )rB   r   rÑ   rü   rò   s     r4   Útest_seq_rangeExamplesz&MessageSetTests.test_seq_rangeExamples±  s–   € ð 	×Ò� A qÑ)Ô)­:°a¸Ñ+;Ô+;Ñ<Ô<Ð<Ø×Ò��j¨¨AÑ.Ô.Ñ/Ô/°°°Ñ;Ô;Ð;å�t˜TÑ"Ô"ˆØˆŒØ×Ò�˜a™œ 4¨ ,Ñ/Ô/Ð/Ð/Ð/r6   c                ó²  — t          d¦  «        t          dd¦  «        z   t          d¦  «        z   t          dd¦  «        z   }d|_        |                      d                     d	„ |D ¦   «         ¦  «        d
¦  «         t          dd¦  «        t          dd¦  «        z   }d|_        |                      d                     d„ |D ¦   «         ¦  «        d¦  «         dS )a©  
        Test the C{sequence-set} examples from Section 9, "Formal
        Syntax" of RFC 3501.  In particular, L{MessageSet} reorders
        and coalesces overlaps::

            Example: a message sequence number set of
                     2,4:7,9,12:* for a mailbox with 15 messages is
                     equivalent to 2,4,5,6,7,9,12,13,14,15

            Example: a message sequence number set of *:4,5:7
                     for a mailbox with 10 messages is equivalent to
                     10,9,8,7,6,5,4,5,6,7 and MAY be reordered and
                     overlap coalesced to be 4,5,6,7,8,9,10.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        rÉ   rË   rÎ   r÷   r  Né   ú,c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r0   ©rå   ©Ú.0ré   s     r4   ú	<genexpr>z<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>Ý  s(   è è € Ð9Ð9 •S˜‘V”VÐ9Ð9Ð9Ð9Ð9Ð9r6   z2,4,5,6,7,9,12,13,14,15rÊ   rö   c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r0   r*  r+  s     r4   r-  z<MessageSetTests.test_sequence_setExamples.<locals>.<genexpr>â  s(   è è € Ð!BÐ!B¨Q¥# a¡&¤&Ð!BÐ!BÐ!BÐ!BÐ!BÐ!Br6   z4,5,6,7,8,9,10)r   rü   rB   r’   )rE   ÚfromFifteenMessagesÚfromTenMessagess      r4   Útest_sequence_setExamplesz)MessageSetTests.test_sequence_setExamplesÇ  sà   € õ$ �q‰MŒM�J q¨!Ñ,Ô,Ñ,­z¸!©}¬}Ñ<½zÈ"ÈdÑ?SÔ?SÑSð 	ð $&ÐÔ Ø×ÒØ�HŠHÐ9Ð9Ð%8Ð9Ñ9Ô9Ñ9Ô9Ð;Tñ	
ô 	
ð 	
õ % T¨1Ñ-Ô-µ
¸1¸aÑ0@Ô0@Ñ@ˆØ!ˆÔØ×Ò˜ŸšÐ!BÐ!B°/Ð!BÑ!BÔ!BÑBÔBÐDTÑUÔUÐUÐUÐUr6   N)rs   rt   ru   Ú__doc__rÕ   rÙ   rÜ   rê   rî   rô   rø   rú   rÿ   r  r  r  r
  r  r  r"  r%  r1  r1   r6   r4   rÃ   rÃ   š  s8  € € € € € ðð ð1:ð 1:ð 1:ðf?ð ?ð ?ðð ð ð(ð (ð (ð.(ð (ð (ð(
'ð 
'ð 
'ðCð Cð Cð
.ð 
.ð 
.ð9ð 9ð 9ð3ð 3ð 3ðð ð ð3ð 3ð 3ð&$ð $ð $ð@ð @ð @ð6-ð -ð -ð*
ð 
ð 
ð00ð 0ð 0ð,Vð Vð Vð Vð Vr6   rÃ   c                  ó  — 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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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(d'„ Z)d(„ Z*d)„ Z+d*S )+ÚIMAP4HelperTestszA
    Tests for various helper utilities in the IMAP4 module.
    c                óN   — t          t          j        ddgd¦  «        ¦  «         dS )zI
        L{imap4.Command}'s C{repr} does not raise an exception.
        s   COMMANDs   argó   extraN)rÛ   r   ÚCommandrR   s    r4   Útest_commandReprz!IMAP4HelperTests.test_commandReprê  s(   € õ 	�UŒ]˜:¨ x°(Ñ<Ô<Ñ=Ô=Ð=Ð=Ð=r6   c                ó2  ‡ ‡‡‡— dŠt          ¦   «         Št          ‰¦  «        }t          j        |¦  «        Š‰                     ‰¦  «        }ˆˆˆˆ fd„}ˆfd„}|                     |¦  «         |                     |¦  «         |                     |¦  «        S )Ns   xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzc                ó´   •— ‰                      | ‰¦  «         ‰                     dt          ‰¦  «        ‰fz  d                     ‰j        ¦  «        ¦  «         | S )Ns   {%d}
%br6   )r§   rB   rÐ   r’   ry   )r2   Úbr”   r•   rE   s    €€€€r4   r–   z6IMAP4HelperTests.test_fileProducer.<locals>.cbProduced÷  sQ   ø€ Ø×$Ò$ V¨QÑ/Ô/Ð/Ø×Ò˜]­c°!©f¬f°a¨[Ñ8¸#¿(º(À1Ä8Ñ:LÔ:LÑMÔMÐMØˆMr6   c                ó0   •— ‰                      ¦   «          | S r0   )r~   )r2   r•   s    €r4   ÚcbResumez4IMAP4HelperTests.test_fileProducer.<locals>.cbResumeü  s   ø€ ð ×ÒÑÔÐØˆMr6   )rw   r   r   ÚFileProducerrš   r›   )rE   r3   rž   r–   r=  r;  r”   r•   s   `    @@@r4   Útest_fileProducerz"IMAP4HelperTests.test_fileProducerð  s¿   øøøø€ Ø7ˆÝÑÔˆÝ�A‰JŒJˆÝÔ˜qÑ!Ô!ˆØ×Ò˜QÑÔˆð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð 	
�Š�jÑ!Ô!Ð!Ø	�Š�hÑÔÐð �}Š}˜ZÑ(Ô(Ð(r6   c                ó*  — dg d¢ddggdg d¢g d¢gdg d	¢g d
¢gg}|D ]u\  }}}t          j        |d¦  «        }|D ]*}|                      |                     |¦  «        ¦  «         Œ+|D ]*}|                      |                     |¦  «        ¦  «         Œ+Œvd S )Núfoo/%gum/bar©zfoo/barzoo/lalagum/barzfoo/gumx/barzfoo/gum/bazúfoo/xgum/barúfoo/gum/barúfoo/x%x/bar©ÚfooÚbarzfuz fuz fuzz	foo/*/barúfoo/xyz/barz
foo/xx/baz)úfoo/xyx/barú
foo/xx/barúfoo/xxxxxxxxxxxxxx/barúfoo/xyz*abc/bar©rI  zfoo/abc/barzfoo/xyzab/cbarzfoo/xyza/bcbar©zfoo/xyzabc/barzfoo/xyz/abc/barzfoo/xyz/123/abc/barú/©r   ÚwildcardToRegexpÚassertFalseÚmatchÚ
assertTrue©rE   ÚcasesÚwildcardÚfailÚsucceedÚxs         r4   Útest_wildcardzIMAP4HelperTests.test_wildcard  s÷   € ð ØLÐLÐLØ Ð/ðð ØWÐWÐWØGÐGÐGðð "ØRÐRÐRØLÐLÐLðð
ˆð$ (-ð 	3ð 	3Ñ#ˆH�d˜GÝÔ-¨h¸Ñ<Ô<ˆHØð 4ð 4�Ø× Ò  §¢°Ñ!2Ô!2Ñ3Ô3Ð3Ð3Øð 3ð 3�Ø—’ §¢¨qÑ 1Ô 1Ñ2Ô2Ð2Ð2ð3ð		3ð 	3r6   c                ó.  — dg d¢g d¢gdg d¢g d¢gdg d¢g d	¢gg}|D ]w\  }}}t          j        |d ¦  «        }|D ]+}|                      |                     |¦  «        |¦  «         Œ,|D ]+}|                      |                     |¦  «        |¦  «         Œ,Œxd S )
NrA  rB  )rC  rD  zfoo/x/gum/barrE  rF  )rJ  rK  rL  zfoo/x/x/barrM  rN  rO  rQ  rV  s         r4   Útest_wildcardNoDelimz%IMAP4HelperTests.test_wildcardNoDelim"  sü   € ð ØLÐLÐLØ@Ð@Ð@ðð ØWÐWÐWØVÐVÐVðð "ØRÐRÐRØLÐLÐLðð
ˆð$ (-ð 	6ð 	6Ñ#ˆH�d˜GÝÔ-¨h¸Ñ=Ô=ˆHØð 7ð 7�Ø× Ò  §¢°Ñ!2Ô!2°AÑ6Ô6Ð6Ð6Øð 6ð 6�Ø—’ §¢¨qÑ 1Ô 1°1Ñ5Ô5Ð5Ð5ð6ð		6ð 	6r6   c           	     óú   — dddœdfg}|D ]o\  }}t          j        |¦  «        }|                      t          |                     d¦  «        ¦  «        t          |                     d¦  «        ¦  «        ¦  «         ŒpdS )zÊ
        L{imap4._formatHeaders} accepts a C{dict} of header name/value pairs and
        returns a string representing those headers in the standard multiline,
        C{":"}-separated format.
        ÚValue1ÚValue2)ÚHeader1ÚHeader2s"   Header2: Value2
Header1: Value1
TN)r   Ú_formatHeadersrB   ÚsortedÚ
splitlines)rE   rW  rd   Úexpectedr^   s        r4   Útest_headerFormatterz%IMAP4HelperTests.test_headerFormatter<  s›   € ð %°Ð:Ð:Ø9ðð
ˆð  %ð 	ð 	‰OˆE�8ÝÔ)¨%Ñ0Ô0ˆFØ×ÒÝ�v×(Ò(¨Ñ.Ô.Ñ/Ô/µ¸×8KÒ8KÈDÑ8QÔ8QÑ1RÔ1Rñô ð ð ð	ð 	r6   c                ó^  — g d¢}ddgddgg d¢g d¢g d¢g d¢g d	¢g d
¢g d¢g d¢dgddgdgg d¢dgg d¢dgg d¢dgg}g d¢}|D ]-}|                       t          j        t          j        |¦  «         Œ.t	          ||¦  «        D ]-\  }}|                      t          j        |¦  «        |¦  «         Œ.d S )N)s   Hello Worlds   Hello "World!"s   World "Hello" "How are you?"s   "Hello world" How "are you?"s   foo bar "baz buz" NILs   foo bar "baz buz" "NIL"s   foo NIL "baz buz" bars   foo "NIL" "baz buz" bars   "NIL" bar "baz buz" foos   oo \"oo\" oos   "oo \"oo\" oo"ó   oo 	 oos	   "oo 	 oo"ó   oo \t oos
   "oo \t oo"ó   oo \o ooó
   "oo \o oo"rl  rm  ó   Helloó   Worlds   World!)ro  rn  s   How are you?)r;   s   Hows   are you?)ó   fooó   baró   baz buzN)rp  rq  rr  ó   NIL)rp  Nrr  rq  )rp  rs  rr  rq  )rs  rq  rr  rp  )ó   oos   "oo"rt  ó
   oo "oo" oort  rj  )rt  s   \trt  rk  )rt  ó   \ort  rl  )s   "mismatched quotes   mismatched quote"s   mismatched"quotes   "oops here is" another")r×   r   ÚMismatchedQuotingÚsplitQuotedrä   rB   )rE   rW  ÚanswersÚerrorsÚsÚcaserg  s          r4   Útest_quotedSplitterz$IMAP4HelperTests.test_quotedSplitterO  sC  € ð
ð 
ð 
ˆð. �xÐ Ø�yÐ!Ø1Ð1Ð1Ø1Ð1Ð1Ø.Ð.Ð.Ø0Ð0Ð0Ø.Ð.Ð.Ø0Ð0Ð0Ø0Ð0Ð0Ø#Ð#Ð#ØˆOØ�EˆNØˆMØ"Ð"Ð"ØˆNØ"Ð"Ð"ØˆNØ"Ð"Ð"ØˆNð'
ˆð,
ð 
ð 
ˆð ð 	Mð 	MˆAØ×Ò�eÔ5µuÔ7HÈ!ÑLÔLÐLÐLå! %¨Ñ1Ô1ð 	@ð 	@‰NˆD�(Ø×Ò�UÔ.¨tÑ4Ô4°hÑ?Ô?Ð?Ð?ð	@ð 	@r6   c                ó  — g d¢g d¢g d¢ddgdg d¢dgddg d	¢gd
ddd
g d¢d
ddd
g	dg d¢ddgg}dgg d¢dgdgddgdgddggddgdgddgdgg}t          ||¦  «        D ]-\  }}|                      t          j        |¦  «        |¦  «         Œ.d S )N)ó   aó   bó   có   dó   e)
r  ó    ó   "r€  r�  r„  r…  r„  r‚  rƒ  )r  r€  r�  r‚  rƒ  r  )r€  r�  r‚  r€  )r�  r‚  rƒ  r…  r„  )r…  r„  r€  r�  r„  r„  r…  s   abcde)r  s   bc ó   des   abcr†  s   bcds   abs   cdes   a s    es    bc  )rä   rB   r   ÚcollapseStrings)rE   rW  ry  r|  rg  s        r4   Útest_stringCollapserz%IMAP4HelperTests.test_stringCollapser‰  s  € à*Ð*Ð*ØHÐHÐHØÐÐ  tÐ,ØÐ%Ð%Ð% tÐ,Ø�4Ð+Ð+Ð+Ð,Ø�4˜˜tÐ%7Ð%7Ð%7¸¸tÀTÈ4ÐPØÐ=Ð=Ð=¸tÀTÐJð
ˆð ˆJØ!Ð!Ð!ØˆX�uÐØ�F�8˜TÐ"Ø�V�HÐØ�V�H˜eÐ$Ø�H�:˜uÐ%ð
ˆõ " %¨Ñ1Ô1ð 	Dð 	D‰NˆD�(Ø×Ò�UÔ2°4Ñ8Ô8¸(ÑCÔCÐCÐCð	Dð 	Dr6   c                óÂ  ‡ — d                      dgdz  ¦  «        }ˆ fd„} |dt          |¦  «        |fz  ddg d¢g|g¦  «          |d	d
dgdddddddg d¢gg d¢gg d¢gg d¢gg d¢g d¢gd d dg
dddddgd d dddgg
¦  «          |d d!g¦  «          |d"d#g¦  «          |d$d%g¦  «          |d&d'g¦  «          |d&d'g¦  «          |d(d)d*g¦  «          |d(d)d*g¦  «         d S )+Nó   
s   xxrË   c                ó^   •— t          j        | ¦  «        }‰                     ||g¦  «         d S r0   )r   ÚparseNestedParensrB   )r|  rg  ÚparsedrE   s      €r4   Úcheckz0IMAP4HelperTests.test_parenParser.<locals>.check¤  s1   ø€ ÝÔ,¨TÑ2Ô2ˆFØ×Ò˜V h ZÑ0Ô0Ð0Ð0Ð0r6   s8   (BODY.PEEK[HEADER.FIELDS.NOT (subject bcc cc)] {%d}
%b)ó	   BODY.PEEKs   HEADER.FIELDS.NOT)s   subjects   bccs   ccs  (FLAGS (\Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" RFC822.SIZE 4286 ENVELOPE ("Wed, 17 Jul 1996 02:23:25 -0700 (PDT)" "IMAP4rev1 WG mtg summary and minutes" (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) (("Terry Gray" NIL gray cac.washington.edu)) ((NIL NIL imap cac.washington.edu)) ((NIL NIL minutes CNRI.Reston.VA.US) ("John Klensin" NIL KLENSIN INFOODS.MIT.EDU)) NIL NIL <B27397-0100000@cac.washington.edu>) BODY (TEXT PLAIN (CHARSET US-ASCII) NIL NIL 7BIT 3028 92))ó   FLAGSs   \Seens   INTERNALDATEs   17-Jul-1996 02:44:25 -0700s   RFC822.SIZEs   4286s   ENVELOPEs%   Wed, 17 Jul 1996 02:23:25 -0700 (PDT)s$   IMAP4rev1 WG mtg summary and minutes)s
   Terry GrayNs   grayó   cac.washington.edu)NNs   imapr‘  )NNs   minutess   CNRI.Reston.VA.US)s   John KlensinNs   KLENSINs   INFOODS.MIT.EDUs#   <B27397-0100000@cac.washington.edu>ó   BODYs   TEXTó   PLAINó   CHARSETs   US-ASCIIs   7BITs   3028s   92s   ("oo \"oo\" oo")ru  s   ("oo \\ oo")s   oo \\ oos   ("oo \ oo")s   oo \ oos	   ("oo \o")s   oo \os   (oo \o)rt  rv  )r’   rÐ   )rE   r{  rŽ  s   `  r4   Útest_parenParserz!IMAP4HelperTests.test_parenParser¡  sÎ  ø€ Ø�LŠL˜%˜ 1™Ñ%Ô%ˆð	1ð 	1ð 	1ð 	1ð 	1ð 	ˆØIÍSÐQRÉVÌVÐUVÈKÑWØÐ0Ð2MÐ2MÐ2MÐNÐPQÐRñ	
ô 	
ð 	
ð 	ˆðJð Ø�ØØ-ØØØà<Ø;ØJÐJÐJÐKØJÐJÐJÐKØJÐJÐJÐKØAÐAÐAÐBàFÐFÐFØOÐOÐOðð ØØ:ðð àØØ Ð-ØØØØØð	ð1"ñ0	
ô 0	
ð 0	
ðd 	ˆÐ# m _Ñ5Ô5Ð5ØˆÐ - Ñ1Ô1Ð1Øˆˆo ˜}Ñ-Ô-Ð-àˆˆm˜i˜[Ñ)Ô)Ð)Øˆˆm˜i˜[Ñ)Ô)Ð)Øˆˆk˜E 6˜?Ñ+Ô+Ð+Øˆˆk˜E 6˜?Ñ+Ô+Ð+Ð+Ð+r6   c           
     óð  — g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢g	}|D ]Õ\  }}}|                      d
¦  «        }t          j        ¦   «         }|                     |¦  «         |                      t          |j        ¦  «        d¦  «         |                      t          |j        d         t          ||¦  «        ¦  «        ¦  «         |                      t          |j        d         ¦  «        |¦  «         ŒÖd S )N)ÚENVELOPEÚEnvelopeÚenvelope)ÚFLAGSÚFlagsÚflags)ÚINTERNALDATEÚInternalDateÚinternaldate)úRFC822.HEADERÚRFC822Headerzrfc822.header)úRFC822.SIZEÚ
RFC822Sizezrfc822.size)úRFC822.TEXTÚ
RFC822Textzrfc822.text)ÚRFC822r¦  Úrfc822)ÚUIDr¨  Úuid)ÚBODYSTRUCTUREÚBodyStructureÚbodystructureÚasciirÅ   r   )rC   r   Ú_FetchParserÚparseStringrB   rÐ   r2   rU  Ú
isinstanceÚgetattrrå   )rE   rW  ÚinpÚoutpÚasStringr•   s         r4   Útest_fetchParserSimplez'IMAP4HelperTests.test_fetchParserSimpleð  s  € à0Ð0Ð0Ø'Ð'Ð'Ø<Ð<Ð<Ø>Ð>Ð>Ø8Ð8Ð8Ø8Ð8Ð8Ø*Ð*Ð*Ø!Ð!Ð!Ø?Ð?Ð?ð

ˆð $)ð 	9ð 	9ÑˆC��xØ—*’*˜WÑ%Ô%ˆCÝÔ"Ñ$Ô$ˆAØ�MŠM˜#ÑÔÐØ×Ò�S ¤™]œ]¨AÑ.Ô.Ð.Ø�OŠO�J q¤x°¤{µG¸A¸tÑ4DÔ4DÑEÔEÑFÔFÐFØ×Ò�S ¤¨!¤Ñ-Ô-¨xÑ8Ô8Ð8Ð8ð	9ð 	9r6   c                ó¦  — ddg d¢fgddg d¢fgddg d	¢fgg}|D ]¶\  }}t          j        ¦   «         }|                     |¦  «         |                      t	          |j        ¦  «        |d
         ¦  «         d„ |j        D ¦   «         }|                     ¦   «          |d                              ¦   «          |                      ||d         ¦  «         Œ·d S )Ns   ALLrË   )ó   flagsó   internaldateó   rfc822.sizeó   envelopes   FULLrÊ   )r·  r¸  r¹  rº  s   bodys   FASTrÇ   )r·  r¸  r¹  r   c                óv   — g | ]6}t          |¦  «                             ¦   «                              d ¦  «        ‘Œ7S )r­  )rå   ÚlowerrC   )r,  Útokens     r4   ú
<listcomp>z;IMAP4HelperTests.test_fetchParserMacros.<locals>.<listcomp>  s8   € ÐWÐWÐWÀU�c %™jœj×.Ò.Ñ0Ô0×7Ò7¸Ñ@Ô@ÐWÐWÐWr6   rÅ   )r   r®  r¯  rB   rÐ   r2   Úsort)rE   rW  r²  r³  r•   ÚexpectedResults         r4   Útest_fetchParserMacrosz'IMAP4HelperTests.test_fetchParserMacros  s   € à�aÐQÐQÐQÐRÐSàØÐUÐUÐUÐVðð �qÐEÐEÐEÐFÐGð
ˆð ð 	6ð 	6‰IˆC�ÝÔ"Ñ$Ô$ˆAØ�MŠM˜#ÑÔÐØ×Ò�S ¤™]œ]¨D°¬GÑ4Ô4Ð4ØWÐWÈaÌhÐWÑWÔWˆNØ×ÒÑ!Ô!Ð!Ø�ŒG�LŠL‰NŒNˆNØ×Ò˜^¨T°!¬WÑ5Ô5Ð5Ð5ð	6ð 	6r6   c                ó0  — t           j        } |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      |j        d         j
        d ¦  «         |                      t          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j        d¦  «         |                      t          |j        d         ¦  «        d	¦  «          |¦   «         }|                     d
¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j
        |j        ¦  «        ¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j        d¦  «         |                      t          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j
        |j        ¦  «        ¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j        d¦  «         |                      t          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j
        |j        ¦  «        ¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j
        j        g d¢¦  «         |                      |j        d         j        d¦  «         |                      t!          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j
        |j        ¦  «        ¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j
        j        g d¢¦  «         |                      |j        d         j        d¦  «         |                      t!          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j
        |j        ¦  «        ¦  «         |                      |j        d         j
        j        d¦  «         |                      |j        d         j
        j        g d¢¦  «         |                      |j        d         j        d¦  «         |                      t!          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j        |j        ¦  «        ¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j        d¦  «         |                      t!          |j        d         ¦  «        d¦  «          |¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      t          |j        d         |j        ¦  «        ¦  «         |                      |j        d         j	        d¦  «         |                      t          |j        d         j
        |j        ¦  «        ¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j
        j        ddg¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j        d¦  «         |                      t!          |j        d         ¦  «        d¦  «         d S )Nr’  rÅ   r   FÚBODYr�  Ts   BODY[]zBODY[]s   BODY[HEADER]r1   zBODY[HEADER]s   BODY.PEEK[HEADER]s+   BODY[HEADER.FIELDS (Subject Cc Message-Id)])s   SUBJECTs   CCó
   MESSAGE-IDs0   BODY.PEEK[HEADER.FIELDS (Subject Cc Message-Id)]s4   BODY.PEEK[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s/   BODY[HEADER.FIELDS.NOT (Subject Cc Message-Id)]s   BODY[1.MIME]<10.50>©r   rö   é2   s?   BODY.PEEK[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   rÉ   rÍ   rö   rÄ  s   DATEég   éE   s:   BODY[1.3.9.11.HEADER.FIELDS.NOT (Message-Id Date)]<103.69>)r   r®  r¯  rB   rÐ   r2   rU  r°  ÚBodyÚpeekÚheaderrå   ÚemptyÚHeaderÚnegateÚfieldsrL   ÚmimeÚMIMEÚpartÚpartialBeginÚpartialLength)rE   ÚPr•   s      r4   Útest_fetchParserBodyz%IMAP4HelperTests.test_fetchParserBody  sð
  € ÝÔˆàˆA‰CŒCˆØ	�Š�gÑÔÐØ×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨5Ñ1Ô1Ð1Ø×Ò˜œ !œÔ+¨TÑ2Ô2Ð2Ø×Ò�˜QœX aœ[Ñ)Ô)¨6Ñ2Ô2Ð2àˆA‰CŒCˆØ	�Š�lÑ#Ô#Ð#Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨4Ñ0Ô0Ð0Ø×Ò�˜QœX aœ[Ñ)Ô)¨6Ñ2Ô2Ð2àˆA‰CŒCˆØ	�Š�iÑ Ô Ð Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ*¨DÑ1Ô1Ð1Ø×Ò�˜QœX aœ[Ñ)Ô)¨8Ñ4Ô4Ð4àˆA‰CŒCˆØ	�Š�oÑ&Ô&Ð&Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨5Ñ1Ô1Ð1Ø�Š�
 1¤8¨A¤;Ô#5°q´xÑ@Ô@ÑAÔAÐAØ×Ò˜œ !œÔ+Ô2°DÑ9Ô9Ð9Ø×Ò˜œ !œÔ+Ô2°BÑ7Ô7Ð7Ø×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×Ò�˜QœX aœ[Ñ)Ô)¨>Ñ:Ô:Ð:àˆA‰CŒCˆØ	�ŠÐ*Ñ+Ô+Ð+Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨4Ñ0Ô0Ð0Ø�Š�
 1¤8¨A¤;Ô#5°q´xÑ@Ô@ÑAÔAÐAØ×Ò˜œ !œÔ+Ô2°DÑ9Ô9Ð9Ø×Ò˜œ !œÔ+Ô2°BÑ7Ô7Ð7Ø×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×Ò�˜QœX aœ[Ñ)Ô)¨>Ñ:Ô:Ð:àˆA‰CŒCˆØ	�ŠÐDÑEÔEÐEØ×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨5Ñ1Ô1Ð1Ø�Š�
 1¤8¨A¤;Ô#5°q´xÑ@Ô@ÑAÔAÐAØ×Ò˜œ !œÔ+Ô2°EÑ:Ô:Ð:Ø×Ò˜œ !œÔ+Ô2Ð4VÐ4VÐ4VÑWÔWÐWØ×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×ÒÝ�!”(˜1”+ÑÔÐ Nñ	
ô 	
ð 	
ð ˆA‰CŒCˆØ	�ŠÐIÑJÔJÐJØ×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨4Ñ0Ô0Ð0Ø�Š�
 1¤8¨A¤;Ô#5°q´xÑ@Ô@ÑAÔAÐAØ×Ò˜œ !œÔ+Ô2°EÑ:Ô:Ð:Ø×Ò˜œ !œÔ+Ô2Ð4VÐ4VÐ4VÑWÔWÐWØ×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×ÒÝ�!”(˜1”+ÑÔÐ Nñ	
ô 	
ð 	
ð ˆA‰CŒCˆØ	�ŠÐMÑNÔNÐNØ×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨4Ñ0Ô0Ð0Ø�Š�
 1¤8¨A¤;Ô#5°q´xÑ@Ô@ÑAÔAÐAØ×Ò˜œ !œÔ+Ô2°DÑ9Ô9Ð9Ø×Ò˜œ !œÔ+Ô2Ð4VÐ4VÐ4VÑWÔWÐWØ×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×ÒÝ�!”(˜1”+ÑÔÐ Rñ	
ô 	
ð 	
ð ˆA‰CŒCˆØ	�ŠÐ,Ñ-Ô-Ð-Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨5Ñ1Ô1Ð1Ø�Š�
 1¤8¨A¤;Ô#3°Q´VÑ<Ô<Ñ=Ô=Ð=Ø×Ò˜œ !œÔ)¨4Ñ0Ô0Ð0Ø×Ò˜œ !œÔ1°2Ñ6Ô6Ð6Ø×Ò˜œ !œÔ2°BÑ7Ô7Ð7Ø×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×Ò�˜qœx¨œ{Ñ+Ô+Ð-CÑDÔDÐDàˆA‰CŒCˆØ	�ŠØNñ	
ô 	
ð 	
ð 	×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø�Š�
 1¤8¨A¤;°´Ñ7Ô7Ñ8Ô8Ð8Ø×Ò˜œ !œÔ)¨4Ñ0Ô0Ð0Ø�Š�
 1¤8¨A¤;Ô#5°q´xÑ@Ô@ÑAÔAÐAØ×Ò˜œ !œÔ)¨=Ñ9Ô9Ð9Ø×Ò˜œ !œÔ+Ô2°]ÀGÐ4LÑMÔMÐMØ×Ò˜œ !œÔ1°3Ñ7Ô7Ð7Ø×Ò˜œ !œÔ2°BÑ7Ô7Ð7Ø×Ò˜œ !œÔ*¨EÑ2Ô2Ð2Ø×ÒÝ�!”(˜1”+ÑÔØIñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óð  — t          j        ¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      |j        d         j        d¦  «         |                      |j        d         |j        ¦  «         |                      |j        d         j	        |j
        ¦  «         |                      t          |j        d         ¦  «        d¦  «         dS )z›
        Parsing a C{BODY} whose C{HEADER} values require quoting
        results in a object that perserves that quoting when
        serialized.
        s   BODY[HEADER.FIELDS ((Quoted)]rÅ   r   Fs   BODY[HEADER.FIELDS ("(Quoted")]N)r   r®  r¯  rB   rÐ   r2   rÊ  ÚassertIsInstancerÉ  rË  rÍ  rL   ©rE   r•   s     r4   Útest_fetchParserQuotedHeaderz-IMAP4HelperTests.test_fetchParserQuotedHeaderŒ  sÌ   € õ ÔÑ Ô ˆØ	�ŠÐ6Ñ7Ô7Ð7Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø×Ò˜œ !œÔ)¨5Ñ1Ô1Ð1Ø×Ò˜aœh qœk¨1¬6Ñ2Ô2Ð2Ø×Ò˜aœh qœkÔ0°!´(Ñ;Ô;Ð;Ø×Ò�˜qœx¨œ{Ñ+Ô+Ð-OÑPÔPÐPÐPÐPr6   c                ó¤   — t          j        ¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        ¦  «         dS )z=
        Parsing an empty string results in no data.
        r6   N)r   r®  r¯  rS  rÐ   r2   rÙ  s     r4   Útest_fetchParserEmptyStringz,IMAP4HelperTests.test_fetchParserEmptyStringš  sF   € õ ÔÑ Ô ˆØ	�Š�cÑÔÐØ×Ò�˜QœX™œÑ'Ô'Ð'Ð'Ð'r6   c                ón   — t          j        ¦   «         }|                      t          |j        d¦  «         dS )z\
        Parsing a string with an unknown attribute raises an
        L{Exception}.
        s   UNKNOWNN©r   r®  r×   Ú	Exceptionr¯  rÙ  s     r4   Ú test_fetchParserUnknownAttributez1IMAP4HelperTests.test_fetchParserUnknownAttribute¢  s2   € õ
 ÔÑ Ô ˆØ×Ò�) Q¤]°JÑ?Ô?Ð?Ð?Ð?r6   c                ón   — t          j        ¦   «         }|                      t          |j        d¦  «         dS )zf
        Parsing a string that prematurely ends in whitespace raises an
        L{Exception}.
        s   BODY[HEADER.FIELDS  NrÞ  rÙ  s     r4   Ú0test_fetchParserIncompleteStringEndsInWhitespacezAIMAP4HelperTests.test_fetchParserIncompleteStringEndsInWhitespaceª  ó3   € õ
 ÔÑ Ô ˆØ×Ò�) Q¤]Ð4KÑLÔLÐLÐLÐLr6   c                ón   — t          j        ¦   «         }|                      t          |j        d¦  «         dS )z
        Parsing a string that contains an unexpected character rather
        than whitespace raises an L{Exception}.
        s   BODY[HEADER.FIELDS!]NrÞ  rÙ  s     r4   Ú"test_fetchParserExpectedWhitespacez3IMAP4HelperTests.test_fetchParserExpectedWhitespace²  rã  r6   c                óð  — t          j        ¦   «         }|                     d¦  «         |                      t	          |j        ¦  «        d¦  «         |                      |j        d         |j        ¦  «         |                      |j        d         j        d¦  «         |                      |j        d         j	        |j
        ¦  «         |                      t          |j        d         ¦  «        d¦  «         dS )z:
        A C{BODY} can contain a C{TEXT} section.
        s
   BODY[TEXT]rÅ   r   FN)r   r®  r¯  rB   rÐ   r2   rØ  rÉ  rÊ  rF   ÚTextrL   rÙ  s     r4   Útest_fetchParserTextSectionz,IMAP4HelperTests.test_fetchParserTextSectionº  sÊ   € õ ÔÑ Ô ˆØ	�Š�mÑ$Ô$Ð$Ø×Ò�˜QœX™œ¨Ñ*Ô*Ð*Ø×Ò˜aœh qœk¨1¬6Ñ2Ô2Ð2Ø×Ò˜œ !œÔ)¨5Ñ1Ô1Ð1Ø×Ò˜aœh qœkÔ.°´Ñ7Ô7Ð7Ø×Ò�˜qœx¨œ{Ñ+Ô+¨]Ñ;Ô;Ð;Ð;Ð;r6   c                ón   — t          j        ¦   «         }|                      t          |j        d¦  «         dS )z[
        Parsing a C{BODY} with an unknown section raises an
        L{Exception}.
        s   BODY[UNKNOWN]NrÞ  rÙ  s     r4   Útest_fetchParserUnknownSectionz/IMAP4HelperTests.test_fetchParserUnknownSectionÆ  s3   € õ
 ÔÑ Ô ˆØ×Ò�) Q¤]Ð4DÑEÔEÐEÐEÐEr6   c                óÖ   — t          j        ¦   «         }|                      t          |j        d¦  «         t          j        ¦   «         }|                      t          |j        d¦  «         dS )ze
        Parsing a C{BODY} with an unterminated section list raises an
        L{Exception}.
        s   BODY[HEADERs   BODY[HEADER.FIELDS (SUBJECT)NrÞ  rÙ  s     r4   Ú#test_fetchParserMissingSectionClosez4IMAP4HelperTests.test_fetchParserMissingSectionCloseÎ  s[   € õ
 ÔÑ Ô ˆØ×Ò�) Q¤]°NÑCÔCÐCÝÔÑ Ô ˆØ×Ò�) Q¤]Ð4SÑTÔTÐTÐTÐTr6   c                óÖ   — t          j        ¦   «         }|                      t          |j        d¦  «         t          j        ¦   «         }|                      t          |j        d¦  «         dS )z½
        Parsing a C{BODY} whose C{HEADER.FIELDS} list does not begin
        with an open parenthesis (C{(}) or end with a close
        parenthesis (C{)}) raises an L{Exception}.
        s   BODY[HEADER.FIELDS Missing)]s   BODY[HEADER.FIELDS (Missing]NrÞ  rÙ  s     r4   Ú(test_fetchParserHeaderMissingParenthesesz9IMAP4HelperTests.test_fetchParserHeaderMissingParenthesesØ  s\   € õ ÔÑ Ô ˆØ×Ò�) Q¤]Ð4SÑTÔTÐTÝÔÑ Ô ˆØ×Ò�) Q¤]Ð4SÑTÔTÐTÐTÐTr6   c                ón   — t          j        ¦   «         }|                      t          |j        d¦  «         dS )zk
        Parsing a C{BODY} with a range that lacks a period (C{.})
        raises an L{Exception}.
        s   BODY<01>NrÞ  rÙ  s     r4   Útest_fetchParserDotlessPartialz/IMAP4HelperTests.test_fetchParserDotlessPartialã  s2   € õ
 ÔÑ Ô ˆØ×Ò�) Q¤]°KÑ@Ô@Ð@Ð@Ð@r6   c                ón   — t          j        ¦   «         }|                      t          |j        d¦  «         dS )zŒ
        Parsing a C{BODY} with a partial range that's missing its
        closing greater than sign (C{>}) raises an L{EXCEPTION}.
        s   BODY<0NrÞ  rÙ  s     r4   Útest_fetchParserUnclosedPartialz0IMAP4HelperTests.test_fetchParserUnclosedPartialë  s2   € õ
 ÔÑ Ô ˆØ×Ò�) Q¤]°IÑ>Ô>Ð>Ð>Ð>r6   c                ó„   — dddt          d¦  «        ddg}d}|                      t          j        |¦  «        |¦  «         d S )NrG  rH  Úbazó   this is a file
ÚbuzÚbizs4   "foo" "bar" "baz" {16}
this is a file
 "buz" "biz")r   rB   r   ÚcollapseNestedLists)rE   ÚinputStructurer^   s      r4   Ú
test_fileszIMAP4HelperTests.test_filesó  sS   € àØØÝÐ)Ñ*Ô*ØØð
ˆð Mˆà×Ò�Ô2°>ÑBÔBÀFÑKÔKÐKÐKÐKr6   c                óÎ   — dt          j        d¦  «        dt          d¦  «        dt          j        d¦  «        dg}d}|                      t          j        |¦  «        |¦  «         d S )	Nrp  rq  s   bazrõ  s   this is
quoteds   buzr6   sC   "foo" bar "baz" {16}
this is a file
 {15}
this is
quoted buz "")r   ÚDontQuoteMer   rB   rø  rc   s      r4   Útest_quoteAvoiderz"IMAP4HelperTests.test_quoteAvoider  sp   € àÝÔ˜fÑ%Ô%ØÝÐ)Ñ*Ô*Ø ÝÔ˜fÑ%Ô%Øð
ˆðð 	ð 	×Ò�Ô2°5Ñ9Ô9¸6ÑBÔBÐBÐBÐBr6   c                ót   — ddggfg}|D ]-\  }}|                       t          j        |¦  «        |¦  «         Œ.d S )Ns   ({10}
0123456789)s
   0123456789)rB   r   rŒ  )rE   rW  r|  rg  s       r4   Útest_literalszIMAP4HelperTests.test_literals  s]   € à$¨ Ð&7Ð8ð
ˆð $ð 	Fð 	F‰NˆD�(Ø×Ò�UÔ4°TÑ:Ô:¸HÑEÔEÐEÐEð	Fð 	Fr6   c                ó€  — t          j        d¬¦  «        t          j        ddd¬¦  «        t          j        t          j        d¬¦  «        t          j        d¬¦  «        ¦  «        t          j        d¬¦  «        t          j        t          j        d¬¦  «        t          j        d¬¦  «        t          j        d¬¦  «        ¦  «        t          j        t          j        t          j        t          j        dd	d
¬¦  «        t          j        ddd¬¦  «        t          j        dddd¬¦  «        t          j        t          j        d¬¦  «        ¦  «        ¦  «        ¦  «        t          j        t          j        d¬¦  «        ¦  «        ¦  «        g}g d¢}t	          ||¦  «        D ]\  }}|                      ||¦  «         Œd S )NrÅ   )Úflagged)re  Ú	unflaggedÚdeleted)r  Útoday)Úbefore)Úunseen)ÚnewÚ	yesterdayiè  )re  ÚsinceÚsmallerÚtuesdayi'  )re  r  Úlarger)re  r  r  r  Úspam)rŒ   z1:5©r©  )ÚFLAGGEDz(DELETED UNFLAGGED)z(OR FLAGGED DELETED)z(BEFORE "today")z(OR DELETED (OR UNSEEN NEW))z¡(OR (NOT (OR (SINCE "yesterday" SMALLER 1000) (OR (BEFORE "tuesday" LARGER 10000) (OR (BEFORE "today" DELETED UNSEEN) (NOT (SUBJECT "spam")))))) (NOT (UID 1:5))))r   ÚQueryÚOrÚNoträ   rB   )rE   rç   rè   Úqueryrg  s        r4   Útest_queryBuilderz"IMAP4HelperTests.test_queryBuilder  s“  € åŒK Ð"Ñ"Ô"ÝŒK˜q¨A°qÐ9Ñ9Ô9ÝŒH•U”[¨Ð+Ñ+Ô+­U¬[ÀÐ-CÑ-CÔ-CÑDÔDÝŒK˜wÐ'Ñ'Ô'ÝŒH•U”[¨Ð+Ñ+Ô+­U¬[ÀÐ-BÑ-BÔ-BÅEÄKÐTUÐDVÑDVÔDVÑWÔWÝŒHÝ”	Ý”HÝœ¨1°KÈÐNÑNÔNÝœ¨1°YÀuÐMÑMÔMÝœ¨1°QÀÈ'ÐRÑRÔRÝœ	¥%¤+°fÐ"=Ñ"=Ô"=Ñ>Ô>ñ	ô ñô õ ”	�%œ+¨%Ð0Ñ0Ô0Ñ1Ô1ñ
ô 
ð
ˆð&

ð 

ð 

ˆõ  # 6¨7Ñ3Ô3ð 	.ð 	.‰OˆE�8Ø×Ò˜U HÑ-Ô-Ð-Ð-ð	.ð 	.r6   c                ó\   — t          j        d¬¦  «        }|                      d|¦  «         dS )zê
        When passed the C{keyword} argument, L{imap4.Query} returns an unquoted
        string.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        @see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
        Útwisted)Úkeywordz(KEYWORD twisted)N©r   r  rB   ©rE   r  s     r4   Útest_queryKeywordFlagWithQuotesz0IMAP4HelperTests.test_queryKeywordFlagWithQuotes@  s3   € õ ” IÐ.Ñ.Ô.ˆØ×ÒÐ,¨eÑ4Ô4Ð4Ð4Ð4r6   c                ó\   — t          j        d¬¦  «        }|                      d|¦  «         dS )zì
        When passed the C{unkeyword} argument, L{imap4.Query} returns an
        unquoted string.

        @see: U{http://tools.ietf.org/html/rfc3501#section-9}
        @see: U{http://tools.ietf.org/html/rfc3501#section-6.4.4}
        r  )Ú	unkeywordz(UNKEYWORD twisted)Nr  r  s     r4   Ú!test_queryUnkeywordFlagWithQuotesz2IMAP4HelperTests.test_queryUnkeywordFlagWithQuotesK  s3   € õ ” iÐ0Ñ0Ô0ˆØ×ÒÐ.°Ñ6Ô6Ð6Ð6Ð6r6   c                ó‚   — t          j        t          j        dd¦  «        ¬¦  «        }|                      |d¦  «         dS )zŽ
        When passed a L{MessageSet}, L{imap4.Query} returns a query
        containing a quoted string representing the ID sequence.
        rÅ   N©Úmessagesz(MESSAGES "1:*"))r   r  r   rB   r  s     r4   Útest_queryWithMesssageSetz*IMAP4HelperTests.test_queryWithMesssageSetV  s@   € õ
 ”¥UÔ%5°a¸Ñ%>Ô%>Ð?Ñ?Ô?ˆØ×Ò˜Ð 2Ñ3Ô3Ð3Ð3Ð3r6   c                ó\   — t          j        d¬¦  «        }|                      |d¦  «         dS )zl
        When passed an L{int}, L{imap4.Query} returns a query
        containing a quoted integer.
        rÅ   r  z(MESSAGES "1")Nr  r  s     r4   Útest_queryWithIntegerz&IMAP4HelperTests.test_queryWithInteger^  s3   € õ
 ” QÐ'Ñ'Ô'ˆØ×Ò˜Ð 0Ñ1Ô1Ð1Ð1Ð1r6   c                ó‚   — |                       t          j        t          j        t          j        d¬¦  «        ¦  «         dS )zq
        An L{imap4.Or} query with less than two arguments raises an
        L{imap4.IllegalQueryError}.
        rÅ   r  N)r×   r   ÚIllegalQueryErrorr  r  rR   s    r4   Útest_queryOrIllegalQueryz)IMAP4HelperTests.test_queryOrIllegalQueryf  s5   € ð
 	×Ò�%Ô1µ5´8½U¼[ÐRSÐ=TÑ=TÔ=TÑUÔUÐUÐUÐUr6   c                óV  — |                       d|                     ¦   «         › d�t          j        d
i |di¤Ž¦  «         |                       d|                     ¦   «         › d�t          j        d
i |dd                     d„ t          d¦  «        D ¦   «         ¦  «        ›d�i¤Ž¦  «         d	S )zÞ
        Helper to implement tests for value filtering of KEYWORD and UNKEYWORD
        queries.

        @param keyword: A native string giving the name of the L{imap4.Query}
            keyword argument to test.
        ú(z twistedrocks)ztwisted (){%*"\] rocksztwisted Ú c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r0   )ro   )r,  Úchs     r4   r-  z9IMAP4HelperTests._keywordFilteringTest.<locals>.<genexpr>�  s(   è è € Ð;Ð;¨2�s 2™wœwÐ;Ð;Ð;Ð;Ð;Ð;r6   é!   z rocksNr1   )rB   Úupperr   r  r’   rn   )rE   r  s     r4   Ú_keywordFilteringTestz&IMAP4HelperTests._keywordFilteringTestm  s×   € ð 	×ÒØ/�—’‘”Ð/Ð/Ð/ÝŒKÐ?Ð?˜7Ð$=Ð>Ð?Ð?ñ	
ô 	
ð 	
ð 	×ÒØ/�—’‘”Ð/Ð/Ð/ÝŒKð ð à�GØ—w’wÐ;Ð;µ°r±´Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;ð>ððð ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó0   — |                       d¦  «         dS )aâ  
        When passed the C{keyword} argument, L{imap4.Query} returns an
        C{atom} that consists of one or more non-special characters.

        List of the invalid characters:

            ( ) { % * " \ ] CTL SP

        @see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
        @see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
        @see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
        r  N©r.  rR   s    r4   Útest_queryKeywordFlagz&IMAP4HelperTests.test_queryKeywordFlag†  s   € ð 	×"Ò" 9Ñ-Ô-Ð-Ð-Ð-r6   c                ó0   — |                       d¦  «         dS )aä  
        When passed the C{unkeyword} argument, L{imap4.Query} returns an
        C{atom} that consists of one or more non-special characters.

        List of the invalid characters:

            ( ) { % * " \ ] CTL SP

        @see: U{ABNF definition of CTL and SP<https://tools.ietf.org/html/rfc2234>}
        @see: U{IMAP4 grammar<http://tools.ietf.org/html/rfc3501#section-9>}
        @see: U{IMAP4 SEARCH specification<http://tools.ietf.org/html/rfc3501#section-6.4.4>}
        r  Nr0  rR   s    r4   Útest_queryUnkeywordFlagz(IMAP4HelperTests.test_queryUnkeywordFlag•  s   € ð 	×"Ò" ;Ñ/Ô/Ð/Ð/Ð/r6   c                óp   — g d¢}|D ].}|                       t          j        t          j        |d¦  «         Œ/dS )z|
        Trying to parse an invalid representation of a sequence range raises an
        L{IllegalIdentifierError}.
        )s   *:*rp  s   4:s   bar:5é90  N©r×   r   ÚIllegalIdentifierErrorrã   ©rE   rç   rd   s      r4   Útest_invalidIdListParserz)IMAP4HelperTests.test_invalidIdListParser¤  sT   € ð
 3Ð2Ð2ˆàð 	ð 	ˆEØ×ÒÝÔ,­eÔ.?ÀÈñô ð ð ð	ð 	r6   c                óp   — g d¢}|D ].}|                       t          j        t          j        |d¦  «         Œ/dS )zó
        Zeroes and negative values are not accepted in id range expressions. RFC
        3501 states that sequence numbers and sequence ranges consist of
        non-negative numbers (RFC 3501 section 9, the seq-number grammar item).
        )s   0:5s   0:0s   *:0ó   0s   -3:5s   1:-2s   -1r5  Nr6  r8  s      r4   Ú#test_invalidIdListParserNonPositivez4IMAP4HelperTests.test_invalidIdListParserNonPositive°  sU   € ð IÐHÐHˆàð 	ð 	ˆEØ×ÒÝÔ,­eÔ.?ÀÈñô ð ð ð	ð 	r6   c                óx  — g d¢}t          dd¦  «        t          dd¦  «        t          dd¦  «        t          dd¦  «        z   t          dd¦  «        t          d¦  «        t          dd¦  «        t          d¦  «        t          d¦  «        z   t          d¦  «        z   t          dd¦  «        t          dd¦  «        t          dd¦  «        t          dd	¦  «        z   t          d¦  «        t          dd¦  «        z   t          d¦  «        t          dd¦  «        z   t          d
d	¦  «        z   t          dd¦  «        t          d
¦  «        z   t          d	d¦  «        z   t          dd¦  «        g}g d¢}t          ||¦  «        D ]-\  }}|                      t          j        |¦  «        |¦  «         Œ.t          ||¦  «        D ]|\  }}|€4|                      t          t          t          j        |¦  «        ¦  «         Œ;t          t          j        |¦  «        ¦  «        }|                      ||d|›d|›d|›�¦  «         Œ}dS )zi
        The function to parse sequence ranges yields appropriate L{MessageSet}
        objects.
        )rß   s   5:*s   1:2,5:*rÞ   ó   1s   1,2s   1,3,5s   1:10s   1:10,11s	   1:5,10:20s   1,5:10s   1,5:10,15:20s   1:10,15,20:25ó   4:2rÅ   NrÊ   rÉ   rÇ   rö   é   é   r'  é   rË   )NNNrÅ   rÅ   rÉ   rÇ   rö   r@  é   rÎ   é   é   rÇ   zlen(z) = z != )r   rä   rB   r   rã   r×   rØ   rÐ   )rE   rç   rè   Úlengthsrd   rg  ÚLs          r4   Útest_parseIdListz!IMAP4HelperTests.test_parseIdList½  s1  € ð

ð 
ð 
ˆõ$ �q˜$ÑÔÝ�q˜$ÑÔÝ�q˜$ÑÔ¥*¨Q°Ñ"2Ô"2Ñ2Ý�t˜TÑ"Ô"Ý�q‰MŒMÝ�q˜!ÑÔÝ�q‰MŒM�J q™MœMÑ)­J°q©M¬MÑ9Ý�q˜"ÑÔÝ�q˜"ÑÔÝ�q˜!ÑÔ�z¨"¨bÑ1Ô1Ñ1Ý�q‰MŒM�J q¨"Ñ-Ô-Ñ-Ý�q‰MŒM�J q¨"Ñ-Ô-Ñ-µ
¸2¸rÑ0BÔ0BÑBÝ�q˜"ÑÔ¥
¨2¡¤Ñ.µ¸BÀÑ1CÔ1CÑCÝ�q˜!ÑÔð
ˆð" KÐJÐJˆå" 6¨7Ñ3Ô3ð 	Að 	A‰OˆE�8Ø×Ò�UÔ.¨uÑ5Ô5°xÑ@Ô@Ð@Ð@å" 6¨7Ñ3Ô3ð 	Yð 	Y‰OˆE�8ØÐØ×!Ò!¥)­Sµ%Ô2CÀEÑ2JÔ2JÑKÔKÐKÐKå�Ô)¨%Ñ0Ô0Ñ1Ô1�Ø× Ò   HÐ.W°UÐ.WÐ.WÀ!Ð.WÐ.WÈ8Ð.WÐ.WÑXÔXÐXÐXð	Yð 	Yr6   c                óR   — |                       t          t          j        d¦  «         dS )zu
        L{imap4.parseTime} raises L{ValueError} when given a a time
        string whose format is invalid.
        ÚinvalidN©r×   r  r   Ú	parseTimerR   s    r4   Útest_parseTimeInvalidFormatz,IMAP4HelperTests.test_parseTimeInvalidFormatð  s$   € ð
 	×Ò�*¥e¤o°yÑAÔAÐAÐAÐAr6   c                ód   — g d¢}|D ](}|                       t          t          j        |¦  «         Œ)dS )zv
        L{imap4.parseTime} raises L{ValueError} when given a time
        string composed of invalid values.
        )zinvalid-July-2017z2-invalid-2017z2-July-invalidNrK  )rE   ÚinvalidStringsrJ  s      r4   Útest_parseTimeInvalidValuesz,IMAP4HelperTests.test_parseTimeInvalidValues÷  sO   € ð

ð 
ð 
ˆð
 &ð 	Dð 	DˆGØ×Ò�j­%¬/¸7ÑCÔCÐCÐCð	Dð 	Dr6   c                ó`  — t          ¦   «         }|                     ¦   «         |                     ¦   «         |                     ¦   «         |                     ¦   «         |                     ¦   «         dœ}t          j        ||                     ¦   «         ¦  «        }|  	                    ||¦  «         dS )z«
        L{imap4.statusRequestHelper} builds a L{dict} mapping the
        requested status names to values extracted from the provided
        L{IMailboxIMAP}'s.
        )ÚMESSAGESÚRECENTÚUIDNEXTÚUIDVALIDITYÚUNSEENN)
ÚSimpleMailboxÚgetMessageCountÚgetRecentCountÚ
getUIDNextÚgetUIDValidityÚgetUnseenCountr   ÚstatusRequestHelperÚkeysrB   )rE   Úmboxrg  r2   s       r4   Útest_statusRequestHelperz)IMAP4HelperTests.test_statusRequestHelper  sœ   € õ ‰Œˆð ×,Ò,Ñ.Ô.Ø×)Ò)Ñ+Ô+Ø—’Ñ(Ô(Ø×.Ò.Ñ0Ô0Ø×)Ò)Ñ+Ô+ð
ð 
ˆõ Ô*¨4°·²±´ÑAÔAˆà×Ò˜ 6Ñ*Ô*Ð*Ð*Ð*r6   N),rs   rt   ru   r2  r8  r?  r\  r^  rh  r}  rˆ  r•  rµ  rÁ  rÖ  rÚ  rÜ  rà  râ  rå  rè  rê  rì  rî  rð  rò  rú  rý  rÿ  r  r  r  r!  r#  r&  r.  r1  r3  r9  r<  rH  rM  rP  r`  r1   r6   r4   r4  r4  å  s´  € € € € € ðð ð>ð >ð >ð)ð )ð )ð03ð 3ð 3ð46ð 6ð 6ð4ð ð ð&8@ð 8@ð 8@ðtDð Dð Dð0M,ð M,ð M,ð^9ð 9ð 9ð*6ð 6ð 6ð&r
ð r
ð r
ðhQð Qð Qð(ð (ð (ð@ð @ð @ðMð Mð MðMð Mð Mð
<ð 
<ð 
<ðFð Fð FðUð Uð Uð	Uð 	Uð 	UðAð Að Að?ð ?ð ?ðLð Lð LðCð Cð Cð(Fð Fð Fð!.ð !.ð !.ðF	5ð 	5ð 	5ð	7ð 	7ð 	7ð4ð 4ð 4ð2ð 2ð 2ðVð Vð Vð
ð 
ð 
ð2.ð .ð .ð0ð 0ð 0ð
ð 
ð 
ðð ð ð1Yð 1Yð 1YðfBð Bð BðDð Dð Dð+ð +ð +ð +ð +r6   r4  c                  ó–   — e Zd ZU dZg Zded<   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d„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )rW  ©z\Flag1ÚFlag2z\AnotherSysFlagÚLastFlagú+list[tuple[bytes, list[bytes], bytes, int]]r   r   rÅ   Fc                óX   — g | _         | j         j        | _        | j         j        | _        d S r0   ©Ú	listenersr|   ÚaddListenerÚremoveÚremoveListenerrR   s    r4   rz   zSimpleMailbox.__init__!  ó)   € ØˆŒØœ>Ô0ˆÔØ"œnÔ3ˆÔÐÐr6   c                ó   — | j         S r0   ©rœ  rR   s    r4   ÚgetFlagszSimpleMailbox.getFlags&  ó
   € ØŒzÐr6   c                ó   — dS )Né*   r1   rR   s    r4   r[  zSimpleMailbox.getUIDValidity)  s   € Øˆrr6   c                ó0   — t          | j        ¦  «        dz   S ©NrÅ   ©rÐ   r   rR   s    r4   rZ  zSimpleMailbox.getUIDNext,  s   € Ý�4”=Ñ!Ô! AÑ%Ð%r6   c                ó   — dS )Nr÷   r1   rR   s    r4   rX  zSimpleMailbox.getMessageCount/  ó   € Øˆqr6   c                ó   — dS )NrÇ   r1   rR   s    r4   rY  zSimpleMailbox.getRecentCount2  rw  r6   c                ó   — dS )NrË   r1   rR   s    r4   r\  zSimpleMailbox.getUnseenCount5  rw  r6   c                ó   — | j         S r0   ©ÚrwrR   s    r4   ÚisWriteablezSimpleMailbox.isWriteable8  s	   € ØŒwˆr6   c                ó   — d S r0   r1   rR   s    r4   ÚdestroyzSimpleMailbox.destroy;  ó   € Øˆr6   c                ó   — dS )NrP  r1   rR   s    r4   ÚgetHierarchicalDelimiterz&SimpleMailbox.getHierarchicalDelimiter>  s   € Øˆsr6   c                óB  — i }d|v r|                       ¦   «         |d<   d|v r|                      ¦   «         |d<   d|v r|                       ¦   «         dz   |d<   d|v r|                      ¦   «         |d<   d|v r|                      ¦   «         |d<   t	          j        |¦  «        S )NrR  rS  rT  rÅ   rU  rV  ©rX  rY  ÚgetUIDr\  r   rZ  ©rE   ÚnamesÚrs      r4   ÚrequestStatuszSimpleMailbox.requestStatusA  s¹   € ØˆØ˜ÐÐØ ×0Ò0Ñ2Ô2ˆAˆj‰MØ�uÐÐØ×-Ò-Ñ/Ô/ˆAˆh‰KØ˜ÐÐØ×/Ò/Ñ1Ô1°AÑ5ˆAˆi‰LØ˜EÐ!Ð!Ø#Ÿ{š{™}œ}ˆAˆmÑØ�uÐÐØ×-Ò-Ñ/Ô/ˆAˆh‰KÝŒ}˜QÑÔÐr6   Nc                ó�   — | j                              |||| j        f¦  «         | xj        dz  c_        t          j        d ¦  «        S rt  ©r   r|   ÚmUIDr   rZ  ©rE   Úmessagerœ  Údates       r4   Ú
addMessagezSimpleMailbox.addMessageO  sB   € ØŒ×Ò˜g u¨d°D´IÐ>Ñ?Ô?Ð?Øˆ	Œ	�Q‰ˆ	Œ	ÝŒ}˜TÑ"Ô"Ð"r6   c                ó®   — g }| j         D ]!}d|d         v r|                     |¦  «         Œ"|D ]}| j                              |¦  «         Œd„ |D ¦   «         S )Nú\DeletedrÅ   c                ó   — g | ]
}|d          ‘ŒS ©rÇ   r1   r+  s     r4   r¾  z)SimpleMailbox.expunge.<locals>.<listcomp>[  ó   € Ð%Ð%Ð%˜��!”Ð%Ð%Ð%r6   ©r   r|   rj  ©rE   Údeleteré   s      r4   ÚexpungezSimpleMailbox.expungeT  sv   € ØˆØ”ð 	!ð 	!ˆAØ˜a œdÐ"Ð"Ø—’˜aÑ Ô Ð øØð 	$ð 	$ˆAØŒM× Ò  Ñ#Ô#Ð#Ð#Ø%Ð%˜fÐ%Ñ%Ô%Ð%r6   c                ó   — d| _         d S ©NT)ÚclosedrR   s    r4   ÚclosezSimpleMailbox.close]  s   € ØˆŒˆˆr6   c                ó   — d S r0   r1   ©rE   r   r©  s      r4   ÚfetchzSimpleMailbox.fetch`  ó   € àˆr6   c                ó   — d S r0   r1   ©rE   rŽ  s     r4   r…  zSimpleMailbox.getUIDd  r¡  r6   c                ó   — d S r0   r1   ©rE   r   rœ  Úmoder©  s        r4   ÚstorezSimpleMailbox.storeh  r¡  r6   r0   )rs   rt   ru   rœ  r   Ú__annotations__rŒ  r|  rœ  rz   ro  r[  rZ  rX  rY  r\  r}  r  r‚  r‰  r�  r™  r�  r   r…  r§  r1   r6   r4   rW  rW    s?  € € € € € € à@€EØ<>€HÐ>Ð>Ð>Ñ>Ø€DØ	
€BØ€Fð4ð 4ð 4ð
ð ð ðð ð ð&ð &ð &ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð ð  ð  ð#ð #ð #ð #ð
&ð &ð &ðð ð ðð ð ðð ð ðð ð ð ð r6   rW  c                  ó”   — e Zd ZU dZdZg Zded<   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d„ Zdd„Zd„ Zd„ Zd„ Zd„ ZdS )ÚUncloseableMailboxz*
    A mailbox that cannot be closed.
    rb  re  r   r   rÅ   Fc                óX   — g | _         | j         j        | _        | j         j        | _        d S r0   rg  rR   s    r4   rz   zUncloseableMailbox.__init__y  rl  r6   c                ó   — | j         S )zB
        The flags

        @return: A sequence of flags.
        rn  rR   s    r4   ro  zUncloseableMailbox.getFlags~  s   € ð ŒzÐr6   c                ó   — dS )zF
        The UID validity value.

        @return: The value.
        rr  r1   rR   s    r4   r[  z!UncloseableMailbox.getUIDValidity†  s	   € ð ˆrr6   c                ó0   — t          | j        ¦  «        dz   S )z:
        The next UID.

        @return: The UID.
        rÅ   ru  rR   s    r4   rZ  zUncloseableMailbox.getUIDNextŽ  s   € õ �4”=Ñ!Ô! AÑ%Ð%r6   c                ó   — dS )zG
        The number of messages.

        @return: The number.
        r÷   r1   rR   s    r4   rX  z"UncloseableMailbox.getMessageCount–  ó	   € ð ˆqr6   c                ó   — dS )úD
        The recent messages.

        @return: The number.
        rÇ   r1   rR   s    r4   rY  z!UncloseableMailbox.getRecentCountž  r°  r6   c                ó   — dS )r²  rË   r1   rR   s    r4   r\  z!UncloseableMailbox.getUnseenCount¦  r°  r6   c                ó   — | j         S )z`
        The recent messages.

        @return: Whether or not the mailbox is writable.
        r{  rR   s    r4   r}  zUncloseableMailbox.isWriteable®  s   € ð Œwˆr6   c                ó   — dS )z'
        Destroy this mailbox.
        Nr1   rR   s    r4   r  zUncloseableMailbox.destroy¶  s	   € ð 	ˆr6   c                ó   — dS )zU
        Return the hierarchical delimiter.

        @return: The delimiter.
        rP  r1   rR   s    r4   r‚  z+UncloseableMailbox.getHierarchicalDelimiter¼  s	   € ð ˆsr6   c                óB  — i }d|v r|                       ¦   «         |d<   d|v r|                      ¦   «         |d<   d|v r|                       ¦   «         dz   |d<   d|v r|                      ¦   «         |d<   d|v r|                      ¦   «         |d<   t	          j        |¦  «        S )zŽ
        Return the mailbox's status.

        @param names: The status items to include.

        @return: A L{dict} of status data.
        rR  rS  rT  rÅ   rU  rV  r„  r†  s      r4   r‰  z UncloseableMailbox.requestStatusÄ  s»   € ð ˆØ˜ÐÐØ ×0Ò0Ñ2Ô2ˆAˆj‰MØ�uÐÐØ×-Ò-Ñ/Ô/ˆAˆh‰KØ˜ÐÐØ×/Ò/Ñ1Ô1°AÑ5ˆAˆi‰LØ˜EÐ!Ð!Ø#Ÿ{š{™}œ}ˆAˆmÑØ�uÐÐØ×-Ò-Ñ/Ô/ˆAˆh‰KÝŒ}˜QÑÔÐr6   Nc                ó�   — | j                              |||| j        f¦  «         | xj        dz  c_        t          j        d¦  «        S )a  
        Add a message to the mailbox.

        @param message: The message body.

        @param flags: The message flags.

        @param date: The message date.

        @return: A L{Deferred} that fires when the message has been
            added.
        rÅ   Nr‹  r�  s       r4   r�  zUncloseableMailbox.addMessageÙ  sD   € ð 	Œ×Ò˜g u¨d°D´IÐ>Ñ?Ô?Ð?Øˆ	Œ	�Q‰ˆ	Œ	ÝŒ}˜TÑ"Ô"Ð"r6   c                ó®   — g }| j         D ]!}d|d         v r|                     |¦  «         Œ"|D ]}| j                              |¦  «         Œd„ |D ¦   «         S )zj
        Delete messages marked for deletion.

        @return: A L{list} of deleted message IDs.
        r’  rÅ   c                ó   — g | ]
}|d          ‘ŒS r”  r1   r+  s     r4   r¾  z.UncloseableMailbox.expunge.<locals>.<listcomp>ö  r•  r6   r–  r—  s      r4   r™  zUncloseableMailbox.expungeê  sx   € ð ˆØ”ð 	!ð 	!ˆAØ˜a œdÐ"Ð"Ø—’˜aÑ Ô Ð øØð 	$ð 	$ˆAØŒM× Ò  Ñ#Ô#Ð#Ð#Ø%Ð%˜fÐ%Ñ%Ô%Ð%r6   c                ó   — d S r0   r1   rŸ  s      r4   r   zUncloseableMailbox.fetchø  r¡  r6   c                ó   — d S r0   r1   r£  s     r4   r…  zUncloseableMailbox.getUIDü  r¡  r6   c                ó   — d S r0   r1   r¥  s        r4   r§  zUncloseableMailbox.store   r¡  r6   r0   )rs   rt   ru   r2  rœ  r   r¨  rŒ  r|  rœ  rz   ro  r[  rZ  rX  rY  r\  r}  r  r‚  r‰  r�  r™  r   r…  r§  r1   r6   r4   rª  rª  m  s=  € € € € € € ðð ð A€EØ<>€HÐ>Ð>Ð>Ñ>Ø€DØ	
€BØ€Fð4ð 4ð 4ð
ð ð ðð ð ð&ð &ð &ðð ð ðð ð ðð ð ðð ð ðð ð ðð ð ð ð  ð  ð*#ð #ð #ð #ð"&ð &ð &ðð ð ðð ð ðð ð ð ð r6   rª  c                  ó$   — e Zd ZdZeZd„ Zdd„ZdS )ÚAccountWithoutNamespaceszL
    An in-memory account that does not provide L{INamespacePresenter}.
    c                ó*   — |                       ¦   «         S r0   )ÚmailboxFactory)rE   ÚnameÚids      r4   Ú_emptyMailboxz&AccountWithoutNamespaces._emptyMailbox  s   € Ø×"Ò"Ñ$Ô$Ð$r6   rÅ   c                óX   — t           j                             | |¦  «        }|�||_        |S r0   )r   ÚMemoryAccountÚselectr|  )rE   rÂ  r|  r_  s       r4   rÇ  zAccountWithoutNamespaces.select  s,   € ÝÔ"×)Ò)¨$°Ñ5Ô5ˆØÐØˆDŒGØˆr6   N©rÅ   )rs   rt   ru   r2  rW  rÁ  rÄ  rÇ  r1   r6   r4   r¿  r¿    sH   € € € € € ðð ð #€Nð%ð %ð %ðð ð ð ð ð r6   r¿  c                  ó   — e Zd ZdZdS )ÚAccountzD
    An in-memory account that provides L{INamespacePresenter}.
    N©rs   rt   ru   r2  r1   r6   r4   rÊ  rÊ    s   € € € € € ðð ð ð r6   rÊ  c                  ó0   — e Zd Z ed¦  «        Zd„ Zd„ ZdS )ÚSimpleServeró   testuserc                ó  — t          j        j        | g|¢R i |¤Ž t          | ¬¦  «        }t	          |¦  «        }t          ¦   «         }|                     dd¦  «         || _        || _        | 	                    |¦  «         d| _
        d S )N©ÚaccountHolderrÎ  ó   password-testF)r   ÚIMAP4Serverrz   Ú	TestRealmr   r   ÚaddUserÚcheckerÚportalÚregisterCheckerÚtimeoutTest)rE   ÚargsÚkwÚrealmr×  r”   s         r4   rz   zSimpleServer.__init__  s‘   € ÝÔÔ" 4Ð5¨$Ð5Ð5Ð5°"Ð5Ð5Ð5Ý¨Ð-Ñ-Ô-ˆÝ˜‘”ˆÝ3Ñ5Ô5ˆØ	�	Š	�+Ð/Ñ0Ô0Ð0ØˆŒØˆŒØ×Ò˜qÑ!Ô!Ð!Ø ˆÔÐÐr6   c                óX   — | j         rd S t          j                             | |¦  «         d S r0   )rÙ  r   rÓ  ÚlineReceived©rE   Úlines     r4   rÞ  zSimpleServer.lineReceived*  s1   € ØÔð 	àˆFåÔ×&Ò& t¨TÑ2Ô2Ð2Ð2Ð2r6   N)rs   rt   ru   rÊ  Ú
theAccountrz   rÞ  r1   r6   r4   rÍ  rÍ    sA   € € € € € Ø�˜Ñ%Ô%€Jð	!ð 	!ð 	!ð3ð 3ð 3ð 3ð 3r6   rÍ  c                  ó.   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ ZdS )ÚSimpleClientNc                ób   — t           j                             | |¦  «         || _        g | _        d S r0   )r   ÚIMAP4Clientrz   ÚdeferredÚevents)rE   ræ  ÚcontextFactorys      r4   rz   zSimpleClient.__init__3  s-   € ÝÔ×"Ò" 4¨Ñ8Ô8Ð8Ø ˆŒØˆŒˆˆr6   c                ó:   — | j                              d ¦  «         d S r0   )ræ  Úcallback)rE   Úcapss     r4   ÚserverGreetingzSimpleClient.serverGreeting8  s   € ØŒ×Ò˜tÑ$Ô$Ð$Ð$Ð$r6   c                óp   — | j                              d|g¦  «         | j                             ¦   «          d S )NÚmodeChanged©rç  r|   Ú	transportÚloseConnection)rE   Ú	writeables     r4   rî  zSimpleClient.modeChanged;  s7   € ØŒ×Ò˜M¨9Ð5Ñ6Ô6Ð6ØŒ×%Ò%Ñ'Ô'Ð'Ð'Ð'r6   c                óp   — | j                              d|g¦  «         | j                             ¦   «          d S )NÚflagsChangedrï  ©rE   ÚnewFlagss     r4   rô  zSimpleClient.flagsChanged?  s7   € ØŒ×Ò˜N¨HÐ5Ñ6Ô6Ð6ØŒ×%Ò%Ñ'Ô'Ð'Ð'Ð'r6   c                ór   — | j                              d||g¦  «         | j                             ¦   «          d S )NÚnewMessagesrï  )rE   ÚexistsÚrecents      r4   rø  zSimpleClient.newMessagesC  s9   € ØŒ×Ò˜M¨6°6Ð:Ñ;Ô;Ð;ØŒ×%Ò%Ñ'Ô'Ð'Ð'Ð'r6   r0   )rs   rt   ru   rz   rì  rî  rô  rø  r1   r6   r4   rã  rã  2  sd   € € € € € ðð ð ð ð
%ð %ð %ð(ð (ð (ð(ð (ð (ð(ð (ð (ð (ð (r6   rã  c                  óP   — e Zd ZU dZded<   dZded<   d„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ ZdS )ÚIMAP4HelperMixinNzOptional[ServerTLSContext]Ú	serverCTXzOptional[ClientTLSContext]Ú	clientCTXc                ó
  — t          j        ¦   «         }t          | j        ¬¦  «        | _        t          || j        ¬¦  «        | _        || _        g t          _
        t          d¦  «        }t          |_        |t          _        d S )N©rè  rÎ  )r   r   rÍ  rý  Úserverrã  rþ  ÚclientÚ	connectedrW  r   rÊ  ÚmboxTyperá  )rE   rž   rá  s      r4   ÚsetUpzIMAP4HelperMixin.setUpL  sk   € ÝŒNÑÔˆÝ"°$´.ÐAÑAÔAˆŒÝ" 1°T´^ÐDÑDÔDˆŒØˆŒà!#�ÔÝ˜[Ñ)Ô)ˆ
Ý+ˆ
ÔØ",�ÔÐÐr6   c                ó   — | ` | `| `d S r0   )r  r  r  rR   s    r4   ÚtearDownzIMAP4HelperMixin.tearDownW  s   € ØˆKØˆKØˆNˆNˆNr6   c                óB   — | j         j                             ¦   «          d S r0   )r  rð  rñ  )rE   Úignores     r4   Ú_cbStopClientzIMAP4HelperMixin._cbStopClient\  s   € ØŒÔ×,Ò,Ñ.Ô.Ð.Ð.Ð.r6   c                óÈ   — | j         j                             ¦   «          | j        j                             ¦   «          t	          j        |dt          | ¦  «        z   ¦  «         d S )NúProblem with )r  rð  rñ  r  r%   Úerrrå   )rE   r$   s     r4   Ú
_ebGeneralzIMAP4HelperMixin._ebGeneral_  sS   € ØŒÔ×,Ò,Ñ.Ô.Ð.ØŒÔ×,Ò,Ñ.Ô.Ð.ÝŒ�˜­3¨t©9¬9Ñ4Ñ5Ô5Ð5Ð5Ð5r6   c                ó@   — t          j        | j        | j        ¦  «        S r0   )r#   ÚloopbackAsyncr  r  rR   s    r4   r#   zIMAP4HelperMixin.loopbackd  s   € ÝÔ% d¤k°4´;Ñ?Ô?Ð?r6   c                ó¬   —  |j         t          j        ¦  «         t          |j        ¦  «        }t          |¦  «        }|                      ||¦  «         dS )a.  
        Assert that the provided failure is an L{IMAP4Exception} with
        the given message.

        @param failure: A failure whose value L{IMAP4Exception}
        @type failure: L{failure.Failure}

        @param expected: The expected failure message.
        @type expected: L{bytes}
        N)Útrapr   ÚIMAP4Exceptionrå   ÚvaluerÛ   rB   )rE   r$   rg  rŽ  s       r4   ÚassertClientFailureMessagez+IMAP4HelperMixin.assertClientFailureMessageg  sO   € ð 	ˆŒ•UÔ)Ñ*Ô*Ð*Ý�g”mÑ$Ô$ˆÝ˜‘>”>ˆà×Ò˜ (Ñ+Ô+Ð+Ð+Ð+r6   )rs   rt   ru   rý  r¨  rþ  r  r  r
  r  r#   r  r1   r6   r4   rü  rü  H  s•   € € € € € € Ø,0€IÐ0Ð0Ð0Ñ0Ø,0€IÐ0Ð0Ð0Ñ0ð	-ð 	-ð 	-ðð ð ð
/ð /ð /ð6ð 6ð 6ð
@ð @ð @ð,ð ,ð ,ð ,ð ,r6   rü  c                  ó@  — 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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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(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d1„ Z3d2„ Z4d3„ Z5d4S )5ÚIMAP4ServerTestsc                ó&  ‡ ‡‡— i Šˆˆ fd„}‰ j                              t          |¦  «        ¦  «                             ‰ j        ¦  «        }t          j        ‰                      ¦   «         |g¦  «        }d d d dœŠ|                     ˆˆˆ fd„¦  «        S )Nc                 óh   •— ˆˆfd„} ‰j                              ¦   «                              | ¦  «        S )Nc                ón   •— ‰                      | ¦  «         ‰j        j                             ¦   «          d S r0   ©Úupdater  rð  rñ  ©r”   rë  rE   s    €€r4   ÚgotCapszAIMAP4ServerTests.testCapability.<locals>.getCaps.<locals>.gotCaps~  ó/   ø€ Ø—’˜A‘”�Ø”Ô%×4Ò4Ñ6Ô6Ð6Ð6Ð6r6   ©r  ÚgetCapabilitiesr›   ©r  rë  rE   s    €€r4   ÚgetCapsz0IMAP4ServerTests.testCapability.<locals>.getCaps}  óE   ø€ ð7ð 7ð 7ð 7ð 7ð 7ð ”;×.Ò.Ñ0Ô0×<Ò<¸WÑEÔEÐEr6   )ó	   IMAP4rev1ó	   NAMESPACEó   IDLEc                ó0   •— ‰                      ‰‰¦  «        S r0   ©rB   )Ú_rë  rg  rE   s    €€€r4   r5   z1IMAP4ServerTests.testCapability.<locals>.<lambda>‡  s   ø€  t×'7Ò'7¸À$Ñ'GÔ'G€ r6   )r  r›   r7   Ú
addErrbackr  r   ÚgatherResultsr#   )rE   r#  Úd1rž   rë  rg  s   `   @@r4   ÚtestCapabilityzIMAP4ServerTests.testCapabilityz  s©   øøø€ Øˆð	Fð 	Fð 	Fð 	Fð 	Fð 	Fð Œ^×'Ò'­¨g©¬Ñ7Ô7×BÒBÀ4Ä?ÑSÔSˆÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ"&°dÀTÐJÐJˆØ�}Š}ÐGÐGÐGÐGÐGÐGÑHÔHÐHr6   c                óR  ‡ ‡‡— i Št           ‰ j        j        d<   ˆˆ fd„}‰ j                             t          |¦  «        ¦  «                             ‰ j        ¦  «        }t          j	        ‰  
                    ¦   «         |g¦  «        }d d d dgdœŠ|                     ˆˆˆ fd„¦  «        S )Nó   CRAM-MD5c                 óh   •— ˆˆfd„} ‰j                              ¦   «                              | ¦  «        S )Nc                ón   •— ‰                      | ¦  «         ‰j        j                             ¦   «          d S r0   r  r  s    €€r4   r  zIIMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps.<locals>.gotCapsŽ  r  r6   r   r"  s    €€r4   r#  z8IMAP4ServerTests.testCapabilityWithAuth.<locals>.getCaps�  r$  r6   )r%  r&  r'  ó   AUTHc                ó0   •— ‰                      ‰‰¦  «        S r0   r)  )r*  rë  ÚexpCaprE   s    €€€r4   r5   z9IMAP4ServerTests.testCapabilityWithAuth.<locals>.<lambda>ž  s   ø€  t×'7Ò'7¸ÀÑ'EÔ'E€ r6   )r   r  Úchallengersr  r›   r7   r+  r  r   r,  r#   )rE   r#  r-  rž   rë  r5  s   `   @@r4   ÚtestCapabilityWithAuthz'IMAP4ServerTests.testCapabilityWithAuth‰  sÇ   øøø€ ØˆÝ/AˆŒÔ Ñ,ð	Fð 	Fð 	Fð 	Fð 	Fð 	Fð Œ^×'Ò'­¨g©¬Ñ7Ô7×BÒBÀ4Ä?ÑSÔSˆÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆð ØØØ!�]ð	
ð 
ˆð �}Š}ÐEÐEÐEÐEÐEÐEÑFÔFÐFr6   c                óò   ‡ — d‰ _         ˆ fd„}‰ j                             t          |¦  «        ¦  «                             ‰ j        ¦  «         ‰                      ¦   «         }|                     ˆ fd„¦  «        S )Nr   c                 ó„   •— ˆfd„} ‰j                              ¦   «                              t          | ¦  «        ¦  «         d S )Nc                 ó   •— d‰ _         d S rt  )Ú	loggedOutrR   s   €r4   ÚsetLoggedOutzAIMAP4ServerTests.testLogout.<locals>.logout.<locals>.setLoggedOut¤  s   ø€ Ø!"�”��r6   )r  Úlogoutr›   r7   )r<  rE   s    €r4   r=  z+IMAP4ServerTests.testLogout.<locals>.logout£  sN   ø€ ð#ð #ð #ð #ð #ð ŒK×ÒÑ Ô ×,Ò,­U°<Ñ-@Ô-@ÑAÔAÐAÐAÐAr6   c                ó:   •— ‰                      ‰j        d¦  «        S rt  )rB   r;  ©r*  rE   s    €r4   r5   z-IMAP4ServerTests.testLogout.<locals>.<lambda>«  s   ø€  t×'7Ò'7¸¼ÈÑ'JÔ'J€ r6   )r;  r  r›   r7   r+  r  r#   )rE   r=  rž   s   `  r4   Ú
testLogoutzIMAP4ServerTests.testLogout   s   ø€ ØˆŒð	Bð 	Bð 	Bð 	Bð 	Bð 	Œ×"Ò"¥5¨¡=¤=Ñ1Ô1×<Ò<¸T¼_ÑMÔMÐMØ�MŠM‰OŒOˆØ�}Š}ÐJÐJÐJÐJÑKÔKÐKr6   c                óò   ‡ — d ‰ _         ˆ fd„}‰ j                             t          |¦  «        ¦  «                             ‰ j        ¦  «         ‰                      ¦   «         }|                     ˆ fd„¦  «        S )Nc                 ój   •— ˆfd„} ‰j                              ¦   «                              | ¦  «         d S )Nc                óR   •— | ‰_         ‰j        j                             ¦   «          d S r0   )Ú	responsesr  rð  rñ  )rD  rE   s    €r4   ÚsetResponsesz=IMAP4ServerTests.testNoop.<locals>.noop.<locals>.setResponses±  s'   ø€ Ø!*�”Ø”Ô%×4Ò4Ñ6Ô6Ð6Ð6Ð6r6   )r  Únoopr›   )rE  rE   s    €r4   rF  z'IMAP4ServerTests.testNoop.<locals>.noop°  sF   ø€ ð7ð 7ð 7ð 7ð 7ð ŒK×ÒÑÔ×*Ò*¨<Ñ8Ô8Ð8Ð8Ð8r6   c                ó:   •— ‰                      ‰j        g ¦  «        S r0   )rB   rD  r?  s    €r4   r5   z+IMAP4ServerTests.testNoop.<locals>.<lambda>¹  s   ø€  t×'7Ò'7¸¼ÈÑ'KÔ'K€ r6   )rD  r  r›   r7   r+  r  r#   )rE   rF  rž   s   `  r4   ÚtestNoopzIMAP4ServerTests.testNoop­  sz   ø€ ØˆŒð	9ð 	9ð 	9ð 	9ð 	9ð 	Œ×"Ò"¥5¨¡;¤;Ñ/Ô/×:Ò:¸4¼?ÑKÔKÐKØ�MŠM‰OŒOˆØ�}Š}ÐKÐKÐKÐKÑLÔLÐLr6   c                ó  ‡ — ˆ fd„}‰ j                              t          |¦  «        ¦  «                             ‰ j        ¦  «        }t          j        |‰                      ¦   «         g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ór   •— ‰j                              dd¦  «        } |                      ‰j        ¦  «         d S ©NrÎ  rÒ  )r  Úloginr›   r
  ©rž   rE   s    €r4   rL  z)IMAP4ServerTests.testLogin.<locals>.login¼  s6   ø€ Ø”×!Ò! +Ð/?Ñ@Ô@ˆAØ�MŠM˜$Ô,Ñ-Ô-Ð-Ð-Ð-r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestLogin©rE   rL  r-  rž   s   `   r4   Ú	testLoginzIMAP4ServerTests.testLogin»  s{   ø€ ð	.ð 	.ð 	.ð 	.ð 	.ð Œ^×'Ò'­¨e©¬Ñ5Ô5×@Ò@ÀÄÑQÔQˆÝÔ  T§]¢]¡_¤_Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ.Ñ/Ô/Ð/r6   c                óš   — |                       | j        j        t          j        ¦  «         |                       | j        j        d¦  «         d S ©NÚauth©rB   r  ÚaccountrÍ  rá  Ústate©rE   Úignoreds     r4   rN  zIMAP4ServerTests._cbTestLoginÄ  óA   € Ø×Ò˜œÔ,­lÔ.EÑFÔFÐFØ×Ò˜œÔ*¨FÑ3Ô3Ð3Ð3Ð3r6   c                ó  ‡ — ˆ fd„}‰ j                              t          |¦  «        ¦  «                             ‰ j        ¦  «        }‰                      ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ór   •— ‰j                              dd¦  «        } |                      ‰j        ¦  «         d S ©NrÎ  s   wrong-password©r  rL  ÚaddBothr
  rM  s    €r4   rL  z/IMAP4ServerTests.testFailedLogin.<locals>.loginÉ  ó6   ø€ Ø”×!Ò! +Ð/@ÑAÔAˆAØ�IŠI�dÔ(Ñ)Ô)Ð)Ð)Ð)r6   )	r  r›   r7   r+  r  r#   r   r,  Ú_cbTestFailedLogin©rE   rL  r-  Úd2rž   s   `    r4   ÚtestFailedLoginz IMAP4ServerTests.testFailedLoginÈ  s   ø€ ð	*ð 	*ð 	*ð 	*ð 	*ð Œ^×'Ò'­¨e©¬Ñ5Ô5×@Ò@ÀÄÑQÔQˆØ�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ4Ñ5Ô5Ð5r6   c                ó†   — |                       | j        j        d ¦  «         |                       | j        j        d¦  «         d S )NÚunauth)rB   r  rU  rV  rW  s     r4   r`  z#IMAP4ServerTests._cbTestFailedLoginÒ  s>   € Ø×Ò˜œÔ,¨dÑ3Ô3Ð3Ø×Ò˜œÔ*¨HÑ5Ô5Ð5Ð5Ð5r6   c                ó,  ‡ — d‰ j         _        ˆ fd„}‰ j                             t	          |¦  «        ¦  «                             ‰ j        ¦  «        }‰                      ¦   «         }t          j	        ||g¦  «        }|                     ‰ j
        ¦  «        S )zj
        Attempting to log into a server that has no L{Portal} results
        in a failed login.
        Nc                 ór   •— ‰j                              dd¦  «        } |                      ‰j        ¦  «         d S r\  r]  rM  s    €r4   rL  z7IMAP4ServerTests.test_loginWithoutPortal.<locals>.loginÝ  r_  r6   )r  r×  r  r›   r7   r+  r  r#   r   r,  r`  ra  s   `    r4   Útest_loginWithoutPortalz(IMAP4ServerTests.test_loginWithoutPortalÖ  s‹   ø€ ð
 "ˆŒÔð	*ð 	*ð 	*ð 	*ð 	*ð Œ^×'Ò'­¨e©¬Ñ5Ô5×@Ò@ÀÄÑQÔQˆØ�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ4Ñ5Ô5Ð5r6   c                óF  ‡ — d„ }|‰ j         j        j        _        ˆ fd„}‰ j                             t          |¦  «        ¦  «                             ‰ j        ¦  «        }‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ¦  «        S )zê
        The server responds with a C{BAD} response when its portal
        attempts to log a user in with checker that claims to support
        L{IAccount} but returns an an avatar interface that is not
        L{IAccount}.
        c                 ó   — ddd„ fS )NzNot IAccountzNot an accountc                 ó   — d S r0   r1   r1   r6   r4   r5   zVIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatar.<locals>.<lambda>ï  s   € ¸d€ r6   r1   )r*  Ú__s     r4   ÚbrokenRequestAvatarzDIMAP4ServerTests.test_nonIAccountAvatar.<locals>.brokenRequestAvatarî  s   € Ø"Ð$4°l°lÐCÐCr6   c                 ór   •— ‰j                              dd¦  «        } |                      ‰j        ¦  «         d S rK  r]  rM  s    €r4   rL  z6IMAP4ServerTests.test_nonIAccountAvatar.<locals>.loginó  s6   ø€ Ø”×!Ò! +Ð/?Ñ@Ô@ˆAØ�IŠI�dÔ(Ñ)Ô)Ð)Ð)Ð)r6   )r  r×  rÜ  ÚrequestAvatarr  r›   r7   r+  r  r#   r   r,  r`  )rE   rm  rL  r-  rb  rž   s   `     r4   Útest_nonIAccountAvatarz'IMAP4ServerTests.test_nonIAccountAvataræ  s¤   ø€ ð	Dð 	Dð 	Dð 2EˆŒÔÔ Ô.ð	*ð 	*ð 	*ð 	*ð 	*ð Œ^×'Ò'­¨e©¬Ñ5Ô5×@Ò@ÀÄÑQÔQˆØ�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ4Ñ5Ô5Ð5r6   c                óò  ‡ ‡—  G d„ dt           ¦  «        Šˆfd„}|‰ j        _        ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     ‰ j        d¦  «         |j        ˆˆ fd„¦   «         }|                     ‰ j        ¦  «         | 	                    ‰ j
        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ¦  «        S )z£
        Any exception raised by L{IMAP4Server.authenticateLogin} that
        is not L{UnauthorizedLogin} is logged results in a C{BAD}
        response.
        c                  ó   — e Zd ZdZdS )úAIMAP4ServerTests.test_loginException.<locals>.UnexpectedExceptionú2
            An unexpected exception.
            NrË  r1   r6   r4   ÚUnexpectedExceptionrs    ó   € € € € € ðð ð ð r6   ru  c                ó   •—  ‰d¦  «        ‚)NÚWhoopsr1   )ÚuserÚpasswdru  s     €r4   ÚraisesUnexpectedExceptionzGIMAP4ServerTests.test_loginException.<locals>.raisesUnexpectedException  s   ø€ Ø%Ð% hÑ/Ô/Ð/r6   c                 ó:   •— ‰ j                              dd¦  «        S rK  ©r  rL  rR   s   €r4   rL  z3IMAP4ServerTests.test_loginException.<locals>.login  ó   ø€ Ø”;×$Ò$ [Ð2BÑCÔCÐCr6   s   Server error: Whoopsc                óX   •— ‰                      ‰                     ‰¦  «        ¦  «         d S r0   ©rU  ÚflushLoggedErrors)r*  ru  rE   s    €€r4   ÚassertErrorLoggedz?IMAP4ServerTests.test_loginException.<locals>.assertErrorLogged  s*   ø€ à�OŠO˜D×2Ò2Ð3FÑGÔGÑHÔHÐHÐHÐHr6   )rß  r  ÚauthenticateLoginr  r›   r7   r+  r  r  r^  r
  r#   r   r,  r`  )rE   r{  rL  r-  r‚  rb  rž   ru  s   `      @r4   Útest_loginExceptionz$IMAP4ServerTests.test_loginExceptionü  s8  øø€ ð	ð 	ð 	ð 	ð 	¥)ñ 	ô 	ð 	ð
	0ð 	0ð 	0ð 	0ð 	0ð )BˆŒÔ%ð	Dð 	Dð 	Dð 	Dð 	Dð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆà
�Š�dÔ5Ð7NÑOÔOÐOà	Œð	Ið 	Ið 	Ið 	Ið 	Iñ 
Œð	Ið 	�Š�d”oÑ&Ô&Ð&Ø
�
Š
�4Ô%Ñ&Ô&Ð&à�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ4Ñ5Ô5Ð5r6   c                ó6  ‡ — ddi‰ j         j        _        ˆ fd„}‰ j                             t          |¦  «        ¦  «                             ‰ j        ¦  «        }t          j	        ‰  
                    ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nó
   {test}useró   {test}passwordc                 óÒ   •— ‰j                              dd¦  «        } |                      t          j        dt          ‰¦  «        z   ¦  «         |                      ‰j        ¦  «         d S )Nr†  r‡  r  )r  rL  r+  r%   r  rå   r›   r
  rM  s    €r4   rL  z9IMAP4ServerTests.testLoginRequiringQuoting.<locals>.login"  sW   ø€ Ø”×!Ò! -Ð1BÑCÔCˆAØ�LŠL�œ /µC¸±I´IÑ"=Ñ>Ô>Ð>Ø�MŠM˜$Ô,Ñ-Ô-Ð-Ð-Ð-r6   )r  rÖ  Úusersr  r›   r7   r+  r  r   r,  r#   Ú_cbTestLoginRequiringQuotingrO  s   `   r4   ÚtestLoginRequiringQuotingz*IMAP4ServerTests.testLoginRequiringQuoting  sŽ   ø€ Ø%2Ð4EÐ$FˆŒÔÔ!ð	.ð 	.ð 	.ð 	.ð 	.ð
 Œ^×'Ò'­¨e©¬Ñ5Ô5×@Ò@ÀÄÑQÔQˆÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ>Ñ?Ô?Ð?r6   c                óš   — |                       | j        j        t          j        ¦  «         |                       | j        j        d¦  «         d S rR  rT  rW  s     r4   rŠ  z-IMAP4ServerTests._cbTestLoginRequiringQuoting+  rY  r6   c                óª  ‡ — d ‰ _         ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         |                     ‰ j        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }|j        ˆ fd„¦   «         }|                     ‰ j	        ddggg g g¦  «         |S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z-IMAP4ServerTests.testNamespace.<locals>.login2  r~  r6   c                 óf   •— ˆfd„} ‰j                              ¦   «                              | ¦  «        S )Nc                ó@   •— | ‰_         ‰                     d ¦  «         d S r0   ©ÚnamespaceArgsr
  ©rÚ  rE   s    €r4   ÚgotNamespacezGIMAP4ServerTests.testNamespace.<locals>.namespace.<locals>.gotNamespace6  ó%   ø€ Ø%)�Ô"Ø×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r6   ©r  Ú	namespacer›   ©r”  rE   s    €r4   r—  z1IMAP4ServerTests.testNamespace.<locals>.namespace5  ó@   ø€ ð)ð )ð )ð )ð )ð ”;×(Ò(Ñ*Ô*×6Ò6°|ÑDÔDÐDr6   c                óp   •— ‰j         D ]'}|D ]"}|D ]}‰                     |t          ¦  «         ŒŒ#Œ(‰j         S r0   )r’  rØ  rå   )rX  Ú
namespacesÚpairr  rE   s       €r4   ÚassertAllPairsNativeStringszCIMAP4ServerTests.testNamespace.<locals>.assertAllPairsNativeStringsB  sa   ø€ à"Ô0ð :ð :�
Ø&ð :ð :�DØ!%ð :ð :˜Ø×-Ò-¨eµSÑ9Ô9Ð9Ð9ð:ð:ð Ô%Ð%r6   r)  rP  )
r’  r  r›   r7   r+  r  r#   r   r,  rB   )rE   rL  r—  r-  rb  rž   r�  s   `      r4   ÚtestNamespacezIMAP4ServerTests.testNamespace/  s  ø€ Ø!ˆÔð	Dð 	Dð 	Dð 	Dð 	Dð	Eð 	Eð 	Eð 	Eð 	Eð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜YÑ'Ô'Ñ(Ô(Ð(Ø
�Š�d”oÑ&Ô&Ð&Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆà	
Œð	&ð 	&ð 	&ð 	&ñ 
Œð	&ð 	
�Š�dÔ&¨2¨s¨)¨°b¸"Ð(=Ñ>Ô>Ð>Øˆr6   c                óâ  ‡ — t          d¦  «        ‰ j        _        d‰ _        ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         |                     ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |                     ‰ j        g g g g¦  «         |S )z–
        A mailbox that does not provide L{INamespacePresenter} returns
        empty L{list}s for its personal, shared, and user namespaces.
        rÎ  Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z<IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.loginU  r~  r6   c                 óf   •— ˆfd„} ‰j                              ¦   «                              | ¦  «        S )Nc                ó@   •— | ‰_         ‰                     d ¦  «         d S r0   r‘  r“  s    €r4   r”  zVIMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespace.<locals>.gotNamespaceY  r•  r6   r–  r˜  s    €r4   r—  z@IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.namespaceX  r™  r6   c                ó   •— ‰j         S r0   )r’  r?  s    €r4   r5   z?IMAP4ServerTests.test_mailboxWithoutNamespace.<locals>.<lambda>d  s
   ø€  Ô 2€ r6   )r¿  r  rá  r’  r  r›   r7   r+  r  r#   r   r,  rB   )rE   rL  r—  r-  rb  rž   s   `     r4   Útest_mailboxWithoutNamespacez-IMAP4ServerTests.test_mailboxWithoutNamespaceM  s  ø€ õ
 ":¸+Ñ!FÔ!FˆŒÔØ!ˆÔð	Dð 	Dð 	Dð 	Dð 	Dð	Eð 	Eð 	Eð 	Eð 	Eð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜YÑ'Ô'Ñ(Ô(Ð(Ø
�Š�d”oÑ&Ô&Ð&Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�ŠÐ2Ð2Ð2Ð2Ñ3Ô3Ð3Ø	�Š�dÔ&¨¨R°¨Ñ5Ô5Ð5Øˆr6   c                ó®  ‡ — t           j                             d¦  «         d ‰ _        ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         |                     ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «                             ‰ j        ¦  «        S )Nútest-mailboxc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests.testSelect.<locals>.loginl  r~  r6   c                 óp   •— ˆfd„} ‰j                              d¦  «        }|                     | ¦  «         |S )Nc                ó@   •— | ‰_         ‰                     d ¦  «         d S r0   )ÚselectedArgsr
  r“  s    €r4   Úselectedz=IMAP4ServerTests.testSelect.<locals>.select.<locals>.selectedp  ó%   ø€ Ø$(�Ô!Ø×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r6   r¦  )r  rÇ  r›   )r«  rž   rE   s     €r4   rÇ  z+IMAP4ServerTests.testSelect.<locals>.selecto  sJ   ø€ ð)ð )ð )ð )ð )ð ”×"Ò" >Ñ2Ô2ˆAØ�MŠM˜(Ñ#Ô#Ð#ØˆHr6   )rÍ  rá  Ú
addMailboxrª  r  r›   r7   r+  r  r#   r   r,  Ú_cbTestSelect)rE   rL  rÇ  r-  rb  s   `    r4   Ú
testSelectzIMAP4ServerTests.testSelecth  sÕ   ø€ ÝÔ×*Ò*¨>Ñ:Ô:Ð:Ø ˆÔð	Dð 	Dð 	Dð 	Dð 	Dð	ð 	ð 	ð 	ð 	ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜V‘}”}Ñ%Ô%Ð%Ø
�Š�d”oÑ&Ô&Ð&Ø�]Š]‰_Œ_ˆÝÔ" B¨ 8Ñ,Ô,×8Ò8¸Ô9KÑLÔLÐLr6   c                óò  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «         ‰ j                              t          |¦  «        ¦  «         ‰ j                              ‰ j        d¦  «         ‰ j                              ‰ j        ¦  «         ‰ j                              ‰ j        ¦  «         t          j        ‰ j         ‰  	                    ¦   «         g¦  «        }|j        ˆ fd„¦   «         }|S )zh
        A client that selects a mailbox that does not exist receives a
        C{NO} response.
        c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z9IMAP4ServerTests.test_selectWithoutMailbox.<locals>.login„  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S )Nr¦  ©r  rÇ  rR   s   €r4   rÇ  z:IMAP4ServerTests.test_selectWithoutMailbox.<locals>.select‡  ó   ø€ Ø”;×%Ò% nÑ5Ô5Ð5r6   ó   No such mailboxc                óF   •— ‰                      ‰j        j        ¦  «         d S r0   )ÚassertIsNoner  r_  r?  s    €r4   ÚassertNoMailboxSelectedzKIMAP4ServerTests.test_selectWithoutMailbox.<locals>.assertNoMailboxSelected’  s"   ø€ à×Ò˜dœkÔ.Ñ/Ô/Ð/Ð/Ð/r6   )
r  r›   r7   r+  r  r
  r  r   r,  r#   )rE   rL  rÇ  ÚconnectionCompleter¸  s   `    r4   Útest_selectWithoutMailboxz*IMAP4ServerTests.test_selectWithoutMailbox~  s  ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	6ð 	6ð 	6ð 	6ð 	6ð 	Œ×"Ò"¥5¨¡<¤<Ñ0Ô0Ð0ØŒ×"Ò"¥5¨¡=¤=Ñ1Ô1Ð1ØŒ×!Ò! $Ô"AÐCUÑVÔVÐVØŒ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2å"Ô0°$´.À$Ç-Â-Á/Ä/Ð1RÑSÔSÐà	Ô	'ð	0ð 	0ð 	0ð 	0ñ 
(Ô	'ð	0ð "Ð!r6   c           	     ó¶   — t           j        j        d         }|                      | j        j        |¦  «         |                      | j        ddddddœ¦  «         d S )NúTEST-MAILBOXr÷   rÇ   rr  rb  T©ÚEXISTSrS  rU  rš  ú
READ-WRITE)rÍ  rá  Ú	mailboxesrB   r  r_  rª  ©rE   rX  r_  s      r4   r®  zIMAP4ServerTests._cbTestSelect˜  sn   € ÝÔ&Ô0°Ô@ˆØ×Ò˜œÔ)¨4Ñ0Ô0Ð0Ø×ÒØÔàØØ!ØMØ"ðð ñ		
ô 		
ð 		
ð 		
ð 		
r6   c                ó²  ‡ — t           j                             d¦  «         d‰ _        ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         |                     ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ¦  «        S )a‡  
        L{IMAP4Client.examine} issues an I{EXAMINE} command to the server and
        returns a L{Deferred} which fires with a C{dict} with as many of the
        following keys as the server includes in its response: C{'FLAGS'},
        C{'EXISTS'}, C{'RECENT'}, C{'UNSEEN'}, C{'READ-WRITE'}, C{'READ-ONLY'},
        C{'UIDVALIDITY'}, and C{'PERMANENTFLAGS'}.

        Unfortunately the server doesn't generate all of these so it's hard to
        test the client's handling of them here.  See
        L{IMAP4ClientExamineTests} below.

        See U{RFC 3501<http://www.faqs.org/rfcs/rfc3501.html>}, section 6.3.2,
        for details.
        r¦  Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z,IMAP4ServerTests.test_examine.<locals>.login¸  r~  r6   c                 óp   •— ˆfd„} ‰j                              d¦  «        }|                     | ¦  «         |S )Nc                ó@   •— | ‰_         ‰                     d ¦  «         d S r0   )ÚexaminedArgsr
  r“  s    €r4   Úexaminedz@IMAP4ServerTests.test_examine.<locals>.examine.<locals>.examined¼  r¬  r6   r¦  )r  Úexaminer›   )rÇ  rž   rE   s     €r4   rÈ  z.IMAP4ServerTests.test_examine.<locals>.examine»  sJ   ø€ ð)ð )ð )ð )ð )ð ”×#Ò# NÑ3Ô3ˆAØ�MŠM˜(Ñ#Ô#Ð#ØˆHr6   )rÍ  rá  r­  rÆ  r  r›   r7   r+  r  r#   r   r,  Ú_cbTestExamine)rE   rL  rÈ  r-  rb  rž   s   `     r4   Útest_examinezIMAP4ServerTests.test_examine¦  sÚ   ø€ õ 	Ô×*Ò*¨>Ñ:Ô:Ð:Ø ˆÔð	Dð 	Dð 	Dð 	Dð 	Dð	ð 	ð 	ð 	ð 	ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜W‘~”~Ñ&Ô&Ð&Ø
�Š�d”oÑ&Ô&Ð&Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ0Ñ1Ô1Ð1r6   c           	     ó¶   — t           j        j        d         }|                      | j        j        |¦  «         |                      | j        ddddddœ¦  «         d S )Nr¼  r÷   rÇ   rr  rb  Fr½  )rÍ  rá  rÀ  rB   r  r_  rÆ  rÁ  s      r4   rÉ  zIMAP4ServerTests._cbTestExamineË  sn   € ÝÔ&Ô0°Ô@ˆØ×Ò˜œÔ)¨4Ñ0Ô0Ð0Ø×ÒØÔàØØ!ØMØ#ðð ñ		
ô 		
ð 		
ð 		
ð 		
r6   c                ól  ‡ ‡‡‡‡	— dŠ	dŠˆ fd„Šˆ fd„Šˆ fd„}ˆˆˆˆ ˆ	fd„}g ‰ _         ‰ j                             t          |¦  «        ¦  «                             t          |¦  «        ¦  «        }‰                      ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ‰	‰¦  «        S )N)Útestboxútest/boxztest/útest/box/boxÚINBOX)rÍ  rÎ  c                 ó<   •— ‰ j                              d¦  «         d S rt  ©r2   r|   rR   s   €r4   Úcbz'IMAP4ServerTests.testCreate.<locals>.cbÝ  ó   ø€ ØŒK×Ò˜qÑ!Ô!Ð!Ð!Ð!r6   c                ó<   •— ‰j                              d¦  «         d S ©Nr   rÒ  ©r$   rE   s    €r4   Úebz'IMAP4ServerTests.testCreate.<locals>.ebà  rÔ  r6   c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests.testCreate.<locals>.loginã  r~  r6   c                 óö   •— ‰‰z   D ]Q} ‰j                              | ¦  «        }|                     t          ‰¦  «        ¦  «                             ‰¦  «         ŒR|                     ‰j        ‰j        ¦  «         d S r0   )r  Úcreater›   r7   r+  ÚaddCallbacksr
  r  )rÂ  rž   rÓ  rØ  rY  rE   rZ  s     €€€€€r4   rÛ  z+IMAP4ServerTests.testCreate.<locals>.createæ  ss   ø€ Ø $™ð 8ð 8�Ø”K×&Ò& tÑ,Ô,�Ø—’�e B™iœiÑ(Ô(×3Ò3°BÑ7Ô7Ð7Ð7Ø�NŠN˜4Ô-¨t¬Ñ?Ô?Ð?Ð?Ð?r6   )r2   r  r›   r7   r#   r   r,  Ú_cbTestCreate)
rE   rL  rÛ  r-  rb  rž   rÓ  rØ  rY  rZ  s
   `     @@@@r4   Ú
testCreatezIMAP4ServerTests.testCreateÙ  s	  øøøøø€ ØKˆØ&ˆð	"ð 	"ð 	"ð 	"ð 	"ð	"ð 	"ð 	"ð 	"ð 	"ð	Dð 	Dð 	Dð 	Dð 	Dð	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð ˆŒØŒ^×'Ò'­¨e©¬Ñ5Ô5×AÒAÅ%ÈÁ-Ä-ÑPÔPˆØ�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ/°¸$Ñ?Ô?Ð?r6   c                ó$  — |                       | j        dgt          |¦  «        z  dgt          |¦  «        z  z   ¦  «         t          t          j        j        ¦  «        }t          g d¢¦  «        }|                       |d„ |D ¦   «         ¦  «         d S )NrÅ   r   )ÚinboxrÍ  rÎ  ÚtestrÏ  c                ó6   — g | ]}|                      ¦   «         ‘ŒS r1   ©r-  )r,  Úas     r4   r¾  z2IMAP4ServerTests._cbTestCreate.<locals>.<listcomp>ö  s    € Ð;Ð;Ð;¨a §¢¡	¤	Ð;Ð;Ð;r6   )rB   r2   rÐ   re  rÍ  rá  rÀ  )rE   rX  rZ  rY  r_  ry  s         r4   rÝ  zIMAP4ServerTests._cbTestCreateò  sŠ   € Ø×Ò˜œ q c­C°©L¬LÑ&8¸A¸3ÅÀTÁÄ¹?Ñ&JÑKÔKÐKÝ•lÔ-Ô7Ñ8Ô8ˆÝÐQÐQÐQÑRÔRˆØ×Ò˜Ð;Ð;°7Ð;Ñ;Ô;Ñ<Ô<Ð<Ð<Ð<r6   c                ó¼  ‡ — t           j                             d¦  «         ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |S )Nú	delete/mec                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests.testDelete.<locals>.loginû  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S ©Nræ  ©r  r˜  rR   s   €r4   r˜  z+IMAP4ServerTests.testDelete.<locals>.deleteþ  ó   ø€ Ø”;×%Ò% kÑ2Ô2Ð2r6   c                óh   •— ‰                      t          t          j        j        ¦  «        g ¦  «        S r0   )rB   rÑ   rÍ  rá  rÀ  r?  s    €r4   r5   z-IMAP4ServerTests.testDelete.<locals>.<lambda>	  s&   ø€ �d×&Ò&¥t­LÔ,CÔ,MÑ'NÔ'NÐPRÑSÔS€ r6   ©rÍ  rá  r­  r  r›   r7   rÜ  r  r
  r#   r   r,  )rE   rL  r˜  r-  rb  rž   s   `     r4   Ú
testDeletezIMAP4ServerTests.testDeleteø  sí   ø€ ÝÔ×*Ò*¨;Ñ7Ô7Ð7ð	Dð 	Dð 	Dð 	Dð 	Dð	3ð 	3ð 	3ð 	3ð 	3ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�ŠØSÐSÐSÐSñ	
ô 	
ð 	
ð ˆr6   c                ó"  ‡ — t           j                             d¦  «         t           j                             d¦  «         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     |¦  «         |                     ‰ j	        ¦  «         ‰  
                    ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |S )zñ
        Attempting to delete a mailbox with hierarchically inferior
        names fails with an informative error.

        @see: U{https://tools.ietf.org/html/rfc3501#section-6.3.4}

        @return: A L{Deferred} with assertions.
        r˜  ræ  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  zGIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.login	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S ©Nr˜  rê  rR   s   €r4   r˜  zHIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.delete	  ó   ø€ Ø”;×%Ò% hÑ/Ô/Ð/r6   c                ó¦   •—  | j         t          j        ¦  «         ‰                     t	          | j        ¦  «        t	          d¦  «        ¦  «         d S )Ns-   Name "DELETE" has inferior hierarchical names)r  r   r  rB   rå   r  r×  s    €r4   ÚassertIMAPExceptionzUIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.assertIMAPException	  sS   ø€ ØˆGŒL�Ô-Ñ.Ô.Ð.Ø×ÒÝ�G”MÑ"Ô"ÝÐDÑEÔEñô ð ð ð r6   c                ól   •— ‰                      t          t          j        j        ¦  «        ddg¦  «        S )NÚDELETEz	DELETE/ME)rB   re  rÍ  rá  rÀ  r?  s    €r4   r5   zJIMAP4ServerTests.testDeleteWithInferiorHierarchicalNames.<locals>.<lambda>,	  s/   ø€ �d×&Ò&Ý•|Ô.Ô8Ñ9Ô9¸HÀkÐ;Rñô € r6   )rÍ  rá  r­  r  r›   r7   rÜ  r  r+  r
  r#   r   r,  )rE   rL  r˜  rõ  ÚloggedInÚ
loopedBackrž   s   `      r4   Ú'testDeleteWithInferiorHierarchicalNamesz8IMAP4ServerTests.testDeleteWithInferiorHierarchicalNames	  s=  ø€ õ 	Ô×*Ò*¨8Ñ4Ô4Ð4ÝÔ×*Ò*¨;Ñ7Ô7Ð7ð	Dð 	Dð 	Dð 	Dð 	Dð	0ð 	0ð 	0ð 	0ð 	0ð	ð 	ð 	ð 	ð 	ð ”>×-Ò-­e°E©l¬lÑ;Ô;ˆØ×Ò�e F™mœm¨T¬_Ñ=Ô=Ð=Ø×ÒÐ/Ñ0Ô0Ð0Ø×Ò˜dÔ0Ñ1Ô1Ð1à—]’]‘_”_ˆ
ÝÔ ¨:Ð 6Ñ7Ô7ˆØ	�Šðð ð ð ñ	
ô 	
ð 	
ð
 ˆr6   c                óÀ  ‡ — d ‰ _         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     |¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j
        ||g¦  «        }|                     ˆ fd„¦  «         |S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z6IMAP4ServerTests.testIllegalInboxDelete.<locals>.login5	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S )Nrà  rê  rR   s   €r4   r˜  z7IMAP4ServerTests.testIllegalInboxDelete.<locals>.delete8	  s   ø€ Ø”;×%Ò% gÑ.Ô.Ð.r6   c                ó   •— | ‰_         d S r0   ©Ústashed©r2   rE   s    €r4   Ústashz6IMAP4ServerTests.testIllegalInboxDelete.<locals>.stash;	  s   ø€ Ø!ˆDŒLˆLˆLr6   c                óh   •— ‰                      t          ‰j        t          j        ¦  «        ¦  «        S r0   ©rU  r°  r   r$   ÚFailurer?  s    €r4   r5   z9IMAP4ServerTests.testIllegalInboxDelete.<locals>.<lambda>E	  ó!   ø€ �d—o’o¥j°´½w¼Ñ&OÔ&OÑPÔP€ r6   ©r   r  r›   r7   rÜ  r  r^  r
  r#   r   r,  )rE   rL  r˜  r  r-  rb  rž   s   `      r4   ÚtestIllegalInboxDeletez'IMAP4ServerTests.testIllegalInboxDelete2	  s  ø€ ØˆŒð	Dð 	Dð 	Dð 	Dð 	Dð	/ð 	/ð 	/ð 	/ð 	/ð	"ð 	"ð 	"ð 	"ð 	"ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�
Š
�5ÑÔÐØ
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�ŠØPÐPÐPÐPñ	
ô 	
ð 	
ð ˆr6   c                ó°  ‡ — ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _         ‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             |¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j
        ||g¦  «        }|                     ˆ fd„¦  «         |S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z5IMAP4ServerTests.testNonExistentDelete.<locals>.loginJ	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S ré  rê  rR   s   €r4   r˜  z6IMAP4ServerTests.testNonExistentDelete.<locals>.deleteM	  rë  r6   c                ó   •— | ‰_         d S r0   ©r$   r×  s    €r4   ÚdeleteFailedz<IMAP4ServerTests.testNonExistentDelete.<locals>.deleteFailedP	  ó   ø€ Ø"ˆDŒLˆLˆLr6   c                óx   •— ‰                      t          ‰j        j        ¦  «        t          d¦  «        ¦  «        S )Nrµ  ©rB   rå   r$   r  r?  s    €r4   r5   z8IMAP4ServerTests.testNonExistentDelete.<locals>.<lambda>Z	  s-   ø€ �d×&Ò&¥s¨4¬<Ô+=Ñ'>Ô'>ÅÐDVÑ@WÔ@WÑXÔX€ r6   )r$   r  r›   r7   r+  rÜ  r
  r  r#   r   r,  )rE   rL  r˜  r  r-  rb  rž   s   `      r4   ÚtestNonExistentDeletez&IMAP4ServerTests.testNonExistentDeleteI	  s   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	3ð 	3ð 	3ð 	3ð 	3ð	#ð 	#ð 	#ð 	#ð 	#ð ˆŒØŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜V‘}”}Ñ%Ô%×0Ò0°Ñ>Ô>Ð>Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�ŠØXÐXÐXÐXñ	
ô 	
ð 	
ð ˆr6   c                óz  ‡ ‡— t          ¦   «         }d|_        t          j                             d|¦  «         t          j                             d¦  «         ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _        ‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         	                    |¦  «         | 
                    ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }t!          d¦  «        Š|                     ˆˆ fd„¦  «         |S )	N)z	\Noselectr˜  ræ  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z1IMAP4ServerTests.testIllegalDelete.<locals>.logind	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S rò  rê  rR   s   €r4   r˜  z2IMAP4ServerTests.testIllegalDelete.<locals>.deleteg	  ró  r6   c                ó   •— | ‰_         d S r0   r  r×  s    €r4   r  z8IMAP4ServerTests.testIllegalDelete.<locals>.deleteFailedj	  r  r6   s<   Hierarchically inferior mailboxes exist and \Noselect is setc                ó^   •— ‰                      t          ‰j        j        ¦  «        ‰¦  «        S r0   r  )r*  rg  rE   s    €€r4   r5   z4IMAP4ServerTests.testIllegalDelete.<locals>.<lambda>v	  s$   ø€  × 0Ò 0µ°T´\Ô5GÑ1HÔ1HÈ(Ñ SÔ S€ r6   )rW  rœ  rÍ  rá  r­  r$   r  r›   r7   r+  rÜ  r
  r  r#   r   r,  rå   )	rE   ró   rL  r˜  r  r-  rb  rž   rg  s	   `       @r4   ÚtestIllegalDeletez"IMAP4ServerTests.testIllegalDelete^	  sP  øø€ Ý‰OŒOˆØ!ˆŒÝÔ×*Ò*¨8°QÑ7Ô7Ð7ÝÔ×*Ò*¨;Ñ7Ô7Ð7ð	Dð 	Dð 	Dð 	Dð 	Dð	0ð 	0ð 	0ð 	0ð 	0ð	#ð 	#ð 	#ð 	#ð 	#ð ˆŒØŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜V‘}”}Ñ%Ô%×0Ò0°Ñ>Ô>Ð>Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆÝØPñ
ô 
ˆð 	
�ŠÐSÐSÐSÐSÐSÑTÔTÐTØˆr6   c                ó¼  ‡ — t           j                             d¦  «         ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |S )NÚoldmboxc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests.testRename.<locals>.login|	  r~  r6   c                 ó:   •— ‰ j                              dd¦  «        S )Ns   oldmboxs   newname©r  ÚrenamerR   s   €r4   r  z+IMAP4ServerTests.testRename.<locals>.rename	  s   ø€ Ø”;×%Ò% j°*Ñ=Ô=Ð=r6   c                óŽ   •— ‰                      t          t          j        j                             ¦   «         ¦  «        dg¦  «        S )NÚNEWNAME)rB   rÑ   rÍ  rá  rÀ  r^  r?  s    €r4   r5   z-IMAP4ServerTests.testRename.<locals>.<lambda>ˆ	  s8   ø€ �d×&Ò&Ý•\Ô,Ô6×;Ò;Ñ=Ô=Ñ>Ô>ÀÀñô € r6   rí  ©rE   rL  r  r-  rb  rž   s   `     r4   Ú
testRenamezIMAP4ServerTests.testRenamey	  sõ   ø€ ÝÔ×*Ò*¨9Ñ5Ô5Ð5ð	Dð 	Dð 	Dð 	Dð 	Dð	>ð 	>ð 	>ð 	>ð 	>ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�Šðð ð ð ñ	
ô 	
ð 	
ð
 ˆr6   c                óÀ  ‡ — d ‰ _         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     |¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j
        ||g¦  «        }|                     ˆ fd„¦  «         |S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z6IMAP4ServerTests.testIllegalInboxRename.<locals>.login‘	  r~  r6   c                 ó:   •— ‰ j                              dd¦  «        S )Nrà  Úfrotzr  rR   s   €r4   r  z7IMAP4ServerTests.testIllegalInboxRename.<locals>.rename”	  s   ø€ Ø”;×%Ò% g¨wÑ7Ô7Ð7r6   c                ó   •— | ‰_         d S r0   rÿ  )ÚstuffrE   s    €r4   r  z6IMAP4ServerTests.testIllegalInboxRename.<locals>.stash—	  s   ø€ Ø ˆDŒLˆLˆLr6   c                óh   •— ‰                      t          ‰j        t          j        ¦  «        ¦  «        S r0   r  r?  s    €r4   r5   z9IMAP4ServerTests.testIllegalInboxRename.<locals>.<lambda>¡	  r  r6   r  )rE   rL  r  r  r-  rb  rž   s   `      r4   ÚtestIllegalInboxRenamez'IMAP4ServerTests.testIllegalInboxRenameŽ	  s  ø€ ØˆŒð	Dð 	Dð 	Dð 	Dð 	Dð	8ð 	8ð 	8ð 	8ð 	8ð	!ð 	!ð 	!ð 	!ð 	!ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�
Š
�5ÑÔÐØ
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�ŠØPÐPÐPÐPñ	
ô 	
ð 	
ð ˆr6   c                óú  ‡ — t           j                             d¦  «         t           j                             d¦  «         ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ¦  «        S )Nz
oldmbox/m1z
oldmbox/m2c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z6IMAP4ServerTests.testHierarchicalRename.<locals>.login©	  r~  r6   c                 ó:   •— ‰ j                              dd¦  «        S )Nr  Únewnamer  rR   s   €r4   r  z7IMAP4ServerTests.testHierarchicalRename.<locals>.rename¬	  s   ø€ Ø”;×%Ò% i°Ñ;Ô;Ð;r6   )rÍ  rá  rÛ  r  r›   r7   rÜ  r  r
  r#   r   r,  Ú_cbTestHierarchicalRenamer!  s   `     r4   ÚtestHierarchicalRenamez'IMAP4ServerTests.testHierarchicalRename¥	  sð   ø€ ÝÔ×&Ò& |Ñ4Ô4Ð4ÝÔ×&Ò& |Ñ4Ô4Ð4ð	Dð 	Dð 	Dð 	Dð 	Dð	<ð 	<ð 	<ð 	<ð 	<ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ;Ñ<Ô<Ð<r6   c                óÌ   — t           j        j                             ¦   «         }g d¢}t	          t          |¦  «        ¦  «        }|                      |d„ |D ¦   «         ¦  «         d S )N)r.  z
newname/m1z
newname/m2c                ó6   — g | ]}|                      ¦   «         ‘ŒS r1   rã  )r,  r{  s     r4   r¾  z>IMAP4ServerTests._cbTestHierarchicalRename.<locals>.<listcomp>º	  s    € Ð!>Ð!>Ð!>° !§'¢'¡)¤)Ð!>Ð!>Ð!>r6   )rÍ  rá  rÀ  r^  rÑ   re  rB   )rE   rX  Úmboxesrg  s       r4   r/  z*IMAP4ServerTests._cbTestHierarchicalRename¶	  sb   € ÝÔ(Ô2×7Ò7Ñ9Ô9ˆØ:Ð:Ð:ˆÝ•f˜V‘n”nÑ%Ô%ˆØ×Ò˜Ð!>Ð!>°XÐ!>Ñ!>Ô!>Ñ?Ô?Ð?Ð?Ð?r6   c                ó~  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z-IMAP4ServerTests.testSubscribe.<locals>.login½	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S ©Nz	this/mbox)r  Ú	subscriberR   s   €r4   r8  z1IMAP4ServerTests.testSubscribe.<locals>.subscribeÀ	  s   ø€ Ø”;×(Ò(¨Ñ5Ô5Ð5r6   c                óP   •— ‰                      t          j        j        dg¦  «        S )Nú	THIS/MBOX©rB   rÍ  rá  Úsubscriptionsr?  s    €r4   r5   z0IMAP4ServerTests.testSubscribe.<locals>.<lambda>É	  ó$   ø€ �d×&Ò&ÝÔ'Ô5¸°}ñô € r6   )	r  r›   r7   rÜ  r  r
  r#   r   r,  )rE   rL  r8  r-  rb  rž   s   `     r4   ÚtestSubscribezIMAP4ServerTests.testSubscribe¼	  sà   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	6ð 	6ð 	6ð 	6ð 	6ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜iÑ(Ô(¨$¬/Ñ:Ô:Ð:Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�Šðð ð ð ñ	
ô 	
ð 	
ð
 ˆr6   c                ó¤  ‡ — ddgt           j        _        ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰  	                    ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |S )Nr:  ú	THAT/MBOXc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z/IMAP4ServerTests.testUnsubscribe.<locals>.loginÒ	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S r7  )r  ÚunsubscriberR   s   €r4   rC  z5IMAP4ServerTests.testUnsubscribe.<locals>.unsubscribeÕ	  s   ø€ Ø”;×*Ò*¨;Ñ7Ô7Ð7r6   c                óP   •— ‰                      t          j        j        dg¦  «        S )Nr@  r;  r?  s    €r4   r5   z2IMAP4ServerTests.testUnsubscribe.<locals>.<lambda>Þ	  r=  r6   )rÍ  rá  r<  r  r›   r7   rÜ  r  r
  r#   r   r,  )rE   rL  rC  r-  rb  rž   s   `     r4   ÚtestUnsubscribez IMAP4ServerTests.testUnsubscribeÏ	  sð   ø€ Ø1<¸kÐ0J�ÔÔ-ð	Dð 	Dð 	Dð 	Dð 	Dð	8ð 	8ð 	8ð 	8ð 	8ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜kÑ*Ô*¨D¬OÑ<Ô<Ð<Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�Šðð ð ð ñ	
ô 	
ð 	
ð
 ˆr6   c                ót  ‡ — t           j                             d¦  «         t           j                             d¦  «         t           j                             d¦  «         ˆ fd„}ˆ fd„}d ‰ _        ‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     |‰ j        ¦  «         |                     ‰ j	        ‰ j        ¦  «         ‰  
                    ¦   «         }t          j        ||g¦  «                             ˆ fd„¦  «        S )Núroot/subthingzroot/another-thingznon-root/subthingc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests._listSetup.<locals>.loginé	  r~  r6   c                ó   •— | ‰_         d S r0   ©Úlisted)ry  rE   s    €r4   rK  z+IMAP4ServerTests._listSetup.<locals>.listedì	  s   ø€ Ø!ˆDŒKˆKˆKr6   c                ó   •— ‰j         S r0   rJ  r?  s    €r4   r5   z-IMAP4ServerTests._listSetup.<locals>.<lambda>õ	  s	   ø€ À4Ä;€ r6   )rÍ  rá  r­  rK  r  r›   r7   rÜ  r  r
  r#   r   r,  )rE   r3   rL  rK  r-  rb  s   `     r4   Ú
_listSetupzIMAP4ServerTests._listSetupä	  s*  ø€ ÝÔ×*Ò*¨?Ñ;Ô;Ð;ÝÔ×*Ò*Ð+?Ñ@Ô@Ð@ÝÔ×*Ò*Ð+>Ñ?Ô?Ð?ð	Dð 	Dð 	Dð 	Dð 	Dð	"ð 	"ð 	"ð 	"ð 	"ð ˆŒØŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜a™œ $¤/Ñ2Ô2Ð2Ø
�Š˜ ¤Ñ0Ô0Ð0Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ" B¨ 8Ñ,Ô,×8Ò8Ð9NÐ9NÐ9NÐ9NÑOÔOÐOr6   c                ó˜   — |D ]F}|                       |d         t          d¦  «         |                       |d         t          d¦  «         ŒG|S )zÐ
        Assert a C{LIST} response's delimiter and mailbox are native
        strings.

        @param results: A list of tuples as returned by
            L{IMAP4Client.list} or L{IMAP4Client.lsub}.
        rÅ   zdelimiter %r is not a strrÉ   zmailbox %r is not a str)rØ  rå   )rE   Úresultsr2   s      r4   Ú'assertListDelimiterAndMailboxAreStringsz8IMAP4ServerTests.assertListDelimiterAndMailboxAreStrings÷	  sW   € ð ð 	Mð 	MˆFØ×!Ò! &¨¤)­SÐ2MÑNÔNÐNØ×!Ò! &¨¤)­SÐ2KÑLÔLÐLÐLØˆr6   c                ó`   ‡ — ˆ fd„}‰                       |¦  «        }|j        ˆ fd„¦   «         }|S )Nc                 ó:   •— ‰ j                              dd¦  «        S ©NÚrootú%)r  rÑ   rR   s   €r4   ÚmailboxListz.IMAP4ServerTests.testList.<locals>.mailboxList
  ó   ø€ Ø”;×#Ò# F¨CÑ0Ô0Ð0r6   c                óL  •— t          t          j        ¦  «        ddft          t          j        ¦  «        ddfg}t          d¦  «        D ]A}|                      d¦  «        \  }}}‰                     t          |¦  «        ||f|¦  «         ŒB‰                     | d| ›�¦  «         d S )NrP  úROOT/SUBTHINGzROOT/ANOTHER-THINGrÉ   r   zMore results than expected: )re  rW  rœ  rn   Úpopr  rS  )rK  ÚexpectedContentsr*  rœ  Ú	delimiterÚmailboxrE   s         €r4   ÚassertListContentsz5IMAP4ServerTests.testList.<locals>.assertListContents

  sº   ø€ õ �Ô+Ñ,Ô,¨c°?ÐCÝ�Ô+Ñ,Ô,¨cÐ3GÐHð Ðõ
 ˜1‘X”Xð ð �Ø,2¯JªJ°q©M¬MÑ)��y 'Ø—’Ý˜E‘]”] I¨wÐ7Ø$ñô ð ð ð
 ×Ò˜VÐ%NÀFÐ%NÐ%NÑOÔOÐOÐOÐOr6   )rM  r›   )rE   rV  rž   r^  s   `   r4   ÚtestListzIMAP4ServerTests.testList
  s`   ø€ ð	1ð 	1ð 	1ð 	1ð 	1ð �OŠO˜KÑ(Ô(ˆà	
Œð	Pð 	Pð 	Pð 	Pñ 
Œð	Pð ˆr6   c                ó   ‡ — t           j                             d¦  «         ˆ fd„}‰                      |¦  «        }|                     ‰ j        ¦  «         |                     ‰ j        t          j        ddfg¦  «         |S )NrY  c                 ó:   •— ‰ j                              dd¦  «        S rS  )r  ÚlsubrR   s   €r4   rb  z'IMAP4ServerTests.testLSub.<locals>.lsub
  rW  r6   rP  )	rÍ  rá  r8  rM  r›   rP  rB   rW  rœ  )rE   rb  rž   s   `  r4   ÚtestLSubzIMAP4ServerTests.testLSub
  s„   ø€ ÝÔ×)Ò)¨/Ñ:Ô:Ð:ð	1ð 	1ð 	1ð 	1ð 	1ð �OŠO˜DÑ!Ô!ˆØ	�Š�dÔBÑCÔCÐCØ	�Š�dÔ&­-Ô*=¸sÀOÐ)TÐ(UÑVÔVÐVØˆr6   c                ó
  ‡ — t           j                             d¦  «         ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _        ‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     |‰ j        ¦  «         |                     ‰ j	        ‰ j        ¦  «         ‰  
                    ¦   «         }t          j        ||g¦  «        }|                     ˆ fd„¦  «         |S )NrG  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests.testStatus.<locals>.login*
  r~  r6   c                 ó>   •— ‰ j                              dddd¦  «        S )NrG  rR  rT  rV  ©r  ÚstatusrR   s   €r4   rh  z+IMAP4ServerTests.testStatus.<locals>.status-
  s   ø€ Ø”;×%Ò% o°zÀ9ÈhÑWÔWÐWr6   c                ó   •— | ‰_         d S r0   ©Ústatusedr  s    €r4   rk  z-IMAP4ServerTests.testStatus.<locals>.statused0
  ó   ø€ Ø"ˆDŒMˆMˆMr6   c                óB   •— ‰                      ‰j        ddddœ¦  «        S )Nr÷   s   10rË   )rR  rT  rV  )rB   rk  r?  s    €r4   r5   z-IMAP4ServerTests.testStatus.<locals>.<lambda>;
  s(   ø€ �d×&Ò&Ø”¨A¸%È1ÐMÐMñô € r6   )rÍ  rá  r­  rk  r  r›   r7   rÜ  r  r
  r#   r   r,  )rE   rL  rh  rk  r-  rb  rž   s   `      r4   Ú
testStatuszIMAP4ServerTests.testStatus'
  s0  ø€ ÝÔ×*Ò*¨?Ñ;Ô;Ð;ð	Dð 	Dð 	Dð 	Dð 	Dð	Xð 	Xð 	Xð 	Xð 	Xð	#ð 	#ð 	#ð 	#ð 	#ð ˆŒØŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜ $¤/Ñ2Ô2Ð2Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ	�Šðð ð ð ñ	
ô 	
ð 	
ð
 ˆr6   c                óÖ  ‡ — ˆ fd„}ˆ fd„}ˆ fd„}ˆ fd„}d x‰ _         ‰ _        ‰ j                             t	          |¦  «        ¦  «        }|                     t	          |¦  «        ‰ j        ¦  «         |                     ||¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j
        ||g¦  «                             ‰ j        ¦  «        S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z0IMAP4ServerTests.testFailedStatus.<locals>.loginB
  r~  r6   c                 ó>   •— ‰ j                              dddd¦  «        S )Nzroot/nonexistentrR  rT  rV  rg  rR   s   €r4   rh  z1IMAP4ServerTests.testFailedStatus.<locals>.statusE
  s&   ø€ Ø”;×%Ò%Ø" J°	¸8ñô ð r6   c                ó   •— | ‰_         d S r0   rj  r  s    €r4   rk  z3IMAP4ServerTests.testFailedStatus.<locals>.statusedJ
  rl  r6   c                ó   •— | ‰_         d S r0   r  r×  s    €r4   Úfailedz1IMAP4ServerTests.testFailedStatus.<locals>.failedM
  r  r6   )rk  r$   r  r›   r7   rÜ  r  r
  r#   r   r,  Ú_cbTestFailedStatus)rE   rL  rh  rk  rt  r-  rb  s   `      r4   ÚtestFailedStatusz!IMAP4ServerTests.testFailedStatusA
  s  ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	ð 	ð 	ð 	ð 	ð
	#ð 	#ð 	#ð 	#ð 	#ð	#ð 	#ð 	#ð 	#ð 	#ð (,Ð+ˆŒ˜œØŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜ &Ñ)Ô)Ð)Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ" B¨ 8Ñ,Ô,×8Ò8¸Ô9QÑRÔRÐRr6   c                ó†   — |                       | j        d ¦  «         |                       | j        j        j        d¦  «         d S )N)s   Could not open mailbox)rB   rk  r$   r  rÚ  rW  s     r4   ru  z$IMAP4ServerTests._cbTestFailedStatusX
  s?   € Ø×Ò˜œ¨Ñ-Ô-Ð-Ø×Ò˜œÔ+Ô0Ð2NÑOÔOÐOÐOÐOr6   c                ó  ‡ ‡— t          j        t          d¦  «        Št          j                             d¦  «         ˆ fd„}t          j        ˆˆ fd„¦   «         }‰ j         	                    t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }| 	                    ‰ j        ‰¦  «        S )Núrfc822.messagerG  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z.IMAP4ServerTests.testFullAppend.<locals>.login`
  r~  r6   c               3  óž   •K  — t          ‰d¦  «        5 } ‰j                             d| dd¦  «        V —}|cd d d ¦  «         S # 1 swxY w Y   d S )NÚrbrG  )ú\SEENú\DELETEDz%Tue, 17 Jun 2003 11:22:16 -0600 (MDT))Úopenr  r|   ©rŽ  r2   ÚinfilerE   s     €€r4   r|   z/IMAP4ServerTests.testFullAppend.<locals>.appendc
  sª   øè è € å�f˜dÑ#Ô#ð  wØ#œ{×1Ò1Ø#ØØ+Ø;ñ	 ô  ð ð �ð ðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ”!AÁAÁ	A)r&   ÚsibpathÚ__file__rÍ  rá  r­  r   ÚinlineCallbacksr  r›   r7   rÜ  r  r
  r#   r,  Ú_cbTestFullAppend©rE   rL  r|   r-  rb  rž   r�  s   `     @r4   ÚtestFullAppendzIMAP4ServerTests.testFullAppend\
  s  øø€ Ý”�hÐ(8Ñ9Ô9ˆÝÔ×*Ò*¨?Ñ;Ô;Ð;ð	Dð 	Dð 	Dð 	Dð 	Dõ 
Ô	ð	ð 	ð 	ð 	ð 	ñ 
Ô	ð	ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆåÔ  R Ñ)Ô)ˆà�}Š}˜TÔ3°VÑ<Ô<Ð<r6   c                óÈ  — t           j        j        d         }|                      dt	          |j        ¦  «        ¦  «         |                      ddgddf|j        d         dd …         ¦  «         t          |d¦  «        5 }|                      |                     ¦   «         |j        d         d                              ¦   «         ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NrY  rÅ   r}  r~  s%   Tue, 17 Jun 2003 11:22:16 -0600 (MDT)r   r|  ©	rÍ  rá  rÀ  rB   rÐ   r   r  rW   r]   ©rE   rX  r�  Úmbr3   s        r4   r…  z"IMAP4ServerTests._cbTestFullAppendw
  s(  € ÝÔ$Ô.¨Ô?ˆØ×Ò˜�C ¤Ñ,Ô,Ñ-Ô-Ð-Ø×ÒØ˜Ð$Ð&NÐPQÐRØŒK˜ŒN˜1˜2˜2Ôñ	
ô 	
ð 	
õ �&˜$ÑÔð 	E 1Ø×Ò˜QŸVšV™XœX r¤{°1¤~°aÔ'8×'AÒ'AÑ'CÔ'CÑDÔDÐDð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð 	Eð 	Es   Á>ACÃCÃCc                ó  ‡ ‡— t          j        t          d¦  «        Št          j                             d¦  «         ˆ fd„}t          j        ˆˆ fd„¦   «         }‰ j         	                    t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }| 	                    ‰ j        ‰¦  «        S )Nry  úPARTIAL/SUBTHINGc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z1IMAP4ServerTests.testPartialAppend.<locals>.login…
  r~  r6   c               3  ó4  •K  — t          ‰d¦  «        5 } ‰j                             t          j        dt          dt          j                             ‰¦  «        fz  ¦  «        d‰j        j	        | ¦  «        ¦  «        V —}|cd d d ¦  «         S # 1 swxY w Y   d S )Nr|  s   APPENDz)PARTIAL/SUBTHING (\SEEN) "Right now" {%d}r1   )
r  r  ÚsendCommandr   r7  r)   ÚosÚpathÚgetsizeÚ_IMAP4Client__cbContinueAppendr€  s     €€r4   r|   z2IMAP4ServerTests.testPartialAppend.<locals>.appendˆ
  sî   øè è € å�f˜dÑ#Ô#ð  wØ#œ{×6Ò6Ý”MØ!õ
 &ð#å&(¤g§o¢o°fÑ&=Ô&=Ð%?ñ@ñô ð
 ØœÔBØñô ñ ô  ð ð �ð" ð%ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ”A,BÂBÂB)r&   r‚  rƒ  rÍ  rá  r­  r   r„  r  r›   r7   rÜ  r  r
  r#   r,  Ú_cbTestPartialAppendr†  s   `     @r4   ÚtestPartialAppendz"IMAP4ServerTests.testPartialAppend�
  s  øø€ Ý”�hÐ(8Ñ9Ô9ˆÝÔ×*Ò*Ð+=Ñ>Ô>Ð>ð	Dð 	Dð 	Dð 	Dð 	Dõ 
Ô	ð	ð 	ð 	ð 	ð 	ñ 
Ô	ð	ð* Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ6¸Ñ?Ô?Ð?r6   c                óÆ  — t           j        j        d         }|                      dt	          |j        ¦  «        ¦  «         |                      dgddf|j        d         dd …         ¦  «         t          |d¦  «        5 }|                      |                     ¦   «         |j        d         d                              ¦   «         ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr�  rÅ   r}  s	   Right nowr   r|  r‰  rŠ  s        r4   r•  z%IMAP4ServerTests._cbTestPartialAppend¥
  s  € ÝÔ$Ô.Ð/AÔBˆØ×Ò˜�C ¤Ñ,Ô,Ñ-Ô-Ð-Ø×Ò˜8˜* l°AÐ6¸¼ÀA¼ÀqÀrÀrÔ8JÑKÔKÐKÝ�&˜$ÑÔð 	E 1Ø×Ò˜QŸVšV™XœX r¤{°1¤~°aÔ'8×'AÒ'AÑ'CÔ'CÑDÔDÐDð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eð 	Eð 	Es   Á=ACÃCÃCc                ó¶  ‡ — t           j                             d¦  «         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         ‰  	                    ¦   «         S )Nó   root/subthingc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z*IMAP4ServerTests._testCheck.<locals>.login¯
  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S )Nr™  r³  rR   s   €r4   rÇ  z+IMAP4ServerTests._testCheck.<locals>.select²
  s   ø€ Ø”;×%Ò%Ð&6Ñ7Ô7Ð7r6   c                 ó6   •— ‰ j                              ¦   «         S r0   )r  rŽ  rR   s   €r4   rŽ  z*IMAP4ServerTests._testCheck.<locals>.checkµ
  ó   ø€ Ø”;×$Ò$Ñ&Ô&Ð&r6   )
rÍ  rá  r­  r  r›   r7   rÜ  r  r
  r#   )rE   rL  rÇ  rŽ  rž   s   `    r4   Ú
_testCheckzIMAP4ServerTests._testCheck¬
  sç   ø€ ÝÔ×*Ò*Ð+;Ñ<Ô<Ð<ð	Dð 	Dð 	Dð 	Dð 	Dð	8ð 	8ð 	8ð 	8ð 	8ð	'ð 	'ð 	'ð 	'ð 	'ð ŒN×&Ò&¥u¨U¡|¤|Ñ4Ô4ˆØ	�Š•u˜V‘}”} d¤oÑ6Ô6Ð6Ø	�Š•u˜U‘|”| T¤_Ñ5Ô5Ð5Ø	�Š�tÔ)¨4¬?Ñ;Ô;Ð;Ø�}Š}‰ŒÐr6   c                ó*   — |                       ¦   «         S )zf
        Trigger the L{imap.IMAP4Server._cbSelectWork} callback
        by selecting an mbox.
        )rž  rR   s    r4   Ú
test_checkzIMAP4ServerTests.test_check¾
  s   € ð
 �ŠÑ Ô Ð r6   c                ó    ‡ — dd„}ˆ fd„}‰                       t          d|¦  «         ‰                      ¦   «         }|                     |¦  «        S )zr
        Trigger the L{imap.IMAP4Server._ebSelectWork} errback
        by failing when we select an mbox.
        rÅ   c                ó*   — t          j        d¦  «        ‚)NÚencoding)r   ÚIllegalMailboxEncoding)rE   rÂ  r|  s      r4   Ú
failSelectz3IMAP4ServerTests.test_checkFail.<locals>.failSelectË
  s   € ÝÔ.¨zÑ:Ô:Ð:r6   c                óˆ   •— ‰                      ¦   «         }‰                     |d         j        j        d         d¦  «         d S )NrÅ   r   s   SELECT failed: Server error)r�  rB   r  rÚ  )r	  ÚfailuresrE   s     €r4   ÚcheckResponsez6IMAP4ServerTests.test_checkFail.<locals>.checkResponseÎ
  s@   ø€ Ø×-Ò-Ñ/Ô/ˆHØ×Ò˜X aœ[Ô.Ô3°AÔ6Ð8VÑWÔWÐWÐWÐWr6   rÇ  rÈ  )ÚpatchrÊ  rž  r›   )rE   r¥  r¨  rž   s   `   r4   Útest_checkFailzIMAP4ServerTests.test_checkFailÅ
  sn   ø€ ð	;ð 	;ð 	;ð 	;ð	Xð 	Xð 	Xð 	Xð 	Xð 	�
Š
•7˜H jÑ1Ô1Ð1Ø�OŠOÑÔˆØ�}Š}˜]Ñ+Ô+Ð+r6   c                óD  ‡ — t          ¦   «         }g d¢|_        t          j                             d|¦  «         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j	        ¦  «         |                     t          |¦  «        ‰ j	        ¦  «         |                     ‰ j
        ‰ j	        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «                             ‰ j        |¦  «        S )N©)s	   Message 1)r’  ÚAnotherFlagNr   ©s	   Message 2)r­  NrÅ   )s	   Message 3)r’  NrÉ   r]  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z)IMAP4ServerTests.testClose.<locals>.loginß
  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S )Ns   mailboxr³  rR   s   €r4   rÇ  z*IMAP4ServerTests.testClose.<locals>.selectâ
  ó   ø€ Ø”;×%Ò% jÑ1Ô1Ð1r6   c                 ó6   •— ‰ j                              ¦   «         S r0   )r  r�  rR   s   €r4   r�  z)IMAP4ServerTests.testClose.<locals>.closeå
  r�  r6   )rW  r   rÍ  rá  r­  r  r›   r7   rÜ  r  r
  r#   r   r,  Ú_cbTestClose)rE   ró   rL  rÇ  r�  rž   rb  s   `      r4   Ú	testClosezIMAP4ServerTests.testCloseÖ
  s-  ø€ Ý‰OŒOˆð
ð 
ð 
ˆŒ
õ
 	Ô×*Ò*¨9°aÑ8Ô8Ð8ð	Dð 	Dð 	Dð 	Dð 	Dð	2ð 	2ð 	2ð 	2ð 	2ð	'ð 	'ð 	'ð 	'ð 	'ð ŒN×&Ò&¥u¨U¡|¤|Ñ4Ô4ˆØ	�Š•u˜V‘}”} d¤oÑ6Ô6Ð6Ø	�Š•u˜U‘|”| T¤_Ñ5Ô5Ð5Ø	�Š�tÔ)¨4¬?Ñ;Ô;Ð;Ø�]Š]‰_Œ_ˆÝÔ" A r 7Ñ+Ô+×7Ò7¸Ô8IÈ1ÑMÔMÐMr6   c                óÌ   — |                       t          |j        ¦  «        d¦  «         |                       |j        d         d¦  «         |                      |j        ¦  «         d S )NrÅ   r   r®  )rB   rÐ   r   rU  rœ  ©rE   rX  ró   s      r4   r³  zIMAP4ServerTests._cbTestCloseï
  sW   € Ø×Ò�˜QœZ™œ¨!Ñ,Ô,Ð,Ø×Ò˜œ AœÐ(QÑRÔRÐRØ�Š˜œÑ!Ô!Ð!Ð!Ð!r6   c                ó–  ‡ — t          ¦   «         }g d¢|_        t          j                             d|¦  «         ˆ fd„}ˆ fd„}ˆ fd„}ˆ fd„}d ‰ _        ‰ j                             t          |¦  «        ¦  «        }| 	                    t          |¦  «        ‰ j
        ¦  «         | 	                    t          |¦  «        ‰ j
        ¦  «         | 	                    |‰ j
        ¦  «         | 	                    ‰ j        ‰ j
        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }|                     ‰ j        |¦  «        S )Nr¬  r]  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z+IMAP4ServerTests.testExpunge.<locals>.loginý
  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S )Nr]  r³  rR   s   €r4   rÇ  z,IMAP4ServerTests.testExpunge.<locals>.select   s   ø€ Ø”;×%Ò% iÑ0Ô0Ð0r6   c                 ó6   •— ‰ j                              ¦   «         S r0   )r  r™  rR   s   €r4   r™  z-IMAP4ServerTests.testExpunge.<locals>.expunge  s   ø€ Ø”;×&Ò&Ñ(Ô(Ð(r6   c                óX   •— ‰                      ‰j        j        d u ¦  «         | ‰_        d S r0   )rS  r  r_  rO  )rO  rE   s    €r4   Úexpungedz.IMAP4ServerTests.testExpunge.<locals>.expunged  s,   ø€ Ø×Ò˜Tœ[Ô-°Ð5Ñ6Ô6Ð6Ø"ˆDŒLˆLˆLr6   )rW  r   rÍ  rá  r­  rO  r  r›   r7   rÜ  r  r
  r#   r   r,  Ú_cbTestExpunge)	rE   ró   rL  rÇ  r™  r¼  r-  rb  rž   s	   `        r4   ÚtestExpungezIMAP4ServerTests.testExpungeô
  sf  ø€ Ý‰OŒOˆð
ð 
ð 
ˆŒ
õ
 	Ô×*Ò*¨9°aÑ8Ô8Ð8ð	Dð 	Dð 	Dð 	Dð 	Dð	1ð 	1ð 	1ð 	1ð 	1ð	)ð 	)ð 	)ð 	)ð 	)ð	#ð 	#ð 	#ð 	#ð 	#ð ˆŒØŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š�˜g™œ¨¬Ñ8Ô8Ð8Ø
�Š˜ $¤/Ñ2Ô2Ð2Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ0°!Ñ4Ô4Ð4r6   c                óÒ   — |                       t          |j        ¦  «        d¦  «         |                       |j        d         d¦  «         |                       | j        ddg¦  «         d S )NrÅ   r   r®  rÉ   )rB   rÐ   r   rO  r¶  s      r4   r½  zIMAP4ServerTests._cbTestExpunge  s_   € Ø×Ò�˜QœZ™œ¨!Ñ,Ô,Ð,Ø×Ò˜œ AœÐ(QÑRÔRÐRà×Ò˜œ¨¨1 vÑ.Ô.Ð.Ð.Ð.r6   N)6rs   rt   ru   r.  r7  r@  rH  rP  rN  rc  r`  rh  rp  r„  r‹  rŠ  rž  r¤  r¯  rº  r®  rÊ  rÉ  rÞ  rÝ  rî  rú  r  r  r  r"  r*  r0  r/  r>  rE  rM  rP  r_  rc  rn  rv  ru  r‡  r…  r–  r•  rž  r   rª  r´  r³  r¾  r½  r1   r6   r4   r  r  y  sC  € € € € € ðIð Ið IðGð Gð Gð.Lð Lð LðMð Mð Mð0ð 0ð 0ð4ð 4ð 4ð6ð 6ð 6ð6ð 6ð 6ð6ð 6ð 6ð 6ð 6ð 6ð,!6ð !6ð !6ðF
@ð 
@ð 
@ð4ð 4ð 4ðð ð ð<ð ð ð6Mð Mð Mð,"ð "ð "ð4
ð 
ð 
ð#2ð #2ð #2ðJ
ð 
ð 
ð@ð @ð @ð2=ð =ð =ðð ð ð&%ð %ð %ðNð ð ð.ð ð ð*ð ð ð6ð ð ð*ð ð ð.=ð =ð =ð"@ð @ð @ðð ð ð&ð ð ð*Pð Pð Pð&ð ð ðð ð ð0	ð 	ð 	ðð ð ð4Sð Sð Sð.Pð Pð Pð=ð =ð =ð6Eð Eð Eð"@ð "@ð "@ðHEð Eð Eðð ð ð$!ð !ð !ð,ð ,ð ,ð"Nð Nð Nð2"ð "ð "ð
5ð 5ð 5ð@/ð /ð /ð /ð /r6   r  c                  óü   — 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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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(d'„ Z)d(„ Z*d)S )*ÚIMAP4ServerParsingTestsz6
    Test L{imap4.IMAP4Server}'s command parsing.
    c                óÌ   — t          ¦   «         | _        t          j        ¦   «         | _        | j                             | j        ¦  «         | j                             ¦   «          d S r0   )r   rð  r   rÓ  r  ÚmakeConnectionÚclearrR   s    r4   r  zIMAP4ServerParsingTests.setUp   sQ   € Ý(Ñ*Ô*ˆŒÝÔ'Ñ)Ô)ˆŒØŒ×"Ò" 4¤>Ñ2Ô2Ð2ØŒ×ÒÑÔÐÐÐr6   c                ó€   — | j                              t          j        t	          j        ¦   «         ¦  «        ¦  «         d S r0   ©r  ÚconnectionLostr$   r  r   ÚConnectionDonerR   s    r4   r  z IMAP4ServerParsingTests.tearDown&  ó1   € ØŒ×"Ò"¥7¤?µ5Ô3GÑ3IÔ3IÑ#JÔ#JÑKÔKÐKÐKÐKr6   c                óì   ‡—  G d„ dt           ¦  «        Šˆfd„}d| j        _        || j        _        | j                             d¦  «         |                      |                      ‰¦  «        ¦  «         dS )zO
        L{imap4.IMAP4Server} logs exceptions raised by parse methods.
        c                  ó   — e Zd ZdZdS )úSIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.UnhandledExceptionú1
            An unhandled exception.
            NrË  r1   r6   r4   ÚUnhandledExceptionrÌ  .  rv  r6   rÎ  c                ó   •— ‰‚r0   r1   )rà  rÎ  s    €r4   ÚraisesValueErrorzQIMAP4ServerParsingTests.test_parseMethodExceptionLogged.<locals>.raisesValueError3  s	   ø€ Ø$Ð$r6   Úcommandó   invalidN)rß  r  Ú
parseStateÚparse_commandrÞ  rU  r�  )rE   rÐ  rÎ  s     @r4   Útest_parseMethodExceptionLoggedz7IMAP4ServerParsingTests.test_parseMethodExceptionLogged)  s™   ø€ ð
	ð 	ð 	ð 	ð 	¥ñ 	ô 	ð 	ð
	%ð 	%ð 	%ð 	%ð 	%ð "+ˆŒÔØ$4ˆŒÔ!àŒ× Ò  Ñ,Ô,Ð,à�Š˜×.Ò.Ð/AÑBÔBÑCÔCÐCÐCÐCr6   c                ó  — | j                              d¦  «         |                      | j                             ¦   «         d¦  «         | j                              t          j        t          j	        d¦  «        ¦  «        ¦  «         dS )z‚
        L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
        a line that includes a tag but no command.
        ó   001s   001 BAD Missing command
ÚDoneN)
r  rÔ  rB   rð  r  rÇ  r$   r  r   rÈ  rR   s    r4   Útest_missingCommandz+IMAP4ServerParsingTests.test_missingCommand=  s{   € ð
 	Œ×!Ò! &Ñ)Ô)Ð)à×Ò˜œ×-Ò-Ñ/Ô/Ð1OÑPÔPÐPàŒ×"Ò"ÝŒO�EÔ0°Ñ8Ô8Ñ9Ô9ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó”   — | j                              d¦  «         |                      | j                             ¦   «         d¦  «         dS )zf
        L{imap4.IMAP4Server.parse_command} sends a C{BAD} response to
        an empty line.
        r6   s   * BAD Null command
N)r  rÔ  rB   rð  r  rR   s    r4   Útest_emptyLinez&IMAP4ServerParsingTests.test_emptyLineJ  sE   € ð
 	Œ×!Ò! #Ñ&Ô&Ð&à×Ò˜œ×-Ò-Ñ/Ô/Ð1JÑKÔKÐKÐKÐKr6   c                ó  ‡— ˆfd„}|| j         _        | j                              d                     |dg¦  «        ¦  «         |                      | j                             ¦   «         d                     ||g¦  «        ¦  «         dS )aV  
        Assert that the given exception results in the expected
        response.

        @param exception: The exception to raise.
        @type exception: L{Exception}

        @param tag: The IMAP tag.

        @type: L{bytes}

        @param expectedResponse: The expected bad response.
        @type expectedResponse: L{bytes}
        c                ó   •— ‰‚r0   r1   )ÚtagÚcmdÚrestÚ	exceptions      €r4   ÚraiseszDIMAP4ServerParsingTests.assertParseExceptionResponse.<locals>.raisesc  ó   ø€ ØˆOr6   r„  rÒ  N)r  ÚdispatchCommandrÔ  r’   rB   rð  r  ©rE   rá  rÞ  ÚexpectedResponserâ  s    `   r4   ÚassertParseExceptionResponsez4IMAP4ServerParsingTests.assertParseExceptionResponseS  s‹   ø€ ð 	ð 	ð 	ð 	ð 	ð '-ˆŒÔ#àŒ×!Ò! $§)¢)¨S°*Ð,=Ñ">Ô">Ñ?Ô?Ð?à×Ò˜œ×-Ò-Ñ/Ô/°·²¸CÐAQÐ;RÑ1SÔ1SÑTÔTÐTÐTÐTr6   c                óX   — |                       t          j        d¦  «        dd¦  «         dS )zt
        When a parsing method raises L{IllegalClientResponse}, the
        server sends a C{BAD} response.
        úclient responser×  ó%   BAD Illegal syntax: client response
N)rç  r   ÚIllegalClientResponserR   s    r4   Ú'test_parsingRaisesIllegalClientResponsez?IMAP4ServerParsingTests.test_parsingRaisesIllegalClientResponsel  s;   € ð
 	×)Ò)ÝÔ'Ð(9Ñ:Ô:ØØ6ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óX   — |                       t          j        d¦  «        dd¦  «         dS )zn
        When a parsing method raises L{IllegalOperation}, the server
        sends a C{NO} response.
        Ú	operationr×  ó!   NO Illegal operation: operation
N)rç  r   ÚIllegalOperationrR   s    r4   Ú*test_parsingRaisesIllegalOperationResponsezBIMAP4ServerParsingTests.test_parsingRaisesIllegalOperationResponsew  s:   € ð
 	×)Ò)ÝÔ" ;Ñ/Ô/ØØ2ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óX   — |                       t          j        d¦  «        dd¦  «         dS )zt
        When a parsing method raises L{IllegalMailboxEncoding}, the
        server sends a C{NO} response.
        r£  r×  ó#   NO Illegal mailbox name: encoding
N)rç  r   r¤  rR   s    r4   Ú(test_parsingRaisesIllegalMailboxEncodingz@IMAP4ServerParsingTests.test_parsingRaisesIllegalMailboxEncoding‚  s:   € ð
 	×)Ò)ÝÔ(¨Ñ4Ô4ØØ4ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó”   — | j                              d¦  «         |                      | j                             ¦   «         d¦  «         dS )zi
        L{imap4.IMAP4Server} responds to an unsupported command with a
        C{BAD} response.
        s   001 HULLABALOOs   001 BAD Unsupported command
N)r  rÞ  rB   rð  r  rR   s    r4   Útest_unsupportedCommandz/IMAP4ServerParsingTests.test_unsupportedCommand�  sF   € ð
 	Œ× Ò Ð!2Ñ3Ô3Ð3Ø×Ò˜œ×-Ò-Ñ/Ô/Ð1SÑTÔTÐTÐTÐTr6   c                óà   — | j                              d¦  «         |                      | j                             ¦   «         dt          d¦  «                             d¦  «        z   dz   ¦  «         dS )z~
        L{imap4.IMAP4Server} responds with a C{BAD} response to a
        command with more arguments than expected.
        s   001 LOGIN A B Cs8   001 BAD Illegal syntax: Too many arguments for command: ó   Czutf-8rŠ  N)r  rÞ  rB   rð  r  rÛ   rC   rR   s    r4   Útest_tooManyArgumentsForCommandz7IMAP4ServerParsingTests.test_tooManyArgumentsForCommand•  sy   € ð
 	Œ× Ò Ð!3Ñ4Ô4Ð4Ø×ÒØŒN× Ò Ñ"Ô"ð7å�t‘*”*×#Ò# GÑ,Ô,ñ-ð ññ	
ô 	
ð 	
ð 	
ð 	
r6   c                óR  ‡— ˆfd„}|                       | j        j        d¦  «         |f| j        j        dd…         z   | j        _        | j                             |dd¦  «         |                       | j                             ¦   «         d                     ||g¦  «        ¦  «         dS )aR  
        Assert that the given exception results in the expected
        response.

        @param exception: The exception to raise.
        @type exception: L{Exception}

        @param: The IMAP tag.

        @type: L{bytes}

        @param expectedResponse: The expected bad response.
        @type expectedResponse: L{bytes}
        c                ó   •— ‰‚r0   r1   )ÚserverInstancerÞ  ry  rz  rá  s       €r4   râ  zFIMAP4ServerParsingTests.assertCommandExceptionResponse.<locals>.raisesµ  rã  r6   re  rÅ   Nó   LOGINs   user passwdr„  )rB   r  rV  Úunauth_LOGINrä  rð  r  r’   rå  s    `   r4   ÚassertCommandExceptionResponsez6IMAP4ServerParsingTests.assertCommandExceptionResponse¥  s®   ø€ ð 	ð 	ð 	ð 	ð 	ð 	×Ò˜œÔ*¨HÑ5Ô5Ð5à$* 9¨t¬{Ô/GÈÈÈÔ/KÑ#KˆŒÔ àŒ×#Ò# C¨°>ÑBÔBÐBà×Ò˜œ×-Ò-Ñ/Ô/°·²¸CÐAQÐ;RÑ1SÔ1SÑTÔTÐTÐTÐTr6   c                óX   — |                       t          j        d¦  «        dd¦  «         dS )zm
        When a command raises L{IllegalClientResponse}, the
        server sends a C{BAD} response.
        ré  r×  rê  N)rÿ  r   rë  rR   s    r4   Ú'test_commandRaisesIllegalClientResponsez?IMAP4ServerParsingTests.test_commandRaisesIllegalClientResponseÀ  s;   € ð
 	×+Ò+ÝÔ'Ð(9Ñ:Ô:ØØ6ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óX   — |                       t          j        d¦  «        dd¦  «         dS )zg
        When a command raises L{IllegalOperation}, the server sends a
        C{NO} response.
        rî  r×  rï  N)rÿ  r   rð  rR   s    r4   Ú*test_commandRaisesIllegalOperationResponsezBIMAP4ServerParsingTests.test_commandRaisesIllegalOperationResponseË  s:   € ð
 	×+Ò+ÝÔ" ;Ñ/Ô/ØØ2ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óX   — |                       t          j        d¦  «        dd¦  «         dS )zm
        When a command raises L{IllegalMailboxEncoding}, the server
        sends a C{NO} response.
        r£  r×  ró  N)rÿ  r   r¤  rR   s    r4   Ú(test_commandRaisesIllegalMailboxEncodingz@IMAP4ServerParsingTests.test_commandRaisesIllegalMailboxEncodingÖ  s:   € ð
 	×+Ò+ÝÔ(¨Ñ4Ô4ØØ4ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó¼   —  G d„ dt           ¦  «        }|                       |d¦  «        dd¦  «         |                      |                      |¦  «        ¦  «         dS )z‚
        Wehn a command raises an unhandled exception, the server sends
        a C{BAD} response and logs the exception.
        c                  ó   — e Zd ZdZdS )úXIMAP4ServerParsingTests.test_commandRaisesUnhandledException.<locals>.UnhandledExceptionrÍ  NrË  r1   r6   r4   rÎ  r  ç  rv  r6   rÎ  Ú	unhandledr×  s   BAD Server error: unhandled
N)rß  rÿ  rU  r�  )rE   rÎ  s     r4   Ú$test_commandRaisesUnhandledExceptionz<IMAP4ServerParsingTests.test_commandRaisesUnhandledExceptioná  sƒ   € ð	ð 	ð 	ð 	ð 	¥ñ 	ô 	ð 	ð
 	×+Ò+ØÐ˜{Ñ+Ô+ØØ.ñ	
ô 	
ð 	
ð 	�Š˜×.Ò.Ð/AÑBÔBÑCÔCÐCÐCÐCr6   c                ó¬   — d| j         _        | j                              d¦  «         |                      | j                             ¦   «         d¦  «         dS )zx
        A string literal whose length exceeds the maximum allowed
        length results in a C{BAD} response.
        rË   s   001 LOGIN {5}
sE   001 BAD Illegal syntax: Literal too long! I accept at most 4 octets
N)r  Ú_literalStringLimitrÞ  rB   rð  r  rR   s    r4   Útest_stringLiteralTooLongz1IMAP4ServerParsingTests.test_stringLiteralTooLongô  s]   € ð
 +,ˆŒÔ'ØŒ× Ò Ð!5Ñ6Ô6Ð6à×ÒØŒN× Ò Ñ"Ô"ð.ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óf   — dD ]-}|                       t          j        | j        j        |¦  «         Œ.dS )zQ
        An empty string argument raises L{imap4.IllegalClientResponse}.
        )r6   rŠ  r„  N©r×   r   rë  r  Úarg_astring)rE   rÌ  s     r4   Útest_arg_astringEmptyLinez1IMAP4ServerParsingTests.test_arg_astringEmptyLine  sI   € ð *ð 	ð 	ˆEØ×ÒÝÔ+¨T¬[Ô-DÀeñô ð ð ð	ð 	r6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zh
        An unmatched quote in a string argument raises
        L{imap4.IllegalClientResponse}.
        s   "openNr  rR   s    r4   Útest_arg_astringUnmatchedQuotesz7IMAP4ServerParsingTests.test_arg_astringUnmatchedQuotes  s5   € ð
 	×ÒÝÔ'¨¬Ô)@À(ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zn
        An unmatched brace in a string literal's size raises
        L{imap4.IllegalClientResponse}.
        s   {0Nr  rR   s    r4   Ú&test_arg_astringUnmatchedLiteralBracesz>IMAP4ServerParsingTests.test_arg_astringUnmatchedLiteralBraces  s+   € ð
 	×Ò�%Ô5°t´{Ô7NÐPUÑVÔVÐVÐVÐVr6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zc
        A non-integral string literal size raises
        L{imap4.IllegalClientResponse}.
        ó   {[object Object]}Nr  rR   s    r4   Ú"test_arg_astringInvalidLiteralSizez:IMAP4ServerParsingTests.test_arg_astringInvalidLiteralSize  ó6   € ð
 	×ÒÝÔ'¨¬Ô)@ÐBVñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )z@
        An empty atom raises L{IllegalClientResponse}.
        r6   N©r×   r   rë  r  Úarg_atomrR   s    r4   Útest_arg_atomEmptyLinez.IMAP4ServerParsingTests.test_arg_atomEmptyLine$  s*   € ð 	×Ò�%Ô5°t´{Ô7KÈSÑQÔQÐQÐQÐQr6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zC
        A malformed atom raises L{IllegalClientResponse}.
        s    not an atom Nr  rR   s    r4   Útest_arg_atomMalformedAtomz2IMAP4ServerParsingTests.test_arg_atomMalformedAtom*  s6   € ð 	×ÒÝÔ'¨¬Ô)=Ð?Oñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zN
        An empty parenthesized list raises L{IllegalClientResponse}.
        r6   N©r×   r   rë  r  Ú	arg_plistrR   s    r4   Útest_arg_plistEmptyLinez/IMAP4ServerParsingTests.test_arg_plistEmptyLine2  s*   € ð 	×Ò�%Ô5°t´{Ô7LÈcÑRÔRÐRÐRÐRr6   c                ó²   — |                       t          j        | j        j        d¦  «         |                       t          j        | j        j        d¦  «         dS )ze
        A parenthesized with unmatched parentheses raises
        L{IllegalClientResponse}.
        s   (foos   foo)Nr!  rR   s    r4   Ú"test_arg_plistUnmatchedParenthesesz:IMAP4ServerParsingTests.test_arg_plistUnmatchedParentheses8  sJ   € ð
 	×Ò�%Ô5°t´{Ô7LÈgÑVÔVÐVØ×Ò�%Ô5°t´{Ô7LÈgÑVÔVÐVÐVÐVr6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zH
        An empty file literal raises L{IllegalClientResponse}.
        r6   N©r×   r   rë  r  Úarg_literalrR   s    r4   Útest_arg_literalEmptyLinez1IMAP4ServerParsingTests.test_arg_literalEmptyLine@  s+   € ð 	×Ò�%Ô5°t´{Ô7NÐPSÑTÔTÐTÐTÐTr6   c                ó²   — |                       t          j        | j        j        d¦  «         |                       t          j        | j        j        d¦  «         dS )zZ
        A literal with unmatched braces raises
        L{IllegalClientResponse}.
        s   {10s   10}Nr'  rR   s    r4   Útest_arg_literalUnmatchedBracesz7IMAP4ServerParsingTests.test_arg_literalUnmatchedBracesF  sL   € ð
 	×Ò�%Ô5°t´{Ô7NÐPVÑWÔWÐWØ×Ò�%Ô5°t´{Ô7NÐPVÑWÔWÐWÐWÐWr6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )z\
        A non-integral literal size raises
        L{imap4.IllegalClientResponse}.
        r  Nr'  rR   s    r4   Ú"test_arg_literalInvalidLiteralSizez:IMAP4ServerParsingTests.test_arg_literalInvalidLiteralSizeN  r  r6   c                óp   — d}| j                              |¦  «        \  }}|                      |d¦  «         dS )zH
        A sequence set returns the unparsed portion of a line.
        s   1:* blah blah blahs   blah blah blahN)r  Ú
arg_seqsetrB   )rE   Úsequencer*  rà  s       r4   Útest_arg_seqsetReturnsRestz2IMAP4ServerParsingTests.test_arg_seqsetReturnsRestW  s?   € ð )ˆØ”+×(Ò(¨Ñ2Ô2‰ˆˆ4Ø×Ò˜Ð0Ñ1Ô1Ð1Ð1Ð1r6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zL
        An invalid sequence raises L{imap4.IllegalClientResponse}.
        s   x:yN)r×   r   rë  r  r/  rR   s    r4   Útest_arg_seqsetInvalidSequencez6IMAP4ServerParsingTests.test_arg_seqsetInvalidSequence_  s*   € ð 	×Ò�%Ô5°t´{Ô7MÈvÑVÔVÐVÐVÐVr6   c                óœ   — d}| j                              |¦  «        \  }}|                      ||g¦  «         |                      |¦  «         dS )zJ
        A single flag that is not contained in a list is parsed.
        s   flagN)r  Úarg_flaglistrB   rS  )rE   Úflagr�  rà  s       r4   Útest_arg_flaglistOneFlagz0IMAP4ServerParsingTests.test_arg_flaglistOneFlage  sT   € ð ˆØ”{×/Ò/°Ñ5Ô5‰ˆ�Ø×Ò˜ $ Ñ(Ô(Ð(Ø×Ò˜ÑÔÐÐÐr6   c                ó\   — |                       t          j        | j        j        d¦  «         dS )zk
        A list of flags with unmatched parentheses raises
        L{imap4.IllegalClientResponse}.
        s   (invalidN©r×   r   rë  r  r5  rR   s    r4   Ú&test_arg_flaglistMismatchedParentehsesz>IMAP4ServerParsingTests.test_arg_flaglistMismatchedParentehsesn  s7   € ð
 	×ÒÝÔ'ØŒKÔ$Øñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó²   — |                       t          j        | j        j        d¦  «         |                       t          j        | j        j        d¦  «         dS )zo
        A list of flags that contains a malformed flag raises
        L{imap4.IllegalClientResponse}.
        s	   (first  )s   (first  second)Nr9  rR   s    r4   Útest_arg_flaglistMalformedFlagz6IMAP4ServerParsingTests.test_arg_flaglistMalformedFlagy  s_   € ð
 	×ÒÝÔ'¨¬Ô)AÀ?ñ	
ô 	
ð 	
ð 	×ÒÝÔ'¨¬Ô)AÐCXñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óš   — d}| j                              |¦  «        \  }}|                      |¦  «         |                      ||¦  «         dS )z�
        A line that does not begin with an open parenthesis (C{(}) is
        parsed as L{None}, and the remainder is the whole line.
        s   not (N)r  Ú	opt_plistr·  rB   )rE   rà  ÚplistÚ	remainders       r4   Ú$test_opt_plistMissingOpenParenthesisz<IMAP4ServerParsingTests.test_opt_plistMissingOpenParenthesis…  sS   € ð
 ˆØœ;×0Ò0°Ñ6Ô6ÑˆˆyØ×Ò˜%Ñ Ô Ð Ø×Ò˜ DÑ)Ô)Ð)Ð)Ð)r6   c                óš   — d}| j                              |¦  «        \  }}|                      |¦  «         |                      ||¦  «         dS )zŠ
        A line that does not begin with a double quote (C{"}) is
        parsed as L{None}, and the remainder is the whole line.
        s   not "N)r  Úopt_datetimer·  rB   )rE   rà  Údtr@  s       r4   Ú!test_opt_datetimeMissingOpenQuotez9IMAP4ServerParsingTests.test_opt_datetimeMissingOpenQuote�  sR   € ð
 ˆØœ×0Ò0°Ñ6Ô6‰ˆˆIØ×Ò˜"ÑÔÐØ×Ò˜ DÑ)Ô)Ð)Ð)Ð)r6   c                ó`   — d}|                       t          j        | j        j        |¦  «         dS )zx
        A line that does not have a closing double quote (C{"}) raises
        L{imap4.IllegalClientResponse}.
        s   "21-Jul-2017 19:37:07 -0700N)r×   r   rë  r  rC  rß  s     r4   Ú"test_opt_datetimeMissingCloseQuotez:IMAP4ServerParsingTests.test_opt_datetimeMissingCloseQuote™  s0   € ð
 .ˆØ×Ò�%Ô5°t´{Ô7OÐQUÑVÔVÐVÐVÐVr6   c                ó`   — d}|                       t          j        | j        j        |¦  «         dS )z€
        A line that contains C{CHARSET} but no character set
        identifier raises L{imap4.IllegalClientResponse}.
        r”  N)r×   r   rë  r  Úopt_charsetrß  s     r4   Ú!test_opt_charsetMissingIdentifierz9IMAP4ServerParsingTests.test_opt_charsetMissingIdentifier¡  s0   € ð
 ˆØ×Ò�%Ô5°t´{Ô7NÐPTÑUÔUÐUÐUÐUr6   c                óœ   — d}| j                              |¦  «        \  }}|                      |d¦  «         |                      |d¦  «         dS )zŒ
        A line that ends with a C{CHARSET} identifier is parsed as
        that identifier, and the remainder is the empty string.
        s   CHARSET UTF-8ó   UTF-8r6   N©r  rI  rB   ©rE   rà  Ú
identifierr@  s       r4   Útest_opt_charsetEndOfLinez1IMAP4ServerParsingTests.test_opt_charsetEndOfLine©  sU   € ð
  ˆØ $¤× 7Ò 7¸Ñ =Ô =Ñˆ
�IØ×Ò˜ XÑ.Ô.Ð.Ø×Ò˜ CÑ(Ô(Ð(Ð(Ð(r6   c                óœ   — d}| j                              |¦  «        \  }}|                      |d¦  «         |                      |d¦  «         dS )z¨
        A line that has additional data after a C{CHARSET} identifier
        is parsed as that identifier, and the remainder is that
        additional data.
        s   CHARSET UTF-8 remainderrL  s	   remainderNrM  rN  s       r4   Útest_opt_charsetWithRemainderz5IMAP4ServerParsingTests.test_opt_charsetWithRemainder³  sU   € ð *ˆØ $¤× 7Ò 7¸Ñ =Ô =Ñˆ
�IØ×Ò˜ XÑ.Ô.Ð.Ø×Ò˜ LÑ1Ô1Ð1Ð1Ð1r6   N)+rs   rt   ru   r2  r  r  rÕ  rÙ  rÛ  rç  rì  rñ  rô  rö  rù  rÿ  r  r  r  r
  r  r  r  r  r  r  r  r#  r%  r)  r+  r-  r1  r3  r7  r:  r<  rA  rE  rG  rJ  rP  rR  r1   r6   r4   rÁ  rÁ    s—  € € € € € ðð ðð ð ðLð Lð LðDð Dð Dð(
ð 
ð 
ðLð Lð LðUð Uð Uð2	
ð 	
ð 	
ð	
ð 	
ð 	
ð	
ð 	
ð 	
ðUð Uð Uð
ð 
ð 
ð Uð Uð Uð6	
ð 	
ð 	
ð	
ð 	
ð 	
ð	
ð 	
ð 	
ðDð Dð Dð&
ð 
ð 
ðð ð ð
ð 
ð 
ðWð Wð Wð
ð 
ð 
ðRð Rð Rð
ð 
ð 
ðSð Sð SðWð Wð WðUð Uð UðXð Xð Xð
ð 
ð 
ð2ð 2ð 2ðWð Wð Wðð ð ð	
ð 	
ð 	
ð

ð 

ð 

ð*ð *ð *ð*ð *ð *ðWð Wð WðVð Vð Vð)ð )ð )ð	2ð 	2ð 	2ð 	2ð 	2r6   rÁ  c                  óZ   — 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d„ ZdS )ÚIMAP4ServerSearchTestszS
    Tests for the behavior of the search_* functions in L{imap4.IMAP4Server}.
    c                ó®   — t                                | ¦  «         dg| _        dg| _        dg| _        d| _        t          ddig ddd	d ¦  «        | _        d S )
Nz10-Dec-2009z13-Dec-2009z16-Dec-2009r   r�  zMon, 13 Dec 2009 21:25:10 GMTz13 Dec 2009 00:00:00 GMTr)  éÒ  )rü  r  ÚearlierQueryÚsameDateQueryÚ
laterQueryÚseqr˜   r�   rR   s    r4   r  zIMAP4ServerSearchTests.setUpÄ  sg   € Ý×Ò˜tÑ$Ô$Ð$Ø*˜OˆÔØ+˜_ˆÔØ(˜/ˆŒØˆŒÝØÐ4Ð5ØØ&ØØØñ
ô 
ˆŒˆˆr6   c                óþ   — |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                      | j                             | j        | j        | j        ¦  «        ¦  «         dS )z�
        L{imap4.IMAP4Server.search_SENTBEFORE} returns True if the message date
        is earlier than the query date.
        N)rS  r  Úsearch_SENTBEFORErW  rZ  r�   rU  rY  rR   s    r4   Útest_searchSentBeforez,IMAP4ServerSearchTests.test_searchSentBeforeÓ  sy   € ð
 	×ÒØŒK×)Ò)¨$Ô*;¸T¼XÀtÄxÑPÔPñ	
ô 	
ð 	
ð 	�ŠØŒK×)Ò)¨$¬/¸4¼8ÀTÄXÑNÔNñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óh  — |                       | j                             dg| j        | j        d¦  «        ¦  «         |                      | j                             dg| j        | j        d¦  «        ¦  «         |                      | j                             dg| j        | j        d¦  «        ¦  «         dS )zq
        L{imap4.IMAP4Server.search_UID} returns True if the message UID is in
        the search range.
        rì   )rÅ   rV  s   2:*rÞ   N)rS  r  Ú
search_UIDrZ  r�   rU  rR   s    r4   Útest_searchWildcardz*IMAP4ServerSearchTests.test_searchWildcardß  sŸ   € ð
 	×ÒØŒK×"Ò" F 8¨T¬X°t´xÀÑKÔKñ	
ô 	
ð 	
ð 	�Š˜œ×.Ò.°¨x¸¼À4Ä8ÈYÑWÔWÑXÔXÐXØ�Š˜œ×.Ò.°¨v°t´xÀÄÈ9ÑUÔUÑVÔVÐVÐVÐVr6   c                ó|   — |                       | j                             dg| j        | j        d¦  «        ¦  «         dS )z›
        L{imap4.IMAP4Server.search_UID} should return True if there is a
        wildcard, because a wildcard means "highest UID in the mailbox".
        s   1235:*)rV  rÅ   N)rU  r  r_  rZ  r�   rR   s    r4   Útest_searchWildcardHighz.IMAP4ServerSearchTests.test_searchWildcardHighë  sC   € ð
 	�ŠØŒK×"Ò" I ;°´¸$¼(ÀIÑNÔNñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óx   — t          j        d¦  «        }|                      t          |¦  «        g d¢¦  «         dS )ú|
        L{imap4.IMAP4Server.search_SENTON} returns True if the message date is
        the same as the query date.
        r?  r$  N)r   rã   rB   rÑ   )rE   Úmsgsets     r4   Útest_reversedSearchTermsz/IMAP4ServerSearchTests.test_reversedSearchTermsô  s:   € õ
 Ô" 6Ñ*Ô*ˆØ×Ò�˜f™œ y y yÑ1Ô1Ð1Ð1Ð1r6   c                óz  — |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                      | j                             | j        | j        | j        ¦  «        ¦  «         |                       | j                             | j        | j        | j        ¦  «        ¦  «         dS )rd  N)	rS  r  Úsearch_SENTONrW  rZ  r�   rU  rX  rY  rR   s    r4   Útest_searchSentOnz(IMAP4ServerSearchTests.test_searchSentOnü  s¦   € ð
 	×ÒØŒK×%Ò% dÔ&7¸¼À4Ä8ÑLÔLñ	
ô 	
ð 	
ð 	�ŠØŒK×%Ò% dÔ&8¸$¼(ÀDÄHÑMÔMñ	
ô 	
ð 	
ð 	×Ò˜œ×2Ò2°4´?ÀDÄHÈdÌhÑWÔWÑXÔXÐXÐXÐXr6   c                óþ   — |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                      | j                             | j        | j        | j        ¦  «        ¦  «         dS )z~
        L{imap4.IMAP4Server.search_SENTSINCE} returns True if the message date
        is later than the query date.
        N)rU  r  Úsearch_SENTSINCErW  rZ  r�   rS  rY  rR   s    r4   Útest_searchSentSincez+IMAP4ServerSearchTests.test_searchSentSince	  sy   € ð
 	�ŠØŒK×(Ò(¨Ô):¸D¼HÀdÄhÑOÔOñ	
ô 	
ð 	
ð 	×ÒØŒK×(Ò(¨¬¸$¼(ÀDÄHÑMÔMñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óà  — |                       | j                             dg| j        z   dgz   | j        z   | j        | j        d¦  «        ¦  «         |                       | j                             dg| j        z   dgz   | j        z   | j        | j        d¦  «        ¦  «         |                      | j                             dg| j        z   dgz   | j        z   | j        | j        d¦  «        ¦  «         dS )z­
        L{imap4.IMAP4Server.search_OR} returns true if either of the two
        expressions supplied to it returns true and returns false if neither
        does.
        Ú	SENTSINCEr  ÚSENTONN)rU  r  Ú	search_ORrW  rY  rZ  r�   rS  rR   s    r4   Útest_searchOrz$IMAP4ServerSearchTests.test_searchOr  s  € ð 	�ŠØŒK×!Ò!Ø� Ô 1Ñ1°[°MÑAÀDÄOÑSØ”Ø”Øñ	ô ñ	
ô 	
ð 	
ð 	�ŠØŒK×!Ò!Ø� ¤Ñ/°;°-Ñ?À$ÔBSÑSØ”Ø”Øñ	ô ñ	
ô 	
ð 	
ð 	×ÒØŒK×!Ò!Ø�
˜Tœ_Ñ,°¨}Ñ<¸t¼ÑNØ”Ø”Øñ	ô ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó  — |                       | j                             dg| j        z   | j        | j        d¦  «        ¦  «         |                      | j                             dg| j        z   | j        | j        d¦  «        ¦  «         dS )z~
        L{imap4.IMAP4Server.search_NOT} returns the negation of the result
        of the expression supplied to it.
        rn  r  ro  N)rS  r  Ú
search_NOTrW  rZ  r�   rU  rY  rR   s    r4   Útest_searchNotz%IMAP4ServerSearchTests.test_searchNot4  s•   € ð
 	×ÒØŒK×"Ò"Ø� Ô 1Ñ1°4´8¸T¼XÀ|ñô ñ	
ô 	
ð 	
ð
 	�ŠØŒK×"Ò"Ø�
˜Tœ_Ñ,¨d¬h¸¼À,ñô ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óz  — |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                      | j                             | j        | j        | j        ¦  «        ¦  «         dS )z€
        L{imap4.IMAP4Server.search_BEFORE} returns True if the
        internal message date is before the query date.
        N)	rS  r  Úsearch_BEFORErW  rZ  r�   rX  rU  rY  rR   s    r4   Útest_searchBeforez(IMAP4ServerSearchTests.test_searchBeforeD  s¦   € ð
 	×ÒØŒK×%Ò% dÔ&7¸¼À4Ä8ÑLÔLñ	
ô 	
ð 	
ð 	×ÒØŒK×%Ò% dÔ&8¸$¼(ÀDÄHÑMÔMñ	
ô 	
ð 	
ð 	�Š˜œ×1Ò1°$´/À4Ä8ÈTÌXÑVÔVÑWÔWÐWÐWÐWr6   c                óz  — |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                       | j                             | j        | j        | j        ¦  «        ¦  «         dS )z�
        L{imap4.IMAP4Server.search_ON} returns True if the
        internal message date is the same as the query date.
        N)rS  r  Ú	search_ONrW  rZ  r�   rX  rY  rR   s    r4   Útest_searchOnz$IMAP4ServerSearchTests.test_searchOnQ  s–   € ð
 	×Ò˜œ×.Ò.¨tÔ/@À$Ä(ÈDÌHÑUÔUÑVÔVÐVØ×Ò˜œ×.Ò.¨tÔ/AÀ4Ä8ÈTÌXÑVÔVÑWÔWÐWØ×Ò˜œ×.Ò.¨t¬ÀÄÈ$Ì(ÑSÔSÑTÔTÐTÐTÐTr6   c                óz  — |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                       | j                             | j        | j        | j        ¦  «        ¦  «         |                      | j                             | j        | j        | j        ¦  «        ¦  «         dS )z…
        L{imap4.IMAP4Server.search_SINCE} returns True if the
        internal message date is greater than the query date.
        N)	rU  r  Úsearch_SINCErW  rZ  r�   rX  rS  rY  rR   s    r4   Útest_searchSincez'IMAP4ServerSearchTests.test_searchSinceZ  s›   € ð
 	�Š˜œ×0Ò0°Ô1BÀDÄHÈdÌhÑWÔWÑXÔXÐXØ�ŠØŒK×$Ò$ TÔ%7¸¼À4Ä8ÑLÔLñ	
ô 	
ð 	
ð 	×Ò˜œ×1Ò1°$´/À4Ä8ÈTÌXÑVÔVÑWÔWÐWÐWÐWr6   N)rs   rt   ru   r2  r  r]  r`  rb  rf  ri  rl  rq  rt  rw  rz  r}  r1   r6   r4   rT  rT  ¿  sã   € € € € € ðð ð
ð 
ð 
ð

ð 

ð 

ð
Wð 
Wð 
Wð
ð 
ð 
ð2ð 2ð 2ðYð Yð Yð

ð 

ð 

ð
ð 
ð 
ð>
ð 
ð 
ð Xð Xð XðUð Uð Uð	Xð 	Xð 	Xð 	Xð 	Xr6   rT  c                  ó$   — e Zd ZdZdZdd„Zd„ ZdS )rÔ  z”
    A L{IRealm} for tests.

    @cvar theAccount: An C{Account} instance.  Tests can set this to
        ensure predictable account retrieval.
    Nc                ó:   ‡ ‡— ‰rˆfd„‰ _         dS ˆ fd„‰ _         dS )ab  
        Create a realm for testing.

        @param accountHolder: (optional) An object whose C{theAccount}
            attribute will be returned instead of
            L{TestRealm.theAccount}.  Attribute access occurs on every
            avatar request, so any modifications to
            C{accountHolder.theAccount} will be reflected here.
        c                 ó   •— ‰ j         S r0   ©rá  rÐ  s   €r4   r5   z$TestRealm.__init__.<locals>.<lambda>|  s
   ø€  }Ô'?€ r6   c                 ó   •— ‰ j         S r0   r�  rR   s   €r4   r5   z$TestRealm.__init__.<locals>.<lambda>~  s	   ø€  t¤€ r6   N)Ú_getAccount)rE   rÑ  s   ``r4   rz   zTestRealm.__init__q  s<   øø€ ð ð 	7Ø?Ð?Ð?Ð?ˆDÔÐÐà6Ð6Ð6Ð6ˆDÔÐÐr6   c                óF   — t           j        |                      ¦   «         d„ fS )Nc                 ó   — d S r0   r1   r1   r6   r4   r5   z)TestRealm.requestAvatar.<locals>.<lambda>�  s   € ¸4€ r6   )r   ÚIAccountrƒ  )rE   ÚavatarIdÚmindr   s       r4   ro  zTestRealm.requestAvatar€  s   € ÝŒ~˜t×/Ò/Ñ1Ô1°<°<Ð?Ð?r6   r0   )rs   rt   ru   r2  rá  rz   ro  r1   r6   r4   rÔ  rÔ  f  sM   € € € € € ðð ð €Jð7ð 7ð 7ð 7ð@ð @ð @ð @ð @r6   rÔ  c                  ó*   — e Zd ZeefZddiZd„ Zd„ ZdS )ÚTestCheckerrÎ  ó   secretc                ó²   — |j         | j        v rHt          j        |j        | j        |j                  ¦  «                             | j        |j         ¦  «        S d S r0   )Úusernamer‰  r   ÚmaybeDeferredÚcheckPasswordr›   Ú_cbCheck)rE   Úcredentialss     r4   ÚrequestAvatarIdzTestChecker.requestAvatarId‰  sU   € ØÔ 4¤:Ð-Ð-ÝÔ&ØÔ)¨4¬:°kÔ6JÔ+Kñô çŠk˜$œ-¨Ô)=Ñ>Ô>ð?ð .Ð-r6   c                ó&   — |r|S t          ¦   «         ‚r0   r   )rE   r2   r�  s      r4   r�  zTestChecker._cbCheck�  s   € Øð 	ØˆOÝÑ!Ô!Ð!r6   N)	rs   rt   ru   r   r   ÚcredentialInterfacesr‰  r’  r�  r1   r6   r4   rŠ  rŠ  „  sH   € € € € € Ø3Ð5FÐGÐà˜)Ð$€Eð?ð ?ð ?ð"ð "ð "ð "ð "r6   rŠ  c                  ó†   — 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d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚAuthenticatorTestsc                ó:  — t                                | ¦  «         t          ¦   «         }t          d¦  «        |_        t          |¦  «        | _        | j                             t          ¦   «         ¦  «         | j        | j	        _        d| _
        |j        | _        d S )NrÎ  r   )rü  r  rÔ  rÊ  rá  r   r×  rØ  rŠ  r  ÚauthenticatedrU  )rE   rÜ  s     r4   r  zAuthenticatorTests.setUp–  sx   € Ý×Ò˜tÑ$Ô$Ð$å‘”ˆÝ" ;Ñ/Ô/ˆÔÝ˜U‘m”mˆŒØŒ×#Ò#¥K¡M¤MÑ2Ô2Ð2Ø!œ[ˆŒÔàˆÔØÔ'ˆŒˆˆr6   c                óˆ  — t          t          t          ¦  «         G d„ d¦  «        ¦   «         } |¦   «         }t          t          |¦  «         t	          j        d|i¦  «        }| j        |_        t          ¦   «         }|                     |¦  «         |  	                    |j
        t          j        d¦  «        ¦  «         |                      d|                     ¦   «         ¦  «         |                     ¦   «          |                     d¦  «         |                      t#          j        |                     ¦   «         ¦  «        |                     ¦   «         ¦  «         |                     ¦   «          |                     t#          j        d¦  «        dz   ¦  «         |                      |                     ¦   «         d	¦  «         d
S )z¡
        L{imap4.IMAP4Server} accepts a L{dict} mapping challenge type
        names to L{twisted.mail.interfaces.IChallengeResponse}
        providers.
        c                  ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ú>AuthenticatorTests.test_customChallengers.<locals>.SPECIALAuthc                ó   — dS )Nó   SPECIALr1   rR   s    r4   ÚgetChallengezKAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.getChallenge«  ó   € Ø!�zr6   c                óL   — |                      d d¦  «        \  | _        | _        d S rt  )Úsplitr�  Úpassword©rE   Úresponses     r4   ÚsetResponsezJAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.setResponse®  s"   € Ø/7¯~ª~¸dÀAÑ/FÔ/FÑ,�”˜tœ}˜}˜}r6   c                ó   — dS ©NFr1   rR   s    r4   ÚmoreChallengeszMAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.moreChallenges±  s   € Ø�ur6   c                ó   — | j         | _         d S r0   )r¢  )rE   r¢  s     r4   r�  zLAuthenticatorTests.test_customChallengers.<locals>.SPECIALAuth.checkPassword´  s   € Ø $¤�”��r6   N)rs   rt   ru   rž  r¥  r¨  r�  r1   r6   r4   ÚSPECIALAuthr›  ©  sS   € € € € € ð"ð "ð "ðGð Gð Gðð ð ð.ð .ð .ð .ð .r6   rª  r�  úConnection done.s   AUTH=SPECIALs   001 AUTHENTICATE SPECIAL
s   username passwordrŠ  s"   001 OK Authentication successful
N)r   r    r   r   r   rÓ  r×  r   rÃ  Ú
addCleanuprÇ  r   rÈ  r  r  rÄ  ÚdataReceivedÚbase64Ú	b64encoderž  rB   )rE   rª  Úspecialr  rð  s        r4   Útest_customChallengersz)AuthenticatorTests.test_customChallengers¢  s•  € õ 
Õ'Õ):Ñ	;Ô	;ð	.ð 	.ð 	.ð 	.ð 	.ñ 	.ô 	.ñ 
<Ô	;ð	.ð �+‘-”-ˆÝÕ'¨Ñ1Ô1Ð1åÔ" J°Ð#<Ñ=Ô=ˆØœˆŒå#Ñ%Ô%ˆ	Ø×Ò˜iÑ(Ô(Ð(Ø�Š˜Ô-­uÔ/CÐDVÑ/WÔ/WÑXÔXÐXà�Š�o y§¢Ñ'8Ô'8Ñ9Ô9Ð9à�ŠÑÔÐØ×ÒÐ;Ñ<Ô<Ð<à�Š•fÔ& w×';Ò';Ñ'=Ô'=Ñ>Ô>À	ÇÂÑ@QÔ@QÑRÔRÐRà�ŠÑÔÐØ×Ò�FÔ,Ð-AÑBÔBÀWÑLÑMÔMÐMà×Ò˜ŸšÑ*Ô*Ð,SÑTÔTÐTÐTÐTr6   c                ó†  — t          j        ¦   «         }| j        |_        t          ¦   «         }|                     |¦  «         |                      |j        t          j        d¦  «        ¦  «         | 	                    ¦   «          | 
                    d¦  «         |                      |                     ¦   «         d¦  «         dS )z_
        An unsupported C{AUTHENTICATE} method results in a negative
        response.
        r«  s   001 AUTHENTICATE UNKNOWN
s(   001 NO AUTHENTICATE method unsupported
N)r   rÓ  r×  r   rÃ  r¬  rÇ  r   rÈ  rÄ  r­  rB   r  )rE   r  rð  s      r4   Útest_unsupportedMethodz)AuthenticatorTests.test_unsupportedMethodÍ  s´   € õ
 Ô"Ñ$Ô$ˆØœˆŒå#Ñ%Ô%ˆ	Ø×Ò˜iÑ(Ô(Ð(Ø�Š˜Ô-­uÔ/CÐDVÑ/WÔ/WÑXÔXÐXà�ŠÑÔÐà×ÒÐ;Ñ<Ô<Ð<Ø×ÒØ�OŠOÑÔÐLñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óÈ  ‡ — t           j        ‰ j        j        d<   t          j        d¦  «        }‰ j                             |¦  «         d‰ j        _        ˆ fd„}‰ j         	                    t          |¦  «        ¦  «        }|                     ‰ j        d¦  «         |                     ‰ j        ‰ j        ¦  «         t!          j        |‰                      ¦   «         g¦  «        S )zv
        An L{imap4.IMAP4Server} that is missing a L{Portal} responds
        negatively to an authentication
        rý  rÎ  Nc                 ó8   •— ‰ j                              d¦  «        S ©Nr‹  ©r  ÚauthenticaterR   s   €r4   rS  z3AuthenticatorTests.test_missingPortal.<locals>.authì  ó   ø€ Ø”;×+Ò+¨IÑ6Ô6Ð6r6   s    Temporary authentication failure)r   ÚLOGINCredentialsr  r6  ÚLOGINAuthenticatorr  ÚregisterAuthenticatorr×  r  r›   r7   r+  r  rÜ  r
  r  r   r,  r#   )rE   ÚcAuthrS  rž   s   `   r4   Útest_missingPortalz%AuthenticatorTests.test_missingPortalà  sÕ   ø€ õ
 -2Ô,BˆŒÔ Ñ)åÔ(¨Ñ5Ô5ˆØŒ×)Ò)¨%Ñ0Ô0Ð0à!ˆŒÔð	7ð 	7ð 	7ð 	7ð 	7ð ŒN×&Ò&¥u¨T¡{¤{Ñ3Ô3ˆØ	�ŠØÔ+Ð-Pñ	
ô 	
ð 	
ð 	
�Š�tÔ)¨4¬?Ñ;Ô;Ð;åÔ" A t§}¢}¡¤Ð#7Ñ8Ô8Ð8r6   c                ó®  ‡ — t          t          ¦  «         G d„ d¦  «        ¦   «         }t          t          ¦  «         G d„ d¦  «        ¦   «         } |¦   «         }t          t          |¦  «         |‰ j        j        d<   ‰ j                              |¦   «         ¦  «         ˆ fd„}‰ j         	                    t          |¦  «        ¦  «        }|                     ‰ j        dt          |j        ¦  «        z                        d¦  «        ¦  «         |                     ‰ j        ‰ j        ¦  «         t'          j        |‰                      ¦   «         g¦  «        S )	z�
        When a challenger's
        L{getChallenge<IChallengeResponse.getChallenge>} method raises
        any exception, a C{NO} response is sent.
        c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )úRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenges   A challenge failurec                ó*   — t          | j        ¦  «        ‚r0   )r  rŽ  rR   s    r4   rž  z_AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.getChallenge  s   € Ý  ¤Ñ.Ô.Ð.r6   c                ó   — dS ©zw
                Never called.

                @param response: See L{IChallengeResponse.setResponse}
                Nr1   r£  s     r4   r¥  z^AuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.setResponse  ó   € € € r6   c                ó   — dS ©z/
                Never called.
                Nr1   rR   s    r4   r¨  zaAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthChallenge.moreChallenges  rÅ  r6   N©rs   rt   ru   rŽ  rž  r¥  r¨  r1   r6   r4   ÚValueErrorAuthChallengerÁ  þ  sF   € € € € € à,ˆGð/ð /ð /ðð ð ðð ð ð ð r6   rÉ  c                  ó   — e Zd Zd„ Zd„ ZdS )úRAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticatorc                ó   — dS )Nó   ERRORr1   rR   s    r4   ÚgetNamezZAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.getName  s   € Ø�xr6   c                ó   — dS )Ns   IGNOREDr1   )rE   ÚsecretÚchals      r4   ÚchallengeResponsezdAuthenticatorTests.test_challengerRaisesException.<locals>.ValueErrorAuthenticator.challengeResponse  rŸ  r6   N)rs   rt   ru   rÎ  rÒ  r1   r6   r4   ÚValueErrorAuthenticatorrË    s2   € € € € € ð ð  ð  ð"ð "ð "ð "ð "r6   rÓ  rÍ  c                 ó8   •— ‰ j                              d¦  «        S r¶  r·  rR   s   €r4   rS  z?AuthenticatorTests.test_challengerRaisesException.<locals>.auth  r¹  r6   zServer error: r­  )r   r    r!   r   r  r6  r  r¼  r  r›   r7   r+  r  rå   rŽ  rC   rÜ  r
  r  r   r,  r#   )rE   rÉ  rÓ  ÚbadrS  rž   s   `     r4   Útest_challengerRaisesExceptionz1AuthenticatorTests.test_challengerRaisesException÷  s|  ø€ õ 
Õ'Ñ	(Ô	(ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ 
)Ô	(ð	õ$ 
Õ*Ñ	+Ô	+ð	"ð 	"ð 	"ð 	"ð 	"ñ 	"ô 	"ñ 
,Ô	+ð	"ð &Ð%Ñ'Ô'ˆÝÕ'¨Ñ-Ô-Ð-à,CˆŒÔ Ñ)ØŒ×)Ò)Ð*AÐ*AÑ*CÔ*CÑDÔDÐDð	7ð 	7ð 	7ð 	7ð 	7ð ŒN×&Ò&¥u¨T¡{¤{Ñ3Ô3ˆØ	�ŠØÔ+Ø¥Ð$;Ô$CÑ DÔ DÑD×LÒLÈWÑUÔUñ	
ô 	
ð 	
ð 	
�Š�tÔ)¨4¬?Ñ;Ô;Ð;åÔ" A t§}¢}¡¤Ð#7Ñ8Ô8Ð8r6   c                ó–  — t          t          ¦  «         G d„ d¦  «        ¦   «         } |¦   «         }t          t          |¦  «         t          j        ¦   «         }| j        |_        ||j        d<   t          ¦   «         }|                     |¦  «         |  	                    |j
        t          j        d¦  «        ¦  «         |                      d|                     ¦   «         ¦  «         |                     ¦   «          |                     d¦  «         |                      t#          j        |                     ¦   «         ¦  «        |                     ¦   «         ¦  «         |                     ¦   «          |                     d¦  «         |                      |                     ¦   «         d                     d	|j        d
g¦  «        ¦  «         dS )z‰
        A client that responds with a challenge that cannot be decoded
        as Base 64 receives an L{IllegalClientResponse}.
        c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )úEAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenges   Malformed Response - not base64c                ó   — dS )Ns   SomeChallenger1   rR   s    r4   rž  zRAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.getChallenge5  s   € Ø'Ð'r6   c                ó   — dS rÄ  r1   r£  s     r4   r¥  zQAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.setResponse8  rÅ  r6   c                ó   — dS rÇ  r1   rR   s    r4   r¨  zTAuthenticatorTests.test_authNotBase64.<locals>.NotBase64AuthChallenge.moreChallenges?  rÅ  r6   NrÈ  r1   r6   r4   ÚNotBase64AuthChallengerÙ  1  sF   € € € € € à8ˆGð(ð (ð (ðð ð ðð ð ð ð r6   rÝ  s	   NOTBASE64r«  s   AUTH=NOTBASE64s   001 AUTHENTICATE NOTBASE64
s     Not base64
r6   s   001 NO Authentication failed: rŠ  N)r   r    r   r   rÓ  r×  r6  r   rÃ  r¬  rÇ  r   rÈ  r  r  rÄ  r­  r®  r¯  rž  rB   r’   rŽ  )rE   rÝ  Ú	notBase64r  rð  s        r4   Útest_authNotBase64z%AuthenticatorTests.test_authNotBase64+  s®  € õ 
Õ'Ñ	(Ô	(ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ 
)Ô	(ð	ð$ +Ð*Ñ,Ô,ˆ	ÝÕ'¨Ñ3Ô3Ð3åÔ"Ñ$Ô$ˆØœˆŒØ+AˆÔ˜<Ñ(å#Ñ%Ô%ˆ	Ø×Ò˜iÑ(Ô(Ð(Ø�Š˜Ô-­uÔ/CÐDVÑ/WÔ/WÑXÔXÐXà�ŠÐ'¨¯ªÑ):Ô):Ñ;Ô;Ð;à�ŠÑÔÐØ×ÒÐ=Ñ>Ô>Ð>à�Š•fÔ& y×'=Ò'=Ñ'?Ô'?Ñ@Ô@À)Ç/Â/ÑBSÔBSÑTÔTÐTà�ŠÑÔÐØ×ÒÐ2Ñ3Ô3Ð3à×ÒØ�OŠOÑÔØ�HŠHÐ7¸Ô9JÈGÐTÑUÔUñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó4  ‡ — t          ¦   «         }t          |¦  «        }|‰ j        _        t          j        x‰ j        j        d<   }t          t          |¦  «         t	          j	        d¦  «        }‰ j
                             |¦  «         ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     ‰ j        d¦  «         |                     ‰ j        ‰ j        ¦  «         t)          j        ‰                      ¦   «         |g¦  «        }|S )zÔ
        A challenger that causes the login to fail
        L{UnhandledCredentials} results in an C{NO} response.

        @return: A L{Deferred} that fires when the authorization has
            failed.
        rý  rÎ  c                 ó8   •— ‰ j                              d¦  «        S r¶  r·  rR   s   €r4   rS  z:AuthenticatorTests.test_unhandledCredentials.<locals>.auths  r¹  r6   s+   Authentication failed: server misconfigured)rÔ  r   r  r×  r   rº  r6  r   r    r»  r  r¼  r  r›   r7   r+  r  rÜ  r
  r  r   r,  r#   )rE   rÜ  r×  Ú	loginCredr½  rS  r-  rž   s   `       r4   Útest_unhandledCredentialsz,AuthenticatorTests.test_unhandledCredentials^  s  ø€ õ ‘”ˆÝ˜‘”ˆð $ˆŒÔå8=Ô8NÐNˆŒÔ Ñ)¨IåÕ&¨	Ñ2Ô2Ð2åÔ(¨Ñ5Ô5ˆØŒ×)Ò)¨%Ñ0Ô0Ð0ð	7ð 	7ð 	7ð 	7ð 	7ð Œ^×'Ò'­¨d©¬Ñ4Ô4ˆØ
�ŠØÔ+Ø:ñ	
ô 	
ð 	
ð 	�Š˜Ô*¨D¬OÑ<Ô<Ð<ÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØˆr6   c                ó  ‡ ‡
—  G d„ dt           ¦  «        Š
 G ˆ
fd„d¦  «        }t          ¦   «         }t          |¦  «        }|                      |¦   «         ¦  «         |‰ j        _        t          j        x‰ j        j        d<   }t          t          |¦  «         t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ
ˆ fd„}‰ j                             t!          |¦  «        ¦  «        }|                     ‰ j        d	¦  «         |                     t!          |¦  «        ¦  «         |                     ‰ j        ‰ j        ¦  «         t-          j        ‰                      ¦   «         |g¦  «        }	|	S )
zÇ
        If the portal raises an exception other than
        L{UnauthorizedLogin} or L{UnhandledCredentials}, the server
        responds with a C{BAD} response and the exception is logged.
        c                  ó   — e Zd ZdZdS )úKAuthenticatorTests.test_unexpectedLoginFailure.<locals>.UnexpectedExceptionrt  NrË  r1   r6   r4   ru  ræ  †  rv  r6   ru  c                  ó&   •— e Zd ZdZeefZˆ fd„ZdS )úFAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingCheckerzz
            A credentials checker whose L{requestAvatarId} method
            raises L{UnexpectedException}.
            c                ó   •—  ‰d¦  «        ‚)NzUnexpected error.r1   )rE   r‘  ru  s     €r4   r’  zVAuthenticatorTests.test_unexpectedLoginFailure.<locals>.FailingChecker.requestAvatarId“  s   ø€ Ø)Ð)Ð*=Ñ>Ô>Ð>r6   N)rs   rt   ru   r2  r   r   r”  r’  )ru  s   €r4   ÚFailingCheckerrè  ‹  sF   ø€ € € € € ðð ð
 %<Ð=NÐ#OÐ ð?ð ?ð ?ð ?ð ?ð ?ð ?r6   rê  rý  rÎ  c                 ó8   •— ‰ j                              d¦  «        S r¶  r·  rR   s   €r4   rS  z<AuthenticatorTests.test_unexpectedLoginFailure.<locals>.auth¢  r¹  r6   c                 óX   •— ‰                      ‰                     ‰ ¦  «        ¦  «         d S r0   r€  )ru  rE   s   €€r4   ÚassertUnexpectedExceptionLoggedzWAuthenticatorTests.test_unexpectedLoginFailure.<locals>.assertUnexpectedExceptionLogged¥  s*   ø€ Ø�OŠO˜D×2Ò2Ð3FÑGÔGÑHÔHÐHÐHÐHr6   s'   Server error: login failed unexpectedly)rß  rÔ  r   rØ  r  r×  r   rº  r6  r   r    r»  r  r¼  r  r›   r7   r+  r  rÜ  r
  r  r   r,  r#   )rE   rê  rÜ  r×  râ  r½  rS  rí  r-  rž   ru  s   `         @r4   Útest_unexpectedLoginFailurez.AuthenticatorTests.test_unexpectedLoginFailure  s»  øø€ ð	ð 	ð 	ð 	ð 	¥)ñ 	ô 	ð 	ð
		?ð 		?ð 		?ð 		?ð 		?ð 		?ð 		?ñ 		?ô 		?ð 		?õ ‘”ˆÝ˜‘”ˆØ×Ò˜~˜~Ñ/Ô/Ñ0Ô0Ð0Ø#ˆŒÔå8=Ô8NÐNˆŒÔ Ñ)¨IåÕ&¨	Ñ2Ô2Ð2åÔ(¨Ñ5Ô5ˆØŒ×)Ò)¨%Ñ0Ô0Ð0ð	7ð 	7ð 	7ð 	7ð 	7ð	Ið 	Ið 	Ið 	Ið 	Ið 	Ið Œ^×'Ò'­¨d©¬Ñ4Ô4ˆØ
�ŠØÔ+Ð-Wñ	
ô 	
ð 	
ð 	�Š•uÐ<Ñ=Ô=Ñ>Ô>Ð>Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<ÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØˆr6   c                ó  ‡ — t           ‰ j        j        d<   t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }| 
                    t          |¦  «        ‰ j        ¦  «         | 
                    ‰ j        ‰ j        ¦  «         ‰                      ¦   «         }t          j        ||g¦  «        }|                     ‰ j        ¦  «        S )Nr0  rÎ  c                 ó8   •— ‰ j                              d¦  «        S r¶  r·  rR   s   €r4   rS  z,AuthenticatorTests.testCramMD5.<locals>.auth¶  r¹  r6   c                 ó   •— d‰ _         d S rt  ©r˜  rR   s   €r4   Úauthedz.AuthenticatorTests.testCramMD5.<locals>.authed¹  ó   ø€ Ø!"ˆDÔÐÐr6   )r   r  r6  r   ÚCramMD5ClientAuthenticatorr  r¼  r  r›   r7   rÜ  r  r
  r#   r   r,  Ú_cbTestCramMD5)rE   r½  rS  ró  r-  rb  rž   s   `      r4   ÚtestCramMD5zAuthenticatorTests.testCramMD5±  sò   ø€ Ý/AˆŒÔ Ñ,ÝÔ0°Ñ=Ô=ˆØŒ×)Ò)¨%Ñ0Ô0Ð0ð	7ð 	7ð 	7ð 	7ð 	7ð	#ð 	#ð 	#ð 	#ð 	#ð Œ^×'Ò'­¨d©¬Ñ4Ô4ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<Ø�]Š]‰_Œ_ˆÝÔ  R Ñ)Ô)ˆØ�}Š}˜TÔ0Ñ1Ô1Ð1r6   c                ó†   — |                       | j        d¦  «         |                       | j        j        | j        ¦  «         d S rt  ©rB   r˜  r  rU  rW  s     r4   rö  z!AuthenticatorTests._cbTestCramMD5Ã  ó>   € Ø×Ò˜Ô+¨QÑ/Ô/Ð/Ø×Ò˜œÔ,¨d¬lÑ;Ô;Ð;Ð;Ð;r6   c                ó  ‡ — t           ‰ j        j        d<   t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }| 
                    t          |¦  «        t          |¦  «        ¦  «         | 
                    ‰ j        ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nr0  rÎ  c                 ó8   •— ‰ j                              d¦  «        S ©Ns   not the secretr·  rR   s   €r4   Úmisauthz5AuthenticatorTests.testFailedCramMD5.<locals>.misauthÌ  ó   ø€ Ø”;×+Ò+Ð,=Ñ>Ô>Ð>r6   c                 ó   •— d‰ _         d S rt  rò  rR   s   €r4   ró  z4AuthenticatorTests.testFailedCramMD5.<locals>.authedÏ  rô  r6   c                 ó   •— d‰ _         d S ©Néÿÿÿÿrò  rR   s   €r4   Ú	misauthedz7AuthenticatorTests.testFailedCramMD5.<locals>.misauthedÒ  ó   ø€ Ø!#ˆDÔÐÐr6   )r   r  r6  r   rõ  r  r¼  r  r›   r7   rÜ  r
  r  r   r,  r#   Ú_cbTestFailedCramMD5©rE   r½  rþ  ró  r  r-  rž   s   `      r4   ÚtestFailedCramMD5z$AuthenticatorTests.testFailedCramMD5Ç  s  ø€ Ý/AˆŒÔ Ñ,ÝÔ0°Ñ=Ô=ˆØŒ×)Ò)¨%Ñ0Ô0Ð0ð	?ð 	?ð 	?ð 	?ð 	?ð	#ð 	#ð 	#ð 	#ð 	#ð	$ð 	$ð 	$ð 	$ð 	$ð Œ^×'Ò'­¨g©¬Ñ7Ô7ˆØ
�Š�˜f™œ¥u¨YÑ'7Ô'7Ñ8Ô8Ð8Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<ÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ6Ñ7Ô7Ð7r6   c                ó|   — |                       | j        d¦  «         |                       | j        j        d ¦  «         d S r  rù  rW  s     r4   r  z'AuthenticatorTests._cbTestFailedCramMD5Û  ó<   € Ø×Ò˜Ô+¨RÑ0Ô0Ð0Ø×Ò˜œÔ,¨dÑ3Ô3Ð3Ð3Ð3r6   c                ó6  ‡ — t           j        x‰ j        j        d<   }t	          t
          |¦  «         t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ fd„}‰ j	         
                    t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }| 
                    ‰ j        ¦  «        S )Nrý  rÎ  c                 ó8   •— ‰ j                              d¦  «        S r¶  r·  rR   s   €r4   rS  z*AuthenticatorTests.testLOGIN.<locals>.authç  r¹  r6   c                 ó   •— d‰ _         d S rt  rò  rR   s   €r4   ró  z,AuthenticatorTests.testLOGIN.<locals>.authedê  rô  r6   )r   rº  r  r6  r   r    r»  r  r¼  r  r›   r7   rÜ  r  r
  r   r,  r#   Ú_cbTestLOGIN)rE   râ  r½  rS  ró  r-  rž   s   `      r4   Ú	testLOGINzAuthenticatorTests.testLOGINß  ó  ø€ Ý8=Ô8NÐNˆŒÔ Ñ)¨IåÕ&¨	Ñ2Ô2Ð2åÔ(¨Ñ5Ô5ˆØŒ×)Ò)¨%Ñ0Ô0Ð0ð	7ð 	7ð 	7ð 	7ð 	7ð	#ð 	#ð 	#ð 	#ð 	#ð Œ^×'Ò'­¨d©¬Ñ4Ô4ˆØ
�Š�˜f™œ t¤Ñ7Ô7Ð7Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<ÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ.Ñ/Ô/Ð/r6   c                ó†   — |                       | j        d¦  «         |                       | j        j        | j        ¦  «         d S rt  rù  rW  s     r4   r  zAuthenticatorTests._cbTestLOGINó  rú  r6   c                ó"  ‡ — t           j        ‰ j        j        d<   t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }| 
                    t          |¦  «        t          |¦  «        ¦  «         | 
                    ‰ j        ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nrý  rÎ  c                 ó8   •— ‰ j                              d¦  «        S rý  r·  rR   s   €r4   rþ  z3AuthenticatorTests.testFailedLOGIN.<locals>.misauthü  rÿ  r6   c                 ó   •— d‰ _         d S rt  rò  rR   s   €r4   ró  z2AuthenticatorTests.testFailedLOGIN.<locals>.authedÿ  rô  r6   c                 ó   •— d‰ _         d S r  rò  rR   s   €r4   r  z5AuthenticatorTests.testFailedLOGIN.<locals>.misauthed  r  r6   )r   rº  r  r6  r»  r  r¼  r  r›   r7   rÜ  r
  r  r   r,  r#   Ú_cbTestFailedLOGINr  s   `      r4   ÚtestFailedLOGINz"AuthenticatorTests.testFailedLOGIN÷  ó  ø€ Ý,1Ô,BˆŒÔ Ñ)ÝÔ(¨Ñ5Ô5ˆØŒ×)Ò)¨%Ñ0Ô0Ð0ð	?ð 	?ð 	?ð 	?ð 	?ð	#ð 	#ð 	#ð 	#ð 	#ð	$ð 	$ð 	$ð 	$ð 	$ð Œ^×'Ò'­¨g©¬Ñ7Ô7ˆØ
�Š�˜f™œ¥u¨YÑ'7Ô'7Ñ8Ô8Ð8Ø
�Š˜Ô*¨D¬OÑ<Ô<Ð<ÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ4Ñ5Ô5Ð5r6   c                ó|   — |                       | j        d¦  «         |                       | j        j        d ¦  «         d S r  rù  rW  s     r4   r  z%AuthenticatorTests._cbTestFailedLOGIN  r
  r6   c                ó6  ‡ — t           j        x‰ j        j        d<   }t	          t
          |¦  «         t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ fd„}‰ j	         
                    t          |¦  «        ¦  «        }|                     t          |¦  «        ‰ j        ¦  «         |                     ‰ j        ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }| 
                    ‰ j        ¦  «        S )Nr“  rÎ  c                 ó8   •— ‰ j                              d¦  «        S r¶  r·  rR   s   €r4   rS  z*AuthenticatorTests.testPLAIN.<locals>.auth  r¹  r6   c                 ó   •— d‰ _         d S rt  rò  rR   s   €r4   ró  z,AuthenticatorTests.testPLAIN.<locals>.authed  rô  r6   )r   ÚPLAINCredentialsr  r6  r   r    ÚPLAINAuthenticatorr  r¼  r  r›   r7   rÜ  r  r
  r   r,  r#   Ú_cbTestPLAIN)rE   Ú	plainCredr½  rS  ró  r-  rž   s   `      r4   Ú	testPLAINzAuthenticatorTests.testPLAIN  r  r6   c                ó†   — |                       | j        d¦  «         |                       | j        j        | j        ¦  «         d S rt  rù  rW  s     r4   r  zAuthenticatorTests._cbTestPLAIN#  rú  r6   c                ó"  ‡ — t           j        ‰ j        j        d<   t          j        d¦  «        }‰ j                             |¦  «         ˆ fd„}ˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }| 
                    t          |¦  «        t          |¦  «        ¦  «         | 
                    ‰ j        ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nr“  rÎ  c                 ó8   •— ‰ j                              d¦  «        S rý  r·  rR   s   €r4   rþ  z3AuthenticatorTests.testFailedPLAIN.<locals>.misauth,  rÿ  r6   c                 ó   •— d‰ _         d S rt  rò  rR   s   €r4   ró  z2AuthenticatorTests.testFailedPLAIN.<locals>.authed/  rô  r6   c                 ó   •— d‰ _         d S r  rò  rR   s   €r4   r  z5AuthenticatorTests.testFailedPLAIN.<locals>.misauthed2  r  r6   )r   r  r  r6  r  r  r¼  r  r›   r7   rÜ  r
  r  r   r,  r#   Ú_cbTestFailedPLAINr  s   `      r4   ÚtestFailedPLAINz"AuthenticatorTests.testFailedPLAIN'  r  r6   c                ó|   — |                       | j        d¦  «         |                       | j        j        d ¦  «         d S r  rù  rW  s     r4   r'  z%AuthenticatorTests._cbTestFailedPLAIN;  r
  r6   N)rs   rt   ru   r  r±  r³  r¾  rÖ  rß  rã  rî  r÷  rö  r  r  r  r  r  r  r!  r  r(  r'  r1   r6   r4   r–  r–  •  sH  € € € € € ð
(ð 
(ð 
(ð)Uð )Uð )UðV
ð 
ð 
ð&9ð 9ð 9ð.29ð 29ð 29ðh1
ð 1
ð 1
ðfð ð ðB0ð 0ð 0ðd2ð 2ð 2ð$<ð <ð <ð8ð 8ð 8ð(4ð 4ð 4ð0ð 0ð 0ð(<ð <ð <ð6ð 6ð 6ð(4ð 4ð 4ð0ð 0ð 0ð(<ð <ð <ð6ð 6ð 6ð(4ð 4ð 4ð 4ð 4r6   r–  c                  ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚSASLPLAINTestszé
    Tests for I{SASL PLAIN} authentication, as implemented by
    L{imap4.PLAINAuthenticator} and L{imap4.PLAINCredentials}.

    @see: U{http://www.faqs.org/rfcs/rfc2595.html}
    @see: U{http://www.faqs.org/rfcs/rfc4616.html}
    c                ó¤   — d}d}d}t          j        |¦  «        }|                     ||¦  «        }|                      |d|z   dz   |z   ¦  «         dS )z�
        L{PLAINAuthenticator.challengeResponse} returns challenge strings of
        the form::

            NUL<authn-id>NUL<secret>
        rÎ  r‹  s	   challengeó    N)r   r  rÒ  rB   )rE   r�  rÐ  rÑ  r½  r¤  s         r4   Ú#test_authenticatorChallengeResponsez2SASLPLAINTests.test_authenticatorChallengeResponseI  sc   € ð ˆØˆØˆÝÔ(¨Ñ2Ô2ˆØ×*Ò*¨6°4Ñ8Ô8ˆØ×Ò˜ 5¨8Ñ#3°eÑ#;¸fÑ#DÑEÔEÐEÐEÐEr6   c                óÂ   — t          j        ¦   «         }|                     d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         dS )z†
        L{PLAINCredentials.setResponse} parses challenge strings of the
        form::

            NUL<authn-id>NUL<secret>
        s    testuser secretrÎ  r‹  N)r   r  r¥  rB   r�  r¢  ©rE   Úcreds     r4   Útest_credentialsSetResponsez*SASLPLAINTests.test_credentialsSetResponseW  s]   € õ Ô%Ñ'Ô'ˆØ×ÒÐ.Ñ/Ô/Ð/Ø×Ò˜œ¨Ñ4Ô4Ð4Ø×Ò˜œ¨	Ñ2Ô2Ð2Ð2Ð2r6   c                ó  — t          j        ¦   «         }|                      t           j        |j        d¦  «         |                      t           j        |j        d¦  «         |                      t           j        |j        d¦  «         dS )zŽ
        L{PLAINCredentials.setResponse} raises L{imap4.IllegalClientResponse}
        when passed a string not of the expected form.
        s   hellos   hello worlds   hello world Zoom! N)r   r  r×   rë  r¥  r0  s     r4   Útest_credentialsInvalidResponsez.SASLPLAINTests.test_credentialsInvalidResponsec  s‡   € õ
 Ô%Ñ'Ô'ˆØ×Ò�%Ô5°tÔ7GÈÑRÔRÐRØ×ÒÝÔ'¨Ô)9¸?ñ	
ô 	
ð 	
ð 	×ÒÝÔ'¨Ô)9Ð;Sñ	
ô 	
ð 	
ð 	
ð 	
r6   N)rs   rt   ru   r2  r.  r2  r4  r1   r6   r4   r+  r+  @  sN   € € € € € ðð ðFð Fð Fð
3ð 
3ð 
3ð
ð 
ð 
ð 
ð 
r6   r+  c                  óV   — 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dS )ÚUnsolicitedResponseTestsc                ó^  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z5UnsolicitedResponseTests.testReadWrite.<locals>.logint  r~  r6   c                 ó<   •— ‰ j                              d¦  «         d S rt  ©r  rî  rR   s   €r4   rø  z8UnsolicitedResponseTests.testReadWrite.<locals>.loggedInw  ó   ø€ ØŒK×#Ò# AÑ&Ô&Ð&Ð&Ð&r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestReadWrite©rE   rL  rø  r-  rž   s   `    r4   ÚtestReadWritez&UnsolicitedResponseTests.testReadWrites  s±   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	'ð 	'ð 	'ð 	'ð 	'ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜X‘”Ñ'Ô'×2Ò2°4´?ÑCÔCÐCÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ2Ñ3Ô3Ð3r6   c                óP   — | j         j        }|                      |ddgg¦  «         d S )Nrî  rÅ   ©r  rç  rB   ©rE   rX  ÚEs      r4   r<  z)UnsolicitedResponseTests._cbTestReadWrite  ó0   € ØŒKÔˆØ×Ò˜˜m¨QÐ/Ð0Ñ1Ô1Ð1Ð1Ð1r6   c                ó^  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z4UnsolicitedResponseTests.testReadOnly.<locals>.login„  r~  r6   c                 ó<   •— ‰ j                              d¦  «         d S rÖ  r:  rR   s   €r4   rø  z7UnsolicitedResponseTests.testReadOnly.<locals>.loggedIn‡  r;  r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestReadOnlyr=  s   `    r4   ÚtestReadOnlyz%UnsolicitedResponseTests.testReadOnlyƒ  s±   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	'ð 	'ð 	'ð 	'ð 	'ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜X‘”Ñ'Ô'×2Ò2°4´?ÑCÔCÐCÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ1Ñ2Ô2Ð2r6   c                óP   — | j         j        }|                      |ddgg¦  «         d S )Nrî  r   r@  rA  s      r4   rG  z(UnsolicitedResponseTests._cbTestReadOnly�  rC  r6   c                óv  ‡ ‡— ddgg dgdœŠˆ fd„}ˆˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ‰¦  «        S )Nú	\Answeredr’  ú\Recent)rÅ   rÊ   rö   c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z6UnsolicitedResponseTests.testFlagChange.<locals>.login–  r~  r6   c                 ó<   •— ‰j                              ‰ ¦  «         d S r0   )r  rô  )rœ  rE   s   €€r4   rø  z9UnsolicitedResponseTests.testFlagChange.<locals>.loggedIn™  s   ø€ ØŒK×$Ò$ UÑ+Ô+Ð+Ð+Ð+r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestFlagChange)rE   rL  rø  r-  rž   rœ  s   `    @r4   ÚtestFlagChangez'UnsolicitedResponseTests.testFlagChange“  sÏ   øø€ Ø! ;Ð/°B¸Z¸LÐIÐIˆð	Dð 	Dð 	Dð 	Dð 	Dð	,ð 	,ð 	,ð 	,ð 	,ð 	,ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜X‘”Ñ'Ô'×2Ò2°4´?ÑCÔCÐCÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ3°UÑ;Ô;Ð;r6   c                óâ   — | j         j        }d„ |                     ¦   «         D ¦   «         }|                     d„ ¬¦  «         |                     d„ ¬¦  «         |                      ||¦  «         d S )Nc                ó2   — g | ]}d |d         |d         ig‘ŒS )rô  r   rÅ   r1   )r,  r[  s     r4   r¾  z>UnsolicitedResponseTests._cbTestFlagChange.<locals>.<listcomp>£  s)   € ÐHÐHÐH°Q�> A a¤D¨!¨A¬$ <Ð0ÐHÐHÐHr6   c                ó   — | d         S rÖ  r1   ©rp   s    r4   r5   z<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>¤  s
   € ˜Q˜qœT€ r6   )Úkeyc                ó   — | d         S rÖ  r1   rT  s    r4   r5   z<UnsolicitedResponseTests._cbTestFlagChange.<locals>.<lambda>¥  s
   €  ! A¤$€ r6   )r  rç  Úitemsr¿  rB   )rE   rX  rœ  rB  Úexpects        r4   rO  z*UnsolicitedResponseTests._cbTestFlagChange¡  so   € ØŒKÔˆØHÐH¸%¿+º+¹-¼-ÐHÑHÔHˆØ	�Š�>�>ˆÑ"Ô"Ð"Ø�Š˜˜ˆÑ'Ô'Ð'Ø×Ò˜˜FÑ#Ô#Ð#Ð#Ð#r6   c                ó^  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z7UnsolicitedResponseTests.testNewMessages.<locals>.login©  r~  r6   c                 ó>   •— ‰ j                              dd ¦  «         d S ©Nrö   ©r  rø  rR   s   €r4   rø  z:UnsolicitedResponseTests.testNewMessages.<locals>.loggedIn¬  s!   ø€ ØŒK×#Ò# B¨Ñ-Ô-Ð-Ð-Ð-r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestNewMessagesr=  s   `    r4   ÚtestNewMessagesz(UnsolicitedResponseTests.testNewMessages¨  s±   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	.ð 	.ð 	.ð 	.ð 	.ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜X‘”Ñ'Ô'×2Ò2°4´?ÑCÔCÐCÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ4Ñ5Ô5Ð5r6   c                óP   — | j         j        }|                      |g d¢g¦  «         d S )N)rø  rö   Nr@  rA  s      r4   r^  z+UnsolicitedResponseTests._cbTestNewMessages´  ó2   € ØŒKÔˆØ×Ò˜Ð6Ð6Ð6Ð7Ñ8Ô8Ð8Ð8Ð8r6   c                ó^  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z=UnsolicitedResponseTests.testNewRecentMessages.<locals>.login¹  r~  r6   c                 ó>   •— ‰ j                              d d¦  «         d S r\  r]  rR   s   €r4   rø  z@UnsolicitedResponseTests.testNewRecentMessages.<locals>.loggedIn¼  s!   ø€ ØŒK×#Ò# D¨"Ñ-Ô-Ð-Ð-Ð-r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestNewRecentMessagesr=  s   `    r4   ÚtestNewRecentMessagesz.UnsolicitedResponseTests.testNewRecentMessages¸  s±   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	.ð 	.ð 	.ð 	.ð 	.ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜X‘”Ñ'Ô'×2Ò2°4´?ÑCÔCÐCÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ:Ñ;Ô;Ð;r6   c                óP   — | j         j        }|                      |g d¢g¦  «         d S )N©rø  Nrö   r@  rA  s      r4   re  z1UnsolicitedResponseTests._cbTestNewRecentMessagesÄ  ra  r6   c                ó^  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «                             ‰ j        ¦  «         t          j        ‰                      ¦   «         |g¦  «        }|                     ‰ j        ¦  «        S )Nc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z@UnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loginÉ  r~  r6   c                 ó>   •— ‰ j                              dd¦  «         d S )NrA  rö   r]  rR   s   €r4   rø  zCUnsolicitedResponseTests.testNewMessagesAndRecent.<locals>.loggedInÌ  s!   ø€ ØŒK×#Ò# B¨Ñ+Ô+Ð+Ð+Ð+r6   )	r  r›   r7   r+  r  r   r,  r#   Ú_cbTestNewMessagesAndRecentr=  s   `    r4   ÚtestNewMessagesAndRecentz1UnsolicitedResponseTests.testNewMessagesAndRecentÈ  s±   ø€ ð	Dð 	Dð 	Dð 	Dð 	Dð	,ð 	,ð 	,ð 	,ð 	,ð Œ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜X‘”Ñ'Ô'×2Ò2°4´?ÑCÔCÐCÝÔ §¢¡¤°"Ð 5Ñ6Ô6ˆØ�}Š}˜TÔ=Ñ>Ô>Ð>r6   c                óV   — | j         j        }|                      |g d¢g d¢g¦  «         d S )N)rø  rA  Nrh  r@  rA  s      r4   rl  z4UnsolicitedResponseTests._cbTestNewMessagesAndRecentÔ  s;   € ØŒKÔˆØ×Ò˜Ð6Ð6Ð6Ð8QÐ8QÐ8QÐRÑSÔSÐSÐSÐSr6   N)rs   rt   ru   r>  r<  rH  rG  rP  rO  r_  r^  rf  re  rm  rl  r1   r6   r4   r6  r6  r  sÍ   € € € € € ð
4ð 
4ð 
4ð2ð 2ð 2ð
3ð 
3ð 
3ð2ð 2ð 2ð<ð <ð <ð$ð $ð $ð
6ð 
6ð 
6ð9ð 9ð 9ð
<ð 
<ð 
<ð9ð 9ð 9ð
?ð 
?ð 
?ðTð Tð Tð Tð Tr6   r6  c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚClientCapabilityTestszT
    Tests for issuance of the CAPABILITY command and handling of its response.
    c                óÎ   — t          ¦   «         | _        t          j        ¦   «         | _        | j                             | j        ¦  «         | j                             d¦  «         dS )zS
        Create an L{imap4.IMAP4Client} connected to a L{StringTransport}.
        s   * OK [IMAP4rev1]
N)r   rð  r   rå  ÚprotocolrÃ  r­  rR   s    r4   r  zClientCapabilityTests.setUpÞ  sV   € õ )Ñ*Ô*ˆŒÝÔ)Ñ+Ô+ˆŒØŒ×$Ò$ T¤^Ñ4Ô4Ð4ØŒ×"Ò"Ð#:Ñ;Ô;Ð;Ð;Ð;r6   c                óÚ   ‡ — ‰ j                              d¬¦  «        }‰ j                              d¦  «         ‰ j                              d¦  «         ˆ fd„}|                     |¦  «         |S )z—
        A capability response consisting only of atoms without C{'='} in them
        should result in a dict mapping those atoms to L{None}.
        F©ÚuseCaches&   * CAPABILITY IMAP4rev1 LOGINDISABLED
ó   0001 OK Capability completed.
c                ó:   •— ‰                      | d d dœ¦  «         d S )N)r%  s   LOGINDISABLEDr)  ©ÚcapabilitiesrE   s    €r4   ÚgotCapabilitiesz?ClientCapabilityTests.test_simpleAtoms.<locals>.gotCapabilitiesð  s(   ø€ Ø×Ò˜\¸$ÐRVÐ+WÐ+WÑXÔXÐXÐXÐXr6   ©rr  r!  r­  r›   ©rE   ÚcapabilitiesResultrz  s   `  r4   Útest_simpleAtomsz&ClientCapabilityTests.test_simpleAtomsç  s†   ø€ ð
 "œ]×:Ò:ÀEÐ:ÑJÔJÐØŒ×"Ò"Ð#NÑOÔOÐOØŒ×"Ò"Ð#GÑHÔHÐHð	Yð 	Yð 	Yð 	Yð 	Yð 	×&Ò& Ñ7Ô7Ð7Ø!Ð!r6   c                óÚ   ‡ — ‰ j                              d¬¦  «        }‰ j                              d¦  «         ‰ j                              d¦  «         ˆ fd„}|                     |¦  «         |S )aã  
        A capability response consisting of atoms including C{'='} should have
        those atoms split on that byte and have capabilities in the same
        category aggregated into lists in the resulting dictionary.

        (n.b. - I made up the word "category atom"; the protocol has no notion
        of structure here, but rather allows each capability to define the
        semantics of its entry in the capability response in a freeform manner.
        If I had realized this earlier, the API for capabilities would look
        different.  As it is, we can hope that no one defines any crazy
        semantics which are incompatible with this API, or try to figure out a
        better API when someone does. -exarkun)
        Frt  s.   * CAPABILITY IMAP4rev1 AUTH=LOGIN AUTH=PLAIN
rv  c                ó>   •— ‰                      | d ddgdœ¦  «         d S )Nrý  r“  )r%  r3  r)  rx  s    €r4   rz  zAClientCapabilityTests.test_categoryAtoms.<locals>.gotCapabilities  s7   ø€ Ø×ÒØ¨T¸XÀxÐ<PÐQÐQñô ð ð ð r6   r{  r|  s   `  r4   Útest_categoryAtomsz(ClientCapabilityTests.test_categoryAtomsö  s�   ø€ ð "œ]×:Ò:ÀEÐ:ÑJÔJÐØŒ×"Ò"Ð#VÑWÔWÐWØŒ×"Ò"Ð#GÑHÔHÐHð	ð 	ð 	ð 	ð 	ð
 	×&Ò& Ñ7Ô7Ð7Ø!Ð!r6   c                óÚ   ‡ — ‰ j                              d¬¦  «        }‰ j                              d¦  «         ‰ j                              d¦  «         ˆ fd„}|                     |¦  «         |S )zÈ
        A capability response consisting of both simple and category atoms of
        the same type should result in a list containing L{None} as well as the
        values for the category.
        Frt  s0   * CAPABILITY IMAP4rev1 FOO FOO=BAR BAR=FOO BAR
rv  c                óD   •— ‰                      | d d dgdd gdœ¦  «         d S )Nó   BARó   FOO)r%  r…  r„  r)  rx  s    €r4   rz  z>ClientCapabilityTests.test_mixedAtoms.<locals>.gotCapabilities  s=   ø€ Ø×ÒØØ#¨d°F¨^ÀfÈdÀ^ÐTÐTñô ð ð ð r6   r{  r|  s   `  r4   Útest_mixedAtomsz%ClientCapabilityTests.test_mixedAtoms  s‹   ø€ ð "œ]×:Ò:ÀEÐ:ÑJÔJÐð 	Œ×"Ò"ØAñ	
ô 	
ð 	
ð 	Œ×"Ò"Ð#GÑHÔHÐHð	ð 	ð 	ð 	ð 	ð 	×&Ò& Ñ7Ô7Ð7Ø!Ð!r6   N)rs   rt   ru   r2  r  r~  r�  r†  r1   r6   r4   rp  rp  Ù  sZ   € € € € € ðð ð<ð <ð <ð"ð "ð "ð"ð "ð "ð4"ð "ð "ð "ð "r6   rp  c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚStillSimplerClientzH
    An IMAP4 client which keeps track of unsolicited flag changes.
    c                óR   — t           j                             | ¦  «         i | _        d S r0   )r   rå  rz   rœ  rR   s    r4   rz   zStillSimplerClient.__init__-  s$   € ÝÔ×"Ò" 4Ñ(Ô(Ð(ØˆŒ
ˆ
ˆ
r6   c                ó:   — | j                              |¦  «         d S r0   )rœ  r  rõ  s     r4   rô  zStillSimplerClient.flagsChanged1  s   € ØŒ
×Ò˜(Ñ#Ô#Ð#Ð#Ð#r6   N)rs   rt   ru   r2  rz   rô  r1   r6   r4   rˆ  rˆ  (  s<   € € € € € ðð ðð ð ð$ð $ð $ð $ð $r6   rˆ  c                  óD   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚHandCraftedTestsc                óJ  ‡ ‡‡‡‡— t          ¦   «         Št          j        ¦   «         Š‰                     ‰¦  «         ‰                     d¦  «         ˆ ˆfd„Šˆˆfd„Šˆˆfd„}‰                     dd¦  «        }‰                     d¦  «         |                     |¦  «         |S )Nó   * OK [IMAP4rev1]c                óˆ   •— ‰                      ‰                     ¦   «                              ¦   «         d         d¦  «         d S )Nr  s   0003 FETCH 1 (RFC822)©rB   r  rf  )rX  rE   rð  s    €€r4   ÚcbCheckTransportz>HandCraftedTests.testTrailingLiteral.<locals>.cbCheckTransport<  sF   ø€ Ø×ÒØ—’Ñ!Ô!×,Ò,Ñ.Ô.¨rÔ2Ø(ñô ð ð ð r6   c                ó°   •— ‰                      d¦  «        }‰                     d¦  «         ‰                     d¦  «         |                     ‰¦  «         |S )Nrð   s6   * 1 FETCH (RFC822 {10}
0123456789
 RFC822.SIZE 10)
s   0003 OK FETCH
)ÚfetchMessager­  r›   )rX  rž   r”   r‘  s     €€r4   ÚcbSelectz6HandCraftedTests.testTrailingLiteral.<locals>.cbSelectB  sZ   ø€ Ø—’˜sÑ#Ô#ˆAØ�NŠNØOñô ð ð �NŠNÐ/Ñ0Ô0Ð0Ø�MŠMÐ*Ñ+Ô+Ð+ØˆHr6   c                ó†   •— ‰                      d¦  «        }‰                     d¦  «         |                     ‰¦  «         |S ©Nrà  ó   0002 OK SELECT)rÇ  rÞ  r›   )rX  rž   r”   r”  s     €€r4   ÚcbLoginz5HandCraftedTests.testTrailingLiteral.<locals>.cbLoginK  s>   ø€ Ø—’˜Ñ!Ô!ˆAØ�NŠNÐ,Ñ-Ô-Ð-Ø�MŠM˜(Ñ#Ô#Ð#ØˆHr6   ó   blahó   0001 OK LOGIN
)r   r   rå  rÃ  rÞ  rL  r­  r›   )rE   r˜  rž   r”   r‘  r”  rð  s   `  @@@@r4   ÚtestTrailingLiteralz$HandCraftedTests.testTrailingLiteral6  sà   øøøøø€ Ý#Ñ%Ô%ˆ	ÝÔÑÔˆØ	×Ò˜Ñ#Ô#Ð#Ø	�ŠÐ*Ñ+Ô+Ð+ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð �GŠG�G˜WÑ%Ô%ˆØ	�ŠÐ+Ñ,Ô,Ð,Ø	�Š�gÑÔÐØˆr6   c                ó´  — | j         j                             dd¦  «         t          ¦   «         }| j                              |¦  «         |                     ¦   «          | j                              d¦  «         |                      |                     ¦   «         d¦  «         |                     ¦   «          | j                              d¦  «         |                      |                     ¦   «         d¦  «         |                     ¦   «          | j                              d¦  «         |  	                    |                     ¦   «         ¦  «         | j                              d¦  «         |                      |                     ¦   «         d	¦  «         |                      | j         j
        d
¦  «         | j                              t          j        d¦  «        ¦  «         dS )z]
        String literals whose data is not immediately available are
        parsed.
        rÎ  rÒ  s   01 LOGIN {8}
s   + Ready for 8 octets of text
s   testuser {13}
s   + Ready for 13 octets of text
s   passwords   -test
ó   01 OK LOGIN succeeded
rS  r«  N)r  rÖ  rÕ  r   rÃ  rÄ  r­  rB   r  Ú	assertNotrV  rÇ  r   rÈ  ©rE   rð  s     r4   Útest_fragmentedStringLiteralsz.HandCraftedTests.test_fragmentedStringLiteralsV  s�  € ð
 	ŒÔ×#Ò# KÐ1AÑBÔBÐBÝ#Ñ%Ô%ˆ	ØŒ×"Ò" 9Ñ-Ô-Ð-à�ŠÑÔÐØŒ× Ò Ð!4Ñ5Ô5Ð5Ø×Ò˜ŸšÑ*Ô*Ð,OÑPÔPÐPà�ŠÑÔÐØŒ× Ò Ð!5Ñ6Ô6Ð6Ø×Ò˜ŸšÑ*Ô*Ð,PÑQÔQÐQà�ŠÑÔÐØŒ× Ò  Ñ-Ô-Ð-Ø�Š�y—’Ñ(Ô(Ñ)Ô)Ð)ØŒ× Ò  Ñ.Ô.Ð.Ø×Ò˜ŸšÑ*Ô*Ð,HÑIÔIÐIØ×Ò˜œÔ*¨FÑ3Ô3Ð3àŒ×"Ò"¥5Ô#7Ð8JÑ#KÔ#KÑLÔLÐLÐLÐLr6   c                ól  — ddi| j         j        _        t          ¦   «         }| j                              |¦  «         |                     ¦   «          | j                              d¦  «         |                      |                     ¦   «         d¦  «         |                     ¦   «          | j                              d¦  «         |                      |                     ¦   «         d¦  «         |                      | j         j	        d¦  «         | j          
                    t          j        d¦  «        ¦  «         dS )	z3
        Empty string literals are parsed.
        r6   s   01 LOGIN {0}
s   + Ready for 0 octets of text
s   {0}
r�  rS  r«  N)r  rÖ  r‰  r   rÃ  rÄ  r­  rB   r  rV  rÇ  r   rÈ  rŸ  s     r4   Útest_emptyStringLiteralz(HandCraftedTests.test_emptyStringLiteralp  s  € ð &)¨# JˆŒÔÔ!Ý#Ñ%Ô%ˆ	ØŒ×"Ò" 9Ñ-Ô-Ð-à�ŠÑÔÐØŒ× Ò Ð!4Ñ5Ô5Ð5Ø×Ò˜ŸšÑ*Ô*Ð,OÑPÔPÐPà�ŠÑÔÐØŒ× Ò  Ñ,Ô,Ð,Ø×Ò˜ŸšÑ*Ô*Ð,HÑIÔIÐIØ×Ò˜œÔ*¨FÑ3Ô3Ð3àŒ×"Ò"¥5Ô#7Ð8JÑ#KÔ#KÑLÔLÐLÐLÐLr6   c                óz  ‡ ‡‡— t          ¦   «         Št          ¦   «         Š‰                     ‰¦  «         ‰                     d¦  «         ˆfd„}ˆfd„}ˆfd„}ˆˆ ˆfd„} |¦   «                              t          |¦  «        ¦  «                             t          |¦  «        ¦  «                             |¦  «        S )a^  
        If unsolicited data is received along with solicited data in the
        response to a I{FETCH} command issued by L{IMAP4Client.fetchSpecific},
        the unsolicited data is passed to the appropriate callback and not
        included in the result with which the L{Deferred} returned by
        L{IMAP4Client.fetchSpecific} fires.
        rŽ  c                 ó^   •— ‰                      dd¦  «        } ‰                     d¦  «         | S ©Nr™  rš  ©rL  r­  ©rž   r”   s    €r4   rL  zRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.login�  ó.   ø€ Ø—’˜ Ñ)Ô)ˆAØ�NŠNÐ/Ñ0Ô0Ð0ØˆHr6   c                 ó\   •— ‰                      d¦  «        } ‰                     d¦  «         | S r–  ©rÇ  rÞ  r§  s    €r4   rÇ  zSHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.select•  ó,   ø€ Ø—’˜Ñ!Ô!ˆAØ�NŠNÐ,Ñ-Ô-Ð-ØˆHr6   c                 óÞ  •— ‰                      dddg¬¦  «        } ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d	¦  «         ‰                     d
¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         | S )Nrá   úHEADER.FIELDSÚSUBJECT©Ú
headerTypeÚ
headerArgss1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {38}
s$   Subject: Suprise for your woman...
rŠ  ó   )
s   * 1 FETCH (FLAGS (\Seen))
s1   * 2 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {75}
sI   Subject: What you been doing. Order your meds here . ,. handcuff madsen
ó   0003 OK FETCH completed
©ÚfetchSpecificr­  r§  s    €r4   r   zRHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.fetchš  sí   ø€ Ø—’Ø /¸y¸kð  ñ ô ˆAð �NŠNÐQÑRÔRÐRØ�NŠNÐDÑEÔEÐEØ�NŠN˜7Ñ#Ô#Ð#Ø�NŠN˜8Ñ$Ô$Ð$Ø�NŠNÐ<Ñ=Ô=Ð=Ø�NŠNÐQÑRÔRÐRØ�NŠNØ^ñô ð ð �NŠN˜7Ñ#Ô#Ð#Ø�NŠN˜8Ñ$Ô$Ð$Ø�NŠNÐ9Ñ:Ô:Ð:ØˆHr6   c                ó  •— ‰                      ‰                     ¦   «                              ¦   «         d         d¦  «         ‰                      | dddggdggdddggdggdœ¦  «         ‰                      ‰j        d	d
gi¦  «         d S )Nr  ó,   0003 FETCH 1:* BODY[HEADER.FIELDS (SUBJECT)]rÃ  r­  r®  z&Subject: Suprise for your woman...

zKSubject: What you been doing. Order your meds here . ,. handcuff madsen

©rÅ   rÉ   rÅ   ú\Seen©rB   r  rf  rœ  ©Úresr”   rE   rð  s    €€€r4   rá  zQHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponse.<locals>.test¬  sÁ   ø€ Ø×ÒØ—’Ñ!Ô!×,Ò,Ñ.Ô.¨rÔ2Ø?ñô ð ð
 ×ÒØð #Ø,¨y¨kÐ:ØHððð #Ø,¨y¨kÐ:Ømðððð ñô ð ð( ×Ò˜QœW q¨8¨* oÑ6Ô6Ð6Ð6Ð6r6   ©r   rˆ  rÃ  rÞ  r›   r7   ©rE   rL  rÇ  r   rá  r”   rð  s   `    @@r4   Ú2test_unsolicitedResponseMixedWithSolicitedResponsezCHandCraftedTests.test_unsolicitedResponseMixedWithSolicitedResponseƒ  sõ   øøø€ õ $Ñ%Ô%ˆ	ÝÑ Ô ˆØ	×Ò˜Ñ#Ô#Ð#Ø	�ŠÐ*Ñ+Ô+Ð+ð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð$	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð: ˆE‰GŒGßŠ[�˜v™œÑ'Ô'ßŠ[�˜u™œÑ&Ô&ßŠ[˜ÑÔð		
r6   c                ó’  ‡ ‡‡— t          ¦   «         Št          j        ¦   «         Š‰                     ‰¦  «         ‰                     d¦  «         ˆfd„}ˆfd„}ˆfd„}ˆ ˆfd„} |¦   «         }|                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         |                     |¦  «         |S )zf
        Literals should be recognized even when they are not preceded by
        whitespace.
        rŽ  c                 ó^   •— ‰                      dd¦  «        } ‰                     d¦  «         | S r¥  r¦  ©rž   rr  s    €r4   rL  zFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.loginÚ  ó0   ø€ Ø—’˜w¨Ñ0Ô0ˆAØ×!Ò!Ð"6Ñ7Ô7Ð7ØˆHr6   c                 ó\   •— ‰                      d¦  «        } ‰                     d¦  «         | S )Nó   inboxr—  rª  rÂ  s    €r4   rÇ  zGHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.selectß  s.   ø€ Ø—’ Ñ)Ô)ˆAØ×!Ò!Ð"3Ñ4Ô4Ð4ØˆHr6   c                 óŽ   •— ‰                      dddg¬¦  «        } ‰                     d¦  «         ‰                     d¦  «         | S )Nrá   r­  r®  r¯  s8   * 1 FETCH (BODY[HEADER.FIELDS ({7}
SUBJECT)] "Hello")
r³  r´  rÂ  s    €r4   r   zFHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.fetchä  s_   ø€ Ø×&Ò&Ø /¸y¸kð 'ñ ô ˆAð ×!Ò!ØOñô ð ð ×!Ò!Ð"@ÑAÔAÐAØˆHr6   c                óÆ   •— ‰                      ‰                     ¦   «                              ¦   «         d         d¦  «         ‰                      | ddddggdggi¦  «         d S )Nr  r·  rÅ   rÃ  r­  r®  ÚHellor�  )r2   rE   rð  s    €€r4   rá  zEHandCraftedTests.test_literalWithoutPrecedingWhitespace.<locals>.testî  s{   ø€ Ø×ÒØ—’Ñ!Ô!×,Ò,Ñ.Ô.¨rÔ2Ø?ñô ð ð ×ÒØ˜˜f ¸¸Ð&DÀgÐNÐOÐPñô ð ð ð r6   ©r   r   rå  rÃ  rÞ  r›   r7   )rE   rL  rÇ  r   rá  rž   rr  rð  s   `     @@r4   Ú&test_literalWithoutPrecedingWhitespacez7HandCraftedTests.test_literalWithoutPrecedingWhitespaceÏ  s  øøø€ õ
 $Ñ%Ô%ˆ	ÝÔ$Ñ&Ô&ˆà×Ò 	Ñ*Ô*Ð*Ø×ÒÐ1Ñ2Ô2Ð2ð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð ˆE‰GŒGˆØ	�Š•e˜F‘m”mÑ$Ô$Ð$Ø	�Š•e˜E‘l”lÑ#Ô#Ð#Ø	�Š�dÑÔÐØˆr6   c                ó`  ‡ ‡‡— t          ¦   «         Št          j        ¦   «         Š‰                     ‰¦  «         ‰                     d¦  «         ˆfd„}ˆfd„}ˆˆ ˆfd„} |¦   «         }|                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         |S )zà
        If the server sends a literal length which cannot be parsed as an
        integer, L{IMAP4Client.lineReceived} should cause the protocol to be
        disconnected by raising L{imap4.IllegalServerResponse}.
        rŽ  c                 ó^   •— ‰                      dd¦  «        } ‰                     d¦  «         | S r¥  r¦  rÂ  s    €r4   rL  z<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.login	  rÃ  r6   c                 ó\   •— ‰                      d¦  «        } ‰                     d¦  «         | S r–  rª  rÂ  s    €r4   rÇ  z=HandCraftedTests.test_nonIntegerLiteralLength.<locals>.select  s.   ø€ Ø—’ Ñ(Ô(ˆAØ×!Ò!Ð"3Ñ4Ô4Ð4ØˆHr6   c                 ó  •— ‰                       dddg¬¦  «         ‰                     ‰                     ¦   «                              ¦   «         d         d¦  «         ‰                     t
          j        ‰ j        d¦  «         d S )Nrá   r­  r®  r¯  r  r·  s   * 1 FETCH {xyz}
...)rµ  rB   r  rf  r×   r   ÚIllegalServerResponser­  )rr  rE   rð  s   €€€r4   r   z<HandCraftedTests.test_nonIntegerLiteralLength.<locals>.fetch  s—   ø€ Ø×"Ò"Ø /¸y¸kð #ñ ô ð ð ×ÒØ—’Ñ!Ô!×,Ò,Ñ.Ô.¨rÔ2Ø?ñô ð ð
 ×ÒÝÔ+ØÔ%Ø)ñô ð ð ð r6   rÉ  )rE   rL  rÇ  r   rž   rr  rð  s   `    @@r4   Útest_nonIntegerLiteralLengthz-HandCraftedTests.test_nonIntegerLiteralLengthý  sà   øøø€ õ $Ñ%Ô%ˆ	ÝÔ$Ñ&Ô&ˆà×Ò 	Ñ*Ô*Ð*Ø×ÒÐ1Ñ2Ô2Ð2ð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð 	ð 	ð  ˆE‰GŒGˆØ	�Š•e˜F‘m”mÑ$Ô$Ð$Ø	�Š•e˜E‘l”lÑ#Ô#Ð#Øˆr6   c                óv  ‡ ‡— t          ¦   «         }t          ¦   «         Š‰                     |¦  «         ‰                     d¦  «         ˆfd„}ˆfd„}ˆfd„}ˆˆ fd„} |¦   «                              t          |¦  «        ¦  «                             t          |¦  «        ¦  «                             |¦  «        S )a  
        Any unrequested flag information received along with other requested
        information in an untagged I{FETCH} received in response to a request
        issued with L{IMAP4Client.fetchSpecific} is passed to the
        C{flagsChanged} callback.
        rŽ  c                 ó^   •— ‰                      dd¦  «        } ‰                     d¦  «         | S r¥  r¦  r§  s    €r4   rL  zLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.login4  r¨  r6   c                 ó\   •— ‰                      d¦  «        } ‰                     d¦  «         | S r–  rª  r§  s    €r4   rÇ  zMHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.select9  r«  r6   c                 ó`  •— ‰                      dddg¬¦  «        } ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d	¦  «         ‰                     d
¦  «         ‰                     d¦  «         | S )Nrß   r­  r®  r¯  s1   * 1 FETCH (BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject one
s    FLAGS (\Recent))
s?   * 2 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS ("SUBJECT")] {22}
s   Subject: subject two
r²  r³  r´  r§  s    €r4   r   zLHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.fetch>  s·   ø€ Ø—’Ø ?À	¸{ð  ñ ô ˆAð �NŠNÐQÑRÔRÐRØ�NŠNÐ6Ñ7Ô7Ð7Ø�NŠNÐ4Ñ5Ô5Ð5à�NŠNØUñô ð ð �NŠNÐ6Ñ7Ô7Ð7Ø�NŠN˜8Ñ$Ô$Ð$Ø�NŠNÐ9Ñ:Ô:Ð:ØˆHr6   c                ó–   •— ‰                      | dddggdggdddggdggdœ¦  «         ‰                      ‰j        dgdgdœ¦  «         d S )	NrÃ  r­  r®  zSubject: subject one
zSubject: subject two
r¸  rL  r¹  )rB   rœ  )r¼  r”   rE   s    €€r4   rá  zKHandCraftedTests.test_flagsChangedInsideFetchSpecificResponse.<locals>.testO  sŒ   ø€ Ø×ÒØð #Ø,¨y¨kÐ:Ø6ððð #Ø,¨y¨kÐ:Ø6ðððð ñô ð ð( ×Ò˜QœW¨:¨,¸H¸:Ð&FÐ&FÑGÔGÐGÐGÐGr6   r½  )rE   rð  rL  rÇ  r   rá  r”   s   `     @r4   Ú,test_flagsChangedInsideFetchSpecificResponsez=HandCraftedTests.test_flagsChangedInsideFetchSpecificResponse(  sõ   øø€ õ $Ñ%Ô%ˆ	ÝÑ Ô ˆØ	×Ò˜Ñ#Ô#Ð#Ø	�ŠÐ*Ñ+Ô+Ð+ð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð"	Hð 	Hð 	Hð 	Hð 	Hð 	Hð0 ˆE‰GŒGßŠ[�˜v™œÑ'Ô'ßŠ[�˜u™œÑ&Ô&ßŠ[˜ÑÔð		
r6   c                óz  ‡ ‡‡— t          ¦   «         Št          ¦   «         Š‰                     ‰¦  «         ‰                     d¦  «         ˆfd„}ˆfd„}ˆfd„}ˆˆ ˆfd„} |¦   «                              t          |¦  «        ¦  «                             t          |¦  «        ¦  «                             |¦  «        S )a  
        Any unrequested flag information received along with other requested
        information in an untagged I{FETCH} received in response to a request
        issued with L{IMAP4Client.fetchMessage} is passed to the
        C{flagsChanged} callback.
        rŽ  c                 ó^   •— ‰                      dd¦  «        } ‰                     d¦  «         | S r¥  r¦  r§  s    €r4   rL  zKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.loginy  r¨  r6   c                 ó\   •— ‰                      d¦  «        } ‰                     d¦  «         | S r–  rª  r§  s    €r4   rÇ  zLHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.select~  r«  r6   c                 óX  •— ‰                      d¦  «        } ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         ‰                     d¦  «         | S )	Nrá   s   * 1 FETCH (RFC822 {24}
s   Subject: first subject
s    FLAGS (\Seen))
s.   * 2 FETCH (FLAGS (\Recent \Seen) RFC822 {25}
s   Subject: second subject
r²  r³  )r“  r­  r§  s    €r4   r   zKHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.fetchƒ  s�   ø€ Ø—’˜uÑ%Ô%ˆAØ�NŠNÐ8Ñ9Ô9Ð9Ø�NŠNÐ8Ñ9Ô9Ð9Ø�NŠNÐ2Ñ3Ô3Ð3Ø�NŠNÐPÑQÔQÐQØ�NŠNÐ9Ñ:Ô:Ð:Ø�NŠN˜8Ñ$Ô$Ð$Ø�NŠNÐ9Ñ:Ô:Ð:ØˆHr6   c                ó  •— ‰                      ‰                     ¦   «                              ¦   «         d         d¦  «         ‰                      | ddiddidœ¦  «         ‰                      ‰j        dgddgdœ¦  «         d S )	Nr  s   0003 FETCH 1:* (RFC822)r¦  zSubject: first subject
zSubject: second subject
r¸  r¹  rL  rº  r»  s    €€€r4   rá  zJHandCraftedTests.test_flagsChangedInsideFetchMessageResponse.<locals>.testŽ  s¤   ø€ Ø×ÒØ—’Ñ!Ô!×,Ò,Ñ.Ô.¨rÔ2Ø*ñô ð ð
 ×ÒØà Ð">Ð?Ø Ð"?Ð@ðð ñô ð ð ×Ò˜QœW¨8¨*¸*ÀhÐ9OÐ&PÐ&PÑQÔQÐQÐQÐQr6   r½  r¾  s   `    @@r4   Ú+test_flagsChangedInsideFetchMessageResponsez<HandCraftedTests.test_flagsChangedInsideFetchMessageResponsem  sü   øøø€ õ $Ñ%Ô%ˆ	ÝÑ Ô ˆØ	×Ò˜Ñ#Ô#Ð#Ø	�ŠÐ*Ñ+Ô+Ð+ð	ð 	ð 	ð 	ð 	ð
	ð 	ð 	ð 	ð 	ð
		ð 		ð 		ð 		ð 		ð	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð" ˆE‰GŒGßŠ[�˜v™œÑ'Ô'ßŠ[�˜u™œÑ&Ô&ßŠ[˜ÑÔð		
r6   c                ól  — t          ¦   «         }t          j        ¦   «         }||_        |                     |¦  «         |                     d¦  «         t          j        d¦  «        }|                     |¦  «         |                     d¦  «        }|  	                    |t          j        ¦  «         |                     d¦  «         |                      t          j        ¦  «        }|                      t!          |¦  «        d¦  «         |                      |d         j        j        d         d¦  «         |S )z¦
        When decoding a base64 encoded authentication message from the server,
        decoding errors are logged and then the client closes the connection.
        sP   * OK [CAPABILITY IMAP4rev1 IDLE NAMESPACE AUTH=CRAM-MD5] Twisted IMAP4rev1 ReadyrÎ  rÐ  s   + Something bad! and bad
rÅ   r   s   Something bad! and bad)r   r   rå  rr  rÃ  rÞ  rõ  r¼  r¸  ÚassertFailurer   rÈ  r­  r�  rÏ  rB   rÐ   r  rÚ  )rE   rð  rr  r½  rž   Úloggeds         r4   Ú-test_authenticationChallengeDecodingExceptionz>HandCraftedTests.test_authenticationChallengeDecodingException¥  s  € õ
 5Ñ6Ô6ˆ	ÝÔ$Ñ&Ô&ˆØ%ˆ	Ôà×Ò 	Ñ*Ô*Ð*Ø×Òð'ñ	
ô 	
ð 	
õ Ô0°Ñ=Ô=ˆØ×&Ò& uÑ-Ô-Ð-à×!Ò! (Ñ+Ô+ˆð 	×Ò˜1�eÔ2Ñ3Ô3Ð3à×ÒÐ=Ñ>Ô>Ð>ð ×'Ò'­Ô(CÑDÔDˆØ×Ò�˜V™œ aÑ(Ô(Ð(Ø×Ò˜ œœÔ-¨aÔ0Ð2KÑLÔLÐLØˆr6   N)rs   rt   ru   r›  r   r¢  r¿  rÊ  rÐ  rÖ  rÜ  rà  r1   r6   r4   rŒ  rŒ  5  s­   € € € € € ðð ð ð@Mð Mð Mð4Mð Mð Mð&J
ð J
ð J
ðX,ð ,ð ,ð\)ð )ð )ðVC
ð C
ð C
ðJ6
ð 6
ð 6
ðpð ð ð ð r6   rŒ  c                  ó2   — e Zd ZU dZej        Zded<   d„ ZdS )ÚPreauthIMAP4ClientMixinav  
    Mixin for L{SynchronousTestCase} subclasses which
    provides a C{setUp} method which creates an L{IMAP4Client}
    connected to a L{StringTransport} and puts it into the
    I{authenticated} state.

    @ivar transport: A L{StringTransport} to which C{client} is
        connected.

    @ivar client: An L{IMAP4Client} which is connected to
        C{transport}.
    zType[imap4.IMAP4Client]ÚclientProtocolc                óÐ   — t          ¦   «         | _        |                      ¦   «         | _        | j                             | j        ¦  «         | j                             d¦  «         dS )zm
        Create an IMAP4Client connected to a fake transport and in the
        authenticated state.
        s   * PREAUTH Hello unittest
N)r   rð  rã  r  rÃ  r­  rR   s    r4   r  zPreauthIMAP4ClientMixin.setUpÔ  sY   € õ
 )Ñ*Ô*ˆŒØ×)Ò)Ñ+Ô+ˆŒØŒ×"Ò" 4¤>Ñ2Ô2Ð2ØŒ× Ò Ð!@ÑAÔAÐAÐAÐAr6   N)	rs   rt   ru   r2  r   rå  rã  r¨  r  r1   r6   r4   râ  râ  Ä  sJ   € € € € € € ðð ð /4Ô.?€NÐ?Ð?Ð?Ñ?ðBð Bð Bð Bð Br6   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d„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚSelectionTestsMixinzl
    Mixin for test cases which defines tests which apply to both I{EXAMINE} and
    I{SELECT} support.
    c                ó¼   —  t          | j        | j        ¦  «        d¦  «        }|                      | j                             ¦   «         d| j        z   dz   ¦  «         |S )zø
        Issue either an I{EXAMINE} or I{SELECT} command (depending on
        C{self.method}), assert that the correct bytes are written to the
        transport, and return the L{Deferred} returned by whichever method was
        called.
        Úfooboxs   0001 s	    foobox
)r±  r  ÚmethodrB   rð  r  rÑ  ©rE   rž   s     r4   Ú_examineOrSelectz$SelectionTestsMixin._examineOrSelectå  s_   € ð .�G�D”K ¤Ñ-Ô-¨hÑ7Ô7ˆØ×ÒØŒN× Ò Ñ"Ô" H¨t¬|Ñ$;¸nÑ$Lñ	
ô 	
ð 	
ð ˆr6   c                ó”   — |D ]}| j                              |dz   ¦  «         Œ | j                              d| j        z   dz   ¦  «         dS )zÉ
        Deliver the given (unterminated) response lines to C{self.client} and
        then deliver a tagged SELECT or EXAMINE completion line to finish the
        SELECT or EXAMINE response.
        rŠ  s   0001 OK [READ-ONLY] s    completed
N)r  r­  rÑ  )rE   Úlinesrà  s      r4   Ú	_responsezSelectionTestsMixin._responseò  sd   € ð ð 	5ð 	5ˆDØŒK×$Ò$ T¨G¡^Ñ4Ô4Ð4Ð4ØŒ× Ò Ø# d¤lÑ2Ð5FÑFñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{EXISTS} response, the L{Deferred} return by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'EXISTS'} key.
        s
   * 3 EXISTSFrÇ   )r¿  r¾  N©rë  rî  rB   ÚsuccessResultOfrê  s     r4   Útest_existszSelectionTestsMixin.test_existsþ  óZ   € ð ×!Ò!Ñ#Ô#ˆØ�Š�}Ñ%Ô%Ð%Ø×Ò˜×-Ò-¨aÑ0Ô0ÀÐRSÐ2TÐ2TÑUÔUÐUÐUÐUr6   c                ó˜   — |                       ¦   «         }|                      d¦  «         |                      |t          j        ¦  «         dS )a  
        If the server returns a non-integer EXISTS value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s   * foo EXISTSN©rë  rî  ÚfailureResultOfr   rÏ  rê  s     r4   Útest_nonIntegerExistsz)SelectionTestsMixin.test_nonIntegerExists	  óF   € ð ×!Ò!Ñ#Ô#ˆØ�Š�Ñ'Ô'Ð'Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{RECENT} response, the L{Deferred} return by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'RECENT'} key.
        s
   * 5 RECENTFrÊ   )r¿  rS  Nrð  rê  s     r4   Útest_recentzSelectionTestsMixin.test_recent  ró  r6   c                ó˜   — |                       ¦   «         }|                      d¦  «         |                      |t          j        ¦  «         dS )a  
        If the server returns a non-integer RECENT value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s   * foo RECENTNrõ  rê  s     r4   Útest_nonIntegerRecentz)SelectionTestsMixin.test_nonIntegerRecent  rø  r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )a  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UNSEEN} response, the L{Deferred} returned by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'UNSEEN'} key.
        s)   * OK [UNSEEN 8] Message 8 is first unseenFrÍ   )r¿  rV  Nrð  rê  s     r4   Útest_unseenzSelectionTestsMixin.test_unseen*  s[   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐCÑDÔDÐDØ×Ò˜×-Ò-¨aÑ0Ô0ÀÐRSÐ2TÐ2TÑUÔUÐUÐUÐUr6   c                ó˜   — |                       ¦   «         }|                      d¦  «         |                      |t          j        ¦  «         dS )a  
        If the server returns a non-integer UNSEEN value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s-   * OK [UNSEEN foo] Message foo is first unseenNrõ  rê  s     r4   Útest_nonIntegerUnseenz)SelectionTestsMixin.test_nonIntegerUnseen5  sG   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐGÑHÔHÐHØ×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )a)  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UIDVALIDITY} response, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fires with a C{dict}
        including the value associated with the C{'UIDVALIDITY'} key.
        s#   * OK [UIDVALIDITY 12345] UIDs validFr5  )r¿  rU  Nrð  rê  s     r4   Útest_uidvalidityz$SelectionTestsMixin.test_uidvalidity@  se   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐ=Ñ>Ô>Ð>Ø×ÒØ× Ò  Ñ#Ô#°EÈ%Ð%PÐ%Pñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó˜   — |                       ¦   «         }|                      d¦  «         |                      |t          j        ¦  «         dS )a  
        If the server returns a non-integer UIDVALIDITY value in its response to
        a I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s!   * OK [UIDVALIDITY foo] UIDs validNrõ  rê  s     r4   Útest_nonIntegerUIDVALIDITYz.SelectionTestsMixin.test_nonIntegerUIDVALIDITYM  sG   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐ;Ñ<Ô<Ð<Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )a!  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{UIDNEXT} response, the L{Deferred} returned by L{IMAP4Client.select}
        or L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'UIDNEXT'} key.
        s&   * OK [UIDNEXT 4392] Predicted next UIDFi(  )r¿  rT  Nrð  rê  s     r4   Útest_uidnextz SelectionTestsMixin.test_uidnextX  se   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐ@ÑAÔAÐAØ×ÒØ× Ò  Ñ#Ô#°EÀdÐ%KÐ%Kñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó˜   — |                       ¦   «         }|                      d¦  «         |                      |t          j        ¦  «         dS )a  
        If the server returns a non-integer UIDNEXT value in its response to a
        I{SELECT} or I{EXAMINE} command, the L{Deferred} returned by
        L{IMAP4Client.select} or L{IMAP4Client.examine} fails with
        L{IllegalServerResponse}.
        s%   * OK [UIDNEXT foo] Predicted next UIDNrõ  rê  s     r4   Útest_nonIntegerUIDNEXTz*SelectionTestsMixin.test_nonIntegerUIDNEXTe  sG   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐ?Ñ@Ô@Ð@Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )á  
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{FLAGS} response, the L{Deferred} returned by L{IMAP4Client.select} or
        L{IMAP4Client.examine} fires with a C{dict} including the value
        associated with the C{'FLAGS'} key.
        s2   * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)F)rK  z\Flaggedr’  r¹  z\Draft)r¿  rš  Nrð  rê  s     r4   Ú
test_flagszSelectionTestsMixin.test_flagsp  sk   € ð ×!Ò!Ñ#Ô#ˆØ�ŠÐQÑRÔRÐRØ×ÒØ× Ò  Ñ#Ô#à#ØVðð ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó°   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        dddœ¦  «         dS )r
  sN   * OK [PERMANENTFLAGS (\Starred)] Just one permanent flag in that list up thereF)z\Starred)r¿  ÚPERMANENTFLAGSNrð  rê  s     r4   Útest_permanentflagsz'SelectionTestsMixin.test_permanentflags�  sp   € ð ×!Ò!Ñ#Ô#ˆØ�Šð"ñ	
ô 	
ð 	
ð 	×ÒØ× Ò  Ñ#Ô#Ø °NÐCÐCñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó®   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        ddi¦  «         dS )z¤
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{OK} with unrecognized response code text, parsing does not fail.
        s3   * OK [X-MADE-UP] I just made this response text up.r¿  FNrð  rê  s     r4   Útest_unrecognizedOkz'SelectionTestsMixin.test_unrecognizedOk’  sY   € ð
 ×!Ò!Ñ#Ô#ˆØ�ŠÐMÑNÔNÐNð 	×Ò˜×-Ò-¨aÑ0Ô0°<ÀÐ2GÑHÔHÐHÐHÐHr6   c                ó®   — |                       ¦   «         }|                      d¦  «         |                      |                      |¦  «        ddi¦  «         dS )zš
        If the server response to a I{SELECT} or I{EXAMINE} command includes an
        I{OK} with no response code text, parsing does not fail.
        s   * OKr¿  FNrð  rê  s     r4   Útest_bareOkzSelectionTestsMixin.test_bareOk�  sV   € ð
 ×!Ò!Ñ#Ô#ˆØ�Š�wÑÔÐØ×Ò˜×-Ò-¨aÑ0Ô0°<ÀÐ2GÑHÔHÐHÐHÐHr6   N)rs   rt   ru   r2  rë  rî  rò  r÷  rú  rü  rþ  r   r  r  r  r  r  r  r  r  r1   r6   r4   ræ  ræ  ß  s  € € € € € ðð ð
ð ð ð

ð 

ð 

ð	Vð 	Vð 	Vð	=ð 	=ð 	=ð	Vð 	Vð 	Vð	=ð 	=ð 	=ð	Vð 	Vð 	Vð	=ð 	=ð 	=ð
ð 
ð 
ð	=ð 	=ð 	=ð
ð 
ð 
ð	=ð 	=ð 	=ð
ð 
ð 
ð"
ð 
ð 
ð"	Ið 	Ið 	IðIð Ið Ið Ið Ir6   ræ  c                  ó   — e Zd ZdZdZdZdS )ÚIMAP4ClientExamineTestsaþ  
    Tests for the L{IMAP4Client.examine} method.

    An example of usage of the EXAMINE command from RFC 3501, section 6.3.2::

        S: * 17 EXISTS
        S: * 2 RECENT
        S: * OK [UNSEEN 8] Message 8 is first unseen
        S: * OK [UIDVALIDITY 3857529045] UIDs valid
        S: * OK [UIDNEXT 4392] Predicted next UID
        S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
        S: * OK [PERMANENTFLAGS ()] No permanent flags permitted
        S: A932 OK [READ-ONLY] EXAMINE completed
    rÈ  s   EXAMINEN©rs   rt   ru   r2  ré  rÑ  r1   r6   r4   r  r  §  s$   € € € € € ðð ð €FØ€G€G€Gr6   r  c                  ó   — e Zd ZdZdZdZdS )ÚIMAP4ClientSelectTestsa  
    Tests for the L{IMAP4Client.select} method.

    An example of usage of the SELECT command from RFC 3501, section 6.3.1::

        C: A142 SELECT INBOX
        S: * 172 EXISTS
        S: * 1 RECENT
        S: * OK [UNSEEN 12] Message 12 is first unseen
        S: * OK [UIDVALIDITY 3857529045] UIDs valid
        S: * OK [UIDNEXT 4392] Predicted next UID
        S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
        S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
        S: A142 OK [READ-WRITE] SELECT completed
    rÇ  s   SELECTNr  r1   r6   r4   r  r  »  s$   € € € € € ðð ð  €FØ€G€G€Gr6   r  c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚIMAP4ClientExpungeTestsa  
    Tests for the L{IMAP4Client.expunge} method.

    An example of usage of the EXPUNGE command from RFC 3501, section 6.4.3::

        C: A202 EXPUNGE
        S: * 3 EXPUNGE
        S: * 3 EXPUNGE
        S: * 5 EXPUNGE
        S: * 8 EXPUNGE
        S: A202 OK EXPUNGE completed
    c                óÄ   — | j                              ¦   «         }|                      | j                             ¦   «         d¦  «         | j                             ¦   «          |S )Ns   0001 EXPUNGE
)r  r™  rB   rð  r  rÄ  rê  s     r4   Ú_expungez IMAP4ClientExpungeTests._expungeÞ  sS   € ØŒK×ÒÑ!Ô!ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1DÑEÔEÐEØŒ×ÒÑÔÐØˆr6   c                óš   — |D ]-}| j                              t          d|› d�¦  «        ¦  «         Œ.| j                              d¦  «         d S )Nz* z EXPUNGEs   0001 OK EXPUNGE COMPLETED)r  rÞ  r)   )rE   ÚsequenceNumbersÚnumbers      r4   rî  z!IMAP4ClientExpungeTests._responseä  s]   € Ø%ð 	Kð 	KˆFØŒK×$Ò$¥]Ð3H¸Ð3HÐ3HÐ3HÑ%IÔ%IÑJÔJÐJÐJØŒ× Ò Ð!=Ñ>Ô>Ð>Ð>Ð>r6   c                ó²   — |                       ¦   «         }|                      g d¢¦  «         |                      |                      |¦  «        g d¢¦  «         dS )zÆ
        L{IMAP4Client.expunge} sends the I{EXPUNGE} command and returns a
        L{Deferred} which fires with a C{list} of message sequence numbers
        given by the server's response.
        )rÇ   rÇ   rÊ   rÍ   N)r  rî  rB   rñ  rê  s     r4   Útest_expungez$IMAP4ClientExpungeTests.test_expungeé  sU   € ð �MŠM‰OŒOˆØ�Š�|�|�|Ñ$Ô$Ð$Ø×Ò˜×-Ò-¨aÑ0Ô0°,°,°,Ñ?Ô?Ð?Ð?Ð?r6   c                óœ   — |                       ¦   «         }|                      g d¢¦  «         |                      |t          j        ¦  «         dS )zÐ
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.expunge}
        fails with L{IllegalServerResponse}.
        )rÇ   rÇ   rG  rÍ   N)r  rî  rö  r   rÏ  rê  s     r4   Útest_nonIntegerExpungedz/IMAP4ClientExpungeTests.test_nonIntegerExpungedó  sI   € ð �MŠM‰OŒOˆØ�ŠÐ'Ð'Ð'Ñ(Ô(Ð(Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   N)rs   rt   ru   r2  r  rî  r   r"  r1   r6   r4   r  r  Ð  s]   € € € € € ðð ðð ð ð?ð ?ð ?ð
@ð @ð @ð=ð =ð =ð =ð =r6   r  c                  ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚIMAP4ClientSearchTestsaí  
    Tests for the L{IMAP4Client.search} method.

    An example of usage of the SEARCH command from RFC 3501, section 6.4.4::

        C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith"
        S: * SEARCH 2 84 882
        S: A282 OK SEARCH completed
        C: A283 SEARCH TEXT "string not in mailbox"
        S: * SEARCH
        S: A283 OK SEARCH completed
        C: A284 SEARCH CHARSET UTF-8 TEXT {6}
        C: XXXXXX
        S: * SEARCH 43
        S: A284 OK SEARCH completed
    c                óº   — | j                              t          j        d¬¦  «        ¦  «        }|                      | j                             ¦   «         d¦  «         |S )NÚABCDEF)rF   s   0001 SEARCH (TEXT "ABCDEF")
)r  Úsearchr   r  rB   rð  r  rê  s     r4   Ú_searchzIMAP4ClientSearchTests._search  sN   € ØŒK×Ò�uœ{°Ð9Ñ9Ô9Ñ:Ô:ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1SÑTÔTÐTØˆr6   c                óÚ   — | j                              dt          d                     t	          t
          |¦  «        ¦  «        ¦  «        z   ¦  «         | j                              d¦  «         d S )Ns	   * SEARCH ú s   0001 OK SEARCH completed)r  rÞ  r)   r’   Úmaprå   )rE   ÚmessageNumberss     r4   rî  z IMAP4ClientSearchTests._response  sa   € ØŒ× Ò Ø�=¨¯ªµ#µc¸>Ñ2JÔ2JÑ)KÔ)KÑLÔLÑLñ	
ô 	
ð 	
ð 	Œ× Ò Ð!<Ñ=Ô=Ð=Ð=Ð=r6   c                ó²   — |                       ¦   «         }|                      g d¢¦  «         |                      |                      |¦  «        g d¢¦  «         dS )zÄ
        L{IMAP4Client.search} sends the I{SEARCH} command and returns a
        L{Deferred} which fires with a C{list} of message sequence numbers
        given by the server's response.
        )rÉ   rÊ   rö   N)r(  rî  rB   rñ  rê  s     r4   Útest_searchz"IMAP4ClientSearchTests.test_search  sU   € ð �LŠL‰NŒNˆØ�Š�z�z�zÑ"Ô"Ð"Ø×Ò˜×-Ò-¨aÑ0Ô0°*°*°*Ñ=Ô=Ð=Ð=Ð=r6   c                óœ   — |                       ¦   «         }|                      g d¢¦  «         |                      |t          j        ¦  «         dS )zÏ
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.search}
        fails with L{IllegalServerResponse}.
        )rÉ   rG  rö   N)r(  rî  rö  r   rÏ  rê  s     r4   Útest_nonIntegerFoundz+IMAP4ClientSearchTests.test_nonIntegerFound%  sF   € ð �LŠL‰NŒNˆØ�Š�~�~�~Ñ&Ô&Ð&Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   N)rs   rt   ru   r2  r(  rî  r.  r0  r1   r6   r4   r$  r$  þ  sZ   € € € € € ðð ð"ð ð ð
>ð >ð >ð>ð >ð >ð=ð =ð =ð =ð =r6   r$  c                  ó~   — 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d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚIMAP4ClientFetchTestszV
    Tests for the L{IMAP4Client.fetch} method.

    See RFC 3501, section 6.4.5.
    c                ó  — | j                              d¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        dd	idd
iddiddidœ¦  «         dS )a  
        L{IMAP4Client.fetchUID} sends the I{FETCH UID} command and returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{dict}s mapping C{'UID'} to that message's I{UID} in the server's
        response.
        ú1:7ó   0001 FETCH 1:7 (UID)
ó   * 2 FETCH (UID 22)s   * 3 FETCH (UID 23)ó   * 4 FETCH (UID 24)s   * 5 FETCH (UID 25)ó   0001 OK FETCH completedr¨  Ú22Ú23Ú24Ú25©rÉ   rÇ   rË   rÊ   N)r  ÚfetchUIDrB   rð  r  rÞ  rñ  rê  s     r4   Útest_fetchUIDz#IMAP4ClientFetchTests.test_fetchUID7  s  € ð ŒK× Ò  Ñ'Ô'ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1LÑMÔMÐMØŒ× Ò Ð!6Ñ7Ô7Ð7ØŒ× Ò Ð!6Ñ7Ô7Ð7ØŒ× Ò Ð!6Ñ7Ô7Ð7ØŒ× Ò Ð!6Ñ7Ô7Ð7ØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô#Ø˜� 5¨$ -°U¸D°MÀuÈdÀmÐTÐTñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó<  — | j                              d¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |t          j        ¦  «         dS )zÑ
        If the server responds with a non-integer where a message sequence
        number is expected, the L{Deferred} returned by L{IMAP4Client.fetchUID}
        fails with L{IllegalServerResponse}.
        rð   s   0001 FETCH 1 (UID)
s   * foo FETCH (UID 22)r8  N©	r  r>  rB   rð  r  rÞ  rö  r   rÏ  rê  s     r4   Útest_fetchUIDNonIntegerFoundz2IMAP4ClientFetchTests.test_fetchUIDNonIntegerFoundJ  s‹   € ð ŒK× Ò  Ñ%Ô%ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1JÑKÔKÐKØŒ× Ò Ð!8Ñ9Ô9Ð9ØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                ó¤  — | j                              d¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |t          j        ¦  «         dS )z¼
        If the server responds with an incomplete I{FETCH} response line, the
        L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        r4  r5  r6  s   * 3 FETCH (UID)r7  r8  NrA  rê  s     r4   Útest_incompleteFetchUIDResponsez5IMAP4ClientFetchTests.test_incompleteFetchUIDResponseV  s¹   € ð ŒK× Ò  Ñ'Ô'ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1LÑMÔMÐMØŒ× Ò Ð!6Ñ7Ô7Ð7ØŒ× Ò Ð!3Ñ4Ô4Ð4ØŒ× Ò Ð!6Ñ7Ô7Ð7ØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                óV  — | j                              d¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        dddii¦  «         dS )	a  
        L{IMAP4Client.fetchBody} sends the I{FETCH BODY} command and returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{dict}s mapping C{'RFC822.TEXT'} to that message's body as given in
        the server's response.
        Ú3s   0001 FETCH 3 (RFC822.TEXT)
s&   * 3 FETCH (RFC822.TEXT "Message text")r8  rÇ   r¤  zMessage textN)r  Ú	fetchBodyrB   rð  r  rÞ  rñ  rê  s     r4   Útest_fetchBodyz$IMAP4ClientFetchTests.test_fetchBodyd  s    € ð ŒK×!Ò! #Ñ&Ô&ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1RÑSÔSÐSØŒ× Ò Ð!JÑKÔKÐKØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°1°}ÀnÐ6UÐ2VÑWÔWÐWÐWÐWr6   c                óZ  — | j                              d¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        ddg dggi¦  «         dS )	aI  
        L{IMAP4Client.fetchSpecific} sends the I{BODY[]} command if no
        parameters beyond the message set to retrieve are given.  It returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{list}s of corresponding message data given by the server's
        response.
        Ú7ó   0001 FETCH 7 BODY[]
s   * 7 FETCH (BODY[] "Some body")r8  rÎ   rÃ  ú	Some bodyN©r  rµ  rB   rð  r  rÞ  rñ  rê  s     r4   Útest_fetchSpecificz(IMAP4ClientFetchTests.test_fetchSpecificq  s¥   € ð ŒK×%Ò% cÑ*Ô*ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1KÑLÔLÐLØŒ× Ò Ð!BÑCÔCÐCØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°1¸ÀÀKÐ7PÐ6QÐ2RÑSÔSÐSÐSÐSr6   c                ó^  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        ddg d	ggi¦  «         d
S )zƒ
        L{IMAP4Client.fetchSpecific} issues a I{BODY.PEEK[]} command if passed
        C{True} for the C{peek} parameter.
        Ú6T)rÊ  s   0001 FETCH 6 BODY.PEEK[]
s   * 6 FETCH (BODY[] "Some body")r8  rÌ   rÃ  rL  NrM  rê  s     r4   Útest_fetchSpecificPeekz,IMAP4ClientFetchTests.test_fetchSpecificPeek  sª   € ð
 ŒK×%Ò% c°Ð%Ñ5Ô5ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1PÑQÔQÐQàŒ× Ò Ð!BÑCÔCÐCØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°1¸ÀÀKÐ7PÐ6QÐ2RÑSÔSÐSÐSÐSr6   c                ó`  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        ddd	gd
ggi¦  «         dS )a;  
        L{IMAP4Client.fetchSpecific}, when passed a sequence for
        C{headerNumber}, sends the I{BODY[N.M]} command.  It returns a
        L{Deferred} which fires with a C{dict} mapping message sequence numbers
        to C{list}s of corresponding message data given by the server's
        response.
        rJ  rÈ   ©ÚheaderNumbers   0001 FETCH 7 BODY[1.2.3]
s#   * 7 FETCH (BODY[1.2.3] "Some body")r8  rÎ   rÃ  z1.2.3rL  NrM  rê  s     r4   Útest_fetchSpecificNumberedz0IMAP4ClientFetchTests.test_fetchSpecificNumbered‹  s·   € ð ŒK×%Ò% c¸	Ð%ÑBÔBˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1PÑQÔQÐQØŒ× Ò Ð!GÑHÔHÐHØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô# a¨6°G°9¸kÐ*JÐ)KÐ%Lñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó`  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        dddgd	ggi¦  «         d
S )a1  
        L{IMAP4Client.fetchSpecific}, when passed C{'TEXT'} for C{headerType},
        sends the I{BODY[TEXT]} command.  It returns a L{Deferred} which fires
        with a C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        Ú8ÚTEXT©r°  ó   0001 FETCH 8 BODY[TEXT]
s"   * 8 FETCH (BODY[TEXT] "Some body")r8  rÍ   rÃ  rL  NrM  rê  s     r4   Útest_fetchSpecificTextz,IMAP4ClientFetchTests.test_fetchSpecificText›  ó·   € ð ŒK×%Ò% c°fÐ%Ñ=Ô=ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1OÑPÔPÐPØŒ× Ò Ð!FÑGÔGÐGØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô# a¨6°F°8¸[Ð*IÐ)JÐ%Kñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ób  — | j                              ddd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        dd	d
gdggi¦  «         dS )ah  
        If passed a value for the C{headerNumber} parameter and C{'TEXT'} for
        the C{headerType} parameter, L{IMAP4Client.fetchSpecific} sends a
        I{BODY[number.TEXT]} request and returns a L{Deferred} which fires with
        a C{dict} mapping message sequence numbers to C{list}s of message data
        given by the server's response.
        Ú4rX  rÎ   )r°  rT  s   0001 FETCH 4 BODY[7.TEXT]
s$   * 4 FETCH (BODY[7.TEXT] "Some body")r8  rË   rÃ  z7.TEXTrL  NrM  rê  s     r4   Útest_fetchSpecificNumberedTextz4IMAP4ClientFetchTests.test_fetchSpecificNumberedTextª  s¹   € ð ŒK×%Ò% c°fÈ1Ð%ÑMÔMˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1QÑRÔRÐRØŒ× Ò Ð!HÑIÔIÐIØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô# a¨6°H°:¸{Ð*KÐ)LÐ%Mñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó@  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |t          j        ¦  «         dS )zü
        If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
        which is truncated after the I{BODY[TEXT]} tokens, the L{Deferred}
        returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        rW  rX  rY  rZ  s   * 8 FETCH (BODY[TEXT])r8  N©	r  rµ  rB   rð  r  rÞ  rö  r   rÏ  rê  s     r4   Ú(test_incompleteFetchSpecificTextResponsez>IMAP4ClientFetchTests.test_incompleteFetchSpecificTextResponseº  s�   € ð ŒK×%Ò% c°fÐ%Ñ=Ô=ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1OÑPÔPÐPØŒ× Ò Ð!:Ñ;Ô;Ð;ØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                ó`  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        dddgd	ggi¦  «         d
S )a1  
        L{IMAP4Client.fetchSpecific}, when passed C{'MIME'} for C{headerType},
        sends the I{BODY[MIME]} command.  It returns a L{Deferred} which fires
        with a C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        rW  rÑ  rY  s   0001 FETCH 8 BODY[MIME]
s"   * 8 FETCH (BODY[MIME] "Some body")r8  rÍ   rÃ  rL  NrM  rê  s     r4   Útest_fetchSpecificMIMEz,IMAP4ClientFetchTests.test_fetchSpecificMIMEÇ  r\  r6   c                óf  — | j                              dddd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        d	d
dgddggi¦  «         dS )aX  
        L{IMAP4Client.fetchSpecific}, when passed C{offset} and C{length},
        sends a partial content request (like I{BODY[TEXT]<offset.length>}).
        It returns a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data given by the
        server's response.
        Ú9rX  rE  rÇ   )r°  ÚoffsetÚlengths   0001 FETCH 9 BODY[TEXT]<17.3>
s    * 9 FETCH (BODY[TEXT]<17> "foo")r8  r÷   rÃ  z<17>rG  NrM  rê  s     r4   Útest_fetchSpecificPartialz/IMAP4ClientFetchTests.test_fetchSpecificPartialÖ  s¾   € ð ŒK×%Ò% c°fÀRÐPQÐ%ÑRÔRˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1UÑVÔVÐVØŒ× Ò Ð!DÑEÔEÐEØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô# a¨6°F°8¸VÀUÐ*KÐ)LÐ%Mñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó@  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |t          j        ¦  «         dS )a  
        If the server responds to a I{BODY[TEXT]} request with a I{FETCH} line
        which is truncated after the I{BODY[TEXT]<offset>} tokens, the
        L{Deferred} returned by L{IMAP4Client.fetchUID} fails with
        L{IllegalServerResponse}.
        rW  rX  rY  rZ  s   * 8 FETCH (BODY[TEXT]<17>)r8  Nra  rê  s     r4   Ú+test_incompleteFetchSpecificPartialResponsezAIMAP4ClientFetchTests.test_incompleteFetchSpecificPartialResponseæ  s�   € ð ŒK×%Ò% c°fÐ%Ñ=Ô=ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1OÑPÔPÐPØŒ× Ò Ð!>Ñ?Ô?Ð?ØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   c                óZ  — | j                              d¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        ddg dggi¦  «         dS )	aA  
        If the body of a message begins with I{<} and ends with I{>} (as,
        for example, HTML bodies typically will), this is still interpreted
        as the body by L{IMAP4Client.fetchSpecific} (and particularly, not
        as a length indicator for a response to a request for a partial
        body).
        rJ  rK  s&   * 7 FETCH (BODY[] "<html>test</html>")r8  rÎ   rÃ  z<html>test</html>NrM  rê  s     r4   Útest_fetchSpecificHTMLz,IMAP4ClientFetchTests.test_fetchSpecificHTMLó  s±   € ð ŒK×%Ò% cÑ*Ô*ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1KÑLÔLÐLØŒ× Ò Ð!JÑKÔKÐKØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô# a¨6°2Ð7JÐ*KÐ)LÐ%Mñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óÆ  — | j                              d|¬¦  «        }|                      | j                             ¦   «         d|                     d¦  «        z   dz   ¦  «         | j                              d|                     d¦  «        z   dz   ¦  «         | j                              d¦  «         |                      |                      |¦  «        d	d
|g gdggi¦  «         dS )aÏ  
        Assert that the provided C{BODY} section, when invoked with no
        arguments, produces an empty list, and that it returns a
        L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.

        @param section: The C{BODY} section to test: either
            C{'HEADER.FIELDS'} or C{'HEADER.FIELDS.NOT'}
        @type section: L{str}
        Ú10rY  s   0001 FETCH 10 BODY[r­  s    ()]
s   * 10 FETCH (BODY[s    ()] "")r8  rö   rÃ  r)  N)r  rµ  rB   rð  r  rC   rÞ  rñ  )rE   Úsectionrž   s      r4   Ú&assertFetchSpecificFieldsWithEmptyListz<IMAP4ClientFetchTests.assertFetchSpecificFieldsWithEmptyList  sì   € ð ŒK×%Ò% d°wÐ%Ñ?Ô?ˆØ×ÒØŒN× Ò Ñ"Ô"Ø" W§^¢^°GÑ%<Ô%<Ñ<¸{ÑJñ	
ô 	
ð 	
ð 	Œ× Ò Ø  7§>¢>°'Ñ#:Ô#:Ñ:¸[ÑHñ	
ô 	
ð 	
ð 	Œ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°2¸À'È2ÀÐPRÐ8SÐ7TÐ2UÑVÔVÐVÐVÐVr6   c                ó0   — |                       d¦  «         dS )az  
        L{IMAP4Client.fetchSpecific}, when passed C{'HEADER.FIELDS'}
        for C{headerType} but no C{headerArgs}, sends the
        I{BODY[HEADER.FIELDS]} command with no arguments.  It returns
        a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.
        r­  N©rq  rR   s    r4   Ú,test_fetchSpecificHeaderFieldsWithoutHeaderszBIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsWithoutHeaders  s   € ð 	×3Ò3°OÑDÔDÐDÐDÐDr6   c                ó0   — |                       d¦  «         dS )a‚  
        L{IMAP4Client.fetchSpecific}, when passed
        C{'HEADER.FIELDS.NOT'} for C{headerType} but no C{headerArgs},
        sends the I{BODY[HEADER.FIELDS.NOT]} command with no
        arguments.  It returns a L{Deferred} which fires with a
        C{dict} mapping message sequence numbers to C{list}s of
        corresponding message data given by the server's response.
        zHEADER.FIELDS.NOTNrs  rR   s    r4   Ú/test_fetchSpecificHeaderFieldsNotWithoutHeaderszEIMAP4ClientFetchTests.test_fetchSpecificHeaderFieldsNotWithoutHeaders'  s   € ð 	×3Ò3Ð4GÑHÔHÐHÐHÐHr6   c                ó`  — | j                              dd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |                      |¦  «        dddgd	ggi¦  «         d
S )a=  
        L{IMAP4Client.fetchSpecific}, when passed C{'HEADER'} for
        C{headerType}, sends the I{BODY[HEADER]} command.  It returns
        a L{Deferred} which fires with a C{dict} mapping message
        sequence numbers to C{list}s of corresponding message data
        given by the server's response.
        Ú11ÚHEADERrY  s   0001 FETCH 11 BODY[HEADER]
sJ   * 11 FETCH (BODY[HEADER] "From: someone@localhost
Subject: Some subject")r8  r@  rÃ  z.From: someone@localhost
Subject: Some subjectNrM  rê  s     r4   Útest_fetchSpecificHeaderz.IMAP4ClientFetchTests.test_fetchSpecificHeader2  sÌ   € ð ŒK×%Ò% d°xÐ%Ñ@Ô@ˆØ×Ò˜œ×-Ò-Ñ/Ô/Ð1RÑSÔSÐSØŒ× Ò ðDñ	
ô 	
ð 	
ð 	Œ× Ò Ð!;Ñ<Ô<Ð<Ø×ÒØ× Ò  Ñ#Ô#ààØ!˜
ØJðððñ	
ô 	
ð 	
ð 	
ð 	
r6   N)rs   rt   ru   r2  r?  rB  rD  rH  rN  rQ  rU  r[  r_  rb  rd  ri  rk  rm  rq  rt  rv  rz  r1   r6   r4   r2  r2  0  s>  € € € € € ðð ð
ð 
ð 
ð&
=ð 
=ð 
=ð=ð =ð =ðXð Xð XðTð Tð Tð
Tð 
Tð 
Tð
ð 
ð 
ð 
ð 
ð 
ð
ð 
ð 
ð =ð =ð =ð
ð 
ð 
ð
ð 
ð 
ð =ð =ð =ð
ð 
ð 
ð Wð Wð Wð2	Eð 	Eð 	Eð	Ið 	Ið 	Ið
ð 
ð 
ð 
ð 
r6   r2  c                  ó^   — e Zd ZdZ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S )ÚIMAP4ClientStoreTestsaÛ  
    Tests for the L{IMAP4Client.setFlags}, L{IMAP4Client.addFlags}, and
    L{IMAP4Client.removeFlags} methods.

    An example of usage of the STORE command, in terms of which these three
    methods are implemented, from RFC 3501, section 6.4.6::

        C: A003 STORE 2:4 +FLAGS (\Deleted)
        S: * 2 FETCH (FLAGS (\Deleted \Seen))
        S: * 3 FETCH (FLAGS (\Deleted))
        S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
        S: A003 OK STORE completed
    c                ór  —  t          | j        |¦  «        ddd¦  «        }|                      | j                             ¦   «         d|z   dz   ¦  «         | j                             d¦  «         | j                             d¦  «         |                      |                      |¦  «        dd	d
dgii¦  «         dS )am  
        Test a non-silent flag modifying method.  Call the method, assert that
        the correct bytes are sent, deliver a I{FETCH} response, and assert
        that the result of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        rF  ©ú\Readr¹  Fó   0001 STORE 3 ó    (\Read \Seen)
s   * 3 FETCH (FLAGS (\Read \Seen))ó   0001 OK STORE completedrÇ   rš  r  r¹  N©r±  r  rB   rð  r  rÞ  rñ  ©rE   ré  Úitemrž   s       r4   Ú
_flagsTestz IMAP4ClientStoreTests._flagsTest`  sÄ   € ð )�G�D”K Ñ(Ô(¨Ð.BÀEÑJÔJˆØ×ÒØŒN× Ò Ñ"Ô"Ð$4°tÑ$;Ð>UÑ$Uñ	
ô 	
ð 	
ð 	Œ× Ò Ð!EÑFÔFÐFØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°1°wÀÈ8Ð@TÐ6UÐ2VÑWÔWÐWÐWÐWr6   c                ó2  —  t          | j        |¦  «        ddd¦  «        }|                      | j                             ¦   «         d|z   dz   ¦  «         | j                             d¦  «         |                      |                      |¦  «        i ¦  «         dS )ag  
        Test a silent flag modifying method.  Call the method, assert that the
        correct bytes are sent, deliver an I{OK} response, and assert that the
        result of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        rF  r~  Tr€  r�  r‚  Nrƒ  r„  s       r4   Ú_flagsSilentlyTestz(IMAP4ClientStoreTests._flagsSilentlyTestq  sž   € ð )�G�D”K Ñ(Ô(¨Ð.BÀDÑIÔIˆØ×ÒØŒN× Ò Ñ"Ô"Ð$4°tÑ$;Ð>UÑ$Uñ	
ô 	
ð 	
ð 	Œ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°"Ñ5Ô5Ð5Ð5Ð5r6   c                ó®  —  t          | j        |¦  «        ddd¦  «        }|                      | j                             ¦   «         d|z   dz   ¦  «         | j                             d¦  «         | j                             d¦  «         |                      |                      |¦  «        i ¦  «         |                      | j        j        dd	d
gi¦  «         dS )a¨  
        Test unsolicited data received in response to a silent flag modifying
        method.  Call the method, assert that the correct bytes are sent,
        deliver the unsolicited I{FETCH} response, and assert that the result
        of the Deferred returned by the method is correct.

        @param method: The name of the method to test.
        @param item: The data item which is expected to be specified.
        rF  r~  Tr€  r�  s   * 2 FETCH (FLAGS (\Read \Seen))r‚  rÉ   r  r¹  N)r±  r  rB   rð  r  rÞ  rñ  rœ  r„  s       r4   Ú%_flagsSilentlyWithUnsolicitedDataTestz;IMAP4ClientStoreTests._flagsSilentlyWithUnsolicitedDataTest�  sÚ   € ð )�G�D”K Ñ(Ô(¨Ð.BÀDÑIÔIˆØ×ÒØŒN× Ò Ñ"Ô"Ð$4°tÑ$;Ð>UÑ$Uñ	
ô 	
ð 	
ð 	Œ× Ò Ð!EÑFÔFÐFØŒ× Ò Ð!;Ñ<Ô<Ð<Ø×Ò˜×-Ò-¨aÑ0Ô0°"Ñ5Ô5Ð5Ø×Ò˜œÔ*¨Q°¸8Ð0DÐ,EÑFÔFÐFÐFÐFr6   c                ó2   — |                       dd¦  «         dS )aQ  
        When passed a C{False} value for the C{silent} parameter,
        L{IMAP4Client.setFlags} sends the I{STORE} command with a I{FLAGS} data
        item and returns a L{Deferred} which fires with a C{dict} mapping
        message sequence numbers to C{dict}s mapping C{'FLAGS'} to the new
        flags of those messages.
        ÚsetFlagsr�  N©r†  rR   s    r4   Útest_setFlagsz#IMAP4ClientStoreTests.test_setFlags”  s   € ð 	�Š˜
 HÑ-Ô-Ð-Ð-Ð-r6   c                ó2   — |                       dd¦  «         dS )zö
        When passed a C{True} value for the C{silent} parameter,
        L{IMAP4Client.setFlags} sends the I{STORE} command with a
        I{FLAGS.SILENT} data item and returns a L{Deferred} which fires with an
        empty dictionary.
        rŒ  ó   FLAGS.SILENTN©rˆ  rR   s    r4   Útest_setFlagsSilentlyz+IMAP4ClientStoreTests.test_setFlagsSilentlyž  s    € ð 	×Ò 
¨OÑ<Ô<Ð<Ð<Ð<r6   c                ó2   — |                       dd¦  «         dS )z®
        If unsolicited flag data is received in response to a I{STORE}
        I{FLAGS.SILENT} request, that data is passed to the C{flagsChanged}
        callback.
        rŒ  r�  N©rŠ  rR   s    r4   Ú(test_setFlagsSilentlyWithUnsolicitedDataz>IMAP4ClientStoreTests.test_setFlagsSilentlyWithUnsolicitedData§  s    € ð 	×2Ò2°:¸ÑOÔOÐOÐOÐOr6   c                ó2   — |                       dd¦  «         dS )z{
        L{IMAP4Client.addFlags} is like L{IMAP4Client.setFlags}, but sends
        I{+FLAGS} instead of I{FLAGS}.
        ÚaddFlagss   +FLAGSNr�  rR   s    r4   Útest_addFlagsz#IMAP4ClientStoreTests.test_addFlags¯  s   € ð
 	�Š˜
 IÑ.Ô.Ð.Ð.Ð.r6   c                ó2   — |                       dd¦  «         dS )zß
        L{IMAP4Client.addFlags} with a C{True} value for C{silent} behaves like
        L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
        sends I{+FLAGS.SILENT} instead of I{FLAGS.SILENT}.
        r—  ó   +FLAGS.SILENTNr‘  rR   s    r4   Útest_addFlagsSilentlyz+IMAP4ClientStoreTests.test_addFlagsSilently¶  s!   € ð 	×Ò 
Ð,<Ñ=Ô=Ð=Ð=Ð=r6   c                ó2   — |                       dd¦  «         dS )z‘
        L{IMAP4Client.addFlags} behaves like L{IMAP4Client.setFlags} when used
        in silent mode and unsolicited data is received.
        r—  rš  Nr”  rR   s    r4   Ú(test_addFlagsSilentlyWithUnsolicitedDataz>IMAP4ClientStoreTests.test_addFlagsSilentlyWithUnsolicitedData¾  s!   € ð
 	×2Ò2°:Ð?OÑPÔPÐPÐPÐPr6   c                ó2   — |                       dd¦  «         dS )z~
        L{IMAP4Client.removeFlags} is like L{IMAP4Client.setFlags}, but sends
        I{-FLAGS} instead of I{FLAGS}.
        ÚremoveFlagss   -FLAGSNr�  rR   s    r4   Útest_removeFlagsz&IMAP4ClientStoreTests.test_removeFlagsÅ  s   € ð
 	�Š˜ yÑ1Ô1Ð1Ð1Ð1r6   c                ó2   — |                       dd¦  «         dS )zâ
        L{IMAP4Client.removeFlags} with a C{True} value for C{silent} behaves
        like L{IMAP4Client.setFlags} with a C{True} value for C{silent}, but it
        sends I{-FLAGS.SILENT} instead of I{FLAGS.SILENT}.
        rŸ  ó   -FLAGS.SILENTNr‘  rR   s    r4   Útest_removeFlagsSilentlyz.IMAP4ClientStoreTests.test_removeFlagsSilentlyÌ  s!   € ð 	×Ò Ð/?Ñ@Ô@Ð@Ð@Ð@r6   c                ó2   — |                       dd¦  «         dS )z”
        L{IMAP4Client.removeFlags} behaves like L{IMAP4Client.setFlags} when
        used in silent mode and unsolicited data is received.
        rŸ  r¢  Nr”  rR   s    r4   Ú+test_removeFlagsSilentlyWithUnsolicitedDatazAIMAP4ClientStoreTests.test_removeFlagsSilentlyWithUnsolicitedDataÔ  s!   € ð
 	×2Ò2°=ÐBRÑSÔSÐSÐSÐSr6   N)rs   rt   ru   r2  rˆ  rã  r†  rˆ  rŠ  rŽ  r’  r•  r˜  r›  r�  r   r£  r¥  r1   r6   r4   r|  r|  O  sí   € € € € € ðð ð (€NðXð Xð Xð"6ð 6ð 6ð Gð Gð Gð&.ð .ð .ð=ð =ð =ðPð Pð Pð/ð /ð /ð>ð >ð >ðQð Qð Qð2ð 2ð 2ðAð Að AðTð Tð Tð Tð Tr6   r|  c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚIMAP4ClientStatusTestsa_  
    Tests for the L{IMAP4Client.status} method.

    An example of usage of the STATUS command from RFC 3501, section
    5.1.2::

        C: A042 STATUS blurdybloop (UIDNEXT MESSAGES)
        S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)
        S: A042 OK STATUS completed

    @see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
    c                ó¼   — |                       t          | j        j        dd¦  «        }|                      t          |¦  «        dt          dh¦  «        z   ¦  «         dS )z‘
        Only allow sending the C{STATUS} names defined in RFC 3501.

        @see: U{https://tools.ietf.org/html/rfc3501#section-5.1.2}
        rX  zIMPOSSIBLE?!zUnknown names: N)r×   r  r  rh  rB   rå   rÛ   )rE   Úexcs     r4   ÚtestUnknownNamez&IMAP4ClientStatusTests.testUnknownNameê  s_   € ð ×ÒÝØŒKÔØØñ	
ô 
ˆð 	×Ò�˜S™œÐ#4µt¸^Ð<LÑ7MÔ7MÑ#MÑNÔNÐNÐNÐNr6   c                ó>  — | j                              dd¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         | j                              d¦  «         |                      |t          j        ¦  «         dS )z‰
        C{STATUS} names that cannot be decoded as ASCII cause the
        status Deferred to fail with L{IllegalServerResponse}
        ÚblurdyblooprR  s$   0001 STATUS blurdybloop (MESSAGES)
s?   * STATUS blurdybloop (MESSAGES 1 ASCIINAME "OK" NOTÿASCII "NO")s   0001 OK STATUS completedN)	r  rh  rB   rð  r  rÞ  rö  r   rÏ  rê  s     r4   ÚtestUndecodableNamez*IMAP4ClientStatusTests.testUndecodableNameø  sž   € ð ŒK×Ò˜}¨jÑ9Ô9ˆØ×ÒØŒN× Ò Ñ"Ô"Ø5ñ	
ô 	
ð 	
ð
 	Œ× Ò ØUñ	
ô 	
ð 	
ð 	Œ× Ò Ð!<Ñ=Ô=Ð=Ø×Ò˜Q¥Ô ;Ñ<Ô<Ð<Ð<Ð<r6   N)rs   rt   ru   r2  rª  r­  r1   r6   r4   r§  r§  Ü  s?   € € € € € ðð ðOð Oð Oð=ð =ð =ð =ð =r6   r§  c                  ó.   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	dS )ÚIMAP4ClientCopyTestszà
    Tests for the L{IMAP4Client.copy} method.

    An example of the C{COPY} command, which this method implements,
    from RFC 3501, section 6.4.7::

        C: A003 COPY 2:4 MEETING
        S: A003 OK COPY completed
    c                ó$  — | j                              ddd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         |                      |                      |¦  «        g df¦  «         dS )	z·
        L{IMAP4Client.copy} copies the messages identified by their
        sequence numbers to the mailbox, returning a L{Deferred} that
        succeeds with a true value.
        rí   ÚMEETINGFr  ó   0001 COPY 2:3 MEETING
ó   0001 OK COPY completedó   OK COPY completedN©r  ÚcopyrB   rð  r  rÞ  rñ  rê  s     r4   Útest_copySequenceNumbersz-IMAP4ClientCopyTests.test_copySequenceNumbers  s•   € ð ŒK×Ò˜U I°5ÐÑ9Ô9ˆà×ÒØŒN× Ò Ñ"Ô"Ø(ñ	
ô 	
ð 	
ð
 	Œ× Ò Ð!:Ñ;Ô;Ð;Ø×Ò˜×-Ò-¨aÑ0Ô0°2Ð7KÐ2LÑMÔMÐMÐMÐMr6   c                ó>  — | j                              ddd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         |                      |                      |¦  «        j        t          j	        ¦  «         dS )zÎ
        L{IMAP4Client.copy} returns a L{Deferred} that fails with an
        L{IMAP4Exception} when the messages specified by the given
        sequence numbers could not be copied to the mailbox.
        rí   r±  Fr  r²  ó   0001 BAD COPY failedN©
r  r¶  rB   rð  r  rÞ  rØ  rö  r   r  rê  s     r4   Útest_copySequenceNumbersFailsz2IMAP4ClientCopyTests.test_copySequenceNumbersFails(  s•   € ð ŒK×Ò˜U I°5ÐÑ9Ô9ˆà×ÒØŒN× Ò Ñ"Ô"Ø(ñ	
ô 	
ð 	
ð
 	Œ× Ò Ð!8Ñ9Ô9Ð9Ø×Ò˜d×2Ò2°1Ñ5Ô5Ô;½UÔ=QÑRÔRÐRÐRÐRr6   c                ó$  — | j                              ddd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         |                      |                      |¦  «        g df¦  «         dS )	z«
        L{IMAP4Client.copy} copies the messages identified by their
        UIDs to the mailbox, returning a L{Deferred} that succeeds
        with a true value.
        rí   r±  Tr  ó   0001 UID COPY 2:3 MEETING
r³  r´  Nrµ  rê  s     r4   Útest_copyUIDsz"IMAP4ClientCopyTests.test_copyUIDs8  s•   € ð ŒK×Ò˜U I°4ÐÑ8Ô8ˆà×ÒØŒN× Ò Ñ"Ô"Ø,ñ	
ô 	
ð 	
ð
 	Œ× Ò Ð!:Ñ;Ô;Ð;Ø×Ò˜×-Ò-¨aÑ0Ô0°2Ð7KÐ2LÑMÔMÐMÐMÐMr6   c                ó>  — | j                              ddd¬¦  «        }|                      | j                             ¦   «         d¦  «         | j                              d¦  «         |                      |                      |¦  «        j        t          j	        ¦  «         dS )zÂ
        L{IMAP4Client.copy} returns a L{Deferred} that fails with an
        L{IMAP4Exception} when the messages specified by the given
        UIDs could not be copied to the mailbox.
        rí   r±  Tr  r½  r¹  Nrº  rê  s     r4   Útest_copyUIDsFailsz'IMAP4ClientCopyTests.test_copyUIDsFailsH  s•   € ð ŒK×Ò˜U I°4ÐÑ8Ô8ˆà×ÒØŒN× Ò Ñ"Ô"Ø,ñ	
ô 	
ð 	
ð
 	Œ× Ò Ð!8Ñ9Ô9Ð9Ø×Ò˜d×2Ò2°1Ñ5Ô5Ô;½UÔ=QÑRÔRÐRÐRÐRr6   N)
rs   rt   ru   r2  rˆ  rã  r·  r»  r¾  rÀ  r1   r6   r4   r¯  r¯    so   € € € € € ðð ð (€NðNð Nð Nð Sð Sð Sð Nð Nð Nð Sð Sð Sð Sð Sr6   r¯  c                  ó   — e Zd ZdZdZd„ ZdS )ÚFakeyServerrÇ  Nc                ó   — d S r0   r1   rR   s    r4   ÚsendServerGreetingzFakeyServer.sendServerGreeting]  r€  r6   )rs   rt   ru   rV  ÚtimeoutrÄ  r1   r6   r4   rÂ  rÂ  Y  s-   € € € € € Ø€EØ€Gðð ð ð ð r6   rÂ  c                  óH   — 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S )r˜   )rœ   rœ  r�  Ú_bodyr©  c                ó‚   — || _         || _        || _        t          |¦  «        | _        || _        || _        || _        d S r0   )rœ   rœ  rÇ  rÐ   Úsizer�  r©  Úsubpart)rE   rœ   rœ  r�  r“   r©  rÊ  s          r4   rz   zFakeyMessage.__init__e  s=   € ØˆŒØˆŒ
ØˆŒ
Ý˜‘I”IˆŒ	ØˆŒ	ØˆŒØˆŒˆˆr6   c                ó"   — ||f| _         | j        S r0   )Úgot_headersrœ   )rE   rÎ  r‡  s      r4   Ú
getHeaderszFakeyMessage.getHeadersn  s   € Ø! 5˜=ˆÔØŒ|Ðr6   c                ó   — | j         S r0   rn  rR   s    r4   ro  zFakeyMessage.getFlagsr  rp  r6   c                ó   — | j         S r0   )r�  rR   s    r4   ÚgetInternalDatezFakeyMessage.getInternalDateu  ó
   € ØŒyÐr6   c                ó*   — t          | j        ¦  «        S r0   )r   rÇ  rR   s    r4   ÚgetBodyFilezFakeyMessage.getBodyFilex  s   € Ý�t”zÑ"Ô"Ð"r6   c                ó   — | j         S r0   )rÉ  rR   s    r4   ÚgetSizezFakeyMessage.getSize{  rÑ  r6   c                ó   — | j         S r0   r  rR   s    r4   r…  zFakeyMessage.getUID~  s	   € ØŒxˆr6   c                ó   — | j         d uS r0   )rÊ  rR   s    r4   ÚisMultipartzFakeyMessage.isMultipart�  s   € ØŒ| 4Ð'Ð'r6   c                ó*   — || _         | j        |         S r0   )Úgot_subpartrÊ  )rE   rÒ  s     r4   Ú
getSubPartzFakeyMessage.getSubPart„  s   € ØˆÔØŒ|˜DÔ!Ð!r6   N)rs   rt   ru   ÚshowAttributesrz   rÍ  ro  rÐ  rÓ  rÕ  r…  rØ  rÛ  r1   r6   r4   r˜   r˜   a  s    € € € € € àA€Nðð ð ðð ð ðð ð ðð ð ð#ð #ð #ðð ð ðð ð ð(ð (ð (ð"ð "ð "ð "ð "r6   r˜   c                  ó<   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d	d„Z
dS )
ÚNewStoreTestsNc                óä   — d x| _         | _        t          j        ¦   «         | _        d| j        _        | | j        _        t          j        ¦   «         | _	        t          | j	        ¦  «        | _        d S ©NrÇ  )Úreceived_messagesÚreceived_uidr   rÓ  r  rV  r_  r   r   r  rã  r  rR   s    r4   r  zNewStoreTests.setUp�  sZ   € Ø59Ð9ˆÔ Ô!2åÔ'Ñ)Ô)ˆŒØ$ˆŒÔØˆŒÔÝœÑ)Ô)ˆŒÝ" 4¤>Ñ2Ô2ˆŒˆˆr6   c                ó   — d S r0   r1   ©rE   r[  s     r4   ri  zNewStoreTests.addListener–  r€  r6   c                ó   — d S r0   r1   rä  s     r4   rk  zNewStoreTests.removeListener™  r€  r6   c                ó"   — ||f| _         | j        S r0   )Ú	storeArgsr¤  )rE   rÚ  rÛ  s      r4   r§  zNewStoreTests.storeœ  s   € Ø˜r˜ˆŒØŒ}Ðr6   c                óf  ‡ — ˆ fd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «                             |¦  «                             ‰ j        ¦  «                             ‰ j        ¦  «         ˆ fd„}t          j        ‰ j        ‰ j	        d¬¦  «        }|                     |¦  «         |S )Nc                 ó\   •— ‰                       ‰ j        ‰ j        ‰ j        ‰ j        ¦  «        S r0   )Úfunctionr   rœ  Úsilentr©  rR   s   €r4   r  z+NewStoreTests._storeWork.<locals>.connected¡  s#   ø€ Ø—=’= ¤°´
¸D¼KÈÌÑRÔRÐRr6   c                ó   •— | ‰_         d S r0   ©r2   ©ÚRrE   s    €r4   r2   z(NewStoreTests._storeWork.<locals>.result¤  ó   ø€ ØˆDŒKˆKˆKr6   c                óˆ   •— ‰                      ‰j        ‰j        ¦  «         ‰                      ‰j        ‰j        ¦  «         d S r0   )rB   r2   rg  rç  ÚexpectedArgs©rX  rE   s    €r4   rŽ  z'NewStoreTests._storeWork.<locals>.check«  s>   ø€ Ø×Ò˜Tœ[¨$¬-Ñ8Ô8Ð8Ø×Ò˜Tœ^¨TÔ->Ñ?Ô?Ð?Ð?Ð?r6   F©Únoisy©
r  r›   r7   r
  r+  r  r#   ÚloopbackTCPr  r  )rE   r  r2   rŽ  rž   s   `    r4   Ú
_storeWorkzNewStoreTests._storeWork   sß   ø€ ð	Sð 	Sð 	Sð 	Sð 	Sð	ð 	ð 	ð 	ð 	ð 	Œ×"Ò"¥5¨Ñ#3Ô#3Ñ4Ô4×@Ò@ÀÑHÔH×TÒTØÔñ	
ô 	
ç
Š*�T”_Ñ
%Ô
%Ð
%ð	@ð 	@ð 	@ð 	@ð 	@õ Ô  ¤¨d¬kÀÐGÑGÔGˆØ	�Š�eÑÔÐØˆr6   r   c                óœ  — | j         j        | _        d| _        g d¢| _        d| _        || _        g d¢g d¢g d¢dœ| _        dg d¢idg d¢idg d¢idœ| _        t          j
        ¦   «         }|                     d¦  «         |                     d¦  «         |                     d¦  «         |g d¢d	fd
d	if| _        |                      ¦   «         S )Nz1,5,9)z\Az\BÚCF)rÅ   rÊ   r÷   rš  rÅ   rÊ   r÷   r   r©  )r  rŒ  rê  r   rœ  rë  r©  r¤  rg  r   r   rÒ   rò  rø  )rE   r©  r�   s      r4   ÚtestSetFlagszNewStoreTests.testSetFlags³  s  € ØœÔ,ˆŒØˆŒØ(Ð(Ð(ˆŒ
ØˆŒØˆŒà"Ð"Ð"Ø"Ð"Ð"Ø"Ð"Ð"ð
ð 
ˆŒð Ð,Ð,Ð,Ð-ØÐ,Ð,Ð,Ð-ØÐ,Ð,Ð,Ð-ð
ð 
ˆŒõ
 ÔÑ Ô ˆØ�Š�‰
Œ
ˆ
Ø�Š�‰
Œ
ˆ
Ø�Š�‰
Œ
ˆ
Ø!Ð#6Ð#6Ð#6¸Ð:¸UÀA¸JÐGˆÔØ�ŠÑ Ô Ð r6   rÅ  )rs   rt   ru   r2   rç  r  ri  rk  r§  rø  rû  r1   r6   r4   rÞ  rÞ  ‰  s}   € € € € € Ø€FØ€Ið3ð 3ð 3ðð ð ðð ð ðð ð ðð ð ð&!ð !ð !ð !ð !ð !r6   rÞ  c                  óH   — 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S )ÚGetBodyStructureTestsz½
    Tests for L{imap4.getBodyStructure}, a helper for constructing a list which
    directly corresponds to the wire information needed for a I{BODY} or
    I{BODYSTRUCTURE} response.
    c                óö   — d}d}d}d}d}d}d}t          |dz   |z   d	z   |z   d
z   |||dœdd|dd¦  «        }t          j        |¦  «        }	|                      ||d|ddg|||t	          |¦  «        g|	¦  «         dS )z´
        L{imap4.getBodyStructure} accepts a L{IMessagePart} provider and returns
        a list giving the basic fields for the I{BODY} response for that
        message.
        ó   hello, worldÚimageÚjpegúus-asciiúsome kind of idúgreat justiceÚmaximumrP  ú
; charset=ú; x=y©rŽ   ú
content-idúcontent-descriptionúcontent-transfer-encodingr1   r6   r�   NÚcharsetr[  Úy©r˜   r   ÚgetBodyStructurerB   rÐ   ©
rE   r“   ÚmajorÚminorr  rO  Údescriptionr£  r�   Ú	structures
             r4   Útest_singlePartz%GetBodyStructureTests.test_singlePartÒ  s×   € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÝà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5ð	ð ð ØØØØñ
ô 
ˆõ Ô*¨3Ñ/Ô/ˆ	Ø×ÒàØØ˜G S¨#Ð.ØØØÝ�D‘	”	ðð ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óT  — t          i ddddd¦  «        }t          j        |¦  «        }|dd…         \  }}|                      d|¦  «         |                      d|¦  «         t          ddiddddd¦  «        }t          j        |¦  «        }|dd…         \  }}|                      d|¦  «         |                      d|¦  «         t          ddiddddd¦  «        }	t          j        |	¦  «        }
|
dd…         \  }}|                      d|¦  «         |                      d|¦  «         dS )	zÑ
        L{imap4.getBodyStructure} returns L{None} for the major and
        minor MIME types of a L{IMessagePart} provider whose headers
        lack a C{Content-Type}, or have an empty value for it.
        r1   r6   r�   NrÉ   rŽ   r)  ú
)r˜   r   r  ÚassertIs)rE   ÚmissingÚmissingContentTypeStructureÚmissingMajorÚmissingMinorrÌ  ÚemptyContentTypeStructureÚ
emptyMajorÚ
emptyMinorÚnewlineÚnewlineContentTypeStructureÚnewlineMajorÚnewlineMinors                r4   Útest_emptyContentTypez+GetBodyStructureTests.test_emptyContentTypeú  s=  € õ ˜r 2 s¨C°°dÑ;Ô;ˆÝ&+Ô&<¸WÑ&EÔ&EÐ#Ø%@ÀÀ!ÀÔ%DÑ"ˆ�lØ�Š�d˜LÑ)Ô)Ð)Ø�Š�d˜LÑ)Ô)Ð)å˜n¨bÐ1°2°s¸CÀÀdÑKÔKˆÝ$)Ô$:¸5Ñ$AÔ$AÐ!Ø!:¸2¸A¸2Ô!>Ñˆ
�JØ�Š�d˜JÑ'Ô'Ð'Ø�Š�d˜JÑ'Ô'Ð'å °Ð5°r¸3ÀÀSÈ$ÑOÔOˆÝ&+Ô&<¸WÑ&EÔ&EÐ#Ø%@ÀÀ!ÀÔ%DÑ"ˆ�lØ�Š�d˜LÑ)Ô)Ð)Ø�Š�d˜LÑ)Ô)Ð)Ð)Ð)r6   c                óÌ   — t          ddiddddd¦  «        }t          j        |¦  «        }|dd…         \  }}|                      |d¦  «         |                      |d¦  «         dS )z·
        L{imap4.getBodyStructure} returns only a non-L{None} major
        MIME type for a L{IMessagePart} provider whose headers only
        have a main a C{Content-Type}.
        rŽ   Úmainr1   r6   r�   NrÉ   )r˜   r   r  rB   r  )rE   r&  ÚmainStructureÚ	mainMajorÚ	mainMinors        r4   Útest_onlyMajorContentTypez/GetBodyStructureTests.test_onlyMajorContentType  ss   € õ ˜^¨VÐ4°b¸#¸sÀCÈÑNÔNˆÝÔ.¨tÑ4Ô4ˆØ,¨R¨a¨RÔ0Ñˆ	�9Ø×Ò˜ FÑ+Ô+Ð+Ø�Š�i Ñ&Ô&Ð&Ð&Ð&r6   c                ó  — d}d}d}d}d}d}d}d}t          |d	z   |z   d
z   |z   dz   ||||ddddœdd|dd¦  «        }	t          j        |	d¬¦  «        }
|                      ||d|ddg|||t	          |¦  «        |dg d¢gddg|
¦  «         dS )zÀ
        L{imap4.getBodyStructure} returns a list giving the basic and extended
        fields for a I{BODYSTRUCTURE} response if passed C{True} for the
        C{extended} parameter.
        rÿ  r   r  r  r  r  r  ÚabcdefabcdefrP  r  r  zattachment; name=foo; size=barÚfrÚFrance©rŽ   r	  r
  r  úcontent-md5úcontent-dispositionúcontent-languageúcontent-locationr1   r)  r�   NT©Úextendedr  r[  r  Ú
attachment)rÂ  rG  rÉ  rH  r  )rE   r“   r  r  r  rO  r  r£  Úmd5r�   r  s              r4   Útest_singlePartExtendedz-GetBodyStructureTests.test_singlePartExtended  s  € ð ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆØˆÝà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5Ø"Ø'GØ$(Ø$,ð	ð 	ð ØØØØñ
ô 
ˆõ" Ô*¨3¸Ð>Ñ>Ô>ˆ	Ø×ÒàØØ˜G S¨#Ð.ØØØÝ�D‘	”	ØØÐ=Ð=Ð=Ð>ØØðð ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óÒ   — d}d}d}t          d|dz   |z   idd|dd	¦  «        }t          j        |d
¬¦  «        }|                      ||d	d	d	d	t	          |¦  «        d	d	d	d	g|¦  «         d	S )z›
        For fields with no information contained in the message headers,
        L{imap4.getBodyStructure} fills in L{None} values in its result.
        r   r  rÿ  rŽ   rP  r1   r6   r�   NTr4  r  )rE   r  r  r“   r�   r  s         r4   Útest_singlePartWithMissingz0GetBodyStructureTests.test_singlePartWithMissingO  sš   € ð
 ˆØˆØˆÝØ˜U S™[¨5Ñ0Ð1°2°s¸DÀ#Àtñ
ô 
ˆõ Ô*¨3¸Ð>Ñ>Ô>ˆ	Ø×ÒØ�E˜4  t¨Tµ3°t±9´9¸dÀDÈ$ÐPTÐUØñ	
ô 	
ð 	
ð 	
ð 	
r6   c                ó6  — d}d}d}d}d}d}d}t          |dz   |z   d	z   |z   d
z   |||dœdd|dd¦  «        }t          j        |¦  «        }	|                      ||d|ddg|||t	          |¦  «        t	          |                     ¦   «         ¦  «        g|	¦  «         dS )z’
        For a I{text/*} message, the number of lines in the message body are
        included after the common single-part basic fields.
        ó"   hello, world
how are you?
goodbye
rF   r  r  r  r  r  rP  r  r  r  r1   r6   r�   Nr  r[  r  )r˜   r   r  rB   rÐ   rf  r  s
             r4   Útest_textPartz#GetBodyStructureTests.test_textPart`  sì   € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÝà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ(Ø'2Ø-5ð	ð ð ØØØØñ
ô 
ˆõ Ô*¨3Ñ/Ô/ˆ	Ø×ÒàØØ˜G S¨#Ð.ØØØÝ�D‘	”	Ý�D—O’OÑ%Ô%Ñ&Ô&ð	ð ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óT  — d}d}d}d}d}d}d}t          |dz   |z   d	z   |z   d
z   dd|||dœdd|dd¦  «        }t          ddidddd|g¦  «        }	t          j        |	¦  «        }
|                      dddddddt          j        |¦  «        t          j        |¦  «        dg
|
¦  «         dS )z‹
        For a I{message/rfc822} message, the common basic fields are followed
        by information about the contained message.
        r<  rF   r  r  r  r  r  rP  r  r  zAlice <alice@example.com>zBob <bob@example.com>)rŽ   rˆ   rŠ   r	  r
  r  r1   r)  r�   NrŽ   úmessage/rfc822r6   rŽ  r§  r   rÇ   )r˜   r   r  rB   ÚgetEnvelope)rE   r“   r  r  r  rO  r  r£  r�   Ú	containerr  s              r4   Útest_rfc822Messagez(GetBodyStructureTests.test_rfc822Messageˆ  s  € ð
 8ˆØˆØˆØˆØ&ˆ
Ø%ˆØˆÝà %¨¡¨eÑ 3°lÑ BÀWÑ LÈwÑ VØ3Ø-Ø(Ø'2Ø-5ðð ð ØØØØñ
ô 
ˆõ  !àÐ 0ðð ØØØØˆEñ	
ô 	
ˆ	õ Ô*¨9Ñ5Ô5ˆ	Ø×ÒàØØØØØØÝÔ! #Ñ&Ô&ÝÔ& sÑ+Ô+Øðð ñ	
ô 	
ð 	
ð 	
ð 	
r6   c           	     ó2  — t          dddddœdddd	d
¦  «        }t          ddiddddd
¦  «        }t          ddidddd||g¦  «        }|                      t          j        |¦  «        t          j        |¦  «        dgt          j        |¦  «        ¦  «         d
S )zî
        For a I{multipart/*} message, L{imap4.getBodyStructure} returns a list
        containing the body structure information for each part of the message
        followed by an element giving the MIME subtype of the message.
        zimage/jpeg; x=yr  r  r  r  r1   r6   ó   hello worldr�   NrŽ   ztext/plain; charset=us-asciió
   some stufféA  zmultipart/relatedé+  Úrelated©r˜   rB   r   r  ©rE   Ú
oneSubPartÚanotherSubPartrA  s       r4   Útest_multiPartz$GetBodyStructureTests.test_multiPartÀ  sñ   € õ "à 1Ø/Ø'6Ø-6ð	ð ð ØØØØñ
ô 
ˆ
õ &àÐ >ðð ØØØØñ	
ô 	
ˆõ !àÐ 3ðð ØØØØ˜Ð(ñ	
ô 	
ˆ	ð 	×ÒåÔ& zÑ2Ô2ÝÔ& ~Ñ6Ô6Øðõ
 Ô" 9Ñ-Ô-ñ	
ô 	
ð 	
ð 	
ð 	
r6   c           	     óX  — t          dddddœdddd	d
¦  «        }t          ddiddddd
¦  «        }t          dddddœdddd||g¦  «        }|                      t          j        |d¬¦  «        t          j        |d¬¦  «        dddgdddggddgt          j        |d¬¦  «        ¦  «         d
S )a)  
        When passed a I{multipart/*} message and C{True} for the C{extended}
        argument, L{imap4.getBodyStructure} includes extended structure
        information from the parts of the multipart message and extended
        structure information about the multipart message itself.
        s   image/jpeg; x=ys   some kind of ids   great justices   maximum)ó   content-types
   content-ids   content-descriptions   content-transfer-encodingr1   r6   rD  r�   NrO  s   text/plain; charset=us-asciirE  rF  zmultipart/related; foo=barÚesÚSpainzattachment; name=monkeys)rŽ   r2  r3  r1  rG  Tr4  rH  rG  rH  r6  rÂ  ÚmonkeysrI  rJ  s       r4   Útest_multiPartExtendedz,GetBodyStructureTests.test_multiPartExtendedó  s%  € õ "à!3Ø1Ø(8Ø.8ð	ð ð ØØØØñ
ô 
ˆ
õ &àÐ!@ðð ØØØØñ	
ô 	
ˆõ !à <Ø$(Ø$+Ø'Að	ð ð ØØØØ˜Ð(ñ
ô 
ˆ	ð 	×ÒåÔ& z¸DÐAÑAÔAÝÔ& ~ÀÐEÑEÔEØØ˜�Ø ¨	Ð2Ð3ØØðõ Ô" 9°tÐ<Ñ<Ô<ñ	
ô 	
ð 	
ð 	
ð 	
r6   N)rs   rt   ru   r2  r  r$  r*  r8  r:  r=  rB  rM  rS  r1   r6   r4   rý  rý  Ë  sª   € € € € € ðð ð&
ð &
ð &
ðP*ð *ð *ð0
'ð 
'ð 
'ð/
ð /
ð /
ðb
ð 
ð 
ð"&
ð &
ð &
ðP6
ð 6
ð 6
ðp1
ð 1
ð 1
ðf9
ð 9
ð 9
ð 9
ð 9
r6   rý  c                  óê  — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd.d„Z	d	„ Z
d.d
„Zd„ Z ej        ej        d¦  «        Z	  ej        ej        d¦  «          ej        ej        e¦  «         dZn# ej        $ r dZY nw xY w eed¦  «        d„ ¦   «         Zd.d„Zd„ Zd.d„Zd„ Zd.d„Zd.d„Zd„ Zd.d„Zd„ Zd.d„Zd„ Zd„ Z d.d„Z!d„ Z"d.d „Z#d!„ Z$d.d"„Z%d#„ Z&d$„ Z'd%„ Z(d.d&„Z)d'„ Z*d.d(„Z+d)„ Z,d.d*„Z-d+„ Z.d.d,„Z/d-„ Z0dS )/ÚNewFetchTestsc                óò   — d x| _         | _        d | _        t          j        ¦   «         | _        d| j        _        | | j        _        t          j	        ¦   «         | _
        t          | j
        ¦  «        | _        d S rà  )rá  râ  r2   r   rÓ  r  rV  r_  r   r   r  rã  r  rR   s    r4   r  zNewFetchTests.setUp0  sa   € Ø59Ð9ˆÔ Ô!2ØˆŒåÔ'Ñ)Ô)ˆŒØ$ˆŒÔØˆŒÔÝœÑ)Ô)ˆŒÝ" 4¤>Ñ2Ô2ˆŒˆˆr6   c                ó   — d S r0   r1   rä  s     r4   ri  zNewFetchTests.addListener:  r€  r6   c                ó   — d S r0   r1   rä  s     r4   rk  zNewFetchTests.removeListener=  r€  r6   c           	     ó    — || _         || _        t          t          t	          t          | j        ¦  «        ¦  «        | j        ¦  «        ¦  «        S r0   )rá  râ  Úiterrä   rn   rÐ   ÚmsgObjsrŸ  s      r4   r   zNewFetchTests.fetch@  s>   € Ø!)ˆÔØˆÔÝ•C��c $¤,Ñ/Ô/Ñ0Ô0°$´,Ñ?Ô?Ñ@Ô@Ð@r6   c                ó  ‡ ‡— ‰rit          t          t          ‰ j        ¦  «        ¦  «        ‰ j        ¦  «        D ]4\  }}t	          |                     ¦   «         ¦  «        ‰ j        |         d<   Œ5ˆ fd„}‰ j                             ˆ ˆfd„¦  «                             |¦  «                             ‰ j	        ¦  «         
                    ‰ j        ¦  «         t          j        ‰ j        ‰ j        d¬¦  «        }|                     ˆ fd„¦  «         |S )Nr¨  c                ó   •— | ‰_         d S r0   rí  rî  s    €r4   r2   z(NewFetchTests._fetchWork.<locals>.resultJ  rð  r6   c                ó:   •— ‰                      ‰j        ‰¦  «        S r0   ©rê  r   )r*  rE   r©  s    €€r4   r5   z*NewFetchTests._fetchWork.<locals>.<lambda>N  s   ø€ �d—m’m D¤M°3Ñ7Ô7€ r6   Frô  c                óD   •— ‰                      ‰j        ‰j        ¦  «        S r0   ©rB   r2   rg  )r[  rE   s    €r4   r5   z*NewFetchTests._fetchWork.<locals>.<lambda>T  s   ø€  × 0Ò 0°´¸d¼mÑ LÔ L€ r6   )rä   rn   rÐ   r[  rå   r…  rg  r  r›   r
  r+  r  r#   r÷  r  r  )rE   r©  ré   r�   r2   rž   s   ``    r4   Ú
_fetchWorkzNewFetchTests._fetchWorkE  s  øø€ Øð 	<Ý�e¥C¨¬Ñ$5Ô$5Ñ6Ô6¸¼ÑEÔEð <ð <‘��3Ý*-¨c¯jªj©l¬lÑ*;Ô*;�”˜aÔ  Ñ'Ð'ð	ð 	ð 	ð 	ð 	ð 	Œ×"Ò"Ø7Ð7Ð7Ð7Ð7ñ	
ô 	
ç
Š+�fÑ
Ô
Ÿkšk¨$Ô*<Ñ=Ô=¿jºjØŒOñ?
ô ?
ð ?
õ Ô  ¤¨d¬kÀÐGÑGÔGˆØ	�ŠÐLÐLÐLÐLÑMÔMÐMØˆr6   c           
     óò   ‡ — ˆ fd„‰ _         d‰ _        t          i ddddd ¦  «        t          i ddddd ¦  «        t          i ddddd ¦  «        g‰ _        dd	idd
iddidœ‰ _        ‰                      d¦  «        S )Nc                ó8   •— ‰j                              | ¦  «        S r0   ©r  r>  )ró   ÚurE   s     €r4   r5   z,NewFetchTests.testFetchUID.<locals>.<lambda>X  s   ø€  T¤[×%9Ò%9¸!Ñ%<Ô%<€ r6   rJ  r1   r6   r5  éç  éu'  r¨  Ú12345Ú999Ú10101)r   rÅ   rÉ   r   )rê  r   r˜   r[  rg  rb  rR   s   `r4   ÚtestFetchUIDzNewFetchTests.testFetchUIDW  s�   ø€ Ø<Ð<Ð<Ð<ˆŒàˆŒå˜˜R  c¨5°$Ñ7Ô7Ý˜˜R  c¨3°Ñ5Ô5Ý˜˜R  c¨5°$Ñ7Ô7ð
ˆŒð �wÐØ�uˆ~Ø�wÐð
ð 
ˆŒð
 �Š˜qÑ!Ô!Ð!r6   r   c           	     óâ   — | j         j        | _        d| _        t	          i g d¢dddd ¦  «        t	          i g d¢dddd ¦  «        g| _        dg d¢idg d¢idœ| _        |                      |¦  «        S )	Nrf  )ÚFlagAÚFlagBú\FlagCr6   é1Ô  )rp  rn  ro  r5  rš  ©r   rÅ   )r  Ú
fetchFlagsrê  r   r˜   r[  rg  rb  ©rE   r©  s     r4   ÚtestFetchFlagszNewFetchTests.testFetchFlagsg  s˜   € ØœÔ.ˆŒØˆŒå˜Ð:Ð:Ð:¸CÀÀeÈTÑRÔRÝ˜Ð:Ð:Ð:¸CÀÀeÈTÑRÔRð
ˆŒð
 Ð6Ð6Ð6Ð7ØÐ6Ð6Ð6Ð7ð
ð 
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )ru  rR   s    r4   ÚtestFetchFlagsUIDzNewFetchTests.testFetchFlagsUIDt  s   € Ø×"Ò" 1Ñ%Ô%Ð%r6   c                ó*  — | j         j        | _        d| _        t	          i ddddd ¦  «        t	          i ddddd ¦  «        t	          i dddd	d ¦  «        t	          i dd
ddd ¦  «        g| _        ddiddiddiddidœ| _        |                      |¦  «        S )NÚ13r1   s   Fri, 02 Nov 2003 21:25:10 GMTr6   iÀZ  s   Thu, 29 Dec 2013 11:31:52 ESTée   s   Mon, 10 Mar 1992 02:44:30 CSTéÊ   s   Sat, 11 Jan 2000 14:40:24 PSTi/  r�  z02-Nov-2003 21:25:10 +0000z29-Dec-2013 11:31:52 -0500z10-Mar-1992 02:44:30 -0600z11-Jan-2000 14:40:24 -0800)r   rÅ   rÉ   rÇ   )r  ÚfetchInternalDaterê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchInternalDatez#NewFetchTests.testFetchInternalDatew  s¾   € ØœÔ5ˆŒØˆŒå˜˜RÐ!AÀ3ÈÈtÑTÔTÝ˜˜RÐ!AÀ3ÈÈTÑRÔRÝ˜˜RÐ!AÀ3ÈÈTÑRÔRÝ˜˜RÐ!AÀ3ÈÈTÑRÔRð	
ˆŒð Ð <Ð=ØÐ <Ð=ØÐ <Ð=ØÐ <Ð=ð	
ð 
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )r}  rR   s    r4   ÚtestFetchInternalDateUIDz&NewFetchTests.testFetchInternalDateUIDˆ  s   € Ø×)Ò)¨!Ñ,Ô,Ð,r6   Nú
es_AR.UTF8FTz'The es_AR.UTF8 locale is not installed.c                óþ   — t          j        t           j        d¦  «        }t          j        t           j        d¦  «         |                      t           j        t           j        |¦  «         |                      d¦  «        S )zC
        The month name in the date is locale independent.
        Nr€  rÅ   )ÚlocaleÚ	setlocaleÚLC_ALLr¬  r}  )rE   ÚcurrentLocales     r4   Ú'test_fetchInternalDateLocaleIndependentz5NewFetchTests.test_fetchInternalDateLocaleIndependent™  s\   € õ Ô(­¬¸Ñ=Ô=ˆÝÔ�œ¨Ñ5Ô5Ð5Ø�Š�Ô(­&¬-¸ÑGÔGÐGØ×)Ò)¨!Ñ,Ô,Ð,r6   c                óÞ   — | j         j        | _        d| _        t	          ddddddœdd	d	d
d ¦  «        g| _        ddddg d¢gg d¢gg d¢gg d¢gd d d dg
ii| _        |                      |¦  «        S )NÚ15zuser@domainzresu@domainÚthursdayzit is a messagezid-id-id-yayaya)rˆ   rŠ   r�  rŒ   z
message-idr1   r6   ix  r   r—  )NNry  Údomain)NNÚresurŠ  )r  ÚfetchEnveloperê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchEnvelopezNewFetchTests.testFetchEnvelope¤  sÆ   € ØœÔ1ˆŒØˆŒåà)Ø'Ø&Ø0Ø"3ðð ð ØØØØñô ð
ˆŒð" ØØØ%Ø3Ð3Ð3Ð4Ø3Ð3Ð3Ð4Ø3Ð3Ð3Ð4Ø3Ð3Ð3Ð4ØØØØ%ððð
ˆŒð  �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )r�  rR   s    r4   ÚtestFetchEnvelopeUIDz"NewFetchTests.testFetchEnvelopeUIDÉ  s   € Ø×%Ò% aÑ(Ô(Ð(r6   c                óÜ   — | j         j        | _        d| _        t	          dddddddd	d
œddddd¦  «        g| _        ddddg d¢dddddddddggdd	gii| _        |                      |¦  «        S )a[  
        L{IMAP4Client.fetchBodyStructure} issues a I{FETCH BODYSTRUCTURE}
        command and returns a Deferred which fires with a structure giving the
        result of parsing the server's response.  The structure is a list
        reflecting the parenthesized data sent by the server, as described by
        RFC 3501, section 7.4.2.
        ú3:9,10:*ú#text/plain; name=thing; key="value"úthis-is-the-content-idú!describing-the-content-goes-here!Ú8BITÚabcdef123456zattachment; filename=monkeysrP  zhttp://example.com/monkeysr/  r1   r)  ó   Body
Text
Goes
Here
éý Nr   rª  rF   Úplain©rU  r  rÂ  ÚthingÚ20r^  r6  ÚfilenamerR  ©r  ÚfetchBodyStructurerê  r   r˜   r[  rg  rb  rt  s     r4   Útest_fetchBodyStructurez%NewFetchTests.test_fetchBodyStructureÌ  sÃ   € ð œÔ6ˆŒØ"ˆŒåà$IØ":Ø+NØ17Ø#1Ø+IØ(,Ø(Dð	ð 	ð ØØ+ØØñô ð
ˆŒð( ØØØØ5Ð5Ð5Ø,Ø7ØØØØ"Ø! J°	Ð#:Ð;ØØ0ð"ðð
ˆŒð$ �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S )z�
        If passed C{True} for the C{uid} argument, C{fetchBodyStructure} can
        also issue a I{UID FETCH BODYSTRUCTURE} command.
        rÅ   )r   rR   s    r4   ÚtestFetchBodyStructureUIDz'NewFetchTests.testFetchBodyStructureUIDý  s   € ð
 ×+Ò+¨AÑ.Ô.Ð.r6   c                ó  — | j         j        | _        d| _        t	          dddddddd	d
œddddd¦  «        }t	          ddddœdddd|g¦  «        g| _        ddddg d¢ddddddddgdd	gdddgdddgii| _        |                      |¦  «        S )z”
        L{IMAP4Client.fetchBodyStructure} can also parse the response to a
        I{FETCH BODYSTRUCTURE} command for a multipart message.
        r‘  r’  r“  r”  r•  r-  Ú123456abcdefÚinlinezouter space)rŽ   r	  r
  r  r2  r0  r1  r3  r1   r6   r—  r˜  Nzmultipart/mixed; boundary="xyz"ÚenÚnearby)rŽ   r2  r3  r   rª  rF   r™  rš  rœ  r^  ÚmixedÚboundaryÚxyzrž  )rE   r©  ÚinnerMessages      r4   Ú test_fetchBodyStructureMultipartz.NewFetchTests.test_fetchBodyStructureMultipart  s  € ð
 œÔ6ˆŒØ"ˆŒÝ#à EØ6Ø'JØ-3Ø$(Ø-Ø'/Ø$1ð	ð 	ð ØØ'ØØñ
ô 
ˆõ$ à$EØ(,Ø(0ðð ð
 ØØØØ�ñô ð
ˆŒð ØàØØ9Ð9Ð9Ø0Ø;ØØØØ&Ø! 4Ð(ØØ%ðð Ø Ð'ØØØð'"ðð
ˆŒð2 �Š˜sÑ#Ô#Ð#r6   c                óÔ   — | j         j        | _        d| _        t	          i ddddt	          ddidddd d ¦  «        g¦  «        g| _        d	d
g d¢ii| _        |                      |¦  «        S )NÚ21r1   r6   ó   Yea whateveré±f rŽ   ú	image/jpgó   Body Body Bodyr   rÃ  ©NNNNNNÚ12©r  ÚfetchSimplifiedBodyrê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchSimplifiedBodyz%NewFetchTests.testFetchSimplifiedBodyE  s�   € ØœÔ7ˆŒØˆŒåØØØØØå Ø'¨Ð5ØØØ)ØØñô ð	ñô ð
ˆŒð& ˜VÐ%OÐ%OÐ%OÐPÐQˆŒà�Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )r·  rR   s    r4   ÚtestFetchSimplifiedBodyUIDz(NewFetchTests.testFetchSimplifiedBodyUID_  s   € Ø×+Ò+¨AÑ.Ô.Ð.r6   c                ó®   — | j         j        | _        d| _        t	          ddiddddd ¦  «        g| _        dd	g d
¢ii| _        |                      |¦  «        S )Nr®  rŽ   r�   r1   r6   r¯  r°  r   rÃ  )rF   r™  NNNNr´  rð   rµ  rt  s     r4   ÚtestFetchSimplifiedBodyTextz)NewFetchTests.testFetchSimplifiedBodyTextb  sn   € ØœÔ7ˆŒØˆŒåØ Ð.°°C¸È%ÐQUñô ð
ˆŒð �ÐLÐLÐLÐMð
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )r»  rR   s    r4   ÚtestFetchSimplifiedBodyTextUIDz,NewFetchTests.testFetchSimplifiedBodyTextUIDp  s   € Ø×/Ò/°Ñ2Ô2Ð2r6   c                ó  — | j         j        | _        d| _        t	          ddiddddt	          ddidd	d
d d ¦  «        g¦  «        g| _        ddddd d d d dd d g d¢gg d¢gd d d d d d g
g d¢dg
ii| _        |                      |¦  «        S )Nr®  rŽ   r?  r1   r6   r¯  r°  r±  r)  r²  r   rÃ  rŽ  r§  r´  ©NNN)r   ÚjpgNNNNÚ14rð   rµ  rt  s     r4   ÚtestFetchSimplifiedBodyRFC822z+NewFetchTests.testFetchSimplifiedBodyRFC822s  sñ   € ØœÔ7ˆŒØˆŒåØÐ!1Ð2ØØØØå Ø'¨Ð5ØØØ)ØØñô ð	ñô ð
ˆŒð( ØØØØØØØØàØØ+Ð+Ð+Ð,Ø+Ð+Ð+Ð,ØØØØØØðð CÐBÐBØð+ðð
ˆŒð8 �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )rÂ  rR   s    r4   Ú testFetchSimplifiedBodyRFC822UIDz.NewFetchTests.testFetchSimplifiedBodyRFC822UID§  s   € Ø×1Ò1°!Ñ4Ô4Ð4r6   c           	     óF  — | j         j        | _        d| _        t	          ddiddddd¦  «        t	          dd	iddd
dd¦  «        g}t	          ddidddd|¦  «        }t	          ddidddd|g¦  «        }|g| _        ddg d¢g d¢dgdgii| _        |                      d¦  «        S )ah  
        L{IMAP4Client.fetchSimplifiedBody} returns a dictionary mapping message
        sequence numbers to fetch responses for the corresponding messages.  In
        particular, for a multipart message, the value in the dictionary maps
        the string C{"BODY"} to a list giving the body structure information for
        that message, in the form of a list of subpart body structure
        information followed by the subtype of the message (eg C{"alternative"}
        for a I{multipart/alternative} message).  This structure is self-similar
        in the case where a subpart is itself multipart.
        r®  rŽ   r�   r1   s   dates   Stuffrq  Nr±   s   ThingsiŸ~  r¸   r6   s
   Irrelevantr5  zmultipart/mixeds   RootOfiÍ� r   rÃ  )rF   r™  NNNNÚ5rð   )rF   ÚhtmlNNNNrP  rð   Úalternativer¨  Frµ  )rE   ÚsinglesrÈ  r¨  s       r4   Ú!test_fetchSimplifiedBodyMultipartz/NewFetchTests.test_fetchSimplifiedBodyMultipartª  s  € ð œÔ7ˆŒØˆŒõ Ø Ð.°°G¸XÀuÈdñô õ Ø Ð-¨r°7¸IÀuÈdñô ð	
ˆõ #ØÐ4Ð5ØØØØØñ
ô 
ˆõ àÐ.Ð/ØØØØØˆMñ
ô 
ˆð �wˆŒð ØàKÐKÐKØJÐJÐJØ%ðð
 ðð	ð
ˆŒð �Š˜uÑ%Ô%Ð%r6   c                óª   — | j         j        | _        d| _        t	          ddiddddd ¦  «        g| _        dd	d
ii| _        |                      |¦  «        S )Nz1,3,7,10101rÍ  ÚValuer1   r6   s   BODY TEXT
é[   r   r¦  zHeader: Value

BODY TEXT
)r  r“  rê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchMessagezNewFetchTests.testFetchMessageê  s_   € ØœÔ0ˆŒØ%ˆŒå˜( GÐ,¨b°#Ð7GÈÈTÑRÔRð
ˆŒð ˜XÐ'KÐLÐMˆŒØ�Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )rÎ  rR   s    r4   ÚtestFetchMessageUIDz!NewFetchTests.testFetchMessageUIDó  ó   € Ø×$Ò$ QÑ'Ô'Ð'r6   c                óô   — | j         j        | _        d| _        t	          dddœddddd ¦  «        g| _        t          t          j        dddœ¦  «        ¦  «        }dd	|ii| _	        |  
                    |¦  «        S )
Nz9,6,2ÚV1ÚV2)ÚH1ÚH2r1   r6   éc   r   r   )r  ÚfetchHeadersrê  r   r˜   r[  r(   r   rd  rg  rb  )rE   r©  rœ   s      r4   ÚtestFetchHeaderszNewFetchTests.testFetchHeadersö  s†   € ØœÔ0ˆŒØˆŒå ¨DÐ1Ð1°2°s¸CÀÀTÑJÔJð
ˆŒõ �uÔ3¸4ÀtÐ4LÐ4LÑMÔMÑNÔNˆð � Ð)ð
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )rÙ  rR   s    r4   ÚtestFetchHeadersUIDz!NewFetchTests.testFetchHeadersUID  rÑ  r6   c                óª   — | j         j        | _        d| _        t	          ddiddddd ¦  «        g| _        dd	d
ii| _        |                      |¦  «        S )Nz1,2,3,4,5,6,7rÍ  rÌ  r1   r)  s   Body goes here
é«   r   r¤  zBody goes here
)r  rG  rê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchBodyzNewFetchTests.testFetchBody  sd   € ØœÔ-ˆŒØ'ˆŒå˜( GÐ,¨b°"Ð6KÈSÐRVÑWÔWð
ˆŒð �Ð3Ð4ð
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )rÞ  rR   s    r4   ÚtestFetchBodyUIDzNewFetchTests.testFetchBodyUID  ó   € Ø×!Ò! !Ñ$Ô$Ð$r6   c                óê  ‡ — ‰ j         j        ‰ _        d‰ _        d}d}d}t	          ¦   «         }d|d<   d|d<   d	|d
<   d|d<   t	          ¦   «         }d|d
<   d|d<   t	          ¦   «         }d|d
<   d|d<   t          |dd|dt          |dd|dd¦  «        t          |dd|dd¦  «        g¦  «        g‰ _        dddgdggi‰ _        ˆ fd„}‰ j         	                    ˆ fd„¦  «         ‰ j         	                    |¦  «         ‰ j         	                    ‰ j
        ¦  «         ‰ j                             ‰ j        ¦  «         t          j        ‰ j        ‰ j         d¬¦  «        }| 	                    ˆ fd„¦  «         |S )zT
        Test the server's handling of requests for specific body sections.
        rð   r)  r¡   r¯   r‡   rˆ   r‰   rŠ   r‹   rŒ   r¢   rŽ   r£   r�   r°   r±   r1   Nr�   r   rÃ  z&Contained body message text.  Squarge.c                ó   •— | ‰_         d S r0   rí  rî  s    €r4   r2   z0NewFetchTests.testFetchBodyParts.<locals>.result8  rð  r6   c                ó<   •— ‰                      ‰j        d¬¦  «        S )NrÅ   rS  r_  r?  s    €r4   r5   z2NewFetchTests.testFetchBodyParts.<locals>.<lambda><  s   ø€ �d—m’m D¤MÀ�mÑBÔB€ r6   Frô  c                óD   •— ‰                      ‰j        ‰j        ¦  «        S r0   ra  ©ÚignrE   s    €r4   r5   z2NewFetchTests.testFetchBodyParts.<locals>.<lambda>C  ó   ø€  $×"2Ò"2°4´;ÀÄÑ"NÔ"N€ r6   ©r  rµ  rê  r   r   r˜   r[  rg  r  r›   r
  r+  r  r#   r÷  r  )	rE   r«   r³   r´   rœ   r¬   rµ   r2   rž   s	   `        r4   ÚtestFetchBodyPartsz NewFetchTests.testFetchBodyParts  sÅ  ø€ ð œÔ1ˆŒØˆŒØˆ	Ø>ˆ
ØFˆ
Ý‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ"Iˆ�ÑÝ"‘}”}ˆØ"8ˆ�YÑØ'3ˆ�^Ñ$Ý#™œˆØ#;ˆ�iÑ Ø(3ˆ�nÑ%åØØØØØå  ¨r°4¸ÀTÈ4ÑPÔPÝ  °°D¸*ÀdÈDÑQÔQðñ
ô 
ð
ˆŒð ˜f s eÐ-UÐVÐWÐXˆŒð	ð 	ð 	ð 	ð 	ð 	Œ×"Ò"ØBÐBÐBÐBñ	
ô 	
ð 	
ð 	Œ×"Ò" 6Ñ*Ô*Ð*ØŒ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2åÔ  ¤¨d¬kÀÐGÑGÔGˆØ	�ŠÐNÐNÐNÐNÑOÔOÐOØˆr6   c                ó@  ‡ ‡— ‰ j         j        ‰ _        d‰ _        dgŠd}t	          ¦   «         }d|d<   d|d<   d|d	<   d
|d<   t          |dd|dd¦  «        g‰ _        dddgdggi‰ _        ˆ fd„}‰ j         	                    ˆˆ fd„¦  «         ‰ j         	                    |¦  «         ‰ j         	                    ‰ j
        ¦  «         ‰ j                             ‰ j        ¦  «         t          j        ‰ j        ‰ j         d¬¦  «        }| 	                    ˆ fd„¦  «         |S )z÷
        Single-part messages have an implicit first part which clients
        should be able to retrieve explicitly.  Test that a client
        requesting part 1 of a text/plain message receives the body of the
        text/plain part.
        rð   rÅ   s   DA bodyr‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r1   Nr�   r   rÃ  zDA bodyc                ó   •— | ‰_         d S r0   rí  rî  s    €r4   r2   z>NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.resultZ  rð  r6   c                ó<   •— ‰                      ‰j        ‰¬¦  «        S )NrS  r_  )r*  ÚpartsrE   s    €€r4   r5   z@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>^  s   ø€ �d—m’m D¤MÀ�mÑFÔF€ r6   Frô  c                óD   •— ‰                      ‰j        ‰j        ¦  «        S r0   ra  ræ  s    €r4   r5   z@NewFetchTests.test_fetchBodyPartOfNonMultipart.<locals>.<lambda>e  rè  r6   ré  )rE   r«   rœ   r2   rž   rî  s   `    @r4   Ú test_fetchBodyPartOfNonMultipartz.NewFetchTests.test_fetchBodyPartOfNonMultipartF  sQ  øø€ ð œÔ1ˆŒØˆŒØ�ˆØˆ	Ý‘-”-ˆØ'ˆ�‰Ø*ˆ�‰Ø.ˆ�	ÑØ".ˆ�ÑÝ$ W¨b°$¸	À3ÈÑMÔMÐNˆŒà˜f s e¨YÐ7Ð8Ð9ˆŒð	ð 	ð 	ð 	ð 	ð 	Œ×"Ò"ØFÐFÐFÐFÐFñ	
ô 	
ð 	
ð 	Œ×"Ò" 6Ñ*Ô*Ð*ØŒ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2åÔ  ¤¨d¬kÀÐGÑGÔGˆØ	�ŠÐNÐNÐNÐNÑOÔOÐOØˆr6   c                ó¦   — | j         j        | _        d| _        t	          i ddddd ¦  «        g| _        dddii| _        |                      |¦  «        S )	Nz	1:100,2:*r1   r6   s   xxxxxxxxxxxxxxxxxxxxr�   r   r¢  rœ  )r  Ú	fetchSizerê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchSizezNewFetchTests.testFetchSizeh  s\   € ØœÔ-ˆŒØ#ˆŒå˜˜R  i°°dÑ;Ô;ð
ˆŒð �˜tÐ$ð
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )ró  rR   s    r4   ÚtestFetchSizeUIDzNewFetchTests.testFetchSizeUIDs  rá  r6   c                ó2  — | j         j        | _        d| _        t	          i ddddd ¦  «        t	          i dddd	d ¦  «        g| _        g d¢d
dd d g d¢gg d¢gd d d d d d g
g d¢dœg d¢ddd d g d¢gg d¢gd d d d d d g
g d¢dœdœ| _        |                      |¦  «        S )Nz1,3)z\XYZz\YZXÚAbcs%   Sun, 25 Jul 2010 06:20:30 -0400 (EDT)s   xyzxyziŽ  )z\Onez\TwoÚThrees   Mon, 14 Apr 2003 19:43:44 -0400s   abcabcabcabcrG  z25-Jul-2010 06:20:30 -0400rP  r¿  )NNNNNNrP  )rš  r�  r¢  r—  rÃ  z14-Apr-2003 19:43:44 -0400r´  r³  rr  )r  Ú	fetchFullrê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchFullzNewFetchTests.testFetchFullv  s9  € ØœÔ-ˆŒØˆŒåØØ)Ø8ØØØñô õ ØØ+Ø2ØØØñô ð
ˆŒð( 3Ð2Ð2Ø <Ø"àØØ'Ð'Ð'Ð(Ø'Ð'Ð'Ð(ØØØØØØðð BÐAÐAð!ð ð& 5Ð4Ð4Ø <Ø#àØØ'Ð'Ð'Ð(Ø'Ð'Ð'Ð(ØØØØØØðð CÐBÐBð!ð ð'%
ð %
ˆŒðL �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )rú  rR   s    r4   ÚtestFetchFullUIDzNewFetchTests.testFetchFullUID³  rá  r6   c                ó  — | j         j        | _        d| _        t	          i ddddd ¦  «        t	          i ddddd ¦  «        g| _        d d g d	¢gg d	¢gd d d d d d g
d
dg dœd d g d	¢gg d	¢gd d d d d d g
d
dg dœdœ| _        |                      |¦  «        S )Nz1,2:3r1   s   Mon, 14 Apr 2003 19:43:44 +0400s   Lalalarh  s   Tue, 15 Apr 2003 19:43:44 +0200s   AlalaliêN  r¿  rP  z14-Apr-2003 19:43:44 +0400)r—  r¢  r�  rš  z15-Apr-2003 19:43:44 +0200rr  )r  ÚfetchAllrê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchAllzNewFetchTests.testFetchAll¶  s  € ØœÔ,ˆŒØˆŒåØ�BÐ:¸IÀuÈdñô õ Ø�BÐ:¸IÀuÈdñô ð	
ˆŒð ØØ'Ð'Ð'Ð(Ø'Ð'Ð'Ð(ØØØØØØðð  #Ø <Øðð ð& ØØ'Ð'Ð'Ð(Ø'Ð'Ð'Ð(ØØØØØØðð  #Ø <Øðð ð%#
ð #
ˆŒðH �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )rÿ  rR   s    r4   ÚtestFetchAllUIDzNewFetchTests.testFetchAllUIDç  s   € Ø× Ò  Ñ#Ô#Ð#r6   c                ó¬   — | j         j        | _        d| _        t	          i ddddd ¦  «        g| _        ddgdd	d
œi| _        |                      |¦  «        S )Nrð   )ú\Xs   19 Mar 2003 19:22:21 -0500r6   r÷   r   r	  z19-Mar-2003 19:22:21 -0500Ú0)rš  r�  r¢  )r  Ú	fetchFastrê  r   r˜   r[  rg  rb  rt  s     r4   ÚtestFetchFastzNewFetchTests.testFetchFastê  sk   € ØœÔ-ˆŒØˆŒå˜˜XÐ'DÀcÈ1ÈdÑSÔSð
ˆŒð Ø˜Ø <Ø"ðð ð
ˆŒð �Š˜sÑ#Ô#Ð#r6   c                ó,   — |                       d¦  «        S rt  )r	  rR   s    r4   ÚtestFetchFastUIDzNewFetchTests.testFetchFastUIDù  rá  r6   rÅ  )1rs   rt   ru   r  ri  rk  r   rb  rl  ru  rw  r}  r  r‚  rƒ  r„  r…  ÚnoEsARLocaleÚErrorr
   r†  r�  r�  r   r¢  r¬  r·  r¹  r»  r½  rÂ  rÄ  rÊ  rÎ  rÐ  rÙ  rÛ  rÞ  rà  rê  rð  ró  rõ  rú  rü  rÿ  r	  r	  r	  r1   r6   r4   rU  rU  /  sK  € € € € € ð3ð 3ð 3ðð ð ðð ð ðAð Að Að
ð ð ð$"ð "ð "ð $ð $ð $ð $ð&ð &ð &ð$ð $ð $ð $ð"-ð -ð -ð %�FÔ$ V¤]°DÑ9Ô9€MðØˆÔ˜œ¨Ñ5Ô5Ð5ð 	ˆÔ˜œ¨Ñ6Ô6Ð6Øˆˆøð	 Œ<ð ð ð Øˆˆˆðøøøð €VˆLÐCÑDÔDð-ð -ñ EÔDð-ð#$ð #$ð #$ð #$ðJ)ð )ð )ð/$ð /$ð /$ð /$ðb/ð /ð /ð?$ð ?$ð ?$ð ?$ðB$ð $ð $ð $ð4/ð /ð /ð$ð $ð $ð $ð3ð 3ð 3ð2$ð 2$ð 2$ð 2$ðh5ð 5ð 5ð>&ð >&ð >&ð@$ð $ð $ð $ð(ð (ð (ð$ð $ð $ð $ð(ð (ð (ð	$ð 	$ð 	$ð 	$ð%ð %ð %ð/ð /ð /ðb ð  ð  ðD	$ð 	$ð 	$ð 	$ð%ð %ð %ð;$ð ;$ð ;$ð ;$ðz%ð %ð %ð/$ð /$ð /$ð /$ðb$ð $ð $ð$ð $ð $ð $ð%ð %ð %ð %ð %s   ¼A+ Á+A:Á9A:rU  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d„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚDefaultSearchTestszz
    Test the behavior of the server's SEARCH implementation, particularly in
    the face of unhandled search terms.
    c                ó”  — t          j        ¦   «         | _        d| j        _        | | j        _        t          j        ¦   «         | _        t          | j        ¦  «        | _	        t          i ddddd ¦  «        t          i ddddd ¦  «        t          i ddddd ¦  «        t          i ddddd ¦  «        t          i ddddd ¦  «        g| _        d S )	NrÇ  r1   r6   rg  rh  r5  i!N  i"N  )r   rÓ  r  rV  r_  r   r   r  rã  r  r˜   r[  rR   s    r4   r  zDefaultSearchTests.setUp  s¼   € ÝÔ'Ñ)Ô)ˆŒØ$ˆŒÔØˆŒÔÝœÑ)Ô)ˆŒÝ" 4¤>Ñ2Ô2ˆŒå˜˜R  c¨3°Ñ5Ô5Ý˜˜R  c¨5°$Ñ7Ô7Ý˜˜R  c¨5°$Ñ7Ô7Ý˜˜R  c¨5°$Ñ7Ô7Ý˜˜R  c¨5°$Ñ7Ô7ð
ˆŒˆˆr6   c           
     óŒ   — t          t          t          dt          | j        ¦  «        dz   ¦  «        | j        ¦  «        ¦  «        S )zW
        Pretend to be a mailbox and let C{self.server} lookup messages on me.
        rÅ   )rÑ   rä   rn   rÐ   r[  rŸ  s      r4   r   zDefaultSearchTests.fetch  s7   € õ •C�˜a¥ T¤\Ñ!2Ô!2°QÑ!6Ñ7Ô7¸¼ÑFÔFÑGÔGÐGr6   c                ó,  ‡ ‡‡— ˆˆ fd„}‰ j                              t          |¦  «        ¦  «        }ˆˆ fd„}|                     |¦  «         |                     ‰ j        ¦  «         |                     ‰ j        ¦  «         ‰                      ¦   «          |S )a€  
        Issue a search with given query and verify that the returned messages
        match the given expected messages.

        @param queryTerms: A string giving the search query.
        @param expectedMessages: A list of the message sequence numbers
            expected as the result of the search.
        @return: A L{Deferred} which fires when the test is complete.
        c                 ó8   •— ‰j                              ‰ ¦  «        S r0   ©r  r'  ©Ú
queryTermsrE   s   €€r4   r'  z8DefaultSearchTests._messageSetSearchTest.<locals>.search"  r±  r6   c                ó4   •— ‰                      | ‰¦  «         d S r0   r)  )rO  ÚexpectedMessagesrE   s    €€r4   Úsearchedz:DefaultSearchTests._messageSetSearchTest.<locals>.searched'  s    ø€ Ø×Ò˜WÐ&6Ñ7Ô7Ð7Ð7Ð7r6   )r  r›   r7   r
  r+  r  r#   )rE   r	  r	  r'  rž   r	  s   ```   r4   Ú_messageSetSearchTestz(DefaultSearchTests._messageSetSearchTest  s­   øøø€ ð	2ð 	2ð 	2ð 	2ð 	2ð 	2ð ŒN×&Ò&¥u¨V¡}¤}Ñ5Ô5ˆð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	
�Š�hÑÔÐØ	�Š�dÔ(Ñ)Ô)Ð)Ø	�Š�T”_Ñ%Ô%Ð%Ø�Š‰ŒˆØˆr6   c                ó0   — |                       ddg¦  «        S )zˆ
        Test that a search which starts with a message set properly limits
        the search results to messages in that set.
        rð   rÅ   ©r	  rR   s    r4   Útest_searchMessageSetz(DefaultSearchTests.test_searchMessageSet0  s   € ð
 ×)Ò)¨#°¨sÑ3Ô3Ð3r6   c                ó2   — |                       dg d¢¦  «        S )zv
        If the search filter ends with a star, all the message from the
        starting point are returned.
        z2:*r=  r	  rR   s    r4   Útest_searchMessageSetWithStarz0DefaultSearchTests.test_searchMessageSetWithStar7  ó   € ð
 ×)Ò)¨%°°°Ñ>Ô>Ð>r6   c                ó2   — |                       dg d¢¦  «        S )z‹
        If the search filter starts with a star, the result should be identical
        with if the filter would end with a star.
        z*:2r=  r	  rR   s    r4   Ú"test_searchMessageSetWithStarFirstz5DefaultSearchTests.test_searchMessageSetWithStarFirst>  r	  r6   c                ó2   — |                       dg d¢¦  «        S )z•
        If the search filter ends with a star, all the message from the
        starting point are returned (also for the SEARCH UID case).
        zUID 10000:*r=  r	  rR   s    r4   Ú test_searchMessageSetUIDWithStarz3DefaultSearchTests.test_searchMessageSetUIDWithStarE  ó   € ð
 ×)Ò)¨-¸¸¸ÑFÔFÐFr6   c                ó2   — |                       dg d¢¦  «        S )zª
        If the search filter starts with a star, the result should be identical
        with if the filter would end with a star (also for the SEARCH UID case).
        zUID *:10000r=  r	  rR   s    r4   Ú%test_searchMessageSetUIDWithStarFirstz8DefaultSearchTests.test_searchMessageSetUIDWithStarFirstL  r"	  r6   c                ó0   — |                       ddg¦  «        S )z‘
        A search filter of 1234:* should include the UID of the last message in
        the mailbox, even if its UID is less than 1234.
        zUID 30000:*rÊ   r	  rR   s    r4   Ú,test_searchMessageSetUIDWithStarAndHighStartz?DefaultSearchTests.test_searchMessageSetUIDWithStarAndHighStartS  s   € ð ×)Ò)¨-¸!¸Ñ=Ô=Ð=r6   c                ó0   — |                       ddg¦  «        S )z—
        If the search filter contains nesting terms, one of which includes a
        message sequence set with a wildcard, IT ALL WORKS GOOD.
        z(6:*)rÊ   r	  rR   s    r4   Útest_searchMessageSetWithListz0DefaultSearchTests.test_searchMessageSetWithList[  s   € ð ×)Ò)¨'°A°3Ñ7Ô7Ð7r6   c                ó2   — |                       dddg¦  «        S )z‚
        If the search filter contains an I{OR} term, all messages
        which match either subexpression are returned.
        zOR 1 2rÅ   rÉ   r	  rR   s    r4   rq  z DefaultSearchTests.test_searchOre  s   € ð
 ×)Ò)¨(°Q¸°FÑ;Ô;Ð;r6   c                ó2   — |                       dg d¢¦  «        S )zà
        If the search filter contains an I{OR} term with a
        subexpression which includes a message sequence set wildcard,
        all messages in that set are considered for inclusion in the
        results.
        z
OR 2:* 2:*r=  r	  rR   s    r4   Útest_searchOrMessageSetz*DefaultSearchTests.test_searchOrMessageSetl  s   € ð ×)Ò)¨,¸¸¸ÑEÔEÐEr6   c                ó2   — |                       dg d¢¦  «        S )z†
        If the search filter contains a I{NOT} term, all messages
        which do not match the subexpression are returned.
        zNOT 3)rÅ   rÉ   rË   rÊ   r	  rR   s    r4   rt  z!DefaultSearchTests.test_searchNotu  s   € ð
 ×)Ò)¨'°<°<°<Ñ@Ô@Ð@r6   c                ó0   — |                       ddg¦  «        S )zÞ
        If the search filter contains a I{NOT} term with a
        subexpression which includes a message sequence set wildcard,
        no messages in that set are considered for inclusion in the
        result.
        zNOT 2:*rÅ   r	  rR   s    r4   Útest_searchNotMessageSetz+DefaultSearchTests.test_searchNotMessageSet|  s   € ð ×)Ò)¨)°a°SÑ9Ô9Ð9r6   c                ó0   — |                       ddg¦  «        S )zÉ
        If the search filter contains multiple terms implicitly
        conjoined with a message sequence set wildcard, only the
        intersection of the results of each term are returned.
        z2:* 3rÇ   r	  rR   s    r4   Útest_searchAndMessageSetz+DefaultSearchTests.test_searchAndMessageSet…  s   € ð ×)Ò)¨'°A°3Ñ7Ô7Ð7r6   c                ó8  ‡ ‡— dŠˆˆ fd„}‰ j                              t          |¦  «        ¦  «        }‰                      |t          j        ¦  «        }ˆ fd„}|                     |¦  «         |                     ‰ j        ¦  «         ‰                      ¦   «          |S )zË
        If the search criteria is not a valid key, a NO result is returned to
        the client (resulting in an error callback), and an IllegalQueryError is
        logged on the server side.
        ÚFOOc                 ó8   •— ‰j                              ‰ ¦  «        S r0   r	  r	  s   €€r4   r'  z=DefaultSearchTests.test_searchInvalidCriteria.<locals>.search•  r±  r6   c                ód  •— ‰j         j                             ¦   «          ‰j        j                             ¦   «          ‰                     t
          j        ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d¦  «        t          | ¦  «        ¦  «         dS )ú—
            Verify that the server logs an IllegalQueryError and the
            client raises an IMAP4Exception with 'Search failed:...'
            rÅ   s)   SEARCH failed: Invalid search command FOON©
r  rð  rñ  r  r�  r   r%  rB   rÐ   rå   ©rO  rz  rE   s     €r4   ÚerrorReceivedzDDefaultSearchTests.test_searchInvalidCriteria.<locals>.errorReceived›  s    ø€ ð
 ŒKÔ!×0Ò0Ñ2Ô2Ð2ØŒKÔ!×0Ò0Ñ2Ô2Ð2ð ×+Ò+­EÔ,CÑDÔDˆFØ×Ò�S ™[œ[¨!Ñ,Ô,Ð,ð ×ÒÝÐ@ÑAÔAÝ�G‘”ñô ð ð ð r6   ©	r  r›   r7   rÞ  r   r  r+  r  r#   )rE   r'  rž   r8	  r	  s   `   @r4   Útest_searchInvalidCriteriaz-DefaultSearchTests.test_searchInvalidCriteria�  s±   øø€ ð ˆ
ð	2ð 	2ð 	2ð 	2ð 	2ð 	2ð ŒN×&Ò&¥u¨V¡}¤}Ñ5Ô5ˆØ×Ò˜q¥%Ô"6Ñ7Ô7ˆð	ð 	ð 	ð 	ð 	ð$ 	
�Š�mÑ$Ô$Ð$Ø	�Š�T”_Ñ%Ô%Ð%Ø�Š‰ŒˆØˆr6   N)rs   rt   ru   r2  r  r   r	  r	  r	  r	  r!	  r$	  r&	  r(	  rq  r+	  rt  r.	  r0	  r:	  r1   r6   r4   r	  r	  ý  s  € € € € € ðð ð

ð 
ð 
ðHð Hð Hðð ð ð24ð 4ð 4ð?ð ?ð ?ð?ð ?ð ?ðGð Gð GðGð Gð Gð>ð >ð >ð8ð 8ð 8ð<ð <ð <ðFð Fð FðAð Að Að:ð :ð :ð8ð 8ð 8ð#ð #ð #ð #ð #r6   r	  c                  óN   — e Zd Zd„ Zd„ Zd„ ZeZd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ ZdS )ÚFetchSearchStoreTestsc                ó  — d x| _         | _        d | _        d | _        d | _        d | _        t          j        ¦   «         | _        d| j        _	        | | j        _
        t          j        ¦   «         | _        t          | j        ¦  «        | _        d S rà  )rg  r2   Úserver_received_queryÚserver_received_uidÚserver_received_partsÚserver_received_messagesr   rÓ  r  rV  r_  r   r   r  rã  r  rR   s    r4   r  zFetchSearchStoreTests.setUpµ  sx   € Ø&*Ð*ˆŒ˜œØ%)ˆÔ"Ø#'ˆÔ Ø%)ˆÔ"Ø(,ˆÔ%åÔ'Ñ)Ô)ˆŒØ$ˆŒÔØˆŒÔÝœÑ)Ô)ˆŒÝ" 4¤>Ñ2Ô2ˆŒˆˆr6   c                ób   — |dgk    rt          j        d¦  «        ‚|| _        || _        | j        S )Nr…  z"FOO is not a valid search criteria)r   r%  r>	  r?	  rg  )rE   r  r©  s      r4   r'  zFetchSearchStoreTests.searchÂ  s9   € à�V�HÒÐÝÔ)Ð*NÑOÔOÐOà%*ˆÔ"Ø#&ˆÔ ØŒ}Ðr6   c                ó   — d S r0   r1   )rE   rä  rÛ  s      r4   ri  z!FetchSearchStoreTests.addListenerË  r€  r6   c                ój  ‡ ‡— ˆ ˆfd„}ˆ fd„}‰ j                              t          |¦  «        ¦  «                             |¦  «                             ‰ j        ¦  «                             ‰ j        ¦  «         ˆ fd„}t          j        ‰ j        ‰ j	        d¬¦  «        }|                     |¦  «         |S )Nc                 óF   •— ‰ j                              ‰ j        ‰¬¦  «        S )Nr  )r  r'  r  rt  s   €€r4   r'  z1FetchSearchStoreTests._searchWork.<locals>.searchÑ  s    ø€ Ø”;×%Ò% d¤j°cÐ%Ñ:Ô:Ð:r6   c                ó   •— | ‰_         d S r0   rí  rî  s    €r4   r2   z1FetchSearchStoreTests._searchWork.<locals>.resultÔ  rð  r6   c                óT  •— ‰                      ‰j        ‰j        u ¦  «         ‰                     ‰j        ‰j        ¦  «         ‰                     ‰j        ‰j        ¦  «         ‰                     t          j        ‰j         	                    d¦  «        ¦  «        ‰j
        ¦  «         d S )NÚcharmap)rS  r2   rg  rB   r©  r?	  r   rŒ  r  rC   r>	  ró  s    €r4   rŽ  z0FetchSearchStoreTests._searchWork.<locals>.checkÛ  s�   ø€ à×Ò˜Tœ[¨D¬MÐ9Ñ:Ô:Ð:à×Ò˜Tœ[¨$¬-Ñ8Ô8Ð8Ø×Ò˜TœX tÔ'?Ñ@Ô@Ð@Ø×Òõ Ô'¨¬
×(9Ò(9¸)Ñ(DÔ(DÑEÔEØÔ*ñ	ô ð ð ð r6   Frô  rö  )rE   r©  r'  r2   rŽ  rž   s   ``    r4   Ú_searchWorkz!FetchSearchStoreTests._searchWorkÐ  sÙ   øø€ ð	;ð 	;ð 	;ð 	;ð 	;ð 	;ð	ð 	ð 	ð 	ð 	ð 	Œ×"Ò"¥5¨¡=¤=Ñ1Ô1×=Ò=¸fÑEÔE×QÒQØÔñ	
ô 	
ç
Š*�T”_Ñ
%Ô
%Ð
%ð	ð 	ð 	ð 	ð 	õ Ô  ¤¨d¬kÀÐGÑGÔGˆØ	�Š�eÑÔÐØˆr6   c                óÎ   — t          j        t          j        d¬¦  «        t          j        dd¬¦  «        ¦  «        | _        g d¢| _        d| _        |                      d¦  «        S )N©rŒ   Ú	substring©rË  é   é   ©r  r
  )rÅ   rË   rÊ   rÎ   r   )r   r  r  r  rg  r©  rI	  rR   s    r4   Ú
testSearchz FetchSearchStoreTests.testSearchì  s`   € Ý”XÝŒKÐ7Ð8Ñ8Ô8ÝŒK˜t¨TÐ2Ñ2Ô2ñ
ô 
ˆŒ
ð %˜˜ˆŒØˆŒØ×Ò Ñ"Ô"Ð"r6   c                óÎ   — t          j        t          j        d¬¦  «        t          j        dd¬¦  «        ¦  «        | _        d| _        g d¢| _        |                      d¦  «        S )NrK	  rM	  rN	  rO	  rP	  rÅ   rÈ   )r   r  r  r  r©  rg  rI	  rR   s    r4   ÚtestUIDSearchz#FetchSearchStoreTests.testUIDSearchõ  s`   € Ý”XÝŒKÐ7Ð8Ñ8Ô8ÝŒK˜t¨TÐ2Ñ2Ô2ñ
ô 
ˆŒ
ð ˆŒØ!˜	˜	ˆŒØ×Ò Ñ"Ô"Ð"r6   c                ó�   — 	 | j         |         d         S # t          t          f$ r | j         |dz
           cY S t          $ r Y dS w xY w)Nr¨  rÅ   rr  )rg  rØ   Ú
IndexErrorÚKeyError©rE   r�   s     r4   r…  zFetchSearchStoreTests.getUIDþ  si   € ð	Ø”= Ô% eÔ,Ð,øÝ�:Ð&ð 	*ð 	*ð 	*Ø”=  q¡Ô)Ð)Ð)Ð)Ýð 	ð 	ð 	Ø�2�2ð	øøøs   ‚ •!A¸	AÁAc                óF   — || _         t          |¦  «        | _        | j        S r0   )r?	  rå   rA	  rg  rŸ  s      r4   r   zFetchSearchStoreTests.fetch  s    € Ø#&ˆÔ Ý(+¨H©¬ˆÔ%ØŒ}Ðr6   c                ó\  ‡ — ˆ fd„}‰ j                              t          |¦  «        ¦  «                             |¦  «                             ‰ j        ¦  «                             ‰ j        ¦  «         ˆ fd„}t          j        ‰ j        ‰ j	        d¬¦  «        }|                     |¦  «         |S )Nc                ó   •— | ‰_         d S r0   rí  rî  s    €r4   r2   z0FetchSearchStoreTests._fetchWork.<locals>.result  rð  r6   c                ó‚  •— ‰                      ‰j        ‰j        u ¦  «         ‰j        o‰j                             ¦   «          ‰j        o‰j                             ¦   «          ‰j        r1‰j                             ¦   «         D ]\  }}t          |¦  «        |d<   Œ‰ 	                    ‰j        ‰j        ¦  «         ‰ 	                    ‰j        ‰j
        ¦  «         ‰ 	                    ‰j        ‰j        ¦  «         ‰ 	                    t          j        ‰j        ¦  «        t          j        ‰j        ¦  «        ¦  «         d S )Nr¨  )rS  r2   rg  rî  r¿  r@	  r©  rW  rå   rB   r?	  r   rã   r   rA	  )rX  ÚkÚvrE   s      €r4   rŽ  z/FetchSearchStoreTests._fetchWork.<locals>.check  s!  ø€ à×Ò˜Tœ[¨D¬MÐ9Ñ:Ô:Ð:àŒJÐ,˜4œ:Ÿ?š?Ñ,Ô,øØÔ&ÐL¨4Ô+E×+JÒ+JÑ+LÔ+LøàŒxð &Ø œM×/Ò/Ñ1Ô1ð &ð &‘D�A�qÝ" 1™vœv�A�e‘H�Hà×Ò˜Tœ[¨$¬-Ñ8Ô8Ð8Ø×Ò˜TœX tÔ'?Ñ@Ô@Ð@Ø×Ò˜TœZ¨Ô)CÑDÔDÐDØ×ÒÝÔ! $¤-Ñ0Ô0ÝÔ! $Ô"?Ñ@Ô@ñô ð ð ð r6   Frô  rö  )rE   r   r2   rŽ  rž   s   `    r4   rb  z FetchSearchStoreTests._fetchWork  sº   ø€ ð	ð 	ð 	ð 	ð 	ð 	Œ×"Ò"¥5¨¡<¤<Ñ0Ô0×<Ò<¸VÑDÔD×PÒPØÔñ	
ô 	
ç
Š*�T”_Ñ
%Ô
%Ð
%ð	ð 	ð 	ð 	ð 	õ& Ô  ¤¨d¬kÀÐGÑGÔGˆØ	�Š�eÑÔÐØˆr6   c                ó8  ‡ ‡— dŠˆˆ fd„}‰ j                              t          |¦  «        ¦  «        }‰                      |t          j        ¦  «        }ˆ fd„}|                     |¦  «         |                     ‰ j        ¦  «         ‰                      ¦   «          |S )zå
        If, as part of a search, an ISearchableMailbox raises an
        IllegalQueryError (e.g. due to invalid search criteria), client sees a
        failure response, and an IllegalQueryError is logged on the server.
        r2	  c                 ó8   •— ‰j                              ‰ ¦  «        S r0   r	  )r  rE   s   €€r4   r'  z6FetchSearchStoreTests.test_invalidTerm.<locals>.search2  s   ø€ Ø”;×%Ò% eÑ,Ô,Ð,r6   c                ód  •— ‰j         j                             ¦   «          ‰j        j                             ¦   «          ‰                     t
          j        ¦  «        }‰                     t          |¦  «        d¦  «         ‰                     t          d¦  «        t          | ¦  «        ¦  «         dS )r5	  rÅ   s1   SEARCH failed: FOO is not a valid search criteriaNr6	  r7	  s     €r4   r8	  z=FetchSearchStoreTests.test_invalidTerm.<locals>.errorReceived8  sŸ   ø€ ð
 ŒKÔ!×0Ò0Ñ2Ô2Ð2ØŒKÔ!×0Ò0Ñ2Ô2Ð2ð ×+Ò+­EÔ,CÑDÔDˆFØ×Ò�S ™[œ[¨!Ñ,Ô,Ð,ð ×ÒÝÐHÑIÔIÍ3ÈwÉ<Ì<ñô ð ð ð r6   r9	  )rE   r'  rž   r8	  r  s   `   @r4   Útest_invalidTermz&FetchSearchStoreTests.test_invalidTerm*  s±   øø€ ð ˆð	-ð 	-ð 	-ð 	-ð 	-ð 	-ð ŒN×&Ò&¥u¨V¡}¤}Ñ5Ô5ˆØ×Ò˜q¥%Ô"6Ñ7Ô7ˆð	ð 	ð 	ð 	ð 	ð" 	
�Š�mÑ$Ô$Ð$Ø	�Š�T”_Ñ%Ô%Ð%Ø�Š‰ŒˆØˆr6   N)rs   rt   ru   r  r'  ri  rk  rI	  rQ	  rS	  r…  r   rb  ra	  r1   r6   r4   r<	  r<	  ³  s±   € € € € € ð3ð 3ð 3ðð ð ðð ð ð !€Nðð ð ð8#ð #ð #ð#ð #ð #ðð ð ðð ð ð
ð ð ð>"ð "ð "ð "ð "r6   r<	  c                  ó   — e Zd Zd„ Zd„ ZdS )ÚFakeMailboxc                ó   — g | _         d S r0   )rÚ  rR   s    r4   rz   zFakeMailbox.__init__P  ó   € ØˆŒ	ˆ	ˆ	r6   c                ód   — | j                              |||f¦  «         t          j        d ¦  «        S r0   )rÚ  r|   r   rZ  )rE   r“   rœ  r�  s       r4   r�  zFakeMailbox.addMessageS  s/   € ØŒ	×Ò˜$  tÐ,Ñ-Ô-Ð-ÝŒ}˜TÑ"Ô"Ð"r6   N)rs   rt   ru   rz   r�  r1   r6   r4   rc	  rc	  O  s2   € € € € € ðð ð ð#ð #ð #ð #ð #r6   rc	  c                  ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚFeaturefulMessagec                ó   — dS )Nrœ  r1   rR   s    r4   ro  zFeaturefulMessage.getFlagsZ  s   € Øˆwr6   c                ó   — dS )NrŸ  r1   rR   s    r4   rÐ  z!FeaturefulMessage.getInternalDate]  s   € Øˆ~r6   c                ó    — t          d¦  «        S )Nó   openr   rR   s    r4   r  zFeaturefulMessage.open`  s   € Ý�wÑÔÐr6   N)rs   rt   ru   ro  rÐ  r  r1   r6   r4   rh	  rh	  X  sA   € € € € € ðð ð ðð ð ð ð  ð  ð  ð  r6   rh	  c                  ó   — e Zd Zd„ Zd„ ZdS )ÚMessageCopierMailboxc                ó   — g | _         d S r0   )ÚmsgsrR   s    r4   rz   zMessageCopierMailbox.__init__f  re	  r6   c                ó^   — | j                              |¦  «         t          | j         ¦  «        S r0   )rp	  r|   rÐ   rW	  s     r4   r¶  zMessageCopierMailbox.copyi  s&   € ØŒ	×Ò˜ÑÔÐÝ�4”9‰~Œ~Ðr6   N)rs   rt   ru   rz   r¶  r1   r6   r4   rn	  rn	  d  s2   € € € € € ðð ð ðð ð ð ð r6   rn	  c                  ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚCopyWorkerTestsc                óÖ   ‡ ‡— t          j        ¦   «         }|j        }t          ¦   «         Š |d„ t	          dd¦  «        D ¦   «         d‰¦  «        }ˆˆ fd„}|                     |¦  «        S )Nc                ó.   — g | ]}|t          ¦   «         f‘ŒS r1   )rh	  r+  s     r4   r¾  z9CopyWorkerTests.testFeaturefulMessage.<locals>.<listcomp>}  s$   € Ð>Ð>Ð>¨A�Õ$Ñ&Ô&Ð'Ð>Ð>Ð>r6   rÅ   r@  rÞ  c                óN  •— ‰j         D ]h}‰                     |d                              ¦   «         d¦  «         ‰                     |d         d¦  «         ‰                     |d         d¦  «         Œi| D ]0\  }}‰                     |¦  «         ‰                     |d ¦  «         Œ1d S )Nr   rl	  rÅ   rœ  rÉ   rŸ  )rÚ  rB   rW   rU  )rO  rä  rh  r2   ró   rE   s       €€r4   ÚcbCopyz5CopyWorkerTests.testFeaturefulMessage.<locals>.cbCopy  sµ   ø€ Ø”Vð 7ð 7�Ø× Ò   1¤§¢¡¤¨gÑ6Ô6Ð6Ø× Ò   1¤ wÑ/Ô/Ð/Ø× Ò   1¤ ~Ñ6Ô6Ð6Ð6à")ð /ð /‘�˜Ø—’ Ñ'Ô'Ð'Ø× Ò  ¨Ñ.Ô.Ð.Ð.ð/ð /r6   )r   rÓ  Ú_IMAP4Server__cbCopyrc	  rn   r›   )rE   r{  r3   rž   rw	  ró   s   `    @r4   ÚtestFeaturefulMessagez%CopyWorkerTests.testFeaturefulMessageo  s�   øø€ ÝÔÑÔˆð Ô"ˆå‰MŒMˆØˆAÐ>Ð>µ°q¸"±´Ð>Ñ>Ô>ÀÀqÑIÔIˆð	/ð 	/ð 	/ð 	/ð 	/ð 	/ð �}Š}˜VÑ$Ô$Ð$r6   c           	     ó&  ‡ ‡— t          j        ¦   «         }|j        }t          ¦   «         Šd„ t	          dd¦  «        D ¦   «         } |d„ t          t	          dd¦  «        |¦  «        D ¦   «         d‰¦  «        }ˆˆ fd„}|                     |¦  «        S )Nc           
     ób   — g | ],}t          d t          |¦  «        iddd|fz  |dz   d¦  «        ‘Œ-S )zHeader-Counterr1   ó   Dates   Body %drö   N)r˜   rå   r+  s     r4   r¾  z;CopyWorkerTests.testUnfeaturefulMessage.<locals>.<listcomp>’  sY   € ð 
ð 
ð 
ð õ Ø!¥3 q¡6¤6Ð*¨B°¸ÀqÀdÑ9JÈAÐPRÉFÐTXñô ð
ð 
ð 
r6   rÅ   r@  c                ó   — g | ]}|‘ŒS r1   r1   ©r,  Úims     r4   r¾  z;CopyWorkerTests.testUnfeaturefulMessage.<locals>.<listcomp>˜  ó   € Ð4Ð4Ð4�bˆrÐ4Ð4Ð4r6   rÞ  c                óò  •— g }‰j         D ]g}|                     |d                              ¦   «         ¦  «         ‰                     |d         d¦  «         ‰                     |d         d¦  «         Œh|                     ¦   «          t          d„ t          dd¦  «        D ¦   «         ¦  «        }‰                     ||¦  «         | D ]0\  }}‰                     |¦  «         ‰                     |d ¦  «         Œ1d S )Nr   rÅ   r1   rÉ   r|	  c              3  ó$   K  — | ]}d ||fz  V — ŒdS )s   Header-Counter: %d

Body %dNr1   r+  s     r4   r-  zJCopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopy.<locals>.<genexpr>¢  s=   è è € ð ð ØBCÐ4¸¸1°vÑ=ðð ð ð ð ð r6   r@  )rÚ  r|   rW   rB   r¿  re  rn   rU  )rO  Úseenrä  Úexprh  r2   ró   rE   s         €€r4   rw	  z7CopyWorkerTests.testUnfeaturefulMessage.<locals>.cbCopyš  s  ø€ ØˆDØ”Vð 0ð 0�Ø—’˜A˜aœDŸIšI™KœKÑ(Ô(Ð(Ø× Ò   1¤ rÑ*Ô*Ð*Ø× Ò   1¤ wÑ/Ô/Ð/Ð/à�IŠI‰KŒKˆKÝð ð ÝGLÈQÐPRÁ|Ä|ðñ ô ñ ô ˆCð ×Ò˜T 3Ñ'Ô'Ð'à")ð /ð /‘�˜Ø—’ Ñ'Ô'Ð'Ø× Ò  ¨Ñ.Ô.Ð.Ð.ð/ð /r6   )r   rÓ  rx	  rc	  rn   rä   r›   )rE   r{  r3   rp	  rž   rw	  ró   s   `     @r4   ÚtestUnfeaturefulMessagez'CopyWorkerTests.testUnfeaturefulMessage‹  sµ   øø€ ÝÔÑÔˆð Ô"ˆå‰MŒMˆð
ð 
õ ˜1˜b‘\”\ð	
ñ 
ô 
ˆð ˆAÐ4Ð4�C¥ a¨¡¤¨dÑ3Ô3Ð4Ñ4Ô4°e¸QÑ?Ô?ˆð	/ð 	/ð 	/ð 	/ð 	/ð 	/ð" �}Š}˜VÑ$Ô$Ð$r6   c           	     ó*  ‡ ‡‡— t          j        ¦   «         }|j        }t          ¦   «         Šd„ t	          dd¦  «        D ¦   «         Š |d„ t          t	          dd¦  «        ‰¦  «        D ¦   «         d‰¦  «        }ˆˆˆ fd„}|                     |¦  «        S )Nc                ó*   — g | ]}t          ¦   «         ‘ŒS r1   )Úobjectr+  s     r4   r¾  z5CopyWorkerTests.testMessageCopier.<locals>.<listcomp>´  s   € Ð/Ð/Ð/˜Q•‘”Ð/Ð/Ð/r6   rÅ   r@  c                ó   — g | ]}|‘ŒS r1   r1   r~	  s     r4   r¾  z5CopyWorkerTests.testMessageCopier.<locals>.<listcomp>µ  r€	  r6   s   tagc                óð   •— ‰                      | t          t          dgdz  t          dd¦  «        ¦  «        ¦  «        ¦  «         t          ‰‰j        ¦  «        D ]\  }}‰                     ||¦  «         Œd S )NrÅ   rö   r@  )rB   rÑ   rä   rn   rp	  r‘   )rO  Úorigr  ró   rp	  rE   s      €€€r4   rw	  z1CopyWorkerTests.testMessageCopier.<locals>.cbCopy·  s{   ø€ Ø×Ò˜W¥d­3°¨s°R©x½¸qÀ"¹¼Ñ+FÔ+FÑ&GÔ&GÑHÔHÐHÝ   q¤vÑ.Ô.ð 0ð 0‘	��cØ×$Ò$ T¨3Ñ/Ô/Ð/Ð/ð0ð 0r6   )r   rÓ  rx	  rn	  rn   rä   r›   )rE   r{  r3   rž   rw	  ró   rp	  s   `    @@r4   ÚtestMessageCopierz!CopyWorkerTests.testMessageCopier­  s®   øøø€ ÝÔÑÔˆð Ô"ˆå Ñ"Ô"ˆØ/Ð/¥%¨¨2¡,¤,Ð/Ñ/Ô/ˆØˆAÐ4Ð4�C¥ a¨¡¤¨dÑ3Ô3Ð4Ñ4Ô4°f¸aÑ@Ô@ˆð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð
 �}Š}˜VÑ$Ô$Ð$r6   N)rs   rt   ru   ry	  r…	  rŒ	  r1   r6   r4   rs	  rs	  n  sB   € € € € € ð%ð %ð %ð8 %ð  %ð  %ðD%ð %ð %ð %ð %r6   rs	  zOpenSSL not presentzReactor doesn't support SSLc                  ó„   — e Zd ZdZdZer
 e¦   «         Zer
 e¦   «         Zd„ Zd„ Zd„ Z	d„ Z
d„ Zdd	„Zd
„ Zd„ Zd„ Zd„ ZdS )ÚTLSTestsNc                óD   — t          j        | j        | j        d¬¦  «        S )NFrô  )r#   r÷  r  r  rR   s    r4   r#   zTLSTests.loopbackÉ  s   € ÝÔ# D¤K°´ÀEÐJÑJÔJÐJr6   c                ó²  ‡ ‡	‡
— t           j                             d¦  «         g Š	ˆ	ˆ fd„}ˆ	ˆ fd„}ˆ	ˆ fd„}ˆ	ˆ fd„}ˆ	ˆ fd„}d‰ j        _        |||||gŠ
‰
D ])}‰ j                             t          |¦  «        ¦  «         Œ*‰ j                             ‰ j	        ‰ j
        ¦  «         ˆ	ˆ
ˆ fd„}‰                      ¦   «         }|                     |¦  «         |S )	NrÅ  c                 ód   •— ‰                       d ¦  «         ‰j                             dd¦  «        S rK  )r|   r  rL  ©ÚcalledrE   s   €€r4   rL  z)TLSTests.testAPileOfThings.<locals>.loginÐ  s.   ø€ Ø�MŠM˜$ÑÔÐØ”;×$Ò$ [Ð2BÑCÔCÐCr6   c                 ód   •— ‰                       d ¦  «         ‰j                             dd¦  «        S )NrÅ  ó   %)r|   r  rÑ   r’	  s   €€r4   rÑ   z(TLSTests.testAPileOfThings.<locals>.listÔ  s-   ø€ Ø�MŠM˜$ÑÔÐØ”;×#Ò# H¨dÑ3Ô3Ð3r6   c                 ód   •— ‰                       d ¦  «         ‰j                             dd¦  «        S )NrÅ  rT  )r|   r  rh  r’	  s   €€r4   rh  z*TLSTests.testAPileOfThings.<locals>.statusØ  s-   ø€ Ø�MŠM˜$ÑÔÐØ”;×%Ò% h°	Ñ:Ô:Ð:r6   c                 ób   •— ‰                       d ¦  «         ‰j                             d¦  «        S )NrÅ  )r|   r  rÈ  r’	  s   €€r4   rÈ  z+TLSTests.testAPileOfThings.<locals>.examineÜ  s+   ø€ Ø�MŠM˜$ÑÔÐØ”;×&Ò& xÑ0Ô0Ð0r6   c                 ó`   •— ‰                       d ¦  «         ‰j                             ¦   «         S r0   )r|   r  r=  r’	  s   €€r4   r=  z*TLSTests.testAPileOfThings.<locals>.logoutà  s)   ø€ Ø�MŠM˜$ÑÔÐØ”;×%Ò%Ñ'Ô'Ð'r6   Tc                óè   •— ‰                      ‰j        j        d¦  «         ‰                      ‰j        j        d¦  «         ‰                      t	          ‰¦  «        t	          ‰¦  «        ¦  «         d S r›  )rB   r  Ú
startedTLSr  rÐ   )rX  r“	  ÚmethodsrE   s    €€€r4   rŽ  z)TLSTests.testAPileOfThings.<locals>.checkì  sa   ø€ Ø×Ò˜Tœ[Ô3°TÑ:Ô:Ð:Ø×Ò˜Tœ[Ô3°TÑ:Ô:Ð:Ø×Ò�S ™[œ[­#¨g©,¬,Ñ7Ô7Ð7Ð7Ð7r6   )rÍ  rá  r­  r  ÚrequireTransportSecurityr  r›   r7   rÜ  r
  r  r#   )rE   rL  rÑ   rh  rÈ  r=  ré  rŽ  rž   r“	  r›	  s   `        @@r4   ÚtestAPileOfThingszTLSTests.testAPileOfThingsÌ  sm  øøø€ ÝÔ×*Ò*¨8Ñ4Ô4Ð4Øˆð	Dð 	Dð 	Dð 	Dð 	Dð 	Dð	4ð 	4ð 	4ð 	4ð 	4ð 	4ð	;ð 	;ð 	;ð 	;ð 	;ð 	;ð	1ð 	1ð 	1ð 	1ð 	1ð 	1ð	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 04ˆŒÔ,à˜$ ¨°Ð8ˆØð 	6ð 	6ˆFØŒN×&Ò&¥u¨V¡}¤}Ñ5Ô5Ð5Ð5àŒ×#Ò# DÔ$6¸¼ÑHÔHÐHð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð
 �MŠM‰OŒOˆØ	�Š�eÑÔÐØˆr6   c                óö  ‡ ‡— ‰ j         j                             dd¦  «         g Š‰ j                             t          j        d¦  «        ¦  «         ‰ j                             ˆ fd„¦  «                             ˆ fd„¦  «                             ‰j	        ¦  «                             ‰ j
        ¦  «                             ‰ j        ¦  «         ‰                      ¦   «         }|                     ˆ ˆfd„¦  «         |S )NrÎ  rÒ  c                ó8   •— ‰j                              d¦  «        S )NrÒ  r·  r?  s    €r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>ú  s   ø€ �d”k×.Ò.Ð/?Ñ@Ô@€ r6   c                ó6   •— ‰j                              ¦   «         S r0   )r  r=  r?  s    €r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>û  s   ø€  ¤× 2Ò 2Ñ 4Ô 4€ r6   c                óJ   •— ‰                      t          ‰¦  «        d¦  «        S rt  )rB   rÐ   ©r[  rE   Úsuccesss    €€r4   r5   z)TLSTests.testLoginLogin.<locals>.<lambda>  s   ø€  × 0Ò 0µ°W±´¸qÑ AÔ A€ r6   )r  rÖ  rÕ  r  r¼  r   r»  r  r›   r|   r
  r+  r  r#   )rE   rž   r£	  s   ` @r4   ÚtestLoginLoginzTLSTests.testLoginLoginõ  sò   øø€ ØŒÔ×#Ò# KÐ1AÑBÔBÐBØˆØŒ×)Ò)­%Ô*BÀ;Ñ*OÔ*OÑPÔPÐPØŒ×"Ò"Ø@Ð@Ð@Ð@ñ	
ô 	
ç
Š+Ð4Ð4Ð4Ð4Ñ
5Ô
5·k²kØŒNñ7
ô 7
ç
Š+ØÔñ
ô 
ç
Š*ØŒOñ
ô 
ð 
ð �MŠM‰OŒOˆØ	�ŠÐAÐAÐAÐAÐAÑBÔBÐBØˆr6   c                óx  ‡ ‡— g Š‰ j                              t          ‰ j        j        ¦  «        ¦  «         ˆ fd„}‰ j                              |¦  «         ‰ j                              ‰j        ¦  «         ‰                      ¦   «         }|                     ˆ ˆfd„¦  «         t          j        |‰ j         g¦  «        S )zì
        Begin a C{STARTTLS} sequence and assert that it results in a
        TLS session.

        @return: A L{Deferred} that fires when the underlying
            connection between the client and server has been terminated.
        c                ó€   •— ‰                      t          j                             ‰j        j        ¦  «        ¦  «         d S r0   )rU  r   ÚISSLTransportÚ
providedByr  rð  ró  s    €r4   ÚcheckSecurez6TLSTests.startTLSAndAssertSession.<locals>.checkSecure  s1   ø€ Ø�OŠO�JÔ4×?Ò?ÀÄÔ@UÑVÔVÑWÔWÐWÐWÐWr6   c                ó.   •— ‰                      ‰¦  «        S r0   )rU  r¢	  s    €€r4   r5   z3TLSTests.startTLSAndAssertSession.<locals>.<lambda>  s   ø€  §¢°Ñ 8Ô 8€ r6   )	r  r›   r7   r  ÚstartTLSr|   r#   r   r,  )rE   r©	  rž   r£	  s   `  @r4   ÚstartTLSAndAssertSessionz!TLSTests.startTLSAndAssertSession  sÀ   øø€ ð ˆØŒ×"Ò"¥5¨¬Ô)=Ñ#>Ô#>Ñ?Ô?Ð?ð	Xð 	Xð 	Xð 	Xð 	Xð 	Œ×"Ò" ;Ñ/Ô/Ð/ØŒ×"Ò" 7¤>Ñ2Ô2Ð2à�MŠM‰OŒOˆØ	�ŠÐ8Ð8Ð8Ð8Ð8Ñ9Ô9Ð9ÝÔ" A t¤~Ð#6Ñ7Ô7Ð7r6   c                óª   — |                       ¦   «         }| j                             | j        ¦  «         | j                             | j        ¦  «         |S )zª
        L{IMAP4Client.startTLS} triggers TLS negotiation and returns a
        L{Deferred} which fires after the client's transport is using
        encryption.
        )r¬	  r  r›   r
  r+  r  ©rE   Údisconnecteds     r4   Útest_startTLSzTLSTests.test_startTLS  sL   € ð ×4Ò4Ñ6Ô6ˆØŒ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2ØÐr6   ÚreturnúDeferred[object]c                ó   — |                       | j        j        ¦  «         d| j        _        |                      ¦   «         }| j                             | j        ¦  «         | j                             | j        ¦  «         |S )zd
        L{IMAPClient.startTLS} supplies a default TLS context if none is
        supplied.
        N)	ÚassertIsNotNoner  Úcontextr¬	  r  r›   r
  r+  r  r®	  s     r4   Útest_startTLSDefaultzTLSTests.test_startTLSDefault'  so   € ð
 	×Ò˜Tœ[Ô0Ñ1Ô1Ð1Ø"ˆŒÔØ)-×)FÒ)FÑ)HÔ)HˆØŒ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2ØÐr6   c                óª  —  G d„ dt           ¦  «        } || j        | j        ¬¦  «        | _        |                      ¦   «         }| j                             t          | j        j        ¦  «        ¦  «         | j                             | j	        d¦  «         | j                             | j
        ¦  «         | j                             | j        ¦  «         |S )z]
        A server that receives a second C{STARTTLS} sends a C{NO}
        response.
        c                  ó   — e Zd Zd„ ZdS )ú:TLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClientc                ó’   — | j         st                               | ¦  «        S |                      t	          j        d¦  «        ¦  «        S )Ns   STARTTLS)rš	  rã  r«	  r�  r   r7  rR   s    r4   r«	  zCTLSTests.test_doubleSTARTTLS.<locals>.DoubleSTARTTLSClient.startTLS:  s>   € Ø”ð 7Ý'×0Ò0°Ñ6Ô6Ð6à×'Ò'­¬°kÑ(BÔ(BÑCÔCÐCr6   N)rs   rt   ru   r«	  r1   r6   r4   ÚDoubleSTARTTLSClientr¹	  9  s(   € € € € € ðDð Dð Dð Dð Dr6   r»	  r   s   TLS already negotiated)rã  r  rþ  r  r¬	  r›   r7   r«	  r+  r  r
  r  )rE   r»	  r¯	  s      r4   Útest_doubleSTARTTLSzTLSTests.test_doubleSTARTTLS3  sê   € ð	Dð 	Dð 	Dð 	Dð 	D¥<ñ 	Dô 	Dð 	Dð +Ð*ØŒN¨4¬>ð
ñ 
ô 
ˆŒð ×4Ò4Ñ6Ô6ˆàŒ×"Ò"¥5¨¬Ô)=Ñ#>Ô#>Ñ?Ô?Ð?ØŒ×!Ò!ØÔ+Ð-Fñ	
ô 	
ð 	
ð 	Œ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2àÐr6   c                ó¼  ‡ — t           j        t           j        dœ‰ j        _        t
          j        ˆ fd„¦   «         }‰ j                             t          |¦  «        ¦  «         ‰  
                    ¦   «         }‰ j                             t          |¦  «        ¦  «         ‰ j                             ‰ j        ¦  «         ‰ j                             ‰ j        ¦  «         |S )z°
        Starting a TLS negotiation with an L{IMAP4Server} that already
        has C{LOGIN} and C{PLAIN} L{IChallengeResponse} factories uses
        those factories.
        )rý  r“  c               3  óÞ   •K  — ‰j                              ¦   «         V —} ‰                     d| ¦  «         ‰                     d| d         ¦  «         ‰                     d| d         ¦  «         d S )Nr3  rý  r“  )r  r!  r  rx  s    €r4   ÚassertLOGINandPLAINzJTLSTests.test_startTLSWithExistingChallengers.<locals>.assertLOGINandPLAIN[  sl   øè è € à!%¤×!<Ò!<Ñ!>Ô!>Ð>Ð>ˆLØ�MŠM˜' <Ñ0Ô0Ð0Ø�MŠM˜( L°Ô$9Ñ:Ô:Ð:Ø�MŠM˜( L°Ô$9Ñ:Ô:Ð:Ð:Ð:r6   )r   rº  r  r  r6  r   r„  r  r›   r7   r¬	  r
  r+  r  )rE   r¿	  r¯	  s   `  r4   Ú$test_startTLSWithExistingChallengersz-TLSTests.test_startTLSWithExistingChallengersP  sÓ   ø€ õ Ô,ÝÔ,ð#
ð #
ˆŒÔõ
 
Ô	ð	;ð 	;ð 	;ð 	;ñ 
Ô	ð	;ð 	Œ×"Ò"¥5Ð)<Ñ#=Ô#=Ñ>Ô>Ð>à×4Ò4Ñ6Ô6ˆàŒ×"Ò"¥5Ð)<Ñ#=Ô#=Ñ>Ô>Ð>àŒ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2àÐr6   c                ón  ‡ — d„ ‰ j         _        ‰ j                             ˆ fd„¦  «         ‰ j                             ‰ j        d¦  «         ‰ j                             ‰ j        ¦  «         ‰ j                             ‰ j        ¦  «         t          j	        ‰  
                    ¦   «         ‰ j        g¦  «        S )z|
        A client that attempts to log in before issuing the
        C{STARTTLS} command receives a C{NO} response.
        c                 ó.   — t          j        g df¦  «        S )NzOK Begin TLS negotiation now)r   rZ  r1   r6   r4   r5   z3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>s  s   € ¥u¤}ØÐ/Ð0ñ(
ô (
€ r6   c                ó:   •— ‰j                              dd¦  «        S )Ns   wrongs   timer}  r?  s    €r4   r5   z3TLSTests.test_loginBeforeSTARTTLS.<locals>.<lambda>w  s   ø€ �d”k×'Ò'¨°'Ñ:Ô:€ r6   s!   LOGIN is disabled before STARTTLS)r  r«	  r  r›   r+  r  r
  r  r   r,  r#   rR   s   `r4   Útest_loginBeforeSTARTTLSz!TLSTests.test_loginBeforeSTARTTLSm  s´   ø€ ð 
ð  
ˆŒÔð 	Œ×"Ò"Ø:Ð:Ð:Ð:ñ	
ô 	
ð 	
ð 	Œ×!Ò!ØÔ+Ø0ñ	
ô 	
ð 	
ð
 	Œ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2åÔ" D§M¢M¡O¤O°T´^Ð#DÑEÔEÐEr6   c                ó’  ‡ ‡— g Šˆ fd„}‰ j                              |¦  «         ‰ j                              ˆ fd„¦  «         ‰ j                              ˆfd„¦  «         ‰ j                              ‰ j        ¦  «         ‰ j                              ‰ j        ¦  «         ˆˆ fd„}‰                      ¦   «                              |¦  «        S )Nc                ó    •— d‰j         _        d S r§  )r  ÚcanStartTLSræ  s    €r4   ÚbreakServerTLSz3TLSTests.testFailedStartTLS.<locals>.breakServerTLS‡  s   ø€ Ø&+ˆDŒKÔ#Ð#Ð#r6   c                ó6   •— ‰j                              ¦   «         S r0   )r  r«	  ræ  s    €r4   r5   z-TLSTests.testFailedStartTLS.<locals>.<lambda>‹  s   ø€ ¨t¬{×/CÒ/CÑ/EÔ/E€ r6   c                óh   •— ‰                      |                      t          j        ¦  «        ¦  «        S r0   )r|   r  r   r  )r  r§  s    €r4   r5   z-TLSTests.testFailedStartTLS.<locals>.<lambda>�  s"   ø€ ˜Ÿš¨¯ªµÔ1EÑ(FÔ(FÑGÔG€ r6   c                ó~   •— ‰                      ‰¦  «         ‰                     ‰d         t          j        ¦  «         d S rÖ  )rU  r‘   r   r  )rX  r§  rE   s    €€r4   rŽ  z*TLSTests.testFailedStartTLS.<locals>.check’  s8   ø€ Ø�OŠO˜HÑ%Ô%Ð%Ø× Ò  ¨!¤­eÔ.BÑCÔCÐCÐCÐCr6   )r  r›   r+  r
  r  r#   )rE   rÈ	  rŽ  r§  s   `  @r4   ÚtestFailedStartTLSzTLSTests.testFailedStartTLS„  sõ   øø€ Øˆð	,ð 	,ð 	,ð 	,ð 	,ð 	Œ×"Ò" >Ñ2Ô2Ð2ØŒ×"Ò"Ð#EÐ#EÐ#EÐ#EÑFÔFÐFØŒ×!Ò!ØGÐGÐGÐGñ	
ô 	
ð 	
ð 	Œ×"Ò" 4Ô#5Ñ6Ô6Ð6ØŒ×!Ò! $¤/Ñ2Ô2Ð2ð	Dð 	Dð 	Dð 	Dð 	Dð 	Dð �}Š}‰Œ×*Ò*¨5Ñ1Ô1Ð1r6   )r±	  r²	  )rs   rt   ru   rý  rþ  r-   r,   r#   r�	  r¤	  r¬	  r°	  r¶	  r¼	  rÀ	  rÄ	  rÌ	  r1   r6   r4   rŽ	  rŽ	  ¿  sî   € € € € € ð €IØ€IØð 'Ø$Ð$Ñ&Ô&ˆ	Øð 'Ø$Ð$Ñ&Ô&ˆ	ðKð Kð Kð'ð 'ð 'ðRð ð ð$8ð 8ð 8ð*	ð 	ð 	ð
ð 
ð 
ð 
ðð ð ð:ð ð ð:Fð Fð Fð.2ð 2ð 2ð 2ð 2r6   rŽ	  c                  ó    — e Zd ZdZdZdZd„ ZdS )ÚSlowMailboxrÉ   Nc                ó¢   — t          j        ¦   «         }|                      | j        |j        d¦  «         | j                             d ¦  «         |S )Nr1   )r   r   Ú	callLaterÚhowSlowrê  ÚfetchDeferred)rE   r   r©  rž   s       r4   r   zSlowMailbox.fetch   sE   € ÝŒNÑÔˆØ�Š�t”| Q¤Z°Ñ4Ô4Ð4ØÔ×#Ò# DÑ)Ô)Ð)Øˆr6   )rs   rt   ru   rÑ	  rÐ	  rÒ	  r   r1   r6   r4   rÎ	  rÎ	  ™  s2   € € € € € Ø€GØ€IØ€Mðð ð ð ð r6   rÎ	  c                  ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTimeoutTestsc                ón  ‡ ‡‡— t          ¦   «         Šd‰ j        _        d‰ j        _        ‰j        ‰ j        _        d‰ _        ˆˆ ˆfd„}ˆ fd„Š‰ j                             t          |¦  «        ¦  «        }| 
                    ‰ j        ¦  «         t          j        |‰                      ¦   «         g¦  «        S )z{
        The *client* has a timeout mechanism which will close connections that
        are inactive for a period.
        TrÊ   Nc                 ó’   •— ‰j                              dd¦  «        } ‰                     d¦  «         |                      ‰¦  «         | S )NrÎ  rÒ  rÊ   )r  rL  Úadvancer+  )rž   r”   rE   ÚtimedOuts    €€€r4   rL  z.TimeoutTests.test_serverTimeout.<locals>.login³  sA   ø€ Ø”×!Ò! +Ð/?Ñ@Ô@ˆAØ�IŠI�a‰LŒLˆLØ�LŠL˜Ñ"Ô"Ð"ØˆHr6   c                óf   •— ‰                      d ¦  «          | j        t          j        ¦  «         d S r0   )r
  r  r   ÚTimeoutErrorr×  s    €r4   rØ	  z1TimeoutTests.test_serverTimeout.<locals>.timedOut¹  s2   ø€ Ø×Ò˜tÑ$Ô$Ð$ØˆGŒL�Ô+Ñ,Ô,Ð,Ð,Ð,r6   )r   r  rÙ  r  rÅ  rÐ	  rª  r  r›   r7   r+  r  r   r,  r#   )rE   rL  rž   r”   rØ	  s   `  @@r4   Útest_serverTimeoutzTimeoutTests.test_serverTimeout¨  sÃ   øøø€ õ
 ‰GŒGˆØ"&ˆŒÔØˆŒÔØ !¤ˆŒÔØ ˆÔð	ð 	ð 	ð 	ð 	ð 	ð 	ð	-ð 	-ð 	-ð 	-ð 	-ð ŒN×&Ò&¥u¨U¡|¤|Ñ4Ô4ˆØ	�Š�T”_Ñ%Ô%Ð%ÝÔ" A t§}¢}¡¤Ð#7Ñ8Ô8Ð8r6   c                ó<  ‡ ‡— t          ¦   «         Š‰j        ‰ j        _        ˆ fd„}ˆˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         t          j        |‰                      ¦   «         g¦  «        S )z4
        The server times out a connection.
        c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z/TimeoutTests.test_serverTimesOut.<locals>.loginÈ  r~  r6   c                 óL   •— ‰                       ‰j        j        dz  ¦  «         d S ©NrÉ   ©r×	  r  ÚPOSTAUTH_TIMEOUT©r”   rE   s   €€r4   Ú
expireTimez4TimeoutTests.test_serverTimesOut.<locals>.expireTimeË  ó%   ø€ Ø�IŠI�d”kÔ2°QÑ6Ñ7Ô7Ð7Ð7Ð7r6   )	r   rÐ	  r  r  r›   r7   r   r,  r#   )rE   rL  rã	  rž   r”   s   `   @r4   Útest_serverTimesOutz TimeoutTests.test_serverTimesOutÁ  s®   øø€ õ ‰GŒGˆØ !¤ˆŒÔð	Dð 	Dð 	Dð 	Dð 	Dð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð ŒN×&Ò&¥u¨U¡|¤|Ñ4Ô4ˆØ	�Š•e˜JÑ'Ô'Ñ(Ô(Ð(õ
 Ô" A t§}¢}¡¤Ð#7Ñ8Ô8Ð8r6   c                ó0  ‡ ‡‡— ‰                       t          j        dt          ¦  «         t          j                             d¦  «         t          j        j        d         Š‰                      t          j        ‰¦  «        ¦  «         t          ¦   «         Š‰j
        ‰ j        _
        ˆ fd„}ˆ fd„}ˆˆ fd„}ˆˆ fd„}ˆ fd„}‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         t          j        |‰                      ¦   «         g¦  «        S )	z^
        The server unsets the selected mailbox when timing out a
        connection.
        rÁ  úmailbox-testúMAILBOX-TESTc                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z7TimeoutTests.test_serverUnselectsMailbox.<locals>.loginã  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S ©Nrç	  r³  rR   s   €r4   rÇ  z8TimeoutTests.test_serverUnselectsMailbox.<locals>.selectæ  r´  r6   c                 óH   •— ‰                      ‰ ‰j        j        ¦  «         d S r0   )r  r  r_  ©r_  rE   s   €€r4   Ú	assertSetz;TimeoutTests.test_serverUnselectsMailbox.<locals>.assertSeté  s"   ø€ Ø�MŠM˜$ ¤Ô 0Ñ1Ô1Ð1Ð1Ð1r6   c                 óL   •— ‰                       ‰j        j        dz  ¦  «         d S rß	  rà	  râ	  s   €€r4   rã	  z<TimeoutTests.test_serverUnselectsMailbox.<locals>.expireTimeì  rä	  r6   c                 óF   •— ‰                       ‰ j        j        ¦  «         d S r0   )rS  r  r_  rR   s   €r4   ÚassertUnsetz=TimeoutTests.test_serverUnselectsMailbox.<locals>.assertUnsetï  s"   ø€ Ø×Ò˜Tœ[Ô-Ñ.Ô.Ð.Ð.Ð.r6   )r©  rÍ  rá  rª  r­  rÀ  rS  r"   r¨	  r   rÐ	  r  r  r›   r7   r   r,  r#   )	rE   rL  rÇ  rî	  rã	  rñ	  rž   r”   r_  s	   `      @@r4   Útest_serverUnselectsMailboxz(TimeoutTests.test_serverUnselectsMailboxÖ  s­  øøø€ ð
 	�
Š
•<Ô*Ð,<Õ>PÑQÔQÐQÝÔ×*Ò*¨>Ñ:Ô:Ð:ÝÔ&Ô0°Ô@ˆØ×ÒÕ.Ô9¸$Ñ?Ô?Ñ@Ô@Ð@å‰GŒGˆØ !¤ˆŒÔð	Dð 	Dð 	Dð 	Dð 	Dð	6ð 	6ð 	6ð 	6ð 	6ð	2ð 	2ð 	2ð 	2ð 	2ð 	2ð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð	/ð 	/ð 	/ð 	/ð 	/ð ŒN×&Ò&¥u¨U¡|¤|Ñ4Ô4ˆØ	�Š•e˜F‘m”mÑ$Ô$Ð$Ø	�Š•e˜IÑ&Ô&Ñ'Ô'Ð'Ø	�Š•e˜JÑ'Ô'Ñ(Ô(Ð(Ø	�Š•e˜KÑ(Ô(Ñ)Ô)Ð)õ
 Ô" A t§}¢}¡¤Ð#7Ñ8Ô8Ð8r6   c                óÂ  ‡ ‡‡— t           j                             d¦  «         t           j        j        d         Št	          t
          ‰¦  «         t          ¦   «         Š‰j        ‰ j        _        ˆ fd„}ˆ fd„}ˆˆ fd„}ˆˆ fd„}ˆˆ fd„}‰ j	         
                    t          |¦  «        ¦  «        }| 
                    t          |¦  «        ¦  «         | 
                    t          |¦  «        ¦  «         | 
                    t          |¦  «        ¦  «         | 
                    t          |¦  «        ¦  «         t          j        |‰                      ¦   «         g¦  «        S )zi
        The server closes the selected, closeable mailbox when timing
        out a connection.
        rç	  rè	  c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z?TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.login	  r~  r6   c                 ó8   •— ‰ j                              d¦  «        S rë	  r³  rR   s   €r4   rÇ  z@TimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.select  r´  r6   c                 ó<   •— ‰                      ‰ j        ¦  «         d S r0   )rS  rœ  rí	  s   €€r4   ÚassertMailboxOpenzKTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxOpen  s   ø€ Ø×Ò˜Tœ[Ñ)Ô)Ð)Ð)Ð)r6   c                 óL   •— ‰                       ‰j        j        dz  ¦  «         d S rß	  rà	  râ	  s   €€r4   rã	  zDTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.expireTime  rä	  r6   c                 ó<   •— ‰                      ‰ j        ¦  «         d S r0   )rU  rœ  rí	  s   €€r4   ÚassertMailboxClosedzMTimeoutTests.test_serverTimesOutAndClosesMailbox.<locals>.assertMailboxClosed  s   ø€ Ø�OŠO˜DœKÑ(Ô(Ð(Ð(Ð(r6   )rÍ  rá  r­  rÀ  r   r"   r   rÐ	  r  r  r›   r7   r   r,  r#   )	rE   rL  rÇ  r÷	  rã	  rú	  rž   r”   r_  s	   `      @@r4   Ú#test_serverTimesOutAndClosesMailboxz0TimeoutTests.test_serverTimesOutAndClosesMailboxý  sŠ  øøø€ õ
 	Ô×*Ò*¨>Ñ:Ô:Ð:ÝÔ&Ô0°Ô@ˆÝÕ*¨DÑ1Ô1Ð1å‰GŒGˆØ !¤ˆŒÔð	Dð 	Dð 	Dð 	Dð 	Dð	6ð 	6ð 	6ð 	6ð 	6ð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð	)ð 	)ð 	)ð 	)ð 	)ð 	)ð ŒN×&Ò&¥u¨U¡|¤|Ñ4Ô4ˆØ	�Š•e˜F‘m”mÑ$Ô$Ð$Ø	�Š•eÐ-Ñ.Ô.Ñ/Ô/Ð/Ø	�Š•e˜JÑ'Ô'Ñ(Ô(Ð(Ø	�Š•eÐ/Ñ0Ô0Ñ1Ô1Ð1õ
 Ô" A t§}¢}¡¤Ð#7Ñ8Ô8Ð8r6   c                ó„  ‡ ‡— t          ¦   «         Š‰j        t          _        t          j        ¦   «         t          _        ‰j        ‰ j        _        t          t          j        _	        t          j         
                    d¦  «         ‰ j                             d¦  «         ˆ fd„}ˆ fd„}ˆ fd„}ˆ fd„}ˆfd„}t          j                             |¦  «         ‰ j                             t          |¦  «        ¦  «        }|                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         |                     t          |¦  «        ¦  «         |                     ‰ j        ¦  «         |                     ‰ j        ¦  «         t          j        |‰                      ¦   «         g¦  «        }|S )zM
        The connection timeout does not take effect during fetches.
        rç	  rÅ   c                 ó:   •— ‰ j                              dd¦  «        S rK  r}  rR   s   €r4   rL  z7TimeoutTests.test_longFetchDoesntTimeout.<locals>.login0  r~  r6   c                 ól   •— ‰ j                              d¦  «         ‰ j                             d¦  «        S )NrÅ   rç	  )r  Ú
setTimeoutr  rÇ  rR   s   €r4   rÇ  z8TimeoutTests.test_longFetchDoesntTimeout.<locals>.select3  s/   ø€ ØŒK×"Ò" 1Ñ%Ô%Ð%Ø”;×%Ò% nÑ5Ô5Ð5r6   c                 ó8   •— ‰ j                              d¦  «        S )Nrá   re  rR   s   €r4   r   z7TimeoutTests.test_longFetchDoesntTimeout.<locals>.fetch7  s   ø€ Ø”;×'Ò'¨Ñ.Ô.Ð.r6   c                 óH   •— ‰                       ‰ j        j        d¦  «         d S )NrÅ  )rÏ   r  rV  rR   s   €r4   ÚstillConnectedz@TimeoutTests.test_longFetchDoesntTimeout.<locals>.stillConnected:  s$   ø€ Ø×Ò ¤Ô 1°9Ñ=Ô=Ð=Ð=Ð=r6   c                óV   •— t          d¦  «        D ]}‰                     d¦  «         Œd S )NrË   g      à?)rn   r×	  )rX  ré   r”   s     €r4   Ú	cbAdvancez;TimeoutTests.test_longFetchDoesntTimeout.<locals>.cbAdvance=  s3   ø€ Ý˜1‘X”Xð ð �Ø—	’	˜#‘”��ðð r6   )r   rÐ	  rÎ	  r   r   rÒ	  r  rÍ  rá  rÁ  r­  rÿ	  r›   r  r7   r
  r+  r  r,  r#   )	rE   rL  rÇ  r   r
  r
  r-  rž   r”   s	   `       @r4   Útest_longFetchDoesntTimeoutz(TimeoutTests.test_longFetchDoesntTimeout#  s¸  øø€ õ ‰GŒGˆØ !¤�ÔÝ$)¤NÑ$4Ô$4�Ô!Ø !¤ˆŒÔÝ1<�ÔÔ.ÝÔ×*Ò*¨>Ñ:Ô:Ð:àŒ×Ò˜qÑ!Ô!Ð!ð	Dð 	Dð 	Dð 	Dð 	Dð	6ð 	6ð 	6ð 	6ð 	6ð	/ð 	/ð 	/ð 	/ð 	/ð	>ð 	>ð 	>ð 	>ð 	>ð	ð 	ð 	ð 	ð 	õ 	Ô!×-Ò-¨iÑ8Ô8Ð8àŒ^×'Ò'­¨e©¬Ñ5Ô5ˆØ
�Š•u˜V‘}”}Ñ%Ô%Ð%Ø
�Š•u˜U‘|”|Ñ$Ô$Ð$Ø
�Š•u˜^Ñ,Ô,Ñ-Ô-Ð-Ø
�Š�tÔ)Ñ*Ô*Ð*Ø
�Š�d”oÑ&Ô&Ð&ÝÔ  T§]¢]¡_¤_Ð 5Ñ6Ô6ˆØˆr6   c                óÞ  ‡‡— t          ¦   «         }t          ¦   «         }| j        |_        |j        | j        _        | j                             |¦  «         g Š| j        j        Šˆˆfd„| j        _        |                     dg| j        j        dz  gdz  z   ¦  «         |  	                    ‰‰¦  «         |                     d| j        j        dz  g¦  «         |  
                    ‰¦  «         dS )z{
        The *server* has a timeout mechanism which will close connections that
        are inactive for a period.
        c                óP   •— ‰                      d ¦  «         ‰| ¦  «        fd         S rt  )r|   )ÚreasonÚconnLostÚlosts    €€r4   r5   z<TimeoutTests.test_idleClientDoesDisconnect.<locals>.<lambda>[  s0   ø€ Ø�KŠK˜ÑÔØˆH�VÑÔð5
ð ô5€ r6   g        g      @rÉ   g       @N)r   r   r  rr  rÐ	  rÃ  rÇ  ÚpumpÚtimeOutrS  rU  )rE   r”   rð  r	
  r

  s      @@r4   Útest_idleClientDoesDisconnectz*TimeoutTests.test_idleClientDoesDisconnectL  sõ   øø€ õ
 ‰GŒGˆå4Ñ6Ô6ˆ	Ø!œ[ˆ	ÔØ !¤ˆŒÔØŒ×"Ò" 9Ñ-Ô-Ð-ð ˆØ”;Ô-ˆð&ð &ð &ð &ð &ˆŒÔ"ð 	
�Š�ˆu˜œÔ+¨cÑ1Ð2°QÑ6Ñ6Ñ7Ô7Ð7Ø×Ò˜˜tÑ$Ô$Ð$ð 	
�Š��T”[Ô(¨3Ñ.Ð/Ñ0Ô0Ð0Ø�Š˜ÑÔÐÐÐr6   N)	rs   rt   ru   rÛ	  rå	  rò	  rû	  r
  r
  r1   r6   r4   rÔ	  rÔ	  §  sq   € € € € € ð9ð 9ð 9ð29ð 9ð 9ð*%9ð %9ð %9ðN$9ð $9ð $9ðL'ð 'ð 'ðRð ð ð ð r6   rÔ	  c                  ó   — e Zd Zd„ ZdS )ÚDisconnectionTestsc                ó(  — t          j        ¦   «         }t          ¦   «         }|                     |¦  «         |                      |                     dd¦  «        t          j        ¦  «        }|                     t          j        d¦  «        ¦  «         |S )NrÎ  zexample.comúConnection closed)	r   rå  r   rÃ  rÞ  rL  r   rÈ  rÇ  )rE   r”   Útrž   s       r4   Ú"testClientDisconnectFailsDeferredsz5DisconnectionTests.testClientDisconnectFailsDeferredsj  s�   € ÝÔÑÔˆÝ,Ñ.Ô.ˆØ	×Ò˜ÑÔÐØ×ÒØ�GŠG�K Ñ/Ô/µÔ1Eñ
ô 
ˆð 	
×Ò�Ô-Ð.AÑBÔBÑCÔCÐCØˆr6   N)rs   rt   ru   r
  r1   r6   r4   r
  r
  i  s#   € € € € € ðð ð ð ð r6   r
  c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚSynchronousMailboxzb
    Trivial, in-memory mailbox implementation which can produce a message
    synchronously.
    c                ó   — || _         d S r0   r  )rE   r   s     r4   rz   zSynchronousMailbox.__init__{  s   € Ø ˆŒˆˆr6   c              #  óT   K  — |r
J d¦   «         ‚|D ]}|| j         |dz
           fV — Œd S )NzCannot handle uid requests.rÅ   r  )rE   re  r©  r�   s       r4   r   zSynchronousMailbox.fetch~  sS   è è € ØÐ5Ð5Ð5Ñ5Ô5Ð5Øð 	.ð 	.ˆCØ�t”} S¨1¡WÔ-Ð-Ð-Ð-Ð-Ð-ð	.ð 	.r6   N)rs   rt   ru   r2  rz   r   r1   r6   r4   r
  r
  u  s<   € € € € € ðð ð
!ð !ð !ð.ð .ð .ð .ð .r6   r
  c            
      óš   — e Zd ZdZ ei g dddd¦  «         ei g dddd¦  «         ei g dddd¦  «        gZd„ Zd„ Zd	„ fd
„Zd„ Z	d„ Z
d„ ZdS )ÚPipeliningTestszM
    Tests for various aspects of the IMAP4 server's pipelining support.
    r6   r;  Nr>  ó   2c                óB  — g | _         t          ¦   «         | _        t          j        d d | j        ¦  «        | _        | j                             | j        ¦  «         t          | j	        ¦  «        }d| j        _
        || j        _        | j                             ¦   «          d S rà  )Ú	iteratorsr   rð  r   rÓ  ÚiterateInReactorr  rÃ  r
  r   rV  r_  rÄ  )rE   r]  s     r4   r  zPipeliningTests.setUp�  sˆ   € ØˆŒå(Ñ*Ô*ˆŒÝÔ'¨¨d°DÔ4IÑJÔJˆŒØŒ×"Ò" 4¤>Ñ2Ô2Ð2å$ T¤]Ñ3Ô3ˆð %ˆŒÔØ"ˆŒÔð 	Œ×ÒÑÔÐÐÐr6   c                ód   — t          j        ¦   «         }| j                             ||f¦  «         |S )zÈ
        A fake L{imap4.iterateInReactor} that records the iterators it
        receives.

        @param iterator: An iterator.

        @return: A L{Deferred} associated with this iterator.
        )r   r   r
  r|   )rE   Úiteratorrž   s      r4   r
  z PipeliningTests.iterateInReactorŸ  s0   € õ ŒNÑÔˆØŒ×Ò˜x¨˜mÑ,Ô,Ð,Øˆr6   c                 ó   — dS r›  r1   r1   r6   r4   r5   zPipeliningTests.<lambda>¬  s   € ¨D€ r6   c                óT  — | j         rœ |¦   «         r”| j         d         d         D ]8}| j        j        r*| j        j                             ¦   «          | j        j        °*Œ9| j                              d¦  «        d                              d¦  «         | j         r |¦   «         °�dS dS dS dS )a†  
        Advance pending iterators enqueued with L{iterateInReactor} in
        a round-robin fashion, resuming the transport's producer until
        it has completed.  This ensures bodies are flushed.

        @param asLongAs: (optional) An optional predicate function.
            Flushing iterators continues as long as there are
            iterators and this returns L{True}.
        r   rÅ   N)r
  rð  Úproducerr~   rZ  rê  )rE   ÚasLongAsÚes      r4   ÚflushPendingzPipeliningTests.flushPending¬  sÖ   € ð Œnð 	8  ¡¤ð 	8Ø”^ AÔ& qÔ)ð 8ð 8�Ø”nÔ-ð >Ø”NÔ+×;Ò;Ñ=Ô=Ð=ð ”nÔ-ð >øð ”×"Ò" 1Ñ%Ô% aÔ(×1Ò1°$Ñ7Ô7Ð7ð Œnð 	8  ¡¤ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8r6   c                ó€   — | j                              t          j        t	          j        ¦   «         ¦  «        ¦  «         d S r0   rÆ  rR   s    r4   r  zPipeliningTests.tearDown½  rÉ  r6   c                ó¶  — | j                              d¦  «         |                      ¦   «          |                      | j                             ¦   «         d                     dt          dt          | j	        d          
                    ¦   «                              ¦   «         ¦  «        ›�¦  «        dt          dt          | j	        d          
                    ¦   «                              ¦   «         ¦  «        ›�¦  «        d	t          d
t          | j	        d          
                    ¦   «                              ¦   «         ¦  «        ›�¦  «        g¦  «        ¦  «         dS )z€
        Test that pipelined FETCH commands which can be responded to
        synchronously are responded to correctly.
        s9   01 FETCH 1 BODY[]
02 FETCH 2 BODY[]
03 FETCH 3 BODY[]
r6   ó   * 1 FETCH (BODY[] )
ú 01 OK FETCH completed
{5}


r   ó   * 2 FETCH (BODY[] )
z 02 OK FETCH completed
{5}


rÅ   s   * 3 FETCH (BODY[] )
z 03 OK FETCH completed
{5}


rÉ   N)r  r­  r%
  rB   rð  r  r’   r)   r(   r   rÓ  rW   rR   s    r4   Útest_synchronousFetchz%PipeliningTests.test_synchronousFetchÀ  sQ  € ð 	Œ× Ò ØVñ	
ô 	
ð 	
ð 	×ÒÑÔÐà×ÒØŒN× Ò Ñ"Ô"Ø�HŠHà.Ý!�Må'¨¬°aÔ(8×(DÒ(DÑ(FÔ(F×(KÒ(KÑ(MÔ(MÑNÔNÐNðQñô ð /Ý!�Må'¨¬°aÔ(8×(DÒ(DÑ(FÔ(F×(KÒ(KÑ(MÔ(MÑNÔNÐNðQñô ð /Ý!�Må'¨¬°aÔ(8×(DÒ(DÑ(FÔ(F×(KÒ(KÑ(MÔ(MÑNÔNÐNðQñô ðñô ñ	
ô 	
ð 	
ð 	
ð 	
r6   c                óÚ  — | j                              d¦  «         t          j        t          t          g d¢¦  «        ¦  «        }|                      |¬¦  «         |                      | j         	                    ¦   «         d 
                    dt          dt          | j        d                              ¦   «                              ¦   «         ¦  «        ›�¦  «        g¦  «        ¦  «         | j                             ¦   «          | j                              d¬	¦  «         |                      | j         	                    ¦   «         ¦  «         |                      ¦   «          |                      | j         	                    ¦   «         d 
                    d
dt          dt          | j        d                              ¦   «                              ¦   «         ¦  «        ›�¦  «        g¦  «        ¦  «         dS )zž
        When a server status change occurs during an ongoing FETCH
        command, the server status is buffered until the FETCH
        completes.
        s   01 FETCH 1,2 BODY[]
)TTF)r#
  r6   r(
  z	{5}


r   T)rò  r*
  s   * [READ-WRITE]
r)
  rÅ   N)r  r­  Ú	functoolsÚpartialÚnextrZ  r%
  rB   rð  r  r’   r)   r(   r   rÓ  rW   rÄ  rî  rS  )rE   Útwices     r4   Útest_bufferedServerStatusz)PipeliningTests.test_bufferedServerStatusã  sÕ  € ð 	Œ× Ò Ð!;Ñ<Ô<Ð<õ Ô!¥$­Ð-@Ð-@Ð-@Ñ(AÔ(AÑBÔBˆØ×Ò 5ÐÑ)Ô)Ð)à×ÒØŒN× Ò Ñ"Ô"Ø�HŠHð /å!�Må'¨¬°aÔ(8×(DÒ(DÑ(FÔ(F×(KÒ(KÑ(MÔ(MÑNÔNÐNðQñô ð	ñ
ô 
ñ	
ô 	
ð 	
ð 	Œ×ÒÑÔÐð 	Œ×Ò¨$ÐÑ/Ô/Ð/ð 	×Ò˜œ×-Ò-Ñ/Ô/Ñ0Ô0Ð0à×ÒÑÔÐà×ÒØŒN× Ò Ñ"Ô"Ø�HŠHð /à)å!�Må'¨¬°aÔ(8×(DÒ(DÑ(FÔ(F×(KÒ(KÑ(MÔ(MÑNÔNÐNðQñô ð
ñô ñ	
ô 	
ð 	
ð 	
ð 	
r6   )rs   rt   ru   r2  r˜   r   r  r
  r%
  r  r+
  r1
  r1   r6   r4   r
  r
  „  sÖ   € € € € € ðð ð
 	ˆ�R˜˜S $¨¨dÑ3Ô3Øˆ�R˜˜S $¨¨dÑ3Ô3Øˆ�R˜˜S $¨¨dÑ3Ô3ð€Hðð ð ð ð ð ð %1 Lð 8ð 8ð 8ð 8ð"Lð Lð Lð!
ð !
ð !
ðF5
ð 5
ð 5
ð 5
ð 5
r6   r
  c                  ó   — e Zd ZdZd„ Zd„ ZdS )ÚIMAP4ServerFetchTestszV
    This test case is for the FETCH tests that require
    a C{StringTransport}.
    c                ó²   — t          ¦   «         | _        t          j        ¦   «         | _        d| j        _        | j                             | j        ¦  «         d S rà  )r   rð  r   rÓ  r  rV  rÃ  rR   s    r4   r  zIMAP4ServerFetchTests.setUp!  sG   € Ý(Ñ*Ô*ˆŒÝÔ'Ñ)Ô)ˆŒØ$ˆŒÔØŒ×"Ò" 4¤>Ñ2Ô2Ð2Ð2Ð2r6   c                óT  — | j                              ¦   «          | j                             d¦  «         d}|                      | j                              ¦   «         |¦  «         | j                              ¦   «          | j                             t          j        d¦  «        ¦  «         dS )a  
        If by any chance, extra bytes got appended at the end of a valid
        FETCH arguments, the client should get a BAD - arguments invalid
        response.

        See U{RFC 3501<http://tools.ietf.org/html/rfc3501#section-6.4.5>},
        section 6.4.5,
        s   0001 FETCH 1 FULLL
s+   0001 BAD Illegal syntax: Invalid Argument
r
  N)	rð  rÄ  r  r­  rB   r  rÇ  r   rÈ  )rE   rg  s     r4   Ú"test_fetchWithPartialValidArgumentz8IMAP4ServerFetchTests.test_fetchWithPartialValidArgument'  s”   € ð 	Œ×ÒÑÔÐàŒ× Ò Ð!:Ñ;Ô;Ð;ØCˆØ×Ò˜œ×-Ò-Ñ/Ô/°Ñ:Ô:Ð:ØŒ×ÒÑÔÐØŒ×"Ò"¥5Ô#7Ð8KÑ#LÔ#LÑMÔMÐMÐMÐMr6   N)rs   rt   ru   r2  r  r6
  r1   r6   r4   r3
  r3
    sA   € € € € € ðð ð
3ð 3ð 3ðNð Nð Nð Nð Nr6   r3
  c                  ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚLiteralTestsMixinz‹
    Shared tests for literal classes.

    @ivar literalFactory: A callable that returns instances of the
        literal under test.
    c                ó6   — t          j        ¦   «         | _        dS )z
        Shared setup.
        N)r   r   ræ  rR   s    r4   r  zLiteralTestsMixin.setUpB  s   € õ œÑ(Ô(ˆŒˆˆr6   c                óÂ   — |                       d| j        ¦  «        }|                      d|                     d¦  «        ¦  «         |                      | j        ¦  «         dS )ze
        The literal returns L{None} when given less data than the
        literal requires.
        rN	  Ns
   incomplete)ÚliteralFactoryræ  r  r\   ÚassertNoResult)rE   Úliterals     r4   Útest_partialWritez#LiteralTestsMixin.test_partialWriteH  sW   € ð
 ×%Ò% d¨D¬MÑ:Ô:ˆØ�Š�d˜GŸMšM¨-Ñ8Ô8Ñ9Ô9Ð9Ø×Ò˜DœMÑ*Ô*Ð*Ð*Ð*r6   c                ó  — d}|                       t          |¦  «        | j        ¦  «        }|                     |¦  «        }|                      |t
          ¦  «         |                      |¦  «         |                      | j        ¦  «         dS )zz
        The literal returns an empty L{bytes} instance when given
        exactly the data the literal requires.
        ó   completeN)r;
  rÐ   ræ  r\   rØ  rL   rS  r<
  ©rE   Údatar=
  Úleftovers       r4   Útest_exactWritez!LiteralTestsMixin.test_exactWriteQ  s}   € ð
 ˆØ×%Ò%¥c¨$¡i¤i°´Ñ?Ô?ˆØ—=’= Ñ&Ô&ˆà×Ò˜h­Ñ.Ô.Ð.Ø×Ò˜Ñ"Ô"Ð"Ø×Ò˜DœMÑ*Ô*Ð*Ð*Ð*r6   c                ó°   — d}|                       t          d¦  «        | j        ¦  «        }|                     |¦  «        }|                      |d¦  «         dS )zt
        The literal returns any left over L{bytes} when given more
        data than the literal requires.
        s   completeleftoverr@
  ó   leftoverN)r;
  rÐ   ræ  r\   rB   rA
  s       r4   Útest_overlongWritez$LiteralTestsMixin.test_overlongWrite^  sU   € ð
 #ˆØ×%Ò%¥c¨+Ñ&6Ô&6¸¼ÑFÔFˆà—=’= Ñ&Ô&ˆà×Ò˜ ;Ñ/Ô/Ð/Ð/Ð/r6   c                ó–   — |                       d| j        ¦  «        }d}|                     |¦  «        }|                      ||¦  «         dS )zo
        The literal returns an empty L{bytes} instance
        when given an empty L{bytes} instance.
        r   rF
  N)r;
  ræ  r\   rB   )rE   r=
  rB
  rC
  s       r4   Útest_emptyLiteralz#LiteralTestsMixin.test_emptyLiteralj  sM   € ð
 ×%Ò% a¨¬Ñ7Ô7ˆØˆà—=’= Ñ&Ô&ˆà×Ò˜ 4Ñ(Ô(Ð(Ð(Ð(r6   N)	rs   rt   ru   r2  r  r>
  rD
  rG
  rI
  r1   r6   r4   r8
  r8
  :  si   € € € € € ðð ð)ð )ð )ð+ð +ð +ð+ð +ð +ð
0ð 
0ð 
0ð
)ð 
)ð 
)ð 
)ð 
)r6   r8
  c                  ó&   — e Zd ZdZej        Zd„ ZdS )ÚLiteralStringTestsz+
    Tests for L{self.literalFactory}.
    c                ó8  — d}d}t          j        t          |¦  «        | j        ¦  «        }t	          |¦  «        D ]}|                     |¦  «         Œ|                     d¦  «         |                      | j        ¦  «        }|                      |||f¦  «         dS )zÙ
        Calling L{imap4.LiteralString.callback} with a line fires the
        instance's L{Deferred} with a 2-L{tuple} whose first element
        is the collected data and whose second is the provided line.
        ó   datar6  N)	r   ÚLiteralStringrÐ   ræ  r'   r\   rê  rñ  rB   )rE   rB
  Úextrar=
  r”   r2   s         r4   Útest_callbackz LiteralStringTests.test_callback~  s›   € ð ˆØˆåÔ%¥c¨$¡i¤i°´Ñ?Ô?ˆå˜4‘”ð 	ð 	ˆAØ�MŠM˜!ÑÔÐÐà×Ò˜Ñ"Ô"Ð"à×%Ò% d¤mÑ4Ô4ˆØ×Ò˜ $¨ Ñ/Ô/Ð/Ð/Ð/r6   N)rs   rt   ru   r2  r   rN
  r;
  rP
  r1   r6   r4   rK
  rK
  w  s7   € € € € € ðð ð Ô(€Nð0ð 0ð 0ð 0ð 0r6   rK
  c                  ó,   — e Zd ZdZej        Zd„ Zd„ ZdS )ÚLiteralFileTestsz)
    Tests for L{imap4.LiteralFile}.
    c                ó¨  — d}d}t          j        t          |¦  «        | j        ¦  «        }t	          |¦  «        D ]}|                     |¦  «         Œ|                     d¦  «         |                      | j        ¦  «        }|                      t          |¦  «        d¦  «         |\  }}|                      | 	                    ¦   «         d¦  «         dS )zÍ
        Calling L{imap4.LiteralFile.callback} with a line fires the
        instance's L{Deferred} with a 2-L{tuple} whose first element
        is the file and whose second is the provided line.
        rM
  r6  rÉ   N)
r   ÚLiteralFilerÐ   ræ  r'   r\   rê  rñ  rB   rW   ©rE   rB
  rO
  r=
  r”   r2   ÚdataFiles          r4   rP
  zLiteralFileTests.test_callback™  sÄ   € ð ˆØˆåÔ#¥C¨¡I¤I¨t¬}Ñ=Ô=ˆå˜4‘”ð 	ð 	ˆAØ�MŠM˜!ÑÔÐÐà×Ò˜Ñ"Ô"Ð"à×%Ò% d¤mÑ4Ô4ˆØ×Ò�˜V™œ aÑ(Ô(Ð(à ‰ˆ�%Ø×Ò˜Ÿš™œ¨'Ñ2Ô2Ð2Ð2Ð2r6   c                óê  — d}d}|                       t          j        dd¦  «         t          j        t          |¦  «        | j        ¦  «        }t          |¦  «        D ]}|                     |¦  «         Œ|                     d¦  «         |                      | j        ¦  «        }|  	                    t          |¦  «        d¦  «         |\  }}|  	                    | 
                    ¦   «         d¦  «         dS )a=  
        A L{imap4.LiteralFile} whose size exceeds the maximum
        in-memory size spools its content to disk, and invoking its
        L{callback} with a line fires the instance's L{Deferred} with
        a 2-L{tuple} whose first element is the spooled file and whose second
        is the provided line.
        rM
  r6  Ú_memoryFileLimitrÅ   rÉ   N)r©  r   rT
  rÐ   ræ  r'   r\   rê  rñ  rB   rW   rU
  s          r4   Útest_callbackSpooledToDiskz+LiteralFileTests.test_callbackSpooledToDisk¯  sÞ   € ð ˆØˆà�
Š
•5Ô$Ð&8¸!Ñ<Ô<Ð<åÔ#¥C¨¡I¤I¨t¬}Ñ=Ô=ˆå˜4‘”ð 	ð 	ˆAØ�MŠM˜!ÑÔÐÐà×Ò˜Ñ"Ô"Ð"à×%Ò% d¤mÑ4Ô4ˆØ×Ò�˜V™œ aÑ(Ô(Ð(à ‰ˆ�%Ø×Ò˜Ÿš™œ¨'Ñ2Ô2Ð2Ð2Ð2r6   N)	rs   rt   ru   r2  r   rT
  r;
  rP
  rY
  r1   r6   r4   rR
  rR
  ’  sF   € € € € € ðð ð Ô&€Nð3ð 3ð 3ð,3ð 3ð 3ð 3ð 3r6   rR
  c                  ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚWriteBufferTestsz)
    Tests for L{imap4.WriteBuffer}.
    c                ó,   — t          ¦   «         | _        d S r0   )r   rð  rR   s    r4   r  zWriteBufferTests.setUpÏ  s   € Ý(Ñ*Ô*ˆŒˆˆr6   c                óÎ   — t          j        | j        ¦  «        }d|j        z  }|                     |¦  «         |                      | j                             ¦   «         ¦  «         dS )zd
        L{imap4.WriteBuffer} buffers writes that are smaller than its
        buffer size.
        ó   xN)r   ÚWriteBufferrð  Ú
bufferSizer\   rS  r  ©rE   ÚbufrB
  s      r4   r>
  z"WriteBufferTests.test_partialWriteÒ  sY   € õ
 Ô ¤Ñ/Ô/ˆØ�c”nÑ$ˆà�	Š	�$‰Œˆà×Ò˜œ×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ð0Ð0r6   c                óÖ   — t          j        | j        ¦  «        }d|j        dz   z  }|                     |¦  «         |                      | j                             ¦   «         |¦  «         dS )z‰
        L{imap4.WriteBuffer} writes data without buffering it when
        the size of the data exceeds the size of its buffer.
        r^
  rÅ   N)r   r_
  rð  r`
  r\   rB   r  ra
  s      r4   rG
  z#WriteBufferTests.test_overlongWriteÞ  s`   € õ
 Ô ¤Ñ/Ô/ˆØ�s”~¨Ñ)Ñ*ˆà�	Š	�$‰Œˆà×Ò˜œ×-Ò-Ñ/Ô/°Ñ6Ô6Ð6Ð6Ð6r6   c                ó\  — t          j        | j        ¦  «        }d|j        z  }d}|                     |¦  «         |                      | j                             ¦   «         ¦  «         |                     |¦  «         |                      | j                             ¦   «         ||z   ¦  «         dS )zp
        L{imap4.WriteBuffer} buffers writes until its buffer's size
        exceeds its maximum value.
        r^
  ó   yN)r   r_
  rð  r`
  r\   rS  r  rB   )rE   rb
  Ú	firstDataÚ
secondDatas       r4   Útest_writesImplyFlushz&WriteBufferTests.test_writesImplyFlushê  sœ   € õ
 Ô ¤Ñ/Ô/ˆØ˜3œ>Ñ)ˆ	Øˆ
à�	Š	�)ÑÔÐà×Ò˜œ×-Ò-Ñ/Ô/Ñ0Ô0Ð0à�	Š	�*ÑÔÐà×Ò˜œ×-Ò-Ñ/Ô/°¸ZÑ1GÑHÔHÐHÐHÐHr6   c                óP  — t          j        | j        ¦  «        }d|j        z  }|                     |¦  «         |                      | j                             ¦   «         ¦  «         |                     ¦   «          |                      | j                             ¦   «         |¦  «         dS )z{
        L{imap4.WriteBuffer.flush} flushes the buffer even when its
        size is smaller than the buffer size.
        r^
  N)	r   r_
  rð  r`
  r\   rS  r  ÚflushrB   ra
  s      r4   Útest_explicitFlushz#WriteBufferTests.test_explicitFlushû  sŠ   € õ
 Ô ¤Ñ/Ô/ˆØ�s”~Ñ&ˆà�	Š	�$‰Œˆà×Ò˜œ×-Ò-Ñ/Ô/Ñ0Ô0Ð0à�	Š	‰Œˆà×Ò˜œ×-Ò-Ñ/Ô/°Ñ6Ô6Ð6Ð6Ð6r6   c                ó¸   — t          j        | j        ¦  «        }|                     ¦   «          |                      | j                             ¦   «         ¦  «         dS )z_
        L{imap4.WriteBuffer.flush} has no effect if when the buffer is
        empty.
        N)r   r_
  rð  rj
  rS  r  )rE   rb
  s     r4   Útest_explicitFlushEmptyBufferz.WriteBufferTests.test_explicitFlushEmptyBuffer  sK   € õ
 Ô ¤Ñ/Ô/ˆà�	Š	‰Œˆà×Ò˜œ×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ð0Ð0r6   N)
rs   rt   ru   r2  r  r>
  rG
  rh
  rk
  rm
  r1   r6   r4   r[
  r[
  Ê  s{   € € € € € ðð ð+ð +ð +ð
1ð 
1ð 
1ð
7ð 
7ð 
7ðIð Ið Ið"7ð 7ð 7ð 	1ð 	1ð 	1ð 	1ð 	1r6   r[
  )Žr2  Ú
__future__r   r®  rU   r-
  r‚  r‘  rº   Úcollectionsr   Úior   Ú	itertoolsr   Útypingr   r	   Úunittestr
   Úzope.interfacer   Úzope.interface.verifyr   r   Útwisted.cred.checkersr   Útwisted.cred.credentialsr   r   r   Útwisted.cred.errorr   Útwisted.cred.portalr   r   Útwisted.internetr   r   r   r   Útwisted.internet.deferr   Útwisted.internet.taskr   Útwisted.internet.testingr   r   Útwisted.mailr   Útwisted.mail.imap4r   Útwisted.mail.interfacesr    r!   r"   Útwisted.protocolsr#   Útwisted.pythonr$   r%   r&   Útwisted.python.compatr'   r(   r)   Útwisted.trial.unittestr*   r+   Útwisted.test.ssl_helpersr,   r-   ÚImportErrorr7   r9   rw   r…   rÃ   r4  ÚIMailboxInfoÚIMailboxÚICloseableMailboxrW  rª  ÚMemoryAccountWithoutNamespacesr¿  rÆ  rÊ  rÓ  rÍ  rå  rã  rü  r  rÁ  rT  rÔ  rŠ  r–  r+  r6  rp  rˆ  rŒ  râ  ræ  r  r  r  r$  r2  r|  r§  r¯  rÂ  ÚIMessageÚFancyStrMixinr˜   rÞ  rý  rU  r	  ÚISearchableMailboxr<	  rc	  ÚIMessageFilerh	  ÚIMessageCopierrn	  rs	  ÚIReactorSSLrŽ	  rÎ	  rÔ	  r
  r
  r
  r3
  r8
  rK
  rR
  r[
  r1   r6   r4   ú<module>r‘
     sr  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;à IÐ IÐ IÐ IÐ IÐ Iðð ð ð ð ð ð ð ð ð ð
 1Ð 0Ð 0Ð 0Ð 0Ð 0Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø +Ð +Ð +Ð +Ð +Ð +Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð
 'Ð &Ð &Ð &Ð &Ð &Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ðØKÐKÐKÐKÐKÐKÐKÐKÐKøØð ð ð ØÐØÐÐÐðøøøð
#ð #ð #ðb;ð b;ð b;ð b;ð b;�Xñ b;ô b;ð b;ðJð ð ð ð ñ ô ð ð"d)ð d)ð d)ð d)ð d)Ð.ñ d)ô d)ð d)ðNHVð HVð HVð HVð HVÐ)ñ HVô HVð HVðV
q+ð q+ð q+ð q+ð q+�xñ q+ô q+ð q+ðh €ˆUÔ ¤°Ô1HÑIÔIðPð Pð Pð Pð Pñ Pô Pñ JÔIðPðf €ˆUÔ ¤Ñ0Ô0ðTð Tð Tð Tð Tñ Tô Tñ 1Ô0ðTðnð ð ð ð ˜uÔCñ ô ð ð"ð ð ð ð Ð&¨Ô(;ñ ô ð ð3ð 3ð 3ð 3ð 3�5Ô$ñ 3ô 3ð 3ð,(ð (ð (ð (ð (�5Ô$ñ (ô (ð (ð,.,ð .,ð .,ð .,ð .,ñ .,ô .,ð .,ðb_/ð _/ð _/ð _/ð _/Ð'¨ñ _/ô _/ð _/ðDa2ð a2ð a2ð a2ð a2Ð1ñ a2ô a2ð a2ðHdXð dXð dXð dXð dXÐ-¨xñ dXô dXð dXðN €ˆVÑÔð@ð @ð @ð @ð @ñ @ô @ñ Ôð@ð:"ð "ð "ð "ð "ñ "ô "ð "ð"h4ð h4ð h4ð h4ð h4Ð)¨8ñ h4ô h4ð h4ðV/
ð /
ð /
ð /
ð /
�Xñ /
ô /
ð /
ðddTð dTð dTð dTð dTÐ/°ñ dTô dTð dTðNL"ð L"ð L"ð L"ð L"˜Hñ L"ô L"ð L"ð^
$ð 
$ð 
$ð 
$ð 
$˜Ô*ñ 
$ô 
$ð 
$ðLð Lð Lð Lð LÐ'¨ñ Lô Lð Lð^Bð Bð Bð Bð Bñ Bô Bð Bð6EIð EIð EIð EIð EIÐ1ñ EIô EIð EIðPð ð ð ð Ð1Ð3Fñ ô ð ð(ð ð ð ð Ð0Ð2Eñ ô ð ð*+=ð +=ð +=ð +=ð +=Ð5Ð7Jñ +=ô +=ð +=ð\/=ð /=ð /=ð /=ð /=Ð4Ð6Iñ /=ô /=ð /=ðd\
ð \
ð \
ð \
ð \
Ð3Ð5Hñ \
ô \
ð \
ð~JTð JTð JTð JTð JTÐ3°Xñ JTô JTð JTðZ,=ð ,=ð ,=ð ,=ð ,=Ð4Ð6Iñ ,=ô ,=ð ,=ð^KSð KSð KSð KSð KSÐ2Ð4Gñ KSô KSð KSð\ð ð ð ð �%Ô#ñ ô ð ð €ˆUŒ^ÑÔð$"ð $"ð $"ð $"ð $"�4Ô%ñ $"ô $"ñ Ôð$"ðN?!ð ?!ð ?!ð ?!ð ?!�HÐ.ñ ?!ô ?!ð ?!ðDa
ð a
ð a
ð a
ð a
˜Hñ a
ô a
ð a
ðHK%ð K%ð K%ð K%ð K%�HÐ.ñ K%ô K%ð K%ð\sð sð sð sð sÐ)¨8ñ sô sð sðl €ˆUÔ%Ñ&Ô&ðXð Xð Xð Xð X˜HÐ&6ñ Xô Xñ 'Ô&ðXðv#ð #ð #ð #ð #ñ #ô #ð #ð €ˆUÔÑ Ô ð ð  ð  ð  ð  ñ  ô  ñ !Ô ð ð €ˆUÔ!Ñ"Ô"ðð ð ð ð ñ ô ñ #Ô"ððN%ð N%ð N%ð N%ð N%�hñ N%ô N%ð N%ðb €ÐÐÐ3Ñ4Ô4Ø€Ð"ˆJÔ" 7¨DÑ1Ô1Ð1Ð3PÑQÔQðU2ð U2ð U2ð U2ð U2Ð ñ U2ô U2ñ RÔQñ 5Ô4ðU2ðpð ð ð ð �-ñ ô ð ðð ð ð ð Ð# Xñ ô ð ðD	ð 	ð 	ð 	ð 	˜ñ 	ô 	ð 	ð.ð .ð .ð .ð .ñ .ô .ð .ðT
ð T
ð T
ð T
ð T
�hñ T
ô T
ð T
ðnNð Nð Nð Nð N˜Hñ Nô Nð Nð>:)ð :)ð :)ð :)ð :)ñ :)ô :)ð :)ðz0ð 0ð 0ð 0ð 0Ð*Ð,?ñ 0ô 0ð 0ð653ð 53ð 53ð 53ð 53Ð(¨(ñ 53ô 53ð 53ðpJ1ð J1ð J1ð J1ð J1Ð*ñ J1ô J1ð J1ð J1ð J1s   ÃC Ã	CÃC