ž ¦ÿf/Cc@s†dZddddgZddlZddlZdZdZd Zd d d d dddddddddddddddddddd gZd!d"d#d$d%d&d'gZidd(6dd)6dd*6dd+6d, d-6d. d/6d0 d16d, d26d3 d46d0 d56d6 d76d3 d86d9 d:6d6 d;6Z d<d„Z d=d>„Z d?d„Z d@d„Z dAd„ZGdBdC„dCƒZGdDdE„dEeƒZdS(FucEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. u mktime_tzu parsedateu parsedate_tzuquoteiNu uu, ujanufebumaruaprumayujunujuluaugusepuoctunovudecujanuaryufebruaryumarchuaprilujuneujulyuaugustu septemberuoctoberunovemberudecemberumonutueuweduthuufriusatusunuUTuUTCuGMTuZi�uASTi,uADTiôuESTuEDTiXuCSTuCDTi¼uMSTuMDTi uPSTuPDTcCs=t|ƒ}|sdS|ddkr3d|d|djdƒ}|dkr‡|d|dd…|d@,:;."[]iu u u.uN( uspecialsuposuLWSuCRuFWSuatomendsureplaceu phraseendsufieldu commentlist(uselfufield((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__init__Õs     uAddrlistClass.__init__cCsÁg}x«|jt|jƒkr³|j|j|jdkr€|j|jdkrn|j|j|jƒn|jd7_q |j|jdkr¯|jj|jƒƒq Pq Wtj|ƒS(u&Skip white space and extract comments.u iu(( uposulenufielduLWSuappendu commentlistu getcommentu EMPTYSTRINGujoin(uselfuwslist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugotonextèsuAddrlistClass.gotonextcCsUg}xH|jt|jƒkrP|jƒ}|r@||7}q |jdƒq W|S(uVParse all addresses. Returns a list containing all of the addresses. u(uu(uposulenufieldu getaddressuappend(uselfuresultuad((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getaddrlistös  uAddrlistClass.getaddrlistcCsžg|_|jƒ|j}|j}|jƒ}|jƒg}|jt|jƒkr„|rPtj|jƒ|dfg}qPnÌ|j|jdkrÖ||_||_|jƒ}tj|jƒ|fg}nz|j|jdkr„g}t|jƒ}|jd7_x=|jt|jƒkr€|jƒ|j|krm|j|jdkrm|jd7_Pn||j ƒ}qWnÌ|j|jdkrý|j ƒ}|jrâtj|ƒddj|jƒd |fg}qPtj|ƒ|fg}nS|r%tj|jƒ|dfg}n+|j|j|j krP|jd7_n|jƒ|jt|jƒkrš|j|jd krš|jd7_n|S( uParse the next address.iu.@u:iu;uu@u:FT(ufielduposuFalseugotonextulenu getdomainuTrueu getaddrspec(uselfu expectrouteuadlist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getrouteaddr?s.     uAddrlistClass.getrouteaddrcCs¾g}|jƒx3|jt|jƒkrEd}|j|jdkr�|rk|djƒ rk|jƒn|jdƒ|jd7_d}nŠ|j|jdkrÆ|jdt |j ƒƒƒnT|j|j|j kr|r|d jƒ r|jƒnPn|j|j ƒƒ|jƒ}|r|r|j|ƒqqW|jt|jƒkst|j|jdkr�t j|ƒS|jdƒ|jd7_|jƒt j|ƒ|jƒS( uParse an RFC 2822 addr-spec.u.iu"u"%s"u@TiÿÿÿÿFiÿÿÿÿ(ugotonextuposulenufielduTrueustripupopuappenduFalseuquoteugetquoteuatomendsugetatomu EMPTYSTRINGujoinu getdomain(uselfuaslistu preserve_wsuws((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getaddrspec_s4        .   uAddrlistClass.getaddrspeccCsg}x|jt|jƒkr|j|j|jkrL|jd7_q |j|jdkr{|jj|jƒƒq |j|jdkr§|j|jƒƒq |j|jdkrÜ|jd7_|jdƒq |j|j|jkrùPq |j|j ƒƒq Wt j |ƒS(u-Get the complete domain name from an address.iu(u[u.( uposulenufielduLWSu commentlistuappendu getcommentugetdomainliteraluatomendsugetatomu EMPTYSTRINGujoin(uselfusdlist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getdomain€suAddrlistClass.getdomaincCs-|j|j|krdSdg}d}|jd7_xå|jt|jƒkr|ry|j|j|jƒd}n”|j|j|kr¢|jd7_Pnk|r×|j|jdkr×|j|jƒƒq;n6|j|jdkröd}n|j|j|jƒ|jd7_q;Wtj|ƒS(uæ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. uiu(u\FT( ufielduposuFalseulenuappendu getcommentuTrueu EMPTYSTRINGujoin(uselfu begincharuendcharsu allowcommentsuslistuquote((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getdelimited“s(    uAddrlistClass.getdelimitedcCs|jdddƒS(u1Get a quote-delimited fragment from self's field.u"u" F(u getdelimiteduFalse(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugetquote¸suAddrlistClass.getquotecCs|jdddƒS(u7Get a parenthesis-delimited fragment from self's field.u(u) T(u getdelimiteduTrue(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getcomment¼suAddrlistClass.getcommentcCsd|jdddƒS(u!Parse an RFC 2822 domain-literal.u[%s]u[u] F(u getdelimiteduFalse(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugetdomainliteralÀsuAddrlistClass.getdomainliteralcCs�dg}|dkr!|j}nx\|jt|jƒkr|j|j|krVPn|j|j|jƒ|jd7_q$Wtj|ƒS(uParse 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).uiN(uNoneuatomendsuposulenufielduappendu EMPTYSTRINGujoin(uselfuatomendsuatomlist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugetatomÄs   uAddrlistClass.getatomcCsåg}xØ|jt|jƒkrà|j|j|jkrL|jd7_q |j|jdkrx|j|jƒƒq |j|jdkr§|jj|jƒƒq |j|j|jkrÄPq |j|j |jƒƒq W|S(uýParse 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. iu"u(( uposulenufielduFWSuappendugetquoteu commentlistu getcommentu phraseendsugetatom(uselfuplist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getphraselistØsuAddrlistClass.getphraselistNT(u__name__u __module__u __qualname__u__doc__u__init__ugotonextu getaddrlistu getaddressu getrouteaddru getaddrspecu getdomainuTrueu getdelimitedugetquoteu getcommentugetdomainliteraluNoneugetatomu getphraselist(u __locals__((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu AddrlistClassËs    ; ! %   u AddrlistClasscBsn|EeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS(u AddressListu@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs5tj||ƒ|r(|jƒ|_n g|_dS(N(u AddrlistClassu__init__u getaddrlistu addresslist(uselfufield((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__init__ñsuAddressList.__init__cCs t|jƒS(N(ulenu addresslist(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__len__øsuAddressList.__len__cCs\tdƒ}|jdd…|_x3|jD](}||jkr,|jj|ƒq,q,W|S(N(u AddressListuNoneu addresslistuappend(uselfuotherunewaddrux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__add__ûs  uAddressList.__add__cCs:x3|jD](}||jkr |jj|ƒq q W|S(N(u addresslistuappend(uselfuotherux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__iadd__suAddressList.__iadd__cCsFtdƒ}x3|jD](}||jkr|jj|ƒqqW|S(N(u AddressListuNoneu addresslistuappend(uselfuotherunewaddrux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__sub__ s  uAddressList.__sub__cCs:x3|jD](}||jkr |jj|ƒq q W|S(N(u addresslisturemove(uselfuotherux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__isub__suAddressList.__isub__cCs |j|S(N(u addresslist(uselfuindex((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu __getitem__suAddressList.__getitem__N( u__name__u __module__u __qualname__u__doc__u__init__u__len__u__add__u__iadd__u__sub__u__isub__u __getitem__(u __locals__((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu AddressListïs     u AddressList(u__doc__u__all__utimeucalendaruSPACEu EMPTYSTRINGu COMMASPACEu _monthnamesu _daynamesu _timezonesu parsedate_tzu _parsedate_tzu parsedateu mktime_tzuquoteu AddrlistClassu AddressList(((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyus6  u ÿ%