o
    ^hE                     @   s   d Z g dZddlZddlZdZdZdZg dZg dZddddd	d
dd	dddddddZ	dd Z
dd Zdd Zdd Zdd ZG dd dZG dd deZdS )zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
)	mktime_tz	parsedateparsedate_tzquote    N  z, )ZjanZfebZmarZaprmayZjunZjulZaugsepoctZnovZdecZjanuaryZfebruaryZmarchZaprilr   ZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecember)ZmonZtueZwedZthuZfriZsatZsunipiiiiDi)ZUTZUTCZGMTZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTc                 C   s,   t | }|sdS |d du rd|d< t|S )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    N	   r   )_parsedate_tztuple)datares r   "  /home/conda/feedstock_root/build_artifacts/python-split_1761171407825/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehol/lib/python3.10/email/_parseaddr.pyr   -   s   r   c              
   C   s  | sdS |   } | sdS | d ds| d  tv r| d= n| d d}|dkr6| d |d d | d< t| dkrQ| d  d}t|dkrQ|| dd  } t| dkr| d }|d}|d	kri|d}|dkr~|d| ||d g| dd< n| d
 t| dk rdS | dd } | \}}}}}|r|r|sdS | }|tvr|| }}|tvrdS t	|d }|dkr|d8 }|d	 dkr|dd	 }|d}|dkr||}}|d	 dkr|dd	 }|sdS |d 
 s||}}|d	 dkr|dd	 }| d}t|dkr|\}	}
d}nAt|dkr&|\}	}
}n4t|dkrXd|d v rX|d  d}t|dkrI|\}	}
d}nt|dkrV|\}	}
}ndS dS zt|}t|}t|	}	t|
}
t|}W n ty{   Y dS w |dk r|dkr|d7 }n|d7 }d}| }|tv rt| }nzt|}W n
 ty   Y nw |dkr|drd}|r|dk rd	}| }nd}||d d |d d   }||||	|
|ddd	|g
S )a  Convert date to extended time tuple.

    The last (additional) element is the time zone offset in seconds, except if
    the timezone was specified as -0000.  In that case the last element is
    None.  This indicates a UTC timestamp that explicitly declaims knowledge of
    the source timezone, as opposed to a +0000 timestamp that indicates the
    source timezone really was UTC.

    Nr   ,      -   +r         :   0.d   D   il  i  i  <   )splitendswithlower	_daynamesrfindlenfindappend_monthnamesindexisdigitint
ValueErrorupper
_timezones
startswith)r   istuffsddZmmZyyZtmZtzZthhZtmmZtssZtzoffsetZtzsignr   r   r   r   9   s   


"










r   c                 C   s"   t | }t|tr|dd S |S )z&Convert a time string to a time tuple.Nr   )r   
isinstancer   r   tr   r   r   r      s   
r   c                 C   s8   | d du rt | dd d S t| }|| d  S )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r   N   )r   )timemktimecalendarZtimegmr8   r   r   r   r      s   
r   c                 C   s   |  dd ddS )zPrepare string to be used in a quoted string.

    Turns backslash and double quote characters into quoted pairs.  These
    are the only characters that need to be quoted inside a quoted string.
    Does not add the surrounding double quotes.
    \z\\"z\")replace)strr   r   r   r      s   r   c                   @   s|   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dddZdd Zdd Zdd ZdddZdd ZdS ) AddrlistClassa  Address parser class by Ben Escoto.

    To understand what this class does, it helps to have a copy of RFC 2822 in
    front of you.

    Note: this class interface is deprecated and may be removed in the future.
    Use email.utils.AddressList instead.
    c                 C   sZ   d| _ d| _d| _d| _| j| j | _| j | j | j | _| jdd| _|| _g | _	dS )zInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
r   r   N)
specialsposLWSZCRFWSatomendsr@   
phraseendsfieldcommentlistselfrI   r   r   r   __init__   s   
zAddrlistClass.__init__c                 C   s   g }| j t| jk rH| j| j  | jd v r.| j| j  dvr&|| j| j   |  j d7  _ n| j| j  dkr?| j|   nn| j t| jk s
t|S )z&Skip white space and extract comments.z
r   ()	rD   r(   rI   rE   r*   rJ   
getcommentEMPTYSTRINGjoin)rL   Zwslistr   r   r   gotonext   s   
	zAddrlistClass.gotonextc                 C   sH   g }| j t| jk r"|  }|r||7 }n|d | j t| jk s
|S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )rD   r(   rI   
getaddressr*   )rL   resultZadr   r   r   getaddrlist   s   

zAddrlistClass.getaddrlistc                 C   s  g | _ |   | j}| j }|  }|   g }| jt| jkr-|r,t| j |d fg}n| j| j dv rI|| _|| _ |  }t| j |fg}n| j| j dkrg }t| j}|  jd7  _| jt| jk r|   | j|k r| j| j dkr|  jd7  _n|| 	  }| jt| jk sgnI| j| j dkr| 
 }| j rt|d d| j  d	 |fg}n't||fg}n|rt| j |d fg}n| j| j | jv r|  jd7  _|   | jt| jk r| j| j d
kr|  jd7  _|S )zParse the next address.r   z.@r   r   ;<z (r   )r   )rJ   rR   rD   getphraselistr(   rI   SPACErQ   getaddrspecrS   getrouteaddrrC   )rL   ZoldposZoldclplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rS     s^   

 zAddrlistClass.getaddressc                 C   s   | j | j dkr
dS d}|  jd7  _|   d}| jt| j k rx|r*|   d}nB| j | j dkr<|  jd7  _	 |S | j | j dkrN|  jd7  _d}n| j | j d	kr^|  jd7  _n|  }|  jd7  _	 |S |   | jt| j k s!|S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        rW   NFr   r   >@Tr   )rI   rD   rR   r(   	getdomainr[   )rL   ZexpectrouteZadlistr   r   r   r\   G  s4   zAddrlistClass.getrouteaddrc                 C   sZ  g }|    | jt| jk ryd}| j| j dkr3|r$|d  s$|  |d |  jd7  _d}n1| j| j dkrG|dt|    n| j| j | j	v r]|r\|d  s\|  n|| 
  |   }|rq|rq|| | jt| jk s| jt| jks| j| j dkrt|S |d |  jd7  _|    |  }|stS t|| S )	zParse an RFC 2822 addr-spec.Tr   r   r   Fr?   z"%s"r_   )rR   rD   r(   rI   strippopr*   r   getquoterG   getatomrP   rQ   r`   )rL   ZaslistZpreserve_wswsdomainr   r   r   r[   g  s<   

 

zAddrlistClass.getaddrspecc                 C   s   g }| j t| jk rt| j| j  | jv r|  j d7  _ nQ| j| j  dkr,| j|   n@| j| j  dkr<||   n0| j| j  dkrQ|  j d7  _ |d n| j| j  dkr[tS | j| j  | j	v ren|| 
  | j t| jk s
t|S )z-Get the complete domain name from an address.r   rN   [r   r_   )rD   r(   rI   rE   rJ   r*   rO   getdomainliteralrP   rG   rd   rQ   )rL   Zsdlistr   r   r   r`     s$   
zAddrlistClass.getdomainTc                 C   s   | j | j |kr
dS dg}d}|  jd7  _| jt| j k rq|r,|| j | j  d}n6| j | j |v r<|  jd7  _n5|rN| j | j dkrN||   q| j | j dkrYd}n	|| j | j  |  jd7  _| jt| j k st|S )a  Parse a header fragment delimited by special characters.

        `beginchar' is the start character for the fragment.
        If self is not looking at an instance of `beginchar' then
        getdelimited returns the empty string.

        `endchars' is a sequence of allowable end-delimiting characters.
        Parsing stops when one of these is encountered.

        If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed
        within the parsed fragment.
        r   Fr   rN   r>   T)rI   rD   r(   r*   rO   rP   rQ   )rL   Z	begincharZendcharsZallowcommentsZslistr   r   r   r   getdelimited  s*   
zAddrlistClass.getdelimitedc                 C      |  dddS )z1Get a quote-delimited fragment from self's field.r?   z"Fri   rL   r   r   r   rc        zAddrlistClass.getquotec                 C   rj   )z7Get a parenthesis-delimited fragment from self's field.rN   z)Trk   rl   r   r   r   rO     rm   zAddrlistClass.getcommentc                 C   s   d|  ddd S )z!Parse an RFC 2822 domain-literal.z[%s]rg   z]Frk   rl   r   r   r   rh     s   zAddrlistClass.getdomainliteralNc                 C   sp   dg}|du r
| j }| jt| jk r3| j| j |v rn|| j| j  |  jd7  _| jt| jk st|S )a  Parse an RFC 2822 atom.

        Optional atomends specifies a different set of end token delimiters
        (the default is to use self.atomends).  This is used e.g. in
        getphraselist() since phrase endings must not include the `.' (which
        is legal in phrases).r   Nr   )rG   rD   r(   rI   r*   rP   rQ   )rL   rG   Zatomlistr   r   r   rd     s   
zAddrlistClass.getatomc                 C   s   g }| j t| jk rY| j| j  | jv r|  j d7  _ n6| j| j  dkr+||   n&| j| j  dkr<| j|   n| j| j  | jv rH	 |S || 	| j | j t| jk s
|S )zParse a sequence of RFC 2822 phrases.

        A phrase is a sequence of words, which are in turn either RFC 2822
        atoms or quoted-strings.  Phrases are canonicalized by squeezing all
        runs of continuous whitespace into one space.
        r   r?   rN   )
rD   r(   rI   rF   r*   rc   rJ   rO   rH   rd   )rL   r]   r   r   r   rY     s   zAddrlistClass.getphraselist)TN)__name__
__module____qualname____doc__rM   rR   rU   rS   r\   r[   r`   ri   rc   rO   rh   rd   rY   r   r   r   r   rB      s    	; &
%
rB   c                   @   sH   e Zd Z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 )AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c                 C   s(   t | | |r|  | _d S g | _d S rn   )rB   rM   rU   addresslistrK   r   r   r   rM     s   
zAddressList.__init__c                 C   s
   t | jS rn   )r(   rt   rl   r   r   r   __len__	  s   
zAddressList.__len__c                 C   s>   t d }| jd d  |_|jD ]}|| jvr|j| q|S rn   rs   rt   r*   rL   otherZnewaddrxr   r   r   __add__  s   

zAddressList.__add__c                 C   s&   |j D ]}|| j vr| j | q| S rn   )rt   r*   rL   rx   ry   r   r   r   __iadd__  
   

zAddressList.__iadd__c                 C   s.   t d }| jD ]}||jvr|j| q|S rn   rv   rw   r   r   r   __sub__  s   

zAddressList.__sub__c                 C   s&   |j D ]}|| j v r| j | q| S rn   )rt   remover{   r   r   r   __isub__$  r}   zAddressList.__isub__c                 C   s
   | j | S rn   )rt   )rL   r,   r   r   r   __getitem__+  s   
zAddressList.__getitem__N)ro   rp   rq   rr   rM   ru   rz   r|   r~   r   r   r   r   r   r   rs      s    	rs   )rr   __all__r;   r=   rZ   rP   Z
COMMASPACEr+   r&   r1   r   r   r   r   r   rB   rs   r   r   r   r   <module>   s0   	}	

  /