a
    ãIþfÊ3 ã                   @   s>  d 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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 zddlZW n ey’   dZY n0 g d¢Zej d¡ZG dd„ dƒZG dd	„ d	eƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dejjƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G d d!„ d!eƒZ"G d"d#„ d#eƒZ#G d$d%„ d%ƒZ$G d&d'„ d'e$ƒZ%d?d)d*„Z&d+d,„ Z'd-d.„ Z(d/d0„ Z)d1d2„ Z*d3d4„ Z+G d5d6„ d6e,ƒZ-G d7d8„ d8e-ƒZ.G d9d:„ d:e-ƒZ/G d;d<„ d<e-ƒZ0G d=d>„ d>e-ƒZ1dS )@zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.é    N)ÚGenericAlias)ÚMailboxÚMaildirÚmboxÚMHÚBabylÚMMDFÚMessageÚMaildirMessageÚmboxMessageÚ	MHMessageÚBabylMessageÚMMDFMessageÚErrorÚNoSuchMailboxErrorÚNotEmptyErrorÚExternalClashErrorÚFormatErrorÚasciic                   @   s  e Zd ZdZdCdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dDdd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZdEd0d1„Zd2d3„ ZdFd4d5„Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@Z"dGdAdB„Z#e$e%ƒZ&dS )Hr   z*A group of messages in a particular place.NTc                 C   s    t j t j |¡¡| _|| _dS )zInitialize a Mailbox instance.N)ÚosÚpathÚabspathÚ
expanduserÚ_pathÚ_factory©Úselfr   ÚfactoryÚcreate© r   úlib/python3.9/mailbox.pyÚ__init__%   s    zMailbox.__init__c                 C   s   t dƒ‚dS )ú$Add message and return assigned key.ú&Method must be implemented by subclassN©ÚNotImplementedError©r   Úmessager   r   r    Úadd*   s    zMailbox.addc                 C   s   t dƒ‚dS )ú=Remove the keyed message; raise KeyError if it doesn't exist.r#   Nr$   ©r   Úkeyr   r   r    Úremove.   s    zMailbox.removec                 C   s   |   |¡ d S ©N)r,   r*   r   r   r    Ú__delitem__2   s    zMailbox.__delitem__c                 C   s&   z|   |¡ W n ty    Y n0 dS ©z'If the keyed message exists, remove it.N)r,   ÚKeyErrorr*   r   r   r    Údiscard5   s    zMailbox.discardc                 C   s   t dƒ‚dS )ú>Replace the keyed message; raise KeyError if it doesn't exist.r#   Nr$   ©r   r+   r'   r   r   r    Ú__setitem__<   s    zMailbox.__setitem__c                 C   s(   z|   |¡W S  ty"   | Y S 0 dS )z9Return the keyed message, or default if it doesn't exist.N)Ú__getitem__r0   )r   r+   Údefaultr   r   r    Úget@   s    zMailbox.getc                 C   sN   | j s|  |¡S t |  |¡¡}|   |¡W  d  ƒ S 1 s@0    Y  dS )z=Return the keyed message; raise KeyError if it doesn't exist.N)r   Úget_messageÚ
contextlibÚclosingÚget_file)r   r+   Úfiler   r   r    r5   G   s    
zMailbox.__getitem__c                 C   s   t dƒ‚dS )ú4Return a Message representation or raise a KeyError.r#   Nr$   r*   r   r   r    r8   O   s    zMailbox.get_messagec                 C   s   t  |  |¡¡ ¡ S )zœReturn a string representation or raise a KeyError.

        Uses email.message.Message to create a 7bit clean string
        representation of the message.©ÚemailÚmessage_from_bytesÚ	get_bytesZ	as_stringr*   r   r   r    Ú
get_stringS   s    zMailbox.get_stringc                 C   s   t dƒ‚dS )z8Return a byte string representation or raise a KeyError.r#   Nr$   r*   r   r   r    rA   Z   s    zMailbox.get_bytesc                 C   s   t dƒ‚dS )ú6Return a file-like representation or raise a KeyError.r#   Nr$   r*   r   r   r    r;   ^   s    zMailbox.get_filec                 C   s   t dƒ‚dS )úReturn an iterator over keys.r#   Nr$   ©r   r   r   r    Úiterkeysb   s    zMailbox.iterkeysc                 C   s   t |  ¡ ƒS )zReturn a list of keys.)ÚlistrF   rE   r   r   r    Úkeysf   s    zMailbox.keysc              	   c   s<   |   ¡ D ].}z| | }W n ty.   Y qY n0 |V  qdS )z%Return an iterator over all messages.N©rF   r0   ©r   r+   Úvaluer   r   r    Ú
itervaluesj   s    
zMailbox.itervaluesc                 C   s   |   ¡ S r-   )rL   rE   r   r   r    Ú__iter__s   s    zMailbox.__iter__c                 C   s   t |  ¡ ƒS )z,Return a list of messages. Memory intensive.)rG   rL   rE   r   r   r    Úvaluesv   s    zMailbox.valuesc              	   c   s@   |   ¡ D ]2}z| | }W n ty.   Y qY n0 ||fV  qdS )z.Return an iterator over (key, message) tuples.NrI   rJ   r   r   r    Ú	iteritemsz   s    
zMailbox.iteritemsc                 C   s   t |  ¡ ƒS )z9Return a list of (key, message) tuples. Memory intensive.)rG   rO   rE   r   r   r    Úitemsƒ   s    zMailbox.itemsc                 C   s   t dƒ‚dS )ú9Return True if the keyed message exists, False otherwise.r#   Nr$   r*   r   r   r    Ú__contains__‡   s    zMailbox.__contains__c                 C   s   t dƒ‚dS )ú*Return a count of messages in the mailbox.r#   Nr$   rE   r   r   r    Ú__len__‹   s    zMailbox.__len__c                 C   s   |   ¡ D ]}|  |¡ qdS )zDelete all messages.N)rH   r1   r*   r   r   r    Úclear   s    zMailbox.clearc                 C   s2   z| | }W n t y"   | Y S 0 |  |¡ |S )z3Delete the keyed message and return it, or default.)r0   r1   )r   r+   r6   Úresultr   r   r    Úpop”   s    

zMailbox.popc                 C   s*   |   ¡ D ]}||  |¡f  S tdƒ‚dS )z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailboxN)rF   rW   r0   r*   r   r   r    Úpopitem   s    zMailbox.popitemc              	   C   sr   t |dƒr| ¡ }nt |dƒr(| ¡ }n|}d}|D ],\}}z|| |< W q4 ty^   d}Y q40 q4|rntdƒ‚dS )z4Change the messages that correspond to certain keys.rO   rP   FTzNo message with key(s)N)ÚhasattrrO   rP   r0   )r   ÚargÚsourceZbad_keyr+   r'   r   r   r    Úupdate¤   s    



zMailbox.updatec                 C   s   t dƒ‚dS )ú&Write any pending changes to the disk.r#   Nr$   rE   r   r   r    Úflushµ   s    zMailbox.flushc                 C   s   t dƒ‚dS )úLock the mailbox.r#   Nr$   rE   r   r   r    Úlock¹   s    zMailbox.lockc                 C   s   t dƒ‚dS )ú#Unlock the mailbox if it is locked.r#   Nr$   rE   r   r   r    Úunlock½   s    zMailbox.unlockc                 C   s   t dƒ‚dS )úFlush and close the mailbox.r#   Nr$   rE   r   r   r    ÚcloseÁ   s    zMailbox.closec                 C   s,   z|  d¡W S  ty&   tdƒ‚Y n0 d S )Nr   z?String input must be ASCII-only; use bytes or a Message instead)ÚencodeÚUnicodeErrorÚ
ValueErrorr&   r   r   r    Ú_string_to_bytesÅ   s    zMailbox._string_to_bytesFc           	      C   sü  t |tjjƒrvt ¡ }tj ||d¡}| |¡ | 	d¡ | 
¡ }| dt¡}| |¡ | jrr| t¡sr| t¡ n‚t |tttjfƒrt |tjƒr¬t dtd¡ | ¡ }t |tƒrÀ|  |¡}|rÐ| dd¡}| dt¡}| |¡ | jrø| t¡sø| t¡ nòt|dƒrèt|dƒr2t d	td¡ |j}d
}| ¡ }| d¡r\|d
d… d }n| d¡rx|d
d… d }|s‚qÂ|r¤| d¡r¤d|dd
…  }| dt¡}| |¡ |}q6| jrø|rø| t¡sø| t¡ ntdt|ƒ ƒ‚d
S )z%Dump message contents to target file.r   ó   
ú8Use of StringIO input is deprecated, use BytesIO insteadé   s   
From s   
>From ÚreadÚbufferúDUse of text mode files is deprecated, use a binary mode file insteadNó   
éþÿÿÿó   éÿÿÿÿó   From s   >From é   úInvalid message type: %s)Ú
isinstancer?   r'   r	   ÚioÚBytesIOÚ	generatorÚBytesGeneratorÚflattenÚseekrl   ÚreplaceÚlinesepÚwriteÚ_append_newlineÚendswithÚstrÚbytesÚStringIOÚwarningsÚwarnÚDeprecationWarningÚgetvaluerh   rY   rm   ÚreadlineÚ
startswithÚ	TypeErrorÚtype)	r   r'   ÚtargetZmangle_from_rm   ÚgenÚdataZlastlineÚliner   r   r    Ú_dump_messageÒ   s\    


ÿ


ÿ
zMailbox._dump_message)NT)N)N)N)F)'Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r(   r,   r.   r1   r4   r7   r5   r8   rB   rA   r;   rF   rH   rL   rM   rN   rO   rP   rR   rT   rU   rW   rX   r\   r^   r`   rb   rd   rh   r€   r‘   Úclassmethodr   Ú__class_getitem__r   r   r   r    r   "   sD   

		
	

6r   c                   @   sÚ   e Zd ZdZdZd6dd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdS )7r   zA qmail-style Maildir mailbox.ú:NTc                 C   s¬   t  | |||¡ tj | jd¡tj | jd¡tj | jd¡dœ| _tj | j¡sŠ|r€t | jd¡ | j 	¡ D ]}t |d¡ qln
t
| jƒ‚i | _dddœ| _d| _d| _d	S )
zInitialize a Maildir instance.ÚtmpÚnewÚcur)r™   rš   r›   éÀ  r   )r›   rš   gš™™™™™¹?N)r   r!   r   r   Újoinr   Ú_pathsÚexistsÚmkdirrN   r   Ú_tocÚ_toc_mtimesÚ
_last_readÚ_skewfactor)r   Údirnamer   r   r   r   r   r    r!     s    ý
zMaildir.__init__c              
   C   s|  |   ¡ }z|  ||¡ W n( ty@   | ¡  t |j¡ ‚ Y n0 t|ƒ t|t	ƒrz| 
¡ }| j| ¡  }|| jkr‚d}nd}d}tj |j¡ | j¡d }tj | j||| ¡}t|t	ƒrÜt |jtj |j¡| ¡ f¡ zJzt |j|¡ W n& ttfy   t |j|¡ Y n0 t |j¡ W nP tyv } z6t |j¡ |jtjkr`td| ƒ‚n‚ W Y d}~n
d}~0 0 |S )r"   Ú rš   r   z$Name clash with existing message: %sN)Ú_create_tmpr‘   ÚBaseExceptionrd   r   r,   ÚnameÚ_sync_closerv   r
   Ú
get_subdirÚcolonÚget_infor   ÚbasenameÚsplitr   r   ÚutimeÚgetatimeÚget_dateÚlinkÚAttributeErrorÚPermissionErrorÚrenameÚOSErrorÚerrnoZEEXISTr   )r   r'   Ztmp_fileÚsubdirÚsuffixÚuniqÚdestÚer   r   r    r(   $  sF    


ÿÿzMaildir.addc                 C   s    t  t j | j|  |¡¡¡ dS ©r)   N)r   r,   r   r   r   Ú_lookupr*   r   r   r    r,   N  s    zMaildir.removec              	   C   s*   z|   |¡ W n ttfy$   Y n0 dS r/   )r,   r0   ÚFileNotFoundErrorr*   r   r   r    r1   R  s    zMaildir.discardc                 C   sÊ   |   |¡}|  |¡}|   |¡}t|tƒr.|}n|}tj |¡}| j|v r`| j| | j¡d  }nd}|  	|¡ tj 
| j|¡}	tj 
| j||| ¡}
t|tƒrºt |	tj |	¡| ¡ f¡ t |	|
¡ dS )r2   rr   r¦   N)r¿   r(   rv   r
   r   r   r¥   r¬   r¯   r1   r   r   r°   r±   r²   r¶   )r   r+   r'   Zold_subpathZtemp_keyZtemp_subpathZdominant_subpathr¹   rº   Ztmp_pathÚnew_pathr   r   r    r4   Z  s$    






ÿzMaildir.__setitem__c                 C   s¶   |   |¡}ttj | j|¡dƒ*}| jr4|  |¡}nt|ƒ}W d  ƒ n1 sP0    Y  tj |¡\}}| 	|¡ | j
|v r”| | | j
¡d ¡ | tj tj | j|¡¡¡ |S )r=   ÚrbNrr   )r¿   Úopenr   r   r   r   r   r
   r¯   Ú
set_subdirr¬   Úset_infoÚset_dateÚgetmtime)r   r+   ZsubpathÚfÚmsgr¹   r©   r   r   r    r8   u  s    
&

zMaildir.get_messagec                 C   sP   t tj | j|  |¡¡dƒ }| ¡  td¡W  d  ƒ S 1 sB0    Y  dS )ú2Return a bytes representation or raise a KeyError.rÂ   ri   N)	rÃ   r   r   r   r   r¿   rl   r}   r~   ©r   r+   rÈ   r   r   r    rA   „  s    zMaildir.get_bytesc                 C   s$   t tj | j|  |¡¡dƒ}t|ƒS )rC   rÂ   )rÃ   r   r   r   r   r¿   Ú
_ProxyFilerË   r   r   r    r;   ‰  s    zMaildir.get_filec              	   c   sD   |   ¡  | jD ]0}z|  |¡ W n ty6   Y qY n0 |V  qdS ©rD   N)Ú_refreshr¡   r¿   r0   r*   r   r   r    rF   Ž  s    

zMaildir.iterkeysc                 C   s   |   ¡  || jv S ©rQ   )rÎ   r¡   r*   r   r   r    rR   ˜  s    zMaildir.__contains__c                 C   s   |   ¡  t| jƒS ©rS   )rÎ   Úlenr¡   rE   r   r   r    rT     s    zMaildir.__len__c                 C   s   dS )ú"Write any pending changes to disk.Nr   rE   r   r   r    r^   ¢  s    zMaildir.flushc                 C   s   dS )r_   Nr   rE   r   r   r    r`   ¨  s    zMaildir.lockc                 C   s   dS )ra   Nr   rE   r   r   r    rb   ¬  s    zMaildir.unlockc                 C   s   dS ©rc   Nr   rE   r   r   r    rd   °  s    zMaildir.closec                 C   s\   g }t  | j¡D ]F}t|ƒdkr|d dkrt j t j | j|¡¡r| |dd… ¡ q|S )úReturn a list of folder names.é   r   Ú.N)r   Úlistdirr   rÑ   r   Úisdirr   Úappend©r   rV   Úentryr   r   r    Úlist_folders´  s    ÿzMaildir.list_foldersc                 C   s    t tj | jd| ¡| jddS )z/Return a Maildir instance for the named folder.rÖ   F©r   r   )r   r   r   r   r   r   ©r   Úfolderr   r   r    Ú
get_folder½  s    þzMaildir.get_folderc                 C   s\   t j | jd| ¡}t|| jd}t j |d¡}t j |¡sXt  t  |t j	t j
B d¡¡ |S )z>Create a folder and return a Maildir instance representing it.rÖ   ©r   Zmaildirfolderé¶  )r   r   r   r   r   r   rŸ   rd   rÃ   ÚO_CREATÚO_WRONLY)r   rß   r   rV   Zmaildirfolder_pathr   r   r    Ú
add_folderÃ  s    ÿzMaildir.add_folderc                 C   s  t j | jd| ¡}t  t j |d¡¡t  t j |d¡¡ D ](}t|ƒdk sX|d dkr<td| ƒ‚q<t  |¡D ]B}|dkrp|dkrp|dkrpt j t j ||¡¡rptd||f ƒ‚qpt j|d	d
D ]F\}}}|D ]}t  	t j ||¡¡ qÐ|D ]}t  
t j ||¡¡ qîqÂt  
|¡ dS )ú-Delete the named folder, which must be empty.rÖ   rš   r›   rÕ   r   zFolder contains message(s): %sr™   z%Folder contains subdirectory '%s': %sF)ÚtopdownN)r   r   r   r   r×   rÑ   r   rØ   Úwalkr,   Úrmdir)r   rß   r   rÛ   ÚrootÚdirsÚfilesr   r   r    Úremove_folderÍ  s&    ÿÿÿzMaildir.remove_folderc                 C   sX   t   ¡ }t tj | jd¡¡D ]4}tj | jd|¡}|tj |¡ dkrt |¡ qdS )zDelete old files in "tmp".r™   i@ú N)Útimer   r×   r   r   r   r±   r,   )r   ÚnowrÛ   r   r   r   r    Úcleanà  s
    zMaildir.cleanrÕ   c                 C   sÔ   t   ¡ }t ¡ }d|v r$| dd¡}d|v r8| dd¡}dt|ƒt|d d ƒt ¡ tj|f }tj	 
| jd|¡}zt |¡ W nB tyÂ   t jd7  _zt|ƒW  Y S  ty¼   Y n0 Y n0 td	| ƒ‚d
S )z=Create a file in the tmp subdirectory and open and return it.ú/z\057r˜   z\072z%s.M%sP%sQ%s.%srÕ   g    €„.Ar™   z&Name clash prevented file creation: %sN)rî   ÚsocketÚgethostnamer}   Úintr   Úgetpidr   Ú_countr   r   r   ÚstatrÀ   Ú_create_carefullyÚFileExistsErrorr   )r   rï   Zhostnamer»   r   r   r   r    r§   ê  s*    ÿÿzMaildir._create_tmpc                 C   sØ   t   ¡ | j d| j kr^d}| jD ]2}tj | j| ¡}|| j| krJd}|| j|< q"|s^dS i | _| jD ]^}| j| }t 	|¡D ]D}tj 
||¡}tj |¡r¢q‚| | j¡d }tj 
||¡| j|< q‚qjt   ¡ | _dS )z!Update table of contents mapping.é   FTNr   )rî   r£   r¤   r¢   r   r   rÇ   rž   r¡   r×   r   rØ   r¯   r¬   )r   Zrefreshr¹   Úmtimer   rÛ   Úpr»   r   r   r    rÎ     s&    


zMaildir._refreshc                 C   s|   z.t j t j | j| j| ¡¡r,| j| W S W n ty@   Y n0 |  ¡  z| j| W S  tyv   td| ƒd‚Y n0 dS )z=Use TOC to return subpath for given key, or raise a KeyError.úNo message with key: %sN)r   r   rŸ   r   r   r¡   r0   rÎ   r*   r   r   r    r¿   &  s    zMaildir._lookupc                 C   sT   t | dƒs|  ¡ | _z| t| jƒ W S  ty8   Y dS  tyL   Y qY q0 qdS )z0Return the next message in a one-time iteration.Ú_onetime_keysN)rY   rF   rþ   ÚnextÚStopIterationr0   rE   r   r   r    rÿ   4  s    

zMaildir.next)NT)r’   r“   r”   r•   r¬   r!   r(   r,   r1   r4   r8   rA   r;   rF   rR   rT   r^   r`   rb   rd   rÜ   rà   rå   rí   rð   rö   r§   rÎ   r¿   rÿ   r   r   r   r    r     s6   
*
	
$r   c                   @   s”   e Zd ZdZd$dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd%d d!„Zd"d#„ ZdS )&Ú_singlefileMailboxzA single-file mailbox.NTc              
   C   sÀ   t  | |||¡ zt| jdƒ}W np ty } zX|jtjkrZ|rNt| jdƒ}q|t| jƒ‚n"|jtjtj	fv rzt| jdƒ}n‚ W Y d}~n
d}~0 0 || _
d| _d| _d| _d| _d| _d| _dS )z!Initialize a single-file mailbox.úrb+zwb+rÂ   Nr   F)r   r!   rÃ   r   r·   r¸   ÚENOENTr   ÚEACCESÚEROFSÚ_filer¡   Ú	_next_keyÚ_pendingÚ_pending_syncÚ_lockedÚ_file_length)r   r   r   r   rÈ   r½   r   r   r    r!   D  s$    z_singlefileMailbox.__init__c                 C   s8   |   ¡  |  |¡| j| j< |  jd7  _d| _| jd S )r"   rÕ   T)r¿   Ú_append_messager¡   r  r	  r&   r   r   r    r(   [  s
    z_singlefileMailbox.addc                 C   s   |   |¡ | j|= d| _dS )r)   TN)r¿   r¡   r  r*   r   r   r    r,   e  s    
z_singlefileMailbox.removec                 C   s$   |   |¡ |  |¡| j|< d| _dS )r2   TN)r¿   r  r¡   r  r3   r   r   r    r4   k  s    
z_singlefileMailbox.__setitem__c                 c   s   |   ¡  | j ¡ E dH  dS rÍ   )r¿   r¡   rH   rE   r   r   r    rF   q  s    z_singlefileMailbox.iterkeysc                 C   s   |   ¡  || jv S rÏ   )r¿   r¡   r*   r   r   r    rR   v  s    z_singlefileMailbox.__contains__c                 C   s   |   ¡  t| jƒS rÐ   )r¿   rÑ   r¡   rE   r   r   r    rT   {  s    z_singlefileMailbox.__len__c                 C   s   | j st| jƒ d| _ dS )r_   TN)r
  Ú
_lock_filer  rE   r   r   r    r`   €  s    
z_singlefileMailbox.lockc                 C   s   | j rt| jƒ d| _ dS ©ra   FN)r
  Ú_unlock_filer  rE   r   r   r    rb   †  s    
z_singlefileMailbox.unlockc           
      C   sâ  | j s | jrt| jƒ d| _dS | jdus.J ‚| j dd¡ | j ¡ }|| jkrbtd| j|f ƒ‚t	| j
ƒ}z¤i }|  |¡ t| j ¡ ƒD ]x}| j| \}}| j |¡ |  |¡ | ¡ }| j td|| j ¡  ƒ¡}|sÜqè| |¡ qº|| ¡ f||< |  |¡ qŠ| ¡ | _W n"   | ¡  t |j¡ ‚ Y n0 t|ƒ | j ¡  t | j
¡j}	t |j|	¡ zt |j| j
¡ W n0 ty¦   t | j
¡ t |j| j
¡ Y n0 t| j
dƒ| _|| _d| _ d| _| jrÞt| jdd dS )	rÒ   FNr   rú   z4Size of mailbox file changed (expected %i, found %i)é   r  )Údotlock) r  r	  Ú_sync_flushr  r¡   r|   Útellr  r   Ú_create_temporaryr   Ú_pre_mailbox_hookÚsortedrH   Ú_pre_message_hookrl   Úminr   Ú_post_message_hookrd   r   r,   r©   rª   r÷   Úst_modeÚchmodr¶   rù   rÃ   r
  r  )
r   Zcur_lenZnew_fileZnew_tocr+   ÚstartÚstopZ	new_startrm   Úmoder   r   r    r^   Œ  sb    


þ



ÿ
z_singlefileMailbox.flushc                 C   s   dS )ú,Called before writing the mailbox to file f.Nr   ©r   rÈ   r   r   r    r  Ì  s    z$_singlefileMailbox._pre_mailbox_hookc                 C   s   dS )ú-Called before writing each message to file f.Nr   r   r   r   r    r  Ð  s    z$_singlefileMailbox._pre_message_hookc                 C   s   dS ©ú,Called after writing each message to file f.Nr   r   r   r   r    r  Ô  s    z%_singlefileMailbox._post_message_hookc                 C   sh   z6|   ¡  W z| jr|  ¡  W | j ¡  qd| j ¡  0 n,z| jrH|  ¡  W | j ¡  n| j ¡  0 0 dS rÓ   )r^   r
  rb   r  rd   rE   r   r   r    rd   Ø  s    

ü
z_singlefileMailbox.closec                 C   sL   | j du r|  ¡  |durHz| j | W S  tyF   td| ƒd‚Y n0 dS )z'Return (start, stop) or raise KeyError.Nrý   )r¡   Ú_generate_tocr0   r*   r   r   r    r¿   ã  s    
z_singlefileMailbox._lookupc                 C   sš   | j  dd¡ | j  ¡ }t| jƒdkr8| js8|  | j ¡ z&|  | j ¡ |  |¡}|  	| j ¡ W n  t
y~   | j  |¡ ‚ Y n0 | j  ¡  | j  ¡ | _|S )z;Append message to mailbox and return (start, stop) offsets.r   rú   )r  r|   r  rÑ   r¡   r  r  r  Ú_install_messager  r¨   Útruncater^   r  )r   r'   ZbeforeZoffsetsr   r   r    r  í  s    


z"_singlefileMailbox._append_message)NT)N)r’   r“   r”   r•   r!   r(   r,   r4   rF   rR   rT   r`   rb   r^   r  r  r  rd   r¿   r  r   r   r   r    r  A  s"   

@

r  c                   @   sB   e Zd ZdZdZdd„ Zddd„Zddd	„Zdd
d„Zdd„ Z	dS )Ú	_mboxMMDFzAn mbox or MMDF mailbox.Tc                 C   sp   |   |¡\}}| j |¡ | j ¡  td¡}| j || j ¡  ¡}|  | td¡¡}| 	|dd…  
d¡¡ |S )r=   ó    ri   rt   Nr   )r¿   r  r|   r‰   r}   r~   rl   r  Ú_message_factoryÚset_fromÚdecode)r   r+   r  r  Ú	from_lineÚstringrÉ   r   r   r    r8   	  s    z_mboxMMDF.get_messageFc                 C   s   t  |  ||¡¡j|dS )ú3Return a string representation or raise a KeyError.)Úunixfromr>   )r   r+   Úfrom_r   r   r    rB     s
    
ÿÿz_mboxMMDF.get_stringc                 C   sJ   |   |¡\}}| j |¡ |s(| j ¡  | j || j ¡  ¡}| td¡S )r.  ri   )r¿   r  r|   r‰   rl   r  r}   r~   )r   r+   r0  r  r  r-  r   r   r    rA     s    
z_mboxMMDF.get_bytesc                 C   s<   |   |¡\}}| j |¡ |s(| j ¡  t| j| j ¡ |ƒS )rC   )r¿   r  r|   r‰   Ú_PartialFiler  )r   r+   r0  r  r  r   r   r    r;   !  s
    
z_mboxMMDF.get_filec                 C   s  d}t |tƒr|  |¡}t |tƒrf| d¡rf| d¡}|dkr\|d|… }||d d… }q°|}d}nJt |tƒrˆ| ¡  d¡}d| }n(t |t	j
jƒr°| ¡ }|dur°| d¡}|du rÎdt t ¡ ¡ ¡  }| j ¡ }| j |t ¡ |  || j| j¡ | j ¡ }||fS )	z1Format a message and blindly write to self._file.Nrs   ri   rr   rÕ   r(  r   s   From MAILER-DAEMON )rv   r‚   rh   rƒ   rŠ   ÚfindÚ_mboxMMDFMessageÚget_fromre   r?   r'   r	   Úget_unixfromrî   ÚasctimeÚgmtimer  r  r   r~   r‘   Ú_mangle_from_)r   r'   r,  ÚnewlineZauthorr  r  r   r   r    r%  )  s0    







z_mboxMMDF._install_messageN)F)F)F)
r’   r“   r”   r•   r8  r8   rB   rA   r;   r%  r   r   r   r    r'    s   


	
r'  c                   @   s2   e Zd ZdZdZdZd
dd„Zdd„ Zdd	„ ZdS )r   zA classic mbox mailbox.TNc                 C   s   t | _t | |||¡ dS )zInitialize an mbox mailbox.N)r   r)  r'  r!   r   r   r   r    r!   O  s    zmbox.__init__c                 C   s   |  t¡ dS r"  ©r   r~   r   r   r   r    r  T  s    zmbox._post_message_hookc                 C   sè   g g  }}d}| j  d¡ | j  ¡ }| j  ¡ }| d¡rzt|ƒt|ƒk rj|r`| |ttƒ ¡ n
| |¡ | |¡ d}q|s¤|r–| |ttƒ ¡ q¸| |¡ q¸q|tkr²d}qd}qtt	t
||ƒƒƒ| _t| jƒ| _| j  ¡ | _dS )ú0Generate key-to-(start, stop) table of contents.Fr   rs   TN)r  r|   r  r‰   rŠ   rÑ   rÙ   r~   ÚdictÚ	enumerateÚzipr¡   r  r  )r   ÚstartsÚstopsZlast_was_emptyÚline_posr   r   r   r    r$  X  s.    






zmbox._generate_toc)NT)	r’   r“   r”   r•   r8  r€   r!   r  r$  r   r   r   r    r   F  s   
r   c                   @   s2   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ ZdS )r   zAn MMDF mailbox.NTc                 C   s   t | _t | |||¡ dS )zInitialize an MMDF mailbox.N)r   r)  r'  r!   r   r   r   r    r!   }  s    zMMDF.__init__c                 C   s   |  dt ¡ dS )r!  ó   Nr:  r   r   r   r    r  ‚  s    zMMDF._pre_message_hookc                 C   s   |  td t ¡ dS )r#  rB  Nr:  r   r   r   r    r  †  s    zMMDF._post_message_hookc                 C   sÞ   g g  }}| j  d¡ d}|}| j  ¡ }| j  ¡ }| dt ¡r˜| |¡ |}| j  ¡ }| j  ¡ }|dt kr„| |ttƒ ¡ qžqJ|sJ| |¡ qžqJq|sq qtt	t
||ƒƒƒ| _t| jƒ| _| j  dd¡ | j  ¡ | _dS )r;  r   rB  rú   N)r  r|   r‰   r  rŠ   r~   rÙ   rÑ   r<  r=  r>  r¡   r  r  )r   r?  r@  Únext_posrA  r   r   r   r    r$  Š  s.    






zMMDF._generate_toc)NT)r’   r“   r”   r•   r!   r  r  r$  r   r   r   r    r   z  s
   
r   c                   @   sÂ   e Zd ZdZd0dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZdS )1r   zAn MH mailbox.NTc                 C   st   t  | |||¡ tj | j¡sj|r`t | jd¡ t t tj 	| jd¡tj
tjB tjB d¡¡ n
t| jƒ‚d| _dS )zInitialize an MH instance.rœ   ú.mh_sequencesi€  FN)r   r!   r   r   rŸ   r   r    rd   rÃ   r   rã   ÚO_EXCLrä   r   r
  r   r   r   r    r!   ª  s    ÿ
zMH.__init__c                 C   sü   |   ¡ }t|ƒdkrd}nt|ƒd }tj | jt|ƒ¡}t|ƒ}d}z¢| j	rVt
|ƒ zrz|  ||¡ W n8 ty    | j	r„t|ƒ t|ƒ d}t |¡ ‚ Y n0 t|tƒr¸|  ||¡ W | j	rÚt|ƒ n| j	rØt|ƒ 0 W |søt|ƒ n|söt|ƒ 0 |S )r"   r   rÕ   FT)rH   rÑ   Úmaxr   r   r   r   r‚   rø   r
  r  r‘   r¨   r  rª   r,   rv   r   Ú_dump_sequences)r   r'   rH   Znew_keyrÁ   rÈ   Úclosedr   r   r    r(   ¶  s>    


ÿ
ÿ
zMH.addc              
   C   sz   t j | jt|ƒ¡}zt|dƒ}W n@ tyb } z(|jtjkrLt	d| ƒ‚n‚ W Y d}~nd}~0 0 | 
¡  t  |¡ dS )r)   r  rý   N)r   r   r   r   r‚   rÃ   r·   r¸   r  r0   rd   r,   )r   r+   r   rÈ   r½   r   r   r    r,   Ø  s    z	MH.removec              
   C   sî   t j | jt|ƒ¡}zt|dƒ}W n@ tyb } z(|jtjkrLt	d| ƒ‚n‚ W Y d}~n
d}~0 0 zz| j
rtt|ƒ zNt  t  |t jt jB ¡¡ |  ||¡ t|tƒr²|  ||¡ W | j
rÔt|ƒ n| j
rÒt|ƒ 0 W t|ƒ n
t|ƒ 0 dS )r2   r  rý   N)r   r   r   r   r‚   rÃ   r·   r¸   r  r0   r
  r  rd   rä   ÚO_TRUNCr‘   rv   r   rG  r  rª   )r   r+   r'   r   rÈ   r½   r   r   r    r4   æ  s(    

ÿzMH.__setitem__c              
   C   s  z@| j r$ttj | jt|ƒ¡dƒ}nttj | jt|ƒ¡dƒ}W n@ ty€ } z(|jtj	krjt
d| ƒ‚n‚ W Y d}~n
d}~0 0 |J | j r–t|ƒ zt|ƒ}W | j rÂt|ƒ n| j rÀt|ƒ 0 W d  ƒ n1 sÖ0    Y  |  ¡  ¡ D ]\}}||v rì| |¡ qì|S )r=   r  rÂ   rý   N)r
  rÃ   r   r   r   r   r‚   r·   r¸   r  r0   r  r   r  Úget_sequencesrP   Úadd_sequence)r   r+   rÈ   r½   rÉ   r©   Úkey_listr   r   r    r8   þ  s*    

ÿ(zMH.get_messagec              
   C   sú   z@| j r$ttj | jt|ƒ¡dƒ}nttj | jt|ƒ¡dƒ}W n@ ty€ } z(|jtj	krjt
d| ƒ‚n‚ W Y d}~n
d}~0 0 |` | j r–t|ƒ z0| ¡  td¡W | j r¶t|ƒ W  d  ƒ S n| j rÖt|ƒ 0 W d  ƒ n1 sì0    Y  dS )rÊ   r  rÂ   rý   Nri   )r
  rÃ   r   r   r   r   r‚   r·   r¸   r  r0   r  rl   r}   r~   r  ©r   r+   rÈ   r½   r   r   r    rA     s(    ý ÿzMH.get_bytesc              
   C   sh   zt tj | jt|ƒ¡dƒ}W n@ ty^ } z(|jtjkrHt	d| ƒ‚n‚ W Y d}~n
d}~0 0 t
|ƒS )rC   rÂ   rý   N)rÃ   r   r   r   r   r‚   r·   r¸   r  r0   rÌ   rM  r   r   r    r;   ,  s    zMH.get_filec                 C   s   t tdd„ t | j¡D ƒƒƒS )rD   c                 s   s   | ]}|  ¡ rt|ƒV  qd S r-   )Úisdigitrô   )Ú.0rÛ   r   r   r    Ú	<genexpr>9  s   ÿzMH.iterkeys.<locals>.<genexpr>)Úiterr  r   r×   r   rE   r   r   r    rF   7  s    zMH.iterkeysc                 C   s   t j t j | jt|ƒ¡¡S rÏ   )r   r   rŸ   r   r   r‚   r*   r   r   r    rR   <  s    zMH.__contains__c                 C   s   t t|  ¡ ƒƒS rÐ   )rÑ   rG   rF   rE   r   r   r    rT   @  s    z
MH.__len__c                 C   s2   | j s.ttj | jd¡dƒ| _t| jƒ d| _ dS )r_   rD  r  TN)r
  rÃ   r   r   r   r   r  r  rE   r   r   r    r`   D  s    
zMH.lockc                 C   s(   | j r$t| jƒ t| jƒ | `d| _ dS r  )r
  r  r  rª   rE   r   r   r    rb   K  s
    

z	MH.unlockc                 C   s   dS )r]   Nr   rE   r   r   r    r^   S  s    zMH.flushc                 C   s   | j r|  ¡  dS rÓ   )r
  rb   rE   r   r   r    rd   W  s    zMH.closec                 C   s<   g }t  | j¡D ]&}t j t j | j|¡¡r| |¡ q|S )rÔ   )r   r×   r   r   rØ   r   rÙ   rÚ   r   r   r    rÜ   \  s
    zMH.list_foldersc                 C   s   t tj | j|¡| jddS )z+Return an MH instance for the named folder.FrÝ   ©r   r   r   r   r   r   rÞ   r   r   r    rà   d  s    ÿzMH.get_folderc                 C   s   t tj | j|¡| jdS )z:Create a folder and return an MH instance representing it.rá   rR  rÞ   r   r   r    rå   i  s    ÿzMH.add_folderc                 C   s`   t j | j|¡}t  |¡}|dgkr:t  t j |d¡¡ n|g krDntd| j ƒ‚t  |¡ dS )ræ   rD  zFolder not empty: %sN)r   r   r   r   r×   r,   r   ré   )r   rß   r   Úentriesr   r   r    rí   n  s    

zMH.remove_folderc           
   
      s  i }t tj | jd¡dddä}t|  ¡ ƒ‰ |D ]Â}zš| d¡\}}tƒ }| ¡ D ]H}| ¡ rn| 	t
|ƒ¡ qRdd„ | d¡D ƒ\}}	| t||	d	 ƒ¡ qR‡ fd
d„t|ƒD ƒ||< t|| ƒdkrÌ||= W q0 tyð   td| ¡  ƒ‚Y q00 q0W d  ƒ n1 s
0    Y  |S )z=Return a name-to-key-list dictionary to define each sequence.rD  ÚrÚASCII©Úencodingr˜   c                 s   s   | ]}t |ƒV  qd S r-   )rô   )rO  Úxr   r   r    rP  ‡  r(  z#MH.get_sequences.<locals>.<genexpr>ú-rÕ   c                    s   g | ]}|ˆ v r|‘qS r   r   )rO  r+   ©Zall_keysr   r    Ú
<listcomp>‰  s   ÿz$MH.get_sequences.<locals>.<listcomp>r   z"Invalid sequence specification: %sN)rÃ   r   r   r   r   ÚsetrH   r¯   rN  r(   rô   r\   Úranger  rÑ   rg   r   Úrstrip)
r   ZresultsrÈ   r   r©   ÚcontentsrH   Úspecr  r  r   rZ  r    rJ  z  s(    
ÿ.zMH.get_sequencesc                 C   s
  t tj | jd¡ddd}zàt t  |jtjtjB ¡¡ | 	¡ D ]®\}}t
|ƒdkrVq@| |d ¡ d}d}tt|ƒƒD ]R}|d	 |krœ|sÆd
}| d¡ n*|r¸d}| d||f ¡ n| d| ¡ |}qx|rä| t|ƒd ¡ q@| d¡ q@W t|ƒ n
t|ƒ 0 dS )z:Set sequences using the given name-to-key-list dictionary.rD  zr+rU  rV  r   r˜   NFrÕ   TrY  z%s %sz %sÚ
)rÃ   r   r   r   r   rd   r©   rä   rI  rP   rÑ   r   r  r\  r‚   rª   )r   Ú	sequencesrÈ   r©   rH   ÚprevZ
completingr+   r   r   r    Úset_sequences’  s.    zMH.set_sequencesc           	      C   s<  |   ¡ }d}g }|  ¡ D ]À}|d |krÐ| ||d f¡ z4t tj | jt|ƒ¡tj | jt|d ƒ¡¡ W nF t	t
fy´   t tj | jt|ƒ¡tj | jt|d ƒ¡¡ Y n0 t tj | jt|ƒ¡¡ |d7 }q|d | _t|ƒdkrôdS | ¡ D ]0\}}|D ]"\}}||v r||| |¡< qqü|  |¡ dS )z?Re-name messages to eliminate numbering gaps. Invalidates keys.r   rÕ   N)rJ  rF   rÙ   r   r³   r   r   r   r‚   r´   rµ   r¶   Úunlinkr  rÑ   rP   Úindexrd  )	r   rb  rc  Zchangesr+   r©   rL  Úoldrš   r   r   r    Úpack¯  s0    ÿÿ



zMH.packc                 C   st   |  ¡ }|   ¡ }| ¡ D ]0\}}||v r4| |¡ q||v r|| |¡= q|D ]}||vrN|g||< qN|  |¡ dS )z;Inspect a new MHMessage and update sequences appropriately.N)rJ  rP   rÙ   rf  rd  )r   r'   r+   Zpending_sequencesZall_sequencesr©   rL  Úsequencer   r   r    rG  É  s    zMH._dump_sequences)NT)r’   r“   r”   r•   r!   r(   r,   r4   r8   rA   r;   rF   rR   rT   r`   rb   r^   rd   rÜ   rà   rå   rí   rJ  rd  rh  rG  r   r   r   r    r   §  s.   
"r   c                   @   s†   e Zd ZdZeh d£ƒZddd„Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) r   zAn Rmail-style Babyl mailbox.>   ZfiledÚ	forwardedÚresentÚansweredZeditedÚdeletedÚunseenNTc                 C   s   t  | |||¡ i | _dS )zInitialize a Babyl mailbox.N)r  r!   Ú_labelsr   r   r   r    r!   Þ  s    zBabyl.__init__c                 C   s(   t  | |¡}t|tƒr$| ¡ | j|< |S )r"   )r  r(   rv   r   Ú
get_labelsro  )r   r'   r+   r   r   r    r(   ã  s    
z	Babyl.addc                 C   s"   t  | |¡ || jv r| j|= dS r¾   )r  r,   ro  r*   r   r   r    r,   ê  s    
zBabyl.removec                 C   s*   t  | ||¡ t|tƒr&| ¡ | j|< dS )r2   N)r  r4   rv   r   rp  ro  r3   r   r   r    r4   ð  s    
zBabyl.__setitem__c           
      C   sþ   |   |¡\}}| j |¡ | j ¡  t ¡ }| j ¡ }|dt ks\|sHq\| | td¡¡ q,t ¡ }| j ¡ }|tks|s|q| | td¡¡ qd|| j 	¡  }|dksªJ ‚| j 
|¡}| td¡}t| ¡ | ƒ}	|	 | ¡ ¡ || jv rú|	 | j| ¡ |	S )r=   ó   *** EOOH ***ri   r   )r¿   r  r|   r‰   rw   rx   r~   r   r}   r  rl   r   rˆ   Úset_visiblero  Ú
set_labels)
r   r+   r  r  Úoriginal_headersr   Zvisible_headersÚnÚbodyrÉ   r   r   r    r8   ö  s,    



zBabyl.get_messagec           	      C   s¸   |   |¡\}}| j |¡ | j ¡  t ¡ }| j ¡ }|dt ks\|sHq\| | td¡¡ q,| j ¡ }|tksv|s\qvq\| 	¡ }|| j 
¡  }|dks˜J ‚| j |¡}| td¡}|| S )r.  rq  ri   r   )r¿   r  r|   r‰   rw   rx   r~   r   r}   rˆ   r  rl   )	r   r+   r  r  rt  r   Zheadersru  r   r   r   r    rA     s"    


zBabyl.get_bytesc                 C   s   t  |  |¡ dt¡¡S )rC   ri   )rw   rx   rA   r}   r~   r*   r   r   r    r;   (  s    zBabyl.get_filec                 C   s<   |   ¡  tƒ }| j ¡ D ]}| |¡ q| | j¡ t|ƒS )z4Return a list of user-defined labels in the mailbox.)r¿   r\  ro  rN   r\   Údifference_updateÚ_special_labelsrG   )r   ÚlabelsZ
label_listr   r   r    rp  ,  s    zBabyl.get_labelsc                 C   s:  g g  }}| j  d¡ d}g }|}| j  ¡ }| j  ¡ }|dt krœt|ƒt|ƒk rd| |ttƒ ¡ | |¡ dd„ | j  ¡ dd…  d¡D ƒ}| |¡ q|dks°|dt krÔt|ƒt|ƒk rì| |ttƒ ¡ q|s| |ttƒ ¡ qîqtt	t
||ƒƒƒ| _tt	|ƒƒ| _t| jƒ| _| j  dd	¡ | j  ¡ | _dS )
r;  r   s   c                 S   s   g | ]}|  ¡ r|  ¡ ‘qS r   )Ústrip©rO  Úlabelr   r   r    r[  C  s   þz'Babyl._generate_toc.<locals>.<listcomp>rÕ   Nó   ,ó   rú   )r  r|   r‰   r  r~   rÑ   rÙ   r¯   r<  r=  r>  r¡   ro  r  r  )r   r?  r@  rC  Zlabel_listsrA  r   ry  r   r   r    r$  5  s4    



ÿzBabyl._generate_tocc                 C   sV   dt  }|dt  7 }|  ¡ }dd„ |D ƒ}|dd |¡ t  7 }|d7 }| |¡ dS )	r  s   BABYL OPTIONS:s
   Version: 5c                 s   s   | ]}|  ¡ V  qd S r-   )re   r{  r   r   r    rP  X  r(  z*Babyl._pre_mailbox_hook.<locals>.<genexpr>s   Labels:r}  r~  N)r~   rp  r   r   )r   rÈ   Zbabylry  r   r   r    r  S  s    zBabyl._pre_mailbox_hookc                 C   s   |  dt ¡ dS )r!  ó   Nr:  r   r   r   r    r  ]  s    zBabyl._pre_message_hookc                 C   s   |  td ¡ dS )r#  r~  Nr:  r   r   r   r    r  a  s    zBabyl._post_message_hookc                 C   sx  | j  ¡ }t|tƒr°g }g }| ¡ D ]$}|| jv r>| |¡ q$| |¡ q$| j  d¡ |D ]}| j  d| ¡  ¡ qZ| j  d¡ |D ]}| j  d| ¡  d ¡ q„| j  t	¡ n| j  dt	 ¡ t|t
jjƒrt ¡ }t
j |dd¡}| |¡ | d¡ | ¡ }| j  | d	t	¡¡ |d	ks,|süq,qü| j  d
t	 ¡ t|tƒr¤t ¡ }	t
j |	dd¡}
|
 | ¡ ¡ |	 ¡ }| j  | d	t	¡¡ |d	ks¢|snqâqnn>| d¡ | ¡ }| j  | d	t	¡¡ |d	ksâ|s®qâq®| d¡}|söqf| j  | d	t	¡¡ qânTt|tttjfƒrt|tjƒrJt dtd¡ | ¡ }t|tƒr`|  |¡}| d¡d }|d dkrâ| j  |d|…  d	t	¡¡ | j  d
t	 ¡ | j  |d|…  d	t	¡¡ | j  ||d…  d	t	¡¡ n(| j  d
t	 t	 ¡ | j  | d	t	¡¡ nXt |dƒrVt |dƒr:t dtd¡ |j!}| ¡ }d}| ¡ }| "d¡rl|dd… d	 }n| "d¡rˆ|dd… d	 }| j  | d	t	¡¡ |d	ks¬|sF|rÚd}| j  d
t	 ¡ | |¡ nqÚqF| ¡ }|sìqf| "d¡r
|dd… t	 }n:| "d¡r(|dd… t	 }n| "d	¡rD|dd… t	 }| j  |¡ qÚnt#dt$|ƒ ƒ‚| j  ¡ }||fS )z0Write message contents and return (start, stop).ó   1s   , s   ,,ó    r}  s   1,,Fr   ri   rq  r  rj   rk   s   

rú   rr   Nr‰   rm   rn   Tro   rp   rq   ru   )%r  r  rv   r   rp  rx  rÙ   r   re   r~   r?   r'   r	   rw   rx   ry   rz   r{   r|   r‰   r}   Úget_visiblerl   rƒ   r‚   r„   r…   r†   r‡   rˆ   rh   r2  rY   rm   r   r‹   rŒ   )r   r'   r  Zspecial_labelsry  r|  Zorig_bufferZorig_generatorr   Z
vis_bufferZvis_generatorrm   Z
body_startZoriginal_posZ
first_passr  r   r   r    r%  e  s¸    







ÿ
ÿ
zBabyl._install_message)NT)r’   r“   r”   r•   Ú	frozensetrx  r!   r(   r,   r4   r8   rA   r;   rp  r$  r  r  r  r%  r   r   r   r    r   Ø  s   
	
r   c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
r	   z0Message with mailbox-format-specific properties.Nc                 C   sÒ   t |tjjƒr4|  t |¡¡ t |tƒrÎ| | ¡ nšt |tƒrP|  t 	|¡¡ n~t |t
ƒrl|  t |¡¡ nbt |tjƒrŠ|  t |¡¡ nDt|dƒr¦|  t |¡¡ n(|du r¾tjj | ¡ ntdt|ƒ ƒ‚dS )zInitialize a Message instance.rl   Nru   )rv   r?   r'   r	   Ú_become_messageÚcopyÚdeepcopyÚ_explain_torƒ   r@   r‚   Zmessage_from_stringrw   ÚTextIOWrapperZmessage_from_filerY   Zmessage_from_binary_filer!   r‹   rŒ   r&   r   r   r    r!   Ô  s    



zMessage.__init__c                 C   s4   t |dg ƒ}|jD ]}||vr|j| | j|< qdS )z0Assume the non-format-specific state of message.Ú_type_specific_attributesN)ÚgetattrÚ__dict__)r   r'   Ztype_specificr©   r   r   r    r„  ç  s    
zMessage._become_messagec                 C   s   t |tƒrdS tdƒ‚dS )z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)rv   r	   r‹   r&   r   r   r    r‡  î  s    
zMessage._explain_to)N)r’   r“   r”   r•   r!   r„  r‡  r   r   r   r    r	   Ñ  s   
r	   c                   @   sz   e Zd ZdZg d¢Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r
   z)Message with Maildir-specific properties.)Ú_subdirÚ_infoÚ_dateNc                 C   s&   d| _ d| _t ¡ | _t | |¡ dS )z%Initialize a MaildirMessage instance.rš   r¦   N)rŒ  r  rî   rŽ  r	   r!   r&   r   r   r    r!   û  s    
zMaildirMessage.__init__c                 C   s   | j S )zReturn 'new' or 'cur'.)rŒ  rE   r   r   r    r«     s    zMaildirMessage.get_subdirc                 C   s(   |dks|dkr|| _ ntd| ƒ‚dS )zSet subdir to 'new' or 'cur'.rš   r›   z!subdir must be 'new' or 'cur': %sN)rŒ  rg   )r   r¹   r   r   r    rÄ     s    zMaildirMessage.set_subdirc                 C   s"   | j  d¡r| j dd… S dS dS )ú*Return as a string the flags that are set.ú2,rú   Nr¦   )r  rŠ   rE   r   r   r    Ú	get_flags  s    zMaildirMessage.get_flagsc                 C   s   dd  t|ƒ¡ | _dS )ú)Set the given flags and unset all others.r  r¦   N)r   r  r  )r   Úflagsr   r   r    Ú	set_flags  s    zMaildirMessage.set_flagsc                 C   s$   |   d t|  ¡ ƒt|ƒB ¡¡ dS ©z.Set the given flag(s) without changing others.r¦   N©r”  r   r\  r‘  ©r   Úflagr   r   r    Úadd_flag  s    zMaildirMessage.add_flagc                 C   s,   |   ¡ r(|  d t|   ¡ ƒt|ƒ ¡¡ dS )ú7Unset the given string flag(s) without changing others.r¦   N)r‘  r”  r   r\  r—  r   r   r    Úremove_flag  s    zMaildirMessage.remove_flagc                 C   s   | j S )z<Return delivery date of message, in seconds since the epoch.)rŽ  rE   r   r   r    r²   !  s    zMaildirMessage.get_datec                 C   s4   zt |ƒ| _W n  ty.   td| ƒd‚Y n0 dS )z9Set delivery date of message, in seconds since the epoch.zcan't convert to float: %sN)ÚfloatrŽ  rg   r‹   )r   Údater   r   r    rÆ   %  s    zMaildirMessage.set_datec                 C   s   | j S )z%Get the message's "info" as a string.)r  rE   r   r   r    r­   ,  s    zMaildirMessage.get_infoc                 C   s&   t |tƒr|| _ntdt|ƒ ƒ‚dS )z Set the message's "info" string.zinfo must be a string: %sN)rv   r‚   r  r‹   rŒ   )r   Úinfor   r   r    rÅ   0  s    
zMaildirMessage.set_infoc                 C   s¤  t |tƒr8| |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ nht |tƒrÄt	|  ¡ ƒ}d|v r`| 
d¡ |  ¡ dkrv| 
d¡ d|v rˆ| 
d¡ d|v rš| 
d¡ d|v r¬| 
d¡ | d	t |  ¡ ¡¡ nÜt |tƒrt	|  ¡ ƒ}d|vrî| d
¡ d|v r| d¡ d|v r | d¡ nˆt |tƒr‚t	|  ¡ ƒ}d|vrD| d
¡ d|v rX| d¡ d|v rl| d¡ d|v r | d¡ nt |tƒrntdt|ƒ ƒ‚dS )z;Copy Maildir-specific state to message insofar as possible.ÚSÚRr›   ÚOÚTÚDÚFÚAúMAILER-DAEMONrn  ÚrepliedÚflaggedrm  rl  ÚPrj  ú$Cannot convert to specified type: %sN)rv   r
   r”  r‘  rÄ   r«   rÆ   r²   r3  r\  r™  r*  rî   r7  r   rK  r   Ú	add_labelr	   r‹   rŒ   )r   r'   r“  r   r   r    r‡  7  sP    

















ÿzMaildirMessage._explain_to)N)r’   r“   r”   r•   r‰  r!   r«   rÄ   r‘  r”  r™  r›  r²   rÆ   r­   rÅ   r‡  r   r   r   r    r
   ö  s   
r
   c                   @   sZ   e Zd ZdZdgZddd„Zdd„ Zddd	„Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )r3  z/Message with mbox- or MMDF-specific properties.Ú_fromNc                 C   sV   |   dd¡ t|tjjƒrF| ¡ }|durF| d¡rF|   |dd… ¡ t | |¡ dS )z'Initialize an mboxMMDFMessage instance.r¦  TNzFrom rt   )r*  rv   r?   r'   r	   r5  rŠ   r!   )r   r'   r/  r   r   r    r!   h  s    z_mboxMMDFMessage.__init__c                 C   s   | j S )z Return contents of "From " line.)r¬  rE   r   r   r    r4  q  s    z_mboxMMDFMessage.get_fromc                 C   s4   |dur*|du rt  ¡ }|dt  |¡ 7 }|| _dS )z>Set "From " line, formatting and appending time_ if specified.NTú )rî   r7  r6  r¬  )r   r0  Ztime_r   r   r    r*  u  s
    z_mboxMMDFMessage.set_fromc                 C   s   |   dd¡|   dd¡ S )r  ÚStatusr¦   úX-Status)r7   rE   r   r   r    r‘  }  s    z_mboxMMDFMessage.get_flagsc                 C   sÎ   t |ƒ}d\}}dD ]}||v r||7 }| |¡ qdD ]}||v r8||7 }| |¡ q8|d t|ƒ¡7 }z|  d|¡ W n ty˜   |  d|¡ Y n0 z|  d|¡ W n tyÈ   |  d|¡ Y n0 dS )r’  )r¦   r¦   )r   r¡  )r£  r¤  r¥  r¦   r®  r¯  N)r\  r,   r   r  Úreplace_headerr0   Z
add_header)r   r“  Zstatus_flagsZxstatus_flagsr˜  r   r   r    r”    s&    z_mboxMMDFMessage.set_flagsc                 C   s$   |   d t|  ¡ ƒt|ƒB ¡¡ dS r•  r–  r—  r   r   r    r™  —  s    z_mboxMMDFMessage.add_flagc                 C   s4   d| v sd| v r0|   d t|  ¡ ƒt|ƒ ¡¡ dS )rš  r®  r¯  r¦   Nr–  r—  r   r   r    r›  ›  s    z_mboxMMDFMessage.remove_flagc              	   C   sÜ  t |tƒrÎt|  ¡ ƒ}d|v r(| d¡ d|v r:| d¡ d|v rL| d¡ d|v r^| d¡ d|v rp| d¡ |d	= |d
= d |  ¡  ¡ dd… ¡}z| 	t
 t |d¡¡¡ W n ttfyÈ   Y n0 n
t |tƒrö| |  ¡ ¡ | |  ¡ ¡ nât |tƒrXt|  ¡ ƒ}d|vr"| d¡ d|v r6| d¡ d|v rJ| d¡ |d	= |d
= n€t |tƒrºt|  ¡ ƒ}d|vr„| d¡ d|v r˜| d¡ d|v r¬| d¡ |d	= |d
= nt |tƒrÈntdt|ƒ ƒ‚dS )zACopy mbox- or MMDF-specific state to message insofar as possible.r¡  r›   r¤  r¥  r   rŸ  r£  r¢  Zstatuszx-statusr­  éûÿÿÿNz%a %b %d %H:%M:%S %Yrn  r§  r¨  rm  rl  rª  )rv   r
   r\  r‘  rÄ   r™  r   r4  r¯   rÆ   ÚcalendarZtimegmrî   Ústrptimerg   ÚOverflowErrorr3  r”  r*  r   rK  r   r«  r	   r‹   rŒ   )r   r'   r“  Z
maybe_dater   r   r    r‡     sb    





ÿ













ÿz_mboxMMDFMessage._explain_to)N)N)r’   r“   r”   r•   r‰  r!   r4  r*  r‘  r”  r™  r›  r‡  r   r   r   r    r3  c  s   
	
r3  c                   @   s   e Zd ZdZdS )r   z&Message with mbox-specific properties.N©r’   r“   r”   r•   r   r   r   r    r   Ô  s   r   c                   @   sH   e Zd ZdZdgZddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )r   z$Message with MH-specific properties.Ú
_sequencesNc                 C   s   g | _ t | |¡ dS )z!Initialize an MHMessage instance.N)r¶  r	   r!   r&   r   r   r    r!   Ý  s    zMHMessage.__init__c                 C   s   | j dd… S )z4Return a list of sequences that include the message.N)r¶  rE   r   r   r    rJ  â  s    zMHMessage.get_sequencesc                 C   s   t |ƒ| _dS )z3Set the list of sequences that include the message.N)rG   r¶  )r   rb  r   r   r    rd  æ  s    zMHMessage.set_sequencesc                 C   s6   t |tƒr"|| jvr2| j |¡ ntdt|ƒ ƒ‚dS )z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)rv   r‚   r¶  rÙ   r‹   rŒ   ©r   ri  r   r   r    rK  ê  s    

zMHMessage.add_sequencec                 C   s(   z| j  |¡ W n ty"   Y n0 dS )zARemove sequence from the list of sequences including the message.N)r¶  r,   rg   r·  r   r   r    Úremove_sequenceò  s    zMHMessage.remove_sequencec                 C   sF  t |tƒrdt|  ¡ ƒ}d|v r*| d¡ n| d¡ | d¡ d|v rP| d¡ d|v rb| d¡ nÞt |tƒr¾t|  ¡ ƒ}d|vrŽ| d¡ n
| d	¡ d|v rª| d¡ d|v r¼| d
¡ n„t |tƒrâ|  ¡ D ]}| |¡ qÐn`t |t	ƒr$t|  ¡ ƒ}d|v r| 
d¡ d|v rB| 
d¡ nt |tƒr2ntdt|ƒ ƒ‚dS )z6Copy MH-specific state to message insofar as possible.rn  r›   rŸ  r¨  r¤  r§  r   ÚROr¡  r¥  rl  rª  N)rv   r
   r\  rJ  rÄ   r™  r3  r   rK  r   r«  r	   r‹   rŒ   )r   r'   rb  ri  r   r   r    r‡  ù  sB    










ÿzMHMessage._explain_to)N)r’   r“   r”   r•   r‰  r!   rJ  rd  rK  r¸  r‡  r   r   r   r    r   Ø  s   
r   c                   @   sb   e Zd ZdZddgZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )r   z'Message with Babyl-specific properties.ro  Ú_visibleNc                 C   s   g | _ tƒ | _t | |¡ dS )z#Initialize a BabylMessage instance.N)ro  r	   rº  r!   r&   r   r   r    r!   %  s    zBabylMessage.__init__c                 C   s   | j dd… S )z'Return a list of labels on the message.N)ro  rE   r   r   r    rp  +  s    zBabylMessage.get_labelsc                 C   s   t |ƒ| _dS )z&Set the list of labels on the message.N)rG   ro  )r   ry  r   r   r    rs  /  s    zBabylMessage.set_labelsc                 C   s6   t |tƒr"|| jvr2| j |¡ ntdt|ƒ ƒ‚dS )z+Add label to list of labels on the message.zlabel must be a string: %sN)rv   r‚   ro  rÙ   r‹   rŒ   ©r   r|  r   r   r    r«  3  s    

zBabylMessage.add_labelc                 C   s(   z| j  |¡ W n ty"   Y n0 dS )z4Remove label from the list of labels on the message.N)ro  r,   rg   r»  r   r   r    Úremove_label;  s    zBabylMessage.remove_labelc                 C   s
   t | jƒS )z3Return a Message representation of visible headers.©r	   rº  rE   r   r   r    r‚  B  s    zBabylMessage.get_visiblec                 C   s   t |ƒ| _dS )z2Set the Message representation of visible headers.Nr½  )r   Zvisibler   r   r    rr  F  s    zBabylMessage.set_visiblec                 C   sb   | j  ¡ D ](}|| v r*| j  || | ¡ q
| j |= q
dD ]$}|| v r8|| j vr8| | | j |< q8dS )z9Update and/or sensibly generate a set of visible headers.)ZDateZFromzReply-ToZToZCCZSubjectN)rº  rH   r°  )r   Úheaderr   r   r    Úupdate_visibleJ  s    
zBabylMessage.update_visiblec                 C   sr  t |tƒr~t|  ¡ ƒ}d|v r*| d¡ n| d¡ | d¡ d|v sNd|v rX| d¡ d|v rj| d¡ d	|v r|| d
¡ nðt |tƒrØt|  ¡ ƒ}d|vr¨| d¡ n
| d¡ d	|v rÄ| d¡ d|v rÖ| d¡ n–t |tƒrt|  ¡ ƒ}d|v r| d¡ d|v rn| d¡ nTt |t	ƒrP| 
|  ¡ ¡ |  ¡ D ]}| |¡ q<nt |tƒr^ntdt|ƒ ƒ‚dS )z9Copy Babyl-specific state to message insofar as possible.rn  r›   rŸ  rj  rk  r©  rl  r   rm  r¢  r¹  r¡  r£  r¥  r§  rª  N)rv   r
   r\  rp  rÄ   r™  r3  r   rK  r   rr  r‚  r«  r	   r‹   rŒ   )r   r'   ry  r|  r   r   r    r‡  U  sH    










ÿzBabylMessage._explain_to)N)r’   r“   r”   r•   r‰  r!   rp  rs  r«  r¼  r‚  rr  r¿  r‡  r   r   r   r    r      s   
r   c                   @   s   e Zd ZdZdS )r   z&Message with MMDF-specific properties.Nrµ  r   r   r   r    r     s   r   c                   @   s°   e Zd ZdZd&dd„Zd'dd„Zd(dd„Zd)d	d
„Zd*dd„Zdd„ Z	dd„ Z
d+dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zed$d%„ ƒZeeƒZdS ),rÌ   zA read-only wrapper of a file.Nc                 C   s$   || _ |du r| ¡ | _n|| _dS )zInitialize a _ProxyFile.N)r  r  Ú_pos)r   rÈ   Úposr   r   r    r!   †  s    z_ProxyFile.__init__c                 C   s   |   || jj¡S ©zRead bytes.)Ú_readr  rl   ©r   Úsizer   r   r    rl   Ž  s    z_ProxyFile.readc                 C   s   |   || jj¡S rÂ  )rÃ  r  Úread1rÄ  r   r   r    rÆ  ’  s    z_ProxyFile.read1c                 C   s   |   || jj¡S )zRead a line.)rÃ  r  r‰   rÄ  r   r   r    r‰   –  s    z_ProxyFile.readlinec                 C   s<   g }| D ].}|  |¡ |dur|t|ƒ8 }|dkr q8q|S )zRead multiple lines.Nr   )rÙ   rÑ   )r   ÚsizehintrV   r   r   r   r    Ú	readlinesš  s    
z_ProxyFile.readlinesc                 c   s   |   ¡ }|sdS |V  q dS )zIterate over lines.N)r‰   )r   r   r   r   r    rM   ¥  s    z_ProxyFile.__iter__c                 C   s   | j S )zReturn the position.)rÀ  rE   r   r   r    r  ­  s    z_ProxyFile.tellr   c                 C   s4   |dkr| j  | j¡ | j  ||¡ | j  ¡ | _dS )zChange position.rÕ   N©r  r|   rÀ  r  ©r   ÚoffsetÚwhencer   r   r    r|   ±  s    z_ProxyFile.seekc                 C   s4   t | dƒr0zt | jdƒr"| j ¡  W | `n| `0 dS )zClose the file.r  rd   N)rY   r  rd   rE   r   r   r    rd   ¸  s
    
z_ProxyFile.closec                 C   s2   |du rd}| j  | j¡ ||ƒ}| j  ¡ | _|S )z"Read size bytes using read_method.Nrr   rÉ  )r   rÅ  Úread_methodrV   r   r   r    rÃ  Á  s    z_ProxyFile._readc                 C   s   | S )z$Context management protocol support.r   rE   r   r   r    Ú	__enter__Ê  s    z_ProxyFile.__enter__c                 G   s   |   ¡  d S r-   )rd   )r   Úexcr   r   r    Ú__exit__Î  s    z_ProxyFile.__exit__c                 C   s
   | j  ¡ S r-   )r  ÚreadablerE   r   r   r    rÑ  Ñ  s    z_ProxyFile.readablec                 C   s
   | j  ¡ S r-   )r  ÚwritablerE   r   r   r    rÒ  Ô  s    z_ProxyFile.writablec                 C   s
   | j  ¡ S r-   )r  ÚseekablerE   r   r   r    rÓ  ×  s    z_ProxyFile.seekablec                 C   s
   | j  ¡ S r-   )r  r^   rE   r   r   r    r^   Ú  s    z_ProxyFile.flushc                 C   s&   t | dƒsdS t | jdƒsdS | jjS )Nr  TrH  F)rY   r  rH  rE   r   r   r    rH  Ý  s
    
z_ProxyFile.closed)N)N)N)N)N)r   )r’   r“   r”   r•   r!   rl   rÆ  r‰   rÈ  rM   r  r|   rd   rÃ  rÎ  rÐ  rÑ  rÒ  rÓ  r^   ÚpropertyrH  r–   r   r—   r   r   r   r    rÌ   ƒ  s(   





		
rÌ   c                   @   s<   e Zd ZdZddd„Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )r1  z&A read-only wrapper of part of a file.Nc                 C   s   t  | ||¡ || _|| _dS )zInitialize a _PartialFile.N)rÌ   r!   Ú_startÚ_stop)r   rÈ   r  r  r   r   r    r!   ë  s    z_PartialFile.__init__c                 C   s   t  | ¡| j S )z*Return the position with respect to start.)rÌ   r  rÕ  rE   r   r   r    r  ñ  s    z_PartialFile.tellr   c                 C   s<   |dkr| j | _d}n|dkr*| j| _d}t | ||¡ dS )z8Change position, possibly with respect to start or stop.r   rÕ   rú   N)rÕ  rÀ  rÖ  rÌ   r|   rÊ  r   r   r    r|   õ  s    z_PartialFile.seekc                 C   sB   | j | j }|dkrdS |du s0|dk s0||kr4|}t | ||¡S )z;Read size bytes using read_method, honoring start and stop.r   r(  N)rÖ  rÀ  rÌ   rÃ  )r   rÅ  rÍ  Z	remainingr   r   r    rÃ  ÿ  s    z_PartialFile._readc                 C   s   t | dƒr| `d S )Nr  )rY   r  rE   r   r   r    rd     s    
z_PartialFile.close)NN)r   )	r’   r“   r”   r•   r!   r  r|   rÃ  rd   r   r   r   r    r1  è  s   


	r1  Tc              
   C   sª  d}zft rrzt  | t jt jB ¡ W nL typ } z4|jtjtjtjfv rZt	d| j
 ƒ‚n‚ W Y d}~n
d}~0 0 |rjzt| j
d ƒ}| ¡  W nH tyÚ } z0|jtjtjfv rÄW Y d}~W dS ‚ W Y d}~n
d}~0 0 z^zt |j
| j
d ¡ d}W n0 ttfy*   t |j
| j
d ¡ d}Y n0 t |j
¡ W n. tyh   t |j
¡ t	d| j
 ƒ‚Y n0 W n8   t rˆt  | t j¡ |ržt | j
d ¡ ‚ Y n0 dS )z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sNú.lockTzdot lock unavailable: %s)ÚfcntlÚlockfZLOCK_EXZLOCK_NBr·   r¸   ZEAGAINr  r  r   r©   r  rd   r   r³   r´   rµ   r¶   re  rù   r,   ÚLOCK_UN)rÈ   r  Zdotlock_doner½   Zpre_lockr   r   r    r    sL    ÿ
ÿr  c                 C   s8   t rt  | t j¡ tj | jd ¡r4t | jd ¡ dS )z*Unlock file f using lockf and dot locking.r×  N)rØ  rÙ  rÚ  r   r   rŸ   r©   r,   ©rÈ   r   r   r    r  9  s    r  c              	   C   sD   t  | t jt jB t jB d¡}zt| dƒW t  |¡ S t  |¡ 0 dS )zCCreate a file if it doesn't exist and open for reading and writing.râ   r  N)r   rÃ   rã   rE  ÚO_RDWRrd   )r   Úfdr   r   r    rø   @  s    

þrø   c                 C   s$   t d| tt ¡ ƒt ¡ t ¡ f ƒS )zBCreate a temp file based on path and open for reading and writing.z%s.%s.%s.%s)rø   rô   rî   rò   ró   r   rõ   )r   r   r   r    r  H  s    þr  c                 C   s$   |   ¡  ttdƒr t |  ¡ ¡ dS )z0Ensure changes to file f are physically on disk.ÚfsyncN)r^   rY   r   rÞ  ÚfilenorÛ  r   r   r    r  N  s    
r  c                 C   s   t | ƒ |  ¡  dS )z:Close file f, ensuring all changes are physically on disk.N)r  rd   rÛ  r   r   r    rª   T  s    rª   c                   @   s   e Zd ZdZdS )r   z"Raised for module-specific errors.Nrµ  r   r   r   r    r   Z  s   r   c                   @   s   e Zd ZdZdS )r   z:The specified mailbox does not exist and won't be created.Nrµ  r   r   r   r    r   ]  s   r   c                   @   s   e Zd ZdZdS )r   z>The specified mailbox is not empty and deletion was requested.Nrµ  r   r   r   r    r   `  s   r   c                   @   s   e Zd ZdZdS )r   z)Another process caused an action to fail.Nrµ  r   r   r   r    r   c  s   r   c                   @   s   e Zd ZdZdS )r   z)A file appears to have an invalid format.Nrµ  r   r   r   r    r   f  s   r   )T)2r•   r   rî   r²  rò   r¸   r…  r…   r?   Zemail.messageZemail.generatorrw   r9   Útypesr   rØ  ÚImportErrorÚ__all__r~   re   r   r   r  r'  r   r   r   r   r'   r	   r
   r3  r   r   r   r   rÌ   r1  r  r  rø   r  r  rª   Ú	Exceptionr   r   r   r   r   r   r   r   r    Ú<module>   sl   
 j  8 DB4-  3 z%mqH_e'
*