<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
U
    e5dϡ                 	   @   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WdXejYZZe dWe [dXej\Z]e dj^Z_e dWe [dXej\Z`e dWe [dXej\Zae dWe [dXej\Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd ZddĄ ZddƄ ZddȄ Zddʄ Zdd̄ Zdd΄ ZddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zddڄ Zdd܄ Zddބ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd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   2/usr/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rt |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|rd }}| d jdks`| d d jdkrdd}| d jdks| d d jdkrd}|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
st|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 qn|
jtd |d7 }|
j}|
j
rz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  || qd|}||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rz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}|rt	|dkr|d	 j
d
krt|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rt| \}} 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rzt	| \}} W q tjk
r   t
| \}} Y qX nt
| \}} || | r| d tkrt| \}} || || 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rt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rt| \}} || || 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rt| \}} |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rd|_|| 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rt
| \}} || t| \}} || t| |r|| fS | d t	krt
| \}} || 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rt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rt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rt| \}} || || 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 rd|_|	| || 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rzt| \}} || W n tjk
r<   d }| d tkrt| \}} | 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rt| \}} | 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rt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  }| rzt| \}} || W n  tjk
rH } zd }| d tkrt| \}} | 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rt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rt| \}} || || 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rt| \}} || | 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rt| \}} || || 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rt| \}} || || 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rt| \}} || || 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rz t| \}} d|_|| W n tj	k
r   Y nX | st	d| d dkr|t
dd | dd  } d|_| d d	krt	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rd}n$t|\}}	|	r|	d dkrd}n(zt|\}}	W n   Y nX |	sd}|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rt| \}} || |j|_| r| d dkrt	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 } zd }| 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 | rt	||  |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  } qt| \}} || 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rt	|t
@ rd	}z|| |}W n6 tk
r   td
d |
jD rd}nd}d	}Y nX |
jdkrt|
||| 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st|
|	 }	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rt|d n|}|dkrdn|}	t|	d }
|
d |krt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 |rt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