
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aÏ¡ ã                	   @   s¸  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
 d dlmZ edƒZeedƒB Zed	ƒZeeB Zeed
ƒ Zeedƒ ZeedƒB ed
ƒ ZeeB ZeedƒB ZeeB Zeedƒ Zdd„ Ze  de je jB ¡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ƒ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 d0d1„ d1eƒZ-G d2d3„ d3eƒZ.G d4d5„ d5eƒZ/G d6d7„ d7eƒZ0G d8d9„ d9eƒZ1G d:d;„ d;eƒZ2G d<d=„ d=eƒZ3G d>d?„ d?eƒZ4G d@dA„ dAeƒZ5G dBdC„ dCeƒZ6G dDdE„ dEeƒZ7G dFdG„ dGeƒZ8G dHdI„ dIeƒZ9G dJdK„ dKe!ƒZ:G dLdM„ dMeƒZ;G dNdO„ dOeƒZ<G dPdQ„ dQeƒZ=G dRdS„ dSeƒZ>G dTdU„ dUe>ƒZ?G dVdW„ dWeƒZ@G dXdY„ dYeƒZAG dZd[„ d[eƒZBG d\d]„ d]eƒZCG d^d_„ d_eƒZDG d`da„ daeDƒZEG dbdc„ dceDƒZFG ddde„ deeƒZGG dfdg„ dgeƒZHG dhdi„ dieƒZIG djdk„ dkeIƒZJG dldm„ dmeJƒZKG dndo„ doeƒZLG dpdq„ dqeMƒZNG drds„ dseNƒZOG dtdu„ dueNƒZPG dvdw„ dweOƒZQG dxdy„ dye
jRƒZSePd
dzƒZTePd{d|ƒZUePd}d~ƒZVe  d Wd€ Xe¡¡¡jYZZe  d� We  [d€ Xe¡¡¡¡j\Z]e  d‚¡j^Z_e  d� We  [d€ Xe¡¡¡¡j\Z`e  d� We  [d€ Xe¡¡¡¡j\Zae  d� We  [d€ Xe¡¡¡¡j\Zbdƒd„„ Zcd…d†„ Zdd‡dˆ„ Zed‰dŠ„ Zfd‹dŒ„ Zgd�dŽ„ Zhd�d�„ Zid‘d’„ Zjd“d”„ Zkd•d–„ Zld—d˜„ Zmd™dš„ Znd›dœ„ Zod�dž„ ZpdŸd „ Zqd¡d¢„ Zrd£d¤„ Zsd¥d¦„ Ztd§d¨„ Zud©dª„ Zvd«d¬„ Zwd­d®„ Zxd¯d°„ Zyd±d²„ Zzd³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ß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 )÷é    N)Ú	hexdigits)Ú
itemgetter)Ú_encoded_words)Úerrors)Úutilsz 	ú(z()<>@,:;.\"[]Ú.z."(z/?=z*'%ú%c                 C   s    dt | ƒ dd¡ dd¡ d S )Nú"ú\ú\\z\")ÚstrÚreplace©Úvalue© r   ú?/opt/alt/python38/lib64/python3.8/email/_header_value_parser.pyÚquote_string`   s    r   zñ
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                       sš   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡ fdd„Ze	d	d
„ ƒZ
e	dd„ ƒZdd„ Ze	dd„ ƒZe	dd„ ƒZdd„ Zddd„Zddd„Zddd„Z‡  ZS )Ú	TokenListNTc                    s   t ƒ j||Ž g | _d S ©N)ÚsuperÚ__init__Údefects)ÚselfÚargsÚkw©Ú	__class__r   r   r   y   s    zTokenList.__init__c                 C   s   d  dd„ | D ƒ¡S )NÚ c                 s   s   | ]}t |ƒV  qd S r   ©r   ©Ú.0Úxr   r   r   Ú	<genexpr>~   s     z$TokenList.__str__.<locals>.<genexpr>©Újoin©r   r   r   r   Ú__str__}   s    zTokenList.__str__c                    s   d  | jjtƒ  ¡ ¡S ©Nz{}({})©Úformatr   Ú__name__r   Ú__repr__r&   r   r   r   r,   €   s    
ÿzTokenList.__repr__c                 C   s   d  dd„ | D ƒ¡S )Nr   c                 s   s   | ]}|j r|j V  qd S r   r   r    r   r   r   r#   †   s      z"TokenList.value.<locals>.<genexpr>r$   r&   r   r   r   r   „   s    zTokenList.valuec                 C   s   t dd„ | D ƒ| jƒS )Nc                 s   s   | ]}|j V  qd S r   )Úall_defectsr    r   r   r   r#   Š   s     z(TokenList.all_defects.<locals>.<genexpr>)Úsumr   r&   r   r   r   r-   ˆ   s    zTokenList.all_defectsc                 C   s   | d   ¡ S ©Nr   )Ústartswith_fwsr&   r   r   r   r0   Œ   s    zTokenList.startswith_fwsc                 C   s   t dd„ | D ƒƒS )Nc                 s   s   | ]}|j V  qd S r   )Úas_ew_allowed)r!   Úpartr   r   r   r#   ’   s     z*TokenList.as_ew_allowed.<locals>.<genexpr>)Úallr&   r   r   r   r1   �   s    zTokenList.as_ew_allowedc                 C   s   g }| D ]}|  |j¡ q|S r   )ÚextendÚcomments)r   r5   Útokenr   r   r   r5   ”   s    zTokenList.commentsc                C   s   t | |d�S )N©Úpolicy)Ú_refold_parse_tree©r   r8   r   r   r   Úfold›   s    zTokenList.foldr   c                 C   s   t | j|d�ƒ d S )N©Úindent)ÚprintÚppstr©r   r=   r   r   r   Úpprintž   s    zTokenList.pprintc                 C   s   d  | j|d�¡S )NÚ
r<   )r%   Ú_ppr@   r   r   r   r?   ¡   s    zTokenList.ppstrc                 c   sz   d  || jj| j¡V  | D ]4}t|dƒs:|d  |¡ V  q| |d ¡E d H  q| jrdd  | j¡}nd}d  ||¡V  d S )Nz{}{}/{}(rC   z*    !! invalid element in token list: {!r}z    z Defects: {}r   z{}){})r*   r   r+   Ú
token_typeÚhasattrrC   r   )r   r=   r6   Zextrar   r   r   rC   ¤   s    ý
ÿ
zTokenList._pp)r   )r   )r   )r+   Ú
__module__Ú__qualname__rD   Úsyntactic_breakÚew_combine_allowedr   r'   r,   Úpropertyr   r-   r0   r1   r5   r;   rA   r?   rC   Ú__classcell__r   r   r   r   r   s   s&   





r   c                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )ÚWhiteSpaceTokenListc                 C   s   dS ©Nú r   r&   r   r   r   r   ¸   s    zWhiteSpaceTokenList.valuec                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|j d kr|j‘qS )Úcomment)rD   Úcontentr    r   r   r   Ú
<listcomp>¾   s     
 z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   r&   r   r   r   r5   ¼   s    zWhiteSpaceTokenList.commentsN)r+   rF   rG   rJ   r   r5   r   r   r   r   rL   ¶   s   
rL   c                   @   s   e Zd ZdZdS )ÚUnstructuredTokenListÚunstructuredN©r+   rF   rG   rD   r   r   r   r   rR   Á   s   rR   c                   @   s   e Zd ZdZdS )ÚPhraseÚphraseNrT   r   r   r   r   rU   Å   s   rU   c                   @   s   e Zd ZdZdS )ÚWordZwordNrT   r   r   r   r   rW   È   s   rW   c                   @   s   e Zd ZdZdS )ÚCFWSListÚcfwsNrT   r   r   r   r   rX   Ì   s   rX   c                   @   s   e Zd ZdZdS )ÚAtomÚatomNrT   r   r   r   r   rZ   Ð   s   rZ   c                   @   s   e Zd ZdZdZdS )ÚTokenr6   FN)r+   rF   rG   rD   Zencode_as_ewr   r   r   r   r\   Ô   s   r\   c                   @   s   e Zd ZdZdZdZdZdS )ÚEncodedWordúencoded-wordN)r+   rF   rG   rD   ÚcteÚcharsetÚlangr   r   r   r   r]   Ù   s   r]   c                   @   s4   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdS )	ÚQuotedStringúquoted-stringc                 C   s"   | D ]}|j dkr|j  S qd S ©Núbare-quoted-string©rD   r   ©r   r"   r   r   r   rP   ä   s    
zQuotedString.contentc                 C   s>   g }| D ]*}|j dkr&| t|ƒ¡ q| |j¡ qd |¡S )Nre   r   )rD   Úappendr   r   r%   )r   Úresr"   r   r   r   Úquoted_valueê   s    
zQuotedString.quoted_valuec                 C   s"   | D ]}|j dkr|j  S qd S rd   rf   ©r   r6   r   r   r   Ústripped_valueô   s    
zQuotedString.stripped_valueN)r+   rF   rG   rD   rJ   rP   rj   rl   r   r   r   r   rb   à   s   

	rb   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚBareQuotedStringre   c                 C   s   t d dd„ | D ƒ¡ƒS )Nr   c                 s   s   | ]}t |ƒV  qd S r   r   r    r   r   r   r#      s     z+BareQuotedString.__str__.<locals>.<genexpr>)r   r%   r&   r   r   r   r'   ÿ   s    zBareQuotedString.__str__c                 C   s   d  dd„ | D ƒ¡S )Nr   c                 s   s   | ]}t |ƒV  qd S r   r   r    r   r   r   r#     s     z)BareQuotedString.value.<locals>.<genexpr>r$   r&   r   r   r   r     s    zBareQuotedString.valueN)r+   rF   rG   rD   r'   rJ   r   r   r   r   r   rm   û   s   rm   c                   @   s8   e Zd ZdZdd„ Zdd„ Zedd„ ƒZedd	„ ƒZd
S )ÚCommentrO   c                    s(   d  tdg‡ fdd„ˆ D ƒdggg ƒ¡S )Nr   r   c                    s   g | ]}ˆ   |¡‘qS r   )Úquoter    r&   r   r   rQ     s     z#Comment.__str__.<locals>.<listcomp>ú))r%   r.   r&   r   r&   r   r'     s    ýüzComment.__str__c                 C   s2   |j dkrt|ƒS t|ƒ dd¡ dd¡ dd¡S )NrO   r   r   r   z\(rp   z\))rD   r   r   )r   r   r   r   r   ro     s    
 ÿ þzComment.quotec                 C   s   d  dd„ | D ƒ¡S )Nr   c                 s   s   | ]}t |ƒV  qd S r   r   r    r   r   r   r#     s     z"Comment.content.<locals>.<genexpr>r$   r&   r   r   r   rP     s    zComment.contentc                 C   s   | j gS r   )rP   r&   r   r   r   r5     s    zComment.commentsN)	r+   rF   rG   rD   r'   ro   rJ   rP   r5   r   r   r   r   rn     s   
rn   c                   @   s4   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdS )	ÚAddressListzaddress-listc                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|j d kr|‘qS )Úaddress©rD   r    r   r   r   rQ   '  s     
 z)AddressList.addresses.<locals>.<listcomp>r   r&   r   r   r   Ú	addresses%  s    zAddressList.addressesc                 C   s   t dd„ | D ƒg ƒS )Nc                 s   s   | ]}|j d kr|jV  qdS ©rr   N©rD   Ú	mailboxesr    r   r   r   r#   +  s    
ÿz(AddressList.mailboxes.<locals>.<genexpr>©r.   r&   r   r   r   rw   )  s
    ÿÿzAddressList.mailboxesc                 C   s   t dd„ | D ƒg ƒS )Nc                 s   s   | ]}|j d kr|jV  qdS ru   ©rD   Úall_mailboxesr    r   r   r   r#   0  s    
ÿz,AddressList.all_mailboxes.<locals>.<genexpr>rx   r&   r   r   r   rz   .  s
    ÿÿzAddressList.all_mailboxesN)r+   rF   rG   rD   rJ   rt   rw   rz   r   r   r   r   rq   !  s   

rq   c                   @   s4   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdS )	ÚAddressrr   c                 C   s   | d j dkr| d jS d S )Nr   Úgroup©rD   Údisplay_namer&   r   r   r   r~   8  s    zAddress.display_namec                 C   s4   | d j dkr| d gS | d j dkr*g S | d jS ©Nr   Úmailboxúinvalid-mailboxrv   r&   r   r   r   rw   =  s
    
zAddress.mailboxesc                 C   s:   | d j dkr| d gS | d j dkr0| d gS | d jS r   ry   r&   r   r   r   rz   E  s
    

zAddress.all_mailboxesN)r+   rF   rG   rD   rJ   r~   rw   rz   r   r   r   r   r{   4  s   

r{   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚMailboxListúmailbox-listc                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|j d kr|‘qS )r€   rs   r    r   r   r   rQ   S  s     
 z)MailboxList.mailboxes.<locals>.<listcomp>r   r&   r   r   r   rw   Q  s    zMailboxList.mailboxesc                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|j d kr|‘qS ))r€   r�   rs   r    r   r   r   rQ   W  s    
ÿz-MailboxList.all_mailboxes.<locals>.<listcomp>r   r&   r   r   r   rz   U  s    zMailboxList.all_mailboxesN©r+   rF   rG   rD   rJ   rw   rz   r   r   r   r   r‚   M  s
   
r‚   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )Ú	GroupListú
group-listc                 C   s    | r| d j dkrg S | d jS ©Nr   rƒ   rv   r&   r   r   r   rw   _  s    zGroupList.mailboxesc                 C   s    | r| d j dkrg S | d jS r‡   ry   r&   r   r   r   rz   e  s    zGroupList.all_mailboxesNr„   r   r   r   r   r…   [  s
   
r…   c                   @   s4   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdS )	ÚGroupr|   c                 C   s   | d j dkrg S | d jS ©Né   r†   rv   r&   r   r   r   rw   p  s    zGroup.mailboxesc                 C   s   | d j dkrg S | d jS r‰   ry   r&   r   r   r   rz   v  s    zGroup.all_mailboxesc                 C   s
   | d j S r/   )r~   r&   r   r   r   r~   |  s    zGroup.display_nameN)r+   rF   rG   rD   rJ   rw   rz   r~   r   r   r   r   rˆ   l  s   

rˆ   c                   @   sL   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	dS )ÚNameAddrú	name-addrc                 C   s   t | ƒdkrd S | d jS ©Né   r   )Úlenr~   r&   r   r   r   r~   …  s    zNameAddr.display_namec                 C   s
   | d j S ©Néÿÿÿÿ©Ú
local_partr&   r   r   r   r“   ‹  s    zNameAddr.local_partc                 C   s
   | d j S r�   ©Údomainr&   r   r   r   r•   �  s    zNameAddr.domainc                 C   s
   | d j S r�   )Úrouter&   r   r   r   r–   “  s    zNameAddr.routec                 C   s
   | d j S r�   ©Ú	addr_specr&   r   r   r   r˜   —  s    zNameAddr.addr_specN©
r+   rF   rG   rD   rJ   r~   r“   r•   r–   r˜   r   r   r   r   r‹   �  s   



r‹   c                   @   s@   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZd
S )Ú	AngleAddrz
angle-addrc                 C   s"   | D ]}|j dkr|j  S qd S ©Nú	addr-spec)rD   r“   rg   r   r   r   r“      s    
zAngleAddr.local_partc                 C   s"   | D ]}|j dkr|j  S qd S r›   ©rD   r•   rg   r   r   r   r•   ¦  s    
zAngleAddr.domainc                 C   s"   | D ]}|j dkr|j  S qd S )Nú	obs-route)rD   Údomainsrg   r   r   r   r–   ¬  s    
zAngleAddr.routec                 C   s<   | D ]2}|j dkr|jr"|j  S t|jƒ|j   S qdS )Nrœ   z<>)rD   r“   r˜   r   rg   r   r   r   r˜   ²  s    

zAngleAddr.addr_specN)	r+   rF   rG   rD   rJ   r“   r•   r–   r˜   r   r   r   r   rš   œ  s   


rš   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚObsRouterž   c                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|j d kr|j‘qS r”   r�   r    r   r   r   rQ   Ä  s     
 z$ObsRoute.domains.<locals>.<listcomp>r   r&   r   r   r   rŸ   Â  s    zObsRoute.domainsN)r+   rF   rG   rD   rJ   rŸ   r   r   r   r   r    ¾  s   r    c                   @   sL   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	dS )ÚMailboxr€   c                 C   s   | d j dkr| d jS d S ©Nr   rŒ   r}   r&   r   r   r   r~   Ë  s    zMailbox.display_namec                 C   s
   | d j S r/   r’   r&   r   r   r   r“   Ð  s    zMailbox.local_partc                 C   s
   | d j S r/   r”   r&   r   r   r   r•   Ô  s    zMailbox.domainc                 C   s   | d j dkr| d jS d S r¢   )rD   r–   r&   r   r   r   r–   Ø  s    zMailbox.routec                 C   s
   | d j S r/   r—   r&   r   r   r   r˜   Ý  s    zMailbox.addr_specNr™   r   r   r   r   r¡   Ç  s   



r¡   c                   @   s,   e Zd ZdZedd„ ƒZe Z Z ZZ	dS )ÚInvalidMailboxr�   c                 C   s   d S r   r   r&   r   r   r   r~   æ  s    zInvalidMailbox.display_nameNr™   r   r   r   r   r£   â  s   
r£   c                       s(   e Zd ZdZdZe‡ fdd„ƒZ‡  ZS )ÚDomainr•   Fc                    s   d  tƒ j ¡ ¡S ©Nr   ©r%   r   r   Úsplitr&   r   r   r   r•   ò  s    zDomain.domain)r+   rF   rG   rD   r1   rJ   r•   rK   r   r   r   r   r¤   í  s   r¤   c                   @   s   e Zd ZdZdS )ÚDotAtomúdot-atomNrT   r   r   r   r   r¨   ÷  s   r¨   c                   @   s   e Zd ZdZdZdS )ÚDotAtomTextzdot-atom-textTN©r+   rF   rG   rD   r1   r   r   r   r   rª   û  s   rª   c                   @   s   e Zd ZdZdZdS )ÚNoFoldLiteralzno-fold-literalFNr«   r   r   r   r   r¬      s   r¬   c                   @   sD   e Zd ZdZdZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZ	dS )ÚAddrSpecrœ   Fc                 C   s
   | d j S r/   r’   r&   r   r   r   r“   
  s    zAddrSpec.local_partc                 C   s   t | ƒdk rd S | d jS )Né   r‘   )r�   r•   r&   r   r   r   r•     s    zAddrSpec.domainc                 C   s<   t | ƒdk r| d jS | d j ¡ | d j | d j ¡  S )Nr®   r   rŽ   rŠ   )r�   r   ÚrstripÚlstripr&   r   r   r   r     s    
zAddrSpec.valuec                 C   sL   t | jƒ}t|ƒt|t ƒkr*t| jƒ}n| j}| jd k	rH|d | j S |S )Nú@)Úsetr“   r�   ÚDOT_ATOM_ENDSr   r•   )r   ZnamesetZlpr   r   r   r˜     s    

zAddrSpec.addr_specN)
r+   rF   rG   rD   r1   rJ   r“   r•   r   r˜   r   r   r   r   r­     s   


r­   c                   @   s   e Zd ZdZdZdS )ÚObsLocalPartzobs-local-partFNr«   r   r   r   r   r´   &  s   r´   c                       s4   e Zd ZdZdZedd„ ƒZe‡ fdd„ƒZ‡  ZS )ÚDisplayNamezdisplay-nameFc                 C   s¦   t | ƒ}t|ƒdkr|jS |d jdkr4| d¡ n*|d d jdkr^t |d dd … ƒ|d< |d jdkrv| ¡  n*|d d jdkr t |d d d… ƒ|d< |jS )Nr   rY   rŽ   r‘   )r   r�   r   rD   Úpop)r   ri   r   r   r   r~   1  s    
zDisplayName.display_namec                    s¦   d}| j rd}n| D ]}|jdkrd}qt| ƒdkrš|ršd }}| d jdks`| d d jdkrdd}| d jdks„| d d jdkrˆd}|t| jƒ | S tƒ jS d S )	NFTrc   r   r   rY   rN   r‘   )r   rD   r�   r   r~   r   r   )r   ro   r"   ZpreZpostr   r   r   r   B  s    
  zDisplayName.value)	r+   rF   rG   rD   rI   rJ   r~   r   rK   r   r   r   r   rµ   ,  s   
rµ   c                   @   s,   e Zd ZdZdZedd„ ƒZedd„ ƒZdS )Ú	LocalPartz
local-partFc                 C   s&   | d j dkr| d jS | d jS d S )Nr   rc   )rD   rj   r   r&   r   r   r   r   [  s    
zLocalPart.valuec                 C   sÈ   t g}t }d}| d t g D ]”}|jdkr,q|r\|jdkr\|d jdkr\t|d d… ƒ|d< t|tƒ}|rš|jdkrš|d jdkrš| t|dd … ƒ¡ n
| |¡ |d }|}qt|dd… ƒ}|jS )NFr   rY   Údotr‘   rŽ   )ÚDOTrD   r   Ú
isinstancerh   r   )r   ri   ZlastZ
last_is_tlÚtokZis_tlr   r   r   r“   b  s(    
ÿ
ÿ
zLocalPart.local_partN)r+   rF   rG   rD   r1   rJ   r   r“   r   r   r   r   r·   V  s   
r·   c                       s4   e Zd ZdZdZe‡ fdd„ƒZedd„ ƒZ‡  ZS )ÚDomainLiteralzdomain-literalFc                    s   d  tƒ j ¡ ¡S r¥   r¦   r&   r   r   r   r•     s    zDomainLiteral.domainc                 C   s"   | D ]}|j dkr|j  S qd S )NÚptextrf   rg   r   r   r   Úipƒ  s    
zDomainLiteral.ip)	r+   rF   rG   rD   r1   rJ   r•   r¾   rK   r   r   r   r   r¼   z  s   r¼   c                   @   s   e Zd ZdZdZdZdS )ÚMIMEVersionzmime-versionN)r+   rF   rG   rD   ÚmajorÚminorr   r   r   r   r¿   Š  s   r¿   c                   @   s4   e Zd ZdZdZdZdZedd„ ƒZedd„ ƒZ	dS )	Ú	ParameterÚ	parameterFúus-asciic                 C   s   | j r| d jS dS r�   )Ú	sectionedÚnumberr&   r   r   r   Úsection_number˜  s    zParameter.section_numberc                 C   sf   | D ]\}|j dkr|j  S |j dkr|D ]4}|j dkr*|D ] }|j dkr<|j      S q<q*qdS )Nr   rc   re   r   )rD   rl   rk   r   r   r   Úparam_valuež  s    




zParameter.param_valueN)
r+   rF   rG   rD   rÅ   Úextendedr`   rJ   rÇ   rÈ   r   r   r   r   rÂ   ‘  s   
rÂ   c                   @   s   e Zd ZdZdS )ÚInvalidParameterúinvalid-parameterNrT   r   r   r   r   rÊ   ­  s   rÊ   c                   @   s   e Zd ZdZedd„ ƒZdS )Ú	AttributeÚ	attributec                 C   s$   | D ]}|j  d¡r|j  S qd S )NÚattrtext)rD   Úendswithr   rk   r   r   r   rl   ¶  s    zAttribute.stripped_valueN©r+   rF   rG   rD   rJ   rl   r   r   r   r   rÌ   ²  s   rÌ   c                   @   s   e Zd ZdZdZdS )ÚSectionÚsectionN)r+   rF   rG   rD   rÆ   r   r   r   r   rÑ   ¼  s   rÑ   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚValuer   c                 C   s2   | d }|j dkr| d }|j  d¡r,|jS | jS )Nr   rY   rŽ   )rc   rÍ   zextended-attribute)rD   rÏ   rl   r   rk   r   r   r   rl   Æ  s    
ÿzValue.stripped_valueNrÐ   r   r   r   r   rÓ   Â  s   rÓ   c                   @   s(   e Zd ZdZdZedd„ ƒZdd„ ZdS )ÚMimeParametersúmime-parametersFc              
   c   sì  i }| D ]T}|j  d¡sq|d j dkr*q|d j ¡ }||krHg ||< ||  |j|f¡ q| ¡ D �]~\}}t|tdƒd�}|d d }|j	}|j
sÚt|ƒdkrÚ|d d dkrÚ|d d j t d¡¡ |d d… }g }d}|D ]ê\}	}
|	|k�r(|
j
�s|
j t d¡¡ qæn|
j t d¡¡ |d7 }|
j}|
j
�rÆztj |¡}W n& tk
�rt   tjj|d	d
�}Y nRX z| |d¡}W n" tk
�r¨   | dd¡}Y nX t |¡�rÆ|
j t ¡ ¡ | |¡ qæd |¡}||fV  qfd S )NrÃ   r   rÍ   )ÚkeyrŽ   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingzlatin-1)ÚencodingÚsurrogateescaperÄ   r   )rD   rÏ   r   Ústriprh   rÇ   ÚitemsÚsortedr   r`   rÉ   r�   r   r   ÚInvalidHeaderDefectrÈ   ÚurllibÚparseZunquote_to_bytesÚUnicodeEncodeErrorZunquoteÚdecodeÚLookupErrorr   Ú_has_surrogatesÚUndecodableBytesDefectr%   )r   Úparamsr6   ÚnameÚpartsZfirst_paramr`   Zvalue_partsÚirÇ   Úparamr   r   r   r   rä   Ö  s`    ÿ

ÿ
ÿ
zMimeParameters.paramsc                 C   sT   g }| j D ].\}}|r.| d |t|ƒ¡¡ q
| |¡ q
d |¡}|rPd| S dS )Nú{}={}z; rN   r   )rä   rh   r*   r   r%   )r   rä   rå   r   r   r   r   r'     s    
zMimeParameters.__str__N)r+   rF   rG   rD   rH   rJ   rä   r'   r   r   r   r   rÔ   Ñ  s
   
ErÔ   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚParameterizedHeaderValueFc                 C   s&   t | ƒD ]}|jdkr|j  S qi S )NrÕ   )ÚreversedrD   rä   rk   r   r   r   rä   -  s    
zParameterizedHeaderValue.paramsN)r+   rF   rG   rH   rJ   rä   r   r   r   r   rê   '  s   rê   c                   @   s   e Zd ZdZdZdZdZdS )ÚContentTypezcontent-typeFÚtextZplainN)r+   rF   rG   rD   r1   ÚmaintypeÚsubtyper   r   r   r   rì   5  s   rì   c                   @   s   e Zd ZdZdZdZdS )ÚContentDispositionzcontent-dispositionFN)r+   rF   rG   rD   r1   Úcontent_dispositionr   r   r   r   rð   <  s   rð   c                   @   s   e Zd ZdZdZdZdS )ÚContentTransferEncodingzcontent-transfer-encodingFZ7bitN)r+   rF   rG   rD   r1   r_   r   r   r   r   rò   B  s   rò   c                   @   s   e Zd ZdZdZdS )ÚHeaderLabelzheader-labelFNr«   r   r   r   r   ró   H  s   ró   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚMsgIDzmsg-idFc                 C   s   t | ƒ|j S r   )r   Úlinesepr:   r   r   r   r;   Q  s    z
MsgID.foldN)r+   rF   rG   rD   r1   r;   r   r   r   r   rô   M  s   rô   c                   @   s   e Zd ZdZdS )Ú	MessageIDz
message-idNrT   r   r   r   r   rö   V  s   rö   c                   @   s   e Zd ZdZdS )ÚInvalidMessageIDzinvalid-message-idNrT   r   r   r   r   r÷   Z  s   r÷   c                   @   s   e Zd ZdZdS )ÚHeaderÚheaderNrT   r   r   r   r   rø   ^  s   rø   c                       sr   e Zd ZdZdZdZ‡ fdd„Z‡ fdd„Zdd„ Ze	dd	„ ƒZ
d‡ fdd„	Zdd„ Ze	dd„ ƒZdd„ Z‡  ZS )ÚTerminalTc                    s   t ƒ  | |¡}||_g |_|S r   )r   Ú__new__rD   r   )Úclsr   rD   r   r   r   r   rû   l  s    zTerminal.__new__c                    s   d  | jjtƒ  ¡ ¡S r(   r)   r&   r   r   r   r,   r  s    zTerminal.__repr__c                 C   s   t | jjd | j ƒ d S )Nú/)r>   r   r+   rD   r&   r   r   r   rA   u  s    zTerminal.pprintc                 C   s
   t | jƒS r   )Úlistr   r&   r   r   r   r-   x  s    zTerminal.all_defectsr   c              	      s2   d  || jj| jtƒ  ¡ | js"dn
d  | j¡¡gS )Nz{}{}/{}({}){}r   z {})r*   r   r+   rD   r   r,   r   r@   r   r   r   rC   |  s    ûzTerminal._ppc                 C   s   d S r   r   r&   r   r   r   Úpop_trailing_ws…  s    zTerminal.pop_trailing_wsc                 C   s   g S r   r   r&   r   r   r   r5   ‰  s    zTerminal.commentsc                 C   s   t | ƒ| jfS r   )r   rD   r&   r   r   r   Ú__getnewargs__�  s    zTerminal.__getnewargs__)r   )r+   rF   rG   r1   rI   rH   rû   r,   rA   rJ   r-   rC   rÿ   r5   r   rK   r   r   r   r   rú   f  s   
	
rú   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚWhiteSpaceTerminalc                 C   s   dS rM   r   r&   r   r   r   r   “  s    zWhiteSpaceTerminal.valuec                 C   s   dS )NTr   r&   r   r   r   r0   —  s    z!WhiteSpaceTerminal.startswith_fwsN©r+   rF   rG   rJ   r   r0   r   r   r   r   r  ‘  s   
r  c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚValueTerminalc                 C   s   | S r   r   r&   r   r   r   r   �  s    zValueTerminal.valuec                 C   s   dS )NFr   r&   r   r   r   r0   ¡  s    zValueTerminal.startswith_fwsNr  r   r   r   r   r  ›  s   
r  c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚEWWhiteSpaceTerminalc                 C   s   dS r¥   r   r&   r   r   r   r   §  s    zEWWhiteSpaceTerminal.valuec                 C   s   dS r¥   r   r&   r   r   r   r'   «  s    zEWWhiteSpaceTerminal.__str__N)r+   rF   rG   rJ   r   r'   r   r   r   r   r  ¥  s   
r  c                   @   s   e Zd ZdS )Ú_InvalidEwErrorN)r+   rF   rG   r   r   r   r   r  ¯  s   r  r¸   ú,úlist-separatorr±   zroute-component-markerz([{}]+)r   z[^{}]+z[\x00-\x20\x7F]c                 C   s>   t | ƒ}|r| j t |¡¡ t | ¡r:| j t d¡¡ d S )Nz*Non-ASCII characters found in header token)Ú_non_printable_finderr   rh   r   ZNonPrintableDefectr   râ   rã   )ÚxtextZnon_printablesr   r   r   Ú_validate_xtextÚ  s    

ÿr
  c                 C   s    t | dƒ^}}g }d}d}tt|ƒƒD ]L}|| dkrJ|rDd}d}nd}q&|rTd}n|| |krd q|| || ¡ q&|d }d |¡d ||d … g| ¡|fS )NrŽ   Fr   Tr   )Ú_wsp_splitterÚranger�   rh   r%   )r   ÚendcharsZfragmentÚ	remainderZvcharsÚescapeÚhad_qpÚposr   r   r   Ú_get_ptext_to_endcharsä  s$    	r  c                 C   s.   |   ¡ }t| d t| ƒt|ƒ … dƒ}||fS )NÚfws)r°   r  r�   )r   Znewvaluer  r   r   r   Úget_fws  s    r  c              	   C   sØ  t ƒ }|  d¡s t d | ¡¡‚| dd …  dd¡^}}|| dd … krXt d | ¡¡‚d |¡}t|ƒdkr°|d tkr°|d tkr°| 	d¡dk r°| dd¡^}}|d | }t| ¡ ƒdkrÒ|j
 t d	¡¡ | |_d |¡} zt d| d ¡\}}}}	W n* ttfk
�r*   td
 |j¡ƒ‚Y nX ||_||_|j
 |	¡ |�rª|d tk�rrt|ƒ\}
}| |
¡ �qDt|dƒ^}}t|dƒ}t|ƒ | |¡ d |¡}�qD| �rÐ| d tk�rÐ|j
 t d¡¡ || fS )Nú=?z"expected encoded word but found {}rŠ   z?=rŽ   r   r   ú?zwhitespace inside encoded wordz!encoded word format invalid: '{}'Úvtextz.missing trailing whitespace after encoded-word)r]   Ú
startswithr   ÚHeaderParseErrorr*   r§   r%   r�   r   Úcountr   rh   rÜ   r_   Ú_ewrà   Ú
ValueErrorÚKeyErrorr  r`   ra   r4   ÚWSPr  r  r  r
  )r   Zewr»   r  ZremstrÚrestrí   r`   ra   r   r6   Úcharsr  r   r   r   Úget_encoded_word  sd    
ÿÿ

ÿ
þý
ÿ

ÿ




ÿr!  c                 C   sF  t ƒ }| �rB| d tkr0t| ƒ\}} | |¡ qd}|  d¡rìzt| ƒ\}} W n, tk
rf   d}Y n† tjk
rz   Y nrX d}t	|ƒdkr°|d j
dkr°|j t d¡¡ d}|ràt	|ƒdkrà|d	 j
d
kràt|d dƒ|d< | |¡ qt| dƒ^}}|�rt |¡�r|  d¡^}}t|dƒ}t|ƒ | |¡ d |¡} q|S )Nr   Tr  Fr‘   r  z&missing whitespace before encoded wordrŽ   éþÿÿÿr^   r  r   )rR   r  r  rh   r  r!  r  r   r  r�   rD   r   rÜ   r  r  Úrfc2047_matcherÚsearchÚ	partitionr  r
  r%   )r   rS   r6   Úvalid_ewZhave_wsr»   r  r  r   r   r   Úget_unstructured?  sJ    


ÿ ÿ


r'  c                 C   s*   t | dƒ\}} }t|dƒ}t|ƒ || fS )Nz()r½   )r  r  r
  ©r   r½   Ú_r   r   r   Úget_qp_ctext‚  s    
r*  c                 C   s*   t | dƒ\}} }t|dƒ}t|ƒ || fS )Nr
   r½   )r  r  r
  r(  r   r   r   Úget_qcontent“  s    

r+  c                 C   sN   t | ƒ}|st d | ¡¡‚| ¡ }| t|ƒd … } t|dƒ}t|ƒ || fS )Nzexpected atext but found '{}'Úatext)Ú_non_atom_end_matcherr   r  r*   r|   r�   r  r
  )r   Úmr,  r   r   r   Ú	get_atext¢  s    ÿ
r/  c                 C   sr  | d dkrt  d | ¡¡‚tƒ }| dd … } | rT| d dkrTt| ƒ\}} | |¡ | �rB| d dk�rB| d tkr‚t| ƒ\}} n´| d d… dk�r*d}z&t| ƒ\}} |j	 t  
d¡¡ d	}W n" t jk
rà   t| ƒ\}} Y nX |�r6t|ƒdk�r6|d
 jdk�r6|d jdk�r6t|d
 dƒ|d
< nt| ƒ\}} | |¡ qT| �sb|j	 t  
d¡¡ || fS || dd … fS )Nr   r
   zexpected '"' but found '{}'rŽ   rŠ   r  Fz!encoded word inside quoted stringTr‘   r  r"  r^   z"end of header inside quoted string)r   r  r*   rm   r+  rh   r  r  r!  r   rÜ   r�   rD   r  )r   Zbare_quoted_stringr6   r&  r   r   r   Úget_bare_quoted_string²  sL    ÿ

ÿÿ ÿ

ÿr0  c                 C   s¼   | r | d dkr t  d | ¡¡‚tƒ }| dd … } | rŽ| d dkrŽ| d tkr\t| ƒ\}} n&| d dkrvt| ƒ\}} nt| ƒ\}} | |¡ q2| s¬|j	 t  
d¡¡ || fS || dd … fS )Nr   r   zexpected '(' but found '{}'rŽ   rp   zend of header inside comment)r   r  r*   rn   r  r  Úget_commentr*  rh   r   rÜ   )r   rO   r6   r   r   r   r1  Ý  s&    ÿ
ÿr1  c                 C   sP   t ƒ }| rH| d tkrH| d tkr0t| ƒ\}} nt| ƒ\}} | |¡ q|| fS r/   )rX   ÚCFWS_LEADERr  r  r1  rh   )r   rY   r6   r   r   r   Úget_cfwsö  s    r3  c                 C   sp   t ƒ }| r,| d tkr,t| ƒ\}} | |¡ t| ƒ\}} | |¡ | rh| d tkrht| ƒ\}} | |¡ || fS r/   )rb   r2  r3  rh   r0  )r   Zquoted_stringr6   r   r   r   Úget_quoted_string  s    


r4  c                 C   sÐ   t ƒ }| r,| d tkr,t| ƒ\}} | |¡ | rL| d tkrLt d | ¡¡‚|  d¡rŒzt	| ƒ\}} W q˜ tjk
rˆ   t
| ƒ\}} Y q˜X nt
| ƒ\}} | |¡ | rÈ| d tkrÈt| ƒ\}} | |¡ || fS )Nr   zexpected atom but found '{}'r  )rZ   r2  r3  rh   Ú	ATOM_ENDSr   r  r*   r  r!  r/  )r   r[   r6   r   r   r   Úget_atom  s&    
ÿ


r6  c                 C   sœ   t ƒ }| r| d tkr&t d | ¡¡‚| rt| d tkrtt| ƒ\}} | |¡ | r&| d dkr&| t¡ | dd … } q&|d tkr”t d d|  ¡¡‚|| fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r   rŽ   r‘   z4expected atom at end of dot-atom-text but found '{}')rª   r5  r   r  r*   r/  rh   r¹   )r   Zdot_atom_textr6   r   r   r   Úget_dot_atom_text0  s     ÿ

ÿr7  c                 C   s¬   t ƒ }| d tkr(t| ƒ\}} | |¡ |  d¡rhzt| ƒ\}} W qt tjk
rd   t| ƒ\}} Y qtX nt| ƒ\}} | |¡ | r¤| d tkr¤t| ƒ\}} | |¡ || fS )Nr   r  )	r¨   r2  r3  rh   r  r!  r   r  r7  )r   Zdot_atomr6   r   r   r   Úget_dot_atomC  s    



r8  c                 C   sŽ   | d t krt| ƒ\}} nd }| s,t d¡‚| d dkrFt| ƒ\}} n*| d tkrdt d | ¡¡‚nt| ƒ\}} |d k	r†|g|d d…< || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r
   z1Expected 'atom' or 'quoted-string' but found '{}')r2  r3  r   r  r4  ÚSPECIALSr*   r6  )r   Úleaderr6   r   r   r   Úget_word\  s"    ÿÿr;  c                 C   sú   t ƒ }zt| ƒ\}} | |¡ W n( tjk
rH   |j t d¡¡ Y nX | rò| d tkrò| d dkr�| t¡ |j t 	d¡¡ | dd … } qJzt| ƒ\}} W nD tjk
rä   | d t
krÞt| ƒ\}} |j t 	d¡¡ n‚ Y nX | |¡ qJ|| fS )Nzphrase does not start with wordr   r   zperiod in 'phrase'rŽ   zcomment found without atom)rU   r;  rh   r   r  r   rÜ   ÚPHRASE_ENDSr¹   ÚObsoleteHeaderDefectr2  r3  )r   rV   r6   r   r   r   Ú
get_phrase~  s4    
ÿ

ÿ
ÿr>  c                 C   sv  t ƒ }d }| d tkr"t| ƒ\}} | s6t d | ¡¡‚zt| ƒ\}} W n^ tjk
r¤   zt| ƒ\}} W n6 tjk
rž   | d dkr”| d tkr”‚ t	ƒ }Y nX Y nX |d k	r¼|g|d d…< | 
|¡ | �r4| d dksæ| d tk�r4tt|ƒ|  ƒ\}} |jdk�r|j 
t d¡¡ n|j 
t d¡¡ ||d< z|j d¡ W n( tk
�rl   |j 
t d¡¡ Y nX || fS )	Nr   z"expected local-part but found '{}'r   úinvalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)Úasciiz)local-part contains non-ASCII characters))r·   r2  r3  r   r  r*   r8  r;  r<  r   rh   Úget_obs_local_partr   rD   r   rÜ   r=  r   Úencoderß   ZNonASCIILocalPartDefect)r   r“   r:  r6   Úobs_local_partr   r   r   Úget_local_part¤  sJ    ÿ
 
ÿ
ÿ
ÿrD  c                 C   sÂ  t ƒ }d}| �r(| d dks*| d tk�r(| d dkrj|rL|j t d¡¡ | t¡ d}| dd … } q
nD| d dkr®| t| d dƒ¡ | dd … } |j t d	¡¡ d}q
|rÒ|d
 jdkrÒ|j t d¡¡ zt	| ƒ\}} d}W n4 tj
k
�r   | d tk�r
‚ t| ƒ\}} Y nX | |¡ q
|d jdk�sX|d jdk�rj|d jdk�rj|j t d¡¡ |d
 jdk�sš|d
 jdk�r¬|d jdk�r¬|j t d¡¡ |j�rºd|_|| fS )NFr   r   r   zinvalid repeated '.'TrŽ   úmisplaced-specialz/'\' character outside of quoted-string/ccontentr‘   r¸   zmissing '.' between wordsrY   z!Invalid leading '.' in local partr"  z"Invalid trailing '.' in local partr?  )r´   r<  r   rh   r   rÜ   r¹   r  rD   r;  r  r2  r3  )r   rC  Zlast_non_ws_was_dotr6   r   r   r   rA  Ë  sj     
ÿ
ÿ
ÿ
ÿÿþ
ÿÿþ
ÿrA  c                 C   s@   t | dƒ\}} }t|dƒ}|r0|j t d¡¡ t|ƒ || fS )Nz[]r½   z(quoted printable found in domain-literal)r  r  r   rh   r   r=  r
  )r   r½   r  r   r   r   Ú	get_dtextú  s    

ÿrF  c                 C   s,   | rdS |  t d¡¡ |  tddƒ¡ dS )NFz"end of input inside domain-literalú]údomain-literal-endT)rh   r   rÜ   r  )r   Údomain_literalr   r   r   Ú_check_for_early_dl_end  s    ÿrJ  c                 C   sj  t ƒ }| d tkr(t| ƒ\}} | |¡ | s6t d¡‚| d dkrRt d | ¡¡‚| dd … } t| |ƒrp|| fS | tddƒ¡ | d t	kr¢t
| ƒ\}} | |¡ t| ƒ\}} | |¡ t| |ƒrÊ|| fS | d t	krìt
| ƒ\}} | |¡ t| |ƒrþ|| fS | d dk�rt d | ¡¡‚| tdd	ƒ¡ | dd … } | �rb| d tk�rbt| ƒ\}} | |¡ || fS )
Nr   zexpected domain-literalú[z6expected '[' at start of domain-literal but found '{}'rŽ   zdomain-literal-startrG  z4expected ']' at end of domain-literal but found '{}'rH  )r¼   r2  r3  rh   r   r  r*   rJ  r  r  r  rF  )r   rI  r6   r   r   r   Úget_domain_literal  sH    

ÿ





ÿ
rL  c                 C   sr  t ƒ }d }| d tkr"t| ƒ\}} | s6t d | ¡¡‚| d dkrvt| ƒ\}} |d k	rd|g|d d…< | |¡ || fS zt| ƒ\}} W n" tjk
r¨   t	| ƒ\}} Y nX | rÄ| d dkrÄt d¡‚|d k	rÚ|g|d d…< | |¡ | �rj| d dk�rj|j
 t d¡¡ |d jdk�r*|d |d d …< | �rj| d dk�rj| t¡ t	| d	d … ƒ\}} | |¡ �q*|| fS )
Nr   zexpected domain but found '{}'rK  r±   zInvalid Domainr   z(domain is not a dot-atom (contains CFWS)r©   rŽ   )r¤   r2  r3  r   r  r*   rL  rh   r8  r6  r   r=  rD   r¹   )r   r•   r:  r6   r   r   r   Ú
get_domain=  sD    ÿ



ÿ
rM  c                 C   s|   t ƒ }t| ƒ\}} | |¡ | r,| d dkrF|j t d¡¡ || fS | tddƒ¡ t| dd … ƒ\}} | |¡ || fS )Nr   r±   z#addr-spec local part with no domainúaddress-at-symbolrŽ   )r­   rD  rh   r   r   rÜ   r  rM  )r   r˜   r6   r   r   r   Úget_addr_specc  s    

ÿ
rO  c                 C   sŒ  t ƒ }| rj| d dks"| d tkrj| d tkrFt| ƒ\}} | |¡ q| d dkr| t¡ | dd … } q| rz| d dkrŠt d | ¡¡‚| t¡ t	| dd … ƒ\}} | |¡ | �r>| d dk�r>| t¡ | dd … } | sä�q>| d tk�rt| ƒ\}} | |¡ | d dkr²| t¡ t	| dd … ƒ\}} | |¡ q²| �sNt d¡‚| d dk�rlt d | ¡¡‚| t
dd	ƒ¡ || dd … fS )
Nr   r  rŽ   r±   z(expected obs-route domain but found '{}'z%end of header while parsing obs-routeú:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker)r    r2  r3  rh   ÚListSeparatorr   r  r*   ÚRouteComponentMarkerrM  r  )r   Z	obs_router6   r   r   r   Úget_obs_routes  sF    
ÿ





ÿrS  c                 C   s²  t ƒ }| d tkr(t| ƒ\}} | |¡ | r8| d dkrHt d | ¡¡‚| tddƒ¡ | dd … } | d dkr¦| tddƒ¡ |j t 	d¡¡ | dd … } || fS zt
| ƒ\}} W nz tjk
�r0   z"t| ƒ\}} |j t d	¡¡ W n( tjk
�r   t d
 | ¡¡‚Y nX | |¡ t
| ƒ\}} Y nX | |¡ | �r^| d dk�r^| dd … } n|j t 	d¡¡ | tddƒ¡ | �rª| d tk�rªt| ƒ\}} | |¡ || fS )Nr   ú<z"expected angle-addr but found '{}'zangle-addr-startrŽ   ú>zangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr)rš   r2  r3  rh   r   r  r*   r  r   rÜ   rO  rS  r=  )r   Z
angle_addrr6   r   r   r   Úget_angle_addrœ  sT    
ÿ
ÿ
ÿ
ÿ



ÿ
rV  c                 C   s<   t ƒ }t| ƒ\}} | |d d … ¡ |jd d … |_|| fS r   )rµ   r>  r4   r   )r   r~   r6   r   r   r   Úget_display_nameÊ  s
    rW  c                 C   sÚ   t ƒ }d }| d tkr6t| ƒ\}} | s6t d |¡¡‚| d dkr¦| d tkr^t d | ¡¡‚t| ƒ\}} | s~t d |¡¡‚|d k	rœ|g|d d d…< d }| |¡ t	| ƒ\}} |d k	rÈ|g|d d…< | |¡ || fS )Nr   z!expected name-addr but found '{}'rT  )
r‹   r2  r3  r   r  r*   r<  rW  rh   rV  )r   Z	name_addrr:  r6   r   r   r   Úget_name_addrÙ  s6    ÿÿÿ

rX  c                 C   s’   t ƒ }zt| ƒ\}} W nN tjk
rd   zt| ƒ\}} W n& tjk
r^   t d | ¡¡‚Y nX Y nX tdd„ |jD ƒƒr€d|_| 	|¡ || fS )Nzexpected mailbox but found '{}'c                 s   s   | ]}t |tjƒV  qd S r   )rº   r   rÜ   r    r   r   r   r#     s   ÿzget_mailbox.<locals>.<genexpr>r�   )
r¡   rX  r   r  rO  r*   Úanyr-   rD   rh   )r   r€   r6   r   r   r   Úget_mailbox÷  s     ÿÿ
rZ  c                 C   sd   t ƒ }| r\| d |kr\| d tkrD| t| d dƒ¡ | dd … } qt| ƒ\}} | |¡ q|| fS )Nr   rE  rŽ   )r£   r<  rh   r  r>  )r   r  Zinvalid_mailboxr6   r   r   r   Úget_invalid_mailbox  s    ÿr[  c                 C   sº  t ƒ }| �r²| d dk�r²zt| ƒ\}} | |¡ W �n tjk
�r<   d }| d tkrÖt| ƒ\}} | rv| d dkr”| |¡ |j t d¡¡ n@t	| dƒ\}} |d k	r¸|g|d d…< | |¡ |j t 
d¡¡ nb| d dkrö|j t d¡¡ nBt	| dƒ\}} |d k	�r|g|d d…< | |¡ |j t 
d¡¡ Y nX | �rŠ| d dk�rŠ|d }d|_t	| dƒ\}} | |¡ |j t 
d¡¡ | r| d dkr| t¡ | d	d … } q|| fS )
Nr   ú;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r‘   r�   rŽ   )r‚   rZ  rh   r   r  r2  r3  r   r=  r[  rÜ   rD   r4   rQ  )r   Zmailbox_listr6   r:  r€   r   r   r   Úget_mailbox_list  sX    

ÿ

ÿ
ÿ


ÿ

ÿ
r]  c                 C   s  t ƒ }| s$|j t d¡¡ || fS d }| rŠ| d tkrŠt| ƒ\}} | sl|j t d¡¡ | |¡ || fS | d dkrŠ| |¡ || fS t| ƒ\}} t|j	ƒdkrÚ|d k	r¶| |¡ | 
|¡ |j t d¡¡ || fS |d k	rð|g|d d…< | |¡ || fS )Nzend of header before group-listr   zend of header in group-listr\  zgroup-list with empty entries)r…   r   rh   r   rÜ   r2  r3  r]  r�   rz   r4   r=  )r   Z
group_listr:  r6   r   r   r   Úget_group_listW  s>    
ÿ
ÿ




ÿ
r^  c                 C   s   t ƒ }t| ƒ\}} | r"| d dkr2t d | ¡¡‚| |¡ | tddƒ¡ | dd … } | rˆ| d dkrˆ| tddƒ¡ || dd … fS t| ƒ\}} | |¡ | s¶|j t 	d¡¡ n| d dkrÒt d	 | ¡¡‚| tddƒ¡ | dd … } | �r| d t
k�rt| ƒ\}} | |¡ || fS )
Nr   rP  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrŽ   r\  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})rˆ   rW  r   r  r*   rh   r  r^  r   rÜ   r2  r3  )r   r|   r6   r   r   r   Ú	get_group|  s8    ÿ


ÿÿ
r_  c                 C   sx   t ƒ }zt| ƒ\}} W nN tjk
rd   zt| ƒ\}} W n& tjk
r^   t d | ¡¡‚Y nX Y nX | |¡ || fS )Nzexpected address but found '{}')r{   r_  r   r  rZ  r*   rh   )r   rr   r6   r   r   r   Úget_addressš  s    ÿ
r`  c              
   C   sÄ  t ƒ }| �r¼zt| ƒ\}} | |¡ W �n  tjk
�rH } zþd }| d tkrÐt| ƒ\}} | rj| d dkrˆ| |¡ |j t d¡¡ nFt	| dƒ\}} |d k	r¬|g|d d…< | t
|gƒ¡ |j t d¡¡ nh| d dkrð|j t d¡¡ nHt	| dƒ\}} |d k	�r|g|d d…< | t
|gƒ¡ |j t d¡¡ W 5 d }~X Y nX | �rš| d dk�rš|d d }d|_t	| dƒ\}} | |¡ |j t d¡¡ | r| tddƒ¡ | d	d … } q|| fS )
Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr‘   r�   r  rŽ   )rq   r`  rh   r   r  r2  r3  r   r=  r[  r{   rÜ   rD   r4   r  )r   Zaddress_listr6   Úerrr:  r€   r   r   r   Úget_address_list·  sX    


ÿ
ÿ
ÿ

ÿ

ÿrb  c                 C   s¨   t ƒ }| st d | ¡¡‚| d dkr6t d | ¡¡‚| tddƒ¡ | dd … } t| ƒ\}} | |¡ | rx| d dkrˆt d | ¡¡‚| tdd	ƒ¡ || dd … fS )
Nz'expected no-fold-literal but found '{}'r   rK  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startrŽ   rG  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r¬   r   r  r*   rh   r  rF  )r   Zno_fold_literalr6   r   r   r   Úget_no_fold_literalî  s.    ÿÿÿ
ÿÿrc  c                 C   sŠ  t ƒ }| r,| d tkr,t| ƒ\}} | |¡ | r<| d dkrLt d | ¡¡‚| tddƒ¡ | dd … } zt| ƒ\}} W n` tjk
rØ   z"t	| ƒ\}} |j
 t d¡¡ W n& tjk
rÒ   t d | ¡¡‚Y nX Y nX | |¡ | rö| d dk�r@|j
 t d	¡¡ | �r8| d d
k�r8| td
dƒ¡ | dd … } || fS | tddƒ¡ | dd … } zt| ƒ\}} W nœ tjk
�r   zt| ƒ\}} W nr tjk
�r } zPz"t| ƒ\}} |j
 t d¡¡ W n( tjk
�rð   t d | ¡¡‚Y nX W 5 d }~X Y nX Y nX | |¡ | �r6| d d
k�r6| dd … } n|j
 t d¡¡ | td
dƒ¡ | �r‚| d tk�r‚t| ƒ\}} | |¡ || fS )Nr   rT  zexpected msg-id but found '{}'zmsg-id-startrŽ   zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r±   zmsg-id with no id-rightrU  z
msg-id-endrN  zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)rô   r2  r3  rh   r   r  r*   r  r7  rA  r   r=  rÜ   rc  rM  )r   Zmsg_idr6   Úer   r   r   Ú
get_msg_id  s~    
ÿ
ÿ
ÿÿ

ÿ
ÿ
ÿÿ"

ÿ
re  c              
   C   sŽ   t ƒ }zt| ƒ\}} | |¡ W nL tjk
rl } z,t| ƒ}t|ƒ}|j t d 	|¡¡¡ W 5 d }~X Y nX | rŠ|j t d 	| ¡¡¡ |S )NzInvalid msg-id: {!r}zUnexpected {!r})
rö   re  rh   r   r  r'  r÷   r   rÜ   r*   )r   Z
message_idr6   Zexr   r   r   Úparse_message_idI  s    ÿ
ÿrf  c                 C   sš  t ƒ }| s |j t d¡¡ |S | d tkrXt| ƒ\}} | |¡ | sX|j t d¡¡ d}| r’| d dkr’| d tkr’|| d 7 }| dd … } q\| ¡ sÄ|j t d 	|¡¡¡ | t
|dƒ¡ nt|ƒ|_| t
|d	ƒ¡ | �r| d tk�rt| ƒ\}} | |¡ | �r| d dk�rT|jd k	�r:|j t d
¡¡ | �rP| t
| dƒ¡ |S | t
ddƒ¡ | dd … } | �rš| d tk�ršt| ƒ\}} | |¡ | �sÂ|jd k	�r¾|j t d
¡¡ |S d}| �rö| d tk�rö|| d 7 }| dd … } �qÆ| ¡ �s*|j t d 	|¡¡¡ | t
|dƒ¡ nt|ƒ|_| t
|d	ƒ¡ | �rn| d tk�rnt| ƒ\}} | |¡ | �r–|j t d¡¡ | t
| dƒ¡ |S )Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr   r   rŽ   z1Expected MIME major version number but found {!r}r	  Údigitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)r¿   r   rh   r   ÚHeaderMissingRequiredValuer2  r3  ÚisdigitrÜ   r*   r  ÚintrÀ   rÁ   )r   Zmime_versionr6   rg  r   r   r   Úparse_mime_versione  s„    
ÿ

ÿ
ÿ


ÿ

ÿ

ÿ


ÿrk  c                 C   sd   t ƒ }| r\| d dkr\| d tkrD| t| d dƒ¡ | dd … } qt| ƒ\}} | |¡ q|| fS )Nr   r\  rE  rŽ   )rÊ   r<  rh   r  r>  )r   Zinvalid_parameterr6   r   r   r   Úget_invalid_parameter©  s    ÿrl  c                 C   sN   t | ƒ}|st d | ¡¡‚| ¡ }| t|ƒd … } t|dƒ}t|ƒ || fS )Nzexpected ttext but found '{}'Úttext)Ú_non_token_end_matcherr   r  r*   r|   r�   r  r
  )r   r.  rm  r   r   r   Ú	get_ttext»  s    	ÿ
ro  c                 C   s�   t ƒ }| r,| d tkr,t| ƒ\}} | |¡ | rL| d tkrLt d | ¡¡‚t| ƒ\}} | |¡ | rˆ| d tkrˆt| ƒ\}} | |¡ || fS ©Nr   zexpected token but found '{}')	r\   r2  r3  rh   Ú
TOKEN_ENDSr   r  r*   ro  )r   Zmtokenr6   r   r   r   Ú	get_tokenÎ  s    	
ÿ

rr  c                 C   sN   t | ƒ}|st d | ¡¡‚| ¡ }| t|ƒd … } t|dƒ}t|ƒ || fS )Nz expected attrtext but found {!r}rÎ   )Ú_non_attribute_end_matcherr   r  r*   r|   r�   r  r
  ©r   r.  rÎ   r   r   r   Úget_attrtextå  s    	ÿ
ru  c                 C   s�   t ƒ }| r,| d tkr,t| ƒ\}} | |¡ | rL| d tkrLt d | ¡¡‚t| ƒ\}} | |¡ | rˆ| d tkrˆt| ƒ\}} | |¡ || fS rp  )	rÌ   r2  r3  rh   ÚATTRIBUTE_ENDSr   r  r*   ru  ©r   rÍ   r6   r   r   r   Úget_attributeø  s    	
ÿ

rx  c                 C   sN   t | ƒ}|st d | ¡¡‚| ¡ }| t|ƒd … } t|dƒ}t|ƒ || fS )Nz)expected extended attrtext but found {!r}úextended-attrtext)Ú#_non_extended_attribute_end_matcherr   r  r*   r|   r�   r  r
  rt  r   r   r   Úget_extended_attrtext	  s    ÿ
r{  c                 C   s�   t ƒ }| r,| d tkr,t| ƒ\}} | |¡ | rL| d tkrLt d | ¡¡‚t| ƒ\}} | |¡ | rˆ| d tkrˆt| ƒ\}} | |¡ || fS rp  )	rÌ   r2  r3  rh   ÚEXTENDED_ATTRIBUTE_ENDSr   r  r*   r{  rw  r   r   r   Úget_extended_attribute!	  s    
ÿ

r}  c                 C   sØ   t ƒ }| r| d dkr&t d | ¡¡‚| tddƒ¡ | dd … } | rR| d  ¡ sbt d | ¡¡‚d}| r�| d  ¡ r�|| d 7 }| dd … } qf|d dkr¶|dkr¶|j t d	¡¡ t	|ƒ|_
| t|d
ƒ¡ || fS )Nr   Ú*zExpected section but found {}zsection-markerrŽ   z$Expected section number but found {}r   Ú0z'section number has an invalid leading 0rg  )rÑ   r   r  r*   rh   r  ri  r   ZInvalidHeaderErrorrj  rÆ   )r   rÒ   rg  r   r   r   Úget_section7	  s,    	ÿÿ
ÿ
r€  c                 C   s’   t ƒ }| st d¡‚d }| d tkr0t| ƒ\}} | sDt d |¡¡‚| d dkr^t| ƒ\}} nt| ƒ\}} |d k	r€|g|d d…< | |¡ || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r
   )	rÓ   r   r  r2  r3  r*   r4  r}  rh   )r   Úvr:  r6   r   r   r   Ú	get_valueU	  s"    
ÿ
r‚  c                 C   s�  t ƒ }t| ƒ\}} | |¡ | r,| d dkrL|j t d |¡¡¡ || fS | d dkrÌz t| ƒ\}} d|_| |¡ W n tj	k
rŽ   Y nX | sžt 	d¡‚| d dkrÌ| t
ddƒ¡ | dd … } d|_| d d	krât 	d
¡‚| t
d	dƒ¡ | dd … } d }| �r,| d tk�r,t| ƒ\}} | |¡ d }|}|j�rF| �rF| d dk�rFt| ƒ\}}|j}d}|jdk�r²|�rŒ|d dk�rŒd}n$t|ƒ\}}	|	�rÚ|	d dk�rÚd}n(zt|ƒ\}}	W n   Y nX |	�sÚd}|�r0|j t d¡¡ | |¡ |D ](}
|
jdk�r g |
d d …< |
} �q*�q |} nd }|j t d¡¡ | �r`| d dk�r`d }nt| ƒ\}} |j�r€|jdk�rÆ| �r”| d dk�r´| |¡ |d k	�r¬|} || fS |j t d¡¡ | �sü|j t d¡¡ | |¡ |d k�rì|| fS nð|d k	�r@|D ]}
|
jdk�r
 �q$�q
|
jdk | |
¡ |
j|_| d dk�r^t 	d | ¡¡‚| t
ddƒ¡ | dd … } | �rÐ| d dk�rÐt| ƒ\}} | |¡ |j|_| �rÀ| d dk�rÐt 	d | ¡¡‚| t
ddƒ¡ | dd … } |d k	�rdtƒ }| �r^| d tk�rt| ƒ\}} n2| d dk�rDt
ddƒ}| dd … } nt| ƒ\}} | |¡ �qü|}nt| ƒ\}} | |¡ |d k	�rˆ|} || fS )Nr   r\  z)Parameter contains name ({}) but no valuer~  TzIncomplete parameterzextended-parameter-markerrŽ   ú=zParameter not followed by '='úparameter-separatorr
   Fú'z5Quoted string value for extended parameter is invalidre   zZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersry  rÎ   z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)rÂ   rx  rh   r   r   rÜ   r*   r€  rÅ   r  r  rÉ   r2  r3  r4  rl   rÇ   ru  r{  rD   r‚  r   r`   ra   rÓ   r  r  r+  )r   rè   r6   r:  r  ZappendtoZqstringZinner_valueZ
semi_validr  Útr�  r   r   r   Úget_parameterk	  sð    
ÿ



ÿ


ÿ


ÿ
ÿ






ÿ
ÿ



r‡  c              
   C   sj  t ƒ }| �rfzt| ƒ\}} | |¡ W nÌ tjk
rò } z¬d }| d tkrVt| ƒ\}} | sp| |¡ | W Y ¢xS | d dkr¢|d k	rŽ| |¡ |j t d¡¡ n@t	| ƒ\}} |rÀ|g|d d…< | |¡ |j t d 
|¡¡¡ W 5 d }~X Y nX | �rD| d dk�rD|d }d|_t	| ƒ\}} | |¡ |j t d 
|¡¡¡ | r| tddƒ¡ | d	d … } q|S )
Nr   r\  zparameter entry with no contentzinvalid parameter {!r}r‘   rË   z)parameter with invalid trailing text {!r}r„  rŽ   )rÔ   r‡  rh   r   r  r2  r3  r   rÜ   rl  r*   rD   r4   r  )r   Zmime_parametersr6   ra  r:  rè   r   r   r   Úparse_mime_parametersù	  sJ    


ÿ

ÿ

ÿrˆ  c                 C   sˆ   |rV|d dkrV|d t kr>|  t|d dƒ¡ |dd … }q t|ƒ\}}|  |¡ q |s^d S |  tddƒ¡ |  t|dd … ƒ¡ d S )Nr   r\  rE  rŽ   r„  )r<  rh   r  r>  rˆ  )Z	tokenlistr   r6   r   r   r   Ú_find_mime_parameters-
  s    r‰  c              
   C   s¶  t ƒ }d}| s$|j t d¡¡ |S zt| ƒ\}} W n< tjk
rp   |j t d | ¡¡¡ t	|| ƒ | Y S X | |¡ | rŒ| d dkr°|j t d¡¡ | r¬t	|| ƒ |S |j
 ¡  ¡ |_| tddƒ¡ | dd … } zt| ƒ\}} W n> tjk
�r*   |j t d	 | ¡¡¡ t	|| ƒ | Y S X | |¡ |j
 ¡  ¡ |_| �sP|S | d d
k�rŒ|j t d | ¡¡¡ |`|`t	|| ƒ |S | td
dƒ¡ | t| dd … ƒ¡ |S )NFz"Missing content type specificationz(Expected content maintype but found {!r}r   rý   zInvalid content typezcontent-type-separatorrŽ   z'Expected content subtype but found {!r}r\  z<Only parameters are valid after content type, but found {!r}r„  )rì   r   rh   r   rh  rr  r  rÜ   r*   r‰  r   rÙ   Úlowerrî   r  rï   rˆ  )r   ZctypeZrecoverr6   r   r   r   Úparse_content_type_header=
  sd    
ÿ
ÿ



ÿ

ÿ



ÿÿ
r‹  c              
   C   sì   t ƒ }| s |j t d¡¡ |S zt| ƒ\}} W n< tjk
rl   |j t d | ¡¡¡ t	|| ƒ | Y S X | |¡ |j
 ¡  ¡ |_| s�|S | d dkrÂ|j t d | ¡¡¡ t	|| ƒ |S | tddƒ¡ | t| dd … ƒ¡ |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   r\  zCOnly parameters are valid after content disposition, but found {!r}r„  rŽ   )rð   r   rh   r   rh  rr  r  rÜ   r*   r‰  r   rÙ   rŠ  rñ   r  rˆ  )r   Zdisp_headerr6   r   r   r   Ú parse_content_disposition_headerv
  s:    
ÿ
ÿ



ÿÿ
rŒ  c              
   C   sâ   t ƒ }| s |j t d¡¡ |S zt| ƒ\}} W n. tjk
r^   |j t d | ¡¡¡ Y nX | |¡ |j	 
¡  ¡ |_| s‚|S | rÞ|j t d¡¡ | d tkrÆ| t| d dƒ¡ | dd … } q‚t| ƒ\}} | |¡ q‚|S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   rE  rŽ   )rò   r   rh   r   rh  rr  r  rÜ   r*   r   rÙ   rŠ  r_   r<  r  r>  )r   Z
cte_headerr6   r   r   r   Ú&parse_content_transfer_encoding_header”
  s4    
ÿ
ÿ

ÿr�  c                 C   sD   d}| r@| d r@| d d t kr@| d d }| d d d… | d< |S )Nr   r‘   )r  )ÚlinesZwspr   r   r   Ú_steal_trailing_WSP_if_existsÃ
  s
    r�  c                C   sº  |j p
tj}|jrdnd}dg}d }d}d}tddƒ}t| ƒ}	|	�r¨|	 d¡}
|
|kr`|d8 }q>t|
ƒ}|
jdkr‚t	|ƒt
@ r‚d	}z| |¡ |}W n6 tk
rÊ   td
d„ |
jD ƒƒr¾d}nd}d	}Y nX |
jdkræt|
|||ƒ q>|�r¤|�s¤|
j�spd}d }|
j�rp|
j|d�d t|jƒ … }|j|k�rpt|ƒ|t|d ƒ k�r^t|ƒ}| |¡ |d  |7  < q>t|
dƒ�sŠt|
ƒ|	 }	nt|||||
j|ƒ}d}q>t|ƒ|t|d ƒ k�rÐ|d  |7  < q>|
j�rt|ƒd |k�rt|ƒ}|�s|
 ¡ �r| || ¡ d }q>t|
dƒ�sNt|
ƒ}|
j�sD|d7 }| |¡ ||	 }	q>|
j�rn|�sn|	 d|
¡ d	}q>t|ƒ}|�s†|
 ¡ �r–| || ¡ q>|d  |7  < q>|j |¡|j S )Núutf-8rÄ   r   r   FÚwrap_as_ew_blockedrŽ   r½   Tc                 s   s   | ]}t |tjƒV  qd S r   )rº   r   rã   r    r   r   r   r#   ä
  s   ÿz%_refold_parse_tree.<locals>.<genexpr>úunknown-8bitrÕ   r7   r‘   rB  )Zmax_line_lengthÚsysÚmaxsizeÚutf8rú   rþ   r¶   r   rD   r²   r9  rB  rß   rY  r-   Ú_fold_mime_parametersr1   rH   r;   r�   rõ   r�  rh   rE   Ú_fold_as_ewrI   r0   Úinsertr%   )Z
parse_treer8   Úmaxlenr×   rŽ  Úlast_ewr‘  Zwant_encodingZend_ew_not_allowedræ   r2   Útstrr`   Zencoded_partÚnewlineZnewpartsr   r   r   r9   Ê
  s˜    


ÿ



 ÿÿ
r9   c                 C   sà  |d k	r<|r<t t|d |d … |  ƒƒ} |d d |… |d< | d tkrŠ| d }| dd … } t|d ƒ|krz| t|ƒ¡ |d  |7  < d}| d tkr®| d }| d d… } |d krÂt|d ƒn|}|dkrÒdn|}	t|	ƒd }
|
d |krøt d¡‚| �rÂ|t|d ƒ }||
 }|dk�r,| d	¡ qø| d |… }tj	||	d
�}t|ƒ| }|dk�r†|d d… }tj	||	d
�}t|ƒ| }�qR|d  |7  < | t|ƒd … } | rø| d	¡ t|d ƒ}qø|d  |7  < |�rÜ|S d S )Nr‘   r   rŽ   r   rÄ   r�  é   z3max_line_length is too small to fit an encoded wordrN   )r`   )
r   r'  r  r�   rh   r�  r   r  r  rB  )Z	to_encoderŽ  r™  rš  rI   r`   Zleading_wspZtrailing_wspZnew_last_ewZ	encode_asÚ
chrome_lenZremaining_spaceZ
text_spaceZto_encode_wordZencoded_wordZexcessr   r   r   r—  1  sT    ÿÿ



r—  c              	   C   sæ  | j D �]Ø\}}|d  ¡  d¡s2|d  d7  < |}d}z| |¡ d}W n0 tk
r|   d}t |¡rtd}d}nd}Y nX |r¤tjj	|d	|d
�}	d 
|||	¡}
nd 
|t|ƒ¡}
t|d ƒt|
ƒ d |k rè|d d |
 |d< qn"t|
ƒd |k�r
| d|
 ¡ qd}|d }|rt|ƒtt|ƒƒ d t|ƒ }||d k�rLd}|| d  }}|d |… }tjj	|d	|d
�}	t|	ƒ|k�rŒ�q˜|d8 }�q\| d 
||||	¡¡ d	}|d7 }||d … }|�r|d  d7  < �qqd S )Nr‘   r\  ÚstrictFTr’  rØ   r�  r   )Zsafer   z
{}*={}''{}ré   rŽ   rN   rŠ   r   z''r®   éN   z {}*{}*={}{})rä   r¯   rÏ   rB  rß   r   râ   rÝ   rÞ   ro   r*   r   r�   rh   r   )r2   rŽ  r™  r×   rå   r   r`   Zerror_handlerZencoding_requiredZencoded_valuer›  rÒ   Zextra_chromerž  Z
splitpointZmaxcharsÚpartialr   r   r   r–  r  sn    


  ÿ   ÿ   ÿr–  )�Úrer“  rÝ   Ústringr   Úoperatorr   Zemailr   r  r   r   r²   r  r2  r9  r5  r³   r<  Z	TSPECIALSrq  Z	ASPECIALSrv  r|  r   ÚcompileÚVERBOSEÚ	MULTILINEr#  rþ   r   rL   rR   rU   rW   rX   rZ   r\   r]   rb   rm   rn   rq   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¹   rQ  rR  r*   r%   r§   r  r  Úmatchr-  Úfindallr  rn  rs  rz  r
  r  r  r!  r'  r*  r+  r/  r0  r1  r3  r4  r6  r7  r8  r;  r>  rD  rA  rF  rJ  rL  rM  rO  rS  rV  rW  rX  rZ  r[  r]  r^  r_  r`  rb  rc  re  rf  rk  rl  ro  rr  ru  rx  r{  r}  r€  r‚  r‡  rˆ  r‰  r‹  rŒ  r�  r�  r9   r—  r–  r   r   r   r   Ú<module>F   s,  
øC"	
!*$
V	+





ÿÿÿÿ
1C+"&'/'&).9%7ED 49/gA