
    =	fЮ                        d dl  ddlZddlZddlZddlZddlZddlZddlZg Z	 ddlZej                  ej                  df       ej                  ej                  df       	 ddlZej                  ej                  df       ej                  ej                  df       ej                  ej                  df       	 ddlZej                  ej"                  df       ej                  ej$                  df       ej                  ej&                  df       	 ddlZej                  ej*                  d	f       ej                  d
       ej                  d        eeD  cg c]  \  } } e|        c}}       Zd Z ej4                  d      Z ej4                  d      Z ej4                  d      Zd Zd Zd Z d Z!g dZ"d Z#d Z$d Z% G d de&      Z' G d d      Z( G d d      Z) G d d      Z*d  Z+d! Z,d" Z-e,e-fZ.d# Z/d$ Z0dNd%Z1dOd&Z2dPd'Z3dQd(Z4d) Z5d* Z6d+ Z7d, Z8d-d.d/d0d1d2d3d4Z9d5 Z:d6 Z;dPd7Z<d8 Z=d9 Z>d: Z?d; Z@d<ZAdRd=ZBe,d d>e3e4e7e8e:e;e<d?
ZCeCj                         ZEe-eEd@<   dAeEdB<   eEj                         ZFe5eFdC<   eEj                         ZGdDeGdE<   eGj                         ZHeHdC= eHj                  e=e>e?e@dF       dGeCdHdIeEdHdJeFdHdKeGdHdLeHdHdMZJy#  Y xY w#  Y 0xY w#  Y xY w#  Y xY wc c}} w )S   )*    Nutf_64utf_32utf_16	utf_16_be	utf_16_leutf_8)z B E G I N : V C A R Dr   )zB E G I N : V C A R D r	   c                     t        | d      S )zThis function detects unicode byte order markers and if present
    uses the codecs module instead to open the file instead with
    appropriate unicode decoding, else returns the file using standard
    open functionrtU)open)names    /usr/share/hplip/base/vcard.pyopentextfiler   Z   s     e    z[^0-9]*z^[0-9]{10}$z
^[0-9]{7}$c                     | S N)joinresplit
_notdigitslen)nnumss     r   phonenumber_normaliser   p   s	     Hr   c                     t        j                  t        |       d| dd d| dd d| dd  S t        j                  t        |       | d d d| dd  S | S )N(r      z)    -)r   match
_tendigits_sevendigits)r   s    r   phonenumber_formatr$   }   s_    	xx
A* 1vq1vqu55	,	"	.2A!"&&Hr   c                 D    t        |       }|r|S | j                  dd      S )z>like L{formatname}, except we use the first matching componentnickname )nameparser_getfullnameget)r   	_fullnames     r   nameparser_formatsimplenamer+      s&    &t,I88J##r   c                 t    d| v r| d   S dj                  t        |       D cg c]  }|s|	 c}      S c c}w )z>Gets the full name, joining the first/middle/last if necessaryfull )r   nameparser_getparts)r   xs     r   r(   r(      s8    ~F|88 3D 9?1QQ?@@?s   55)vanvondedic                 T   | j                  d      }|j                         }t        |      dk  r|ddfS t        |      dk(  r|d   d|d   fS |d   g}g }|d   g}|d= |d= t        |      r|d   d   j                         |d   d   k(  s|d   j                         t        v rQ|d   g|z   }|d= t        |      r:|d   d   j                         |d   d   k(  r7|d   j                         t        v rQ|}dj                  |      dj                  |      dj                  |      fS )Nr-   r   r'      r   r.   )r)   r   r   lower	lastpartsr   )r   r   partsfmls         r   nameparser_getparts_FMLr>      s=   A GGIE 5zQ2r{ 5zQa"eAh'' 
q
A
A	rAab	
e*%)A,,,.%)A,>%)//BSW`B`2YKM"I e*%)A,,,.%)A,>%)//BSW`B` 	A HHQK!chhqk22r   c                    | j                  d      }|j                  d      }t        |      dk  r|ddfS |d   }d}d}|d   j                         }t        |      dk\  r'|d   }t        |      dkD  rdj                  |dd        }|||fS )Nr-   ,r   r'   r   r.   )r)   r   r   r   )r   r   r:   _last_first_middles         r   nameparser_getparts_LFMrD      s    AGGCLE
5zQ2r{!HEFG!HNNE
5zQqu:>hhuQRy)GGU##r   c                    dD ]=  }|| v s| j                  dd      | j                  dd      | j                  dd      fc S  d| vr| j                  dd      ddfS | j                  d      }d|v rt        |       S t        |       S )	zfReturns (first, middle, last) for name.  If the part doesn't exist
    then a blank string is returned)firstmiddlelastrF   r'   rG   rH   r-   r&   r@   )r)   nameparser_getrD   r>   )r   ir   s      r   r/   r/      s    
 ) Y9HHWb)488Hb+A488FTVCWXXY
 TR("b11F#A
ax&t,,"4((r   c                       e Zd Zy)VFileExceptionN)__name__
__module____qualname__ r   r   rL   rL      s    r   rL   c                   >    e Zd ZddiZd Zd Zd Zd Zd Zd Z	d	 Z
y
)VFile	MACINTOSH	MAC_ROMANc                      || _         d | _        y r   )sourcesaved)selfrV   s     r   __init__zVFile.__init__  s    
r   c                     | S r   rP   rX   s    r   __iter__zVFile.__iter__      r   c                 "    | j                         S r   __next__r[   s    r   nextz
VFile.next
      }}r   c                     	 | j                         }|
t               t        |      dk7  rn,d}|j                  d      }|dkD  r|d | j	                         j                  d      }d|v sd|v rUd}|d   d	k(  s|d
   d	k(  rC|d   d	k(  rd}nd
}| j                         }|d   dv r|dd  }|d | |z   }|d   d	k(  r:|d
   d	k(  rC|rL| j                         }|n9t        |      dk(  rn*|d   dk7  r	|d   dk7  rn|| j                         dd  z  }|rL|j                  d      }|dk  r(t        j                  d|z         t        |      }|dz  }|d | }||dz   d  j                         }|j                         j                  d      }	g }
t        |t              rd }nd}|	D ]  }|j                  d      r
|dd  xs d}|j                  d      s|dk(  s|
j                  |       F	 |dk(  s|dk(  rt        j                   |      }n+|dk(  rt#        j                   |      }d }nt%        d|z          t        |
      dk(  rt%        d|      |;	 t)        j*                  | j,                  j/                  ||            } ||      \  }}|
dgk(  s|
d gk(  r|j                         }|
|fS # t&        $ r5}t        |t$              r|t%        dt        |      d|d|d      d }~ww xY w# t0        $ r t%        d|d|      w xY w)!NTr   :;zquoted-printablezencoding=quoted-printableFr7   =)	r.   r   r.   rh   zFixing up bad line: %szLATIN-1zCHARSET=   z	ENCODING=zQUOTED-PRINTABLEENCODING=QUOTED-PRINTABLEz
ENCODING=Bzunknown encoding: z
Exception z while processing encoding z
 on data ''zLine contains no property: zunknown character set 'z' in parameters BEGINEND)_getnextlineStopIterationr   findr8   r   
_lookaheadlogdebugstripupper
isinstancestr
startswithappendquopridecodestringbase64rL   	Exceptioncodecs
getdecoder_charset_aliasesr)   LookupError)rX   linenormalcontinuationscolonsrJ   nextlnextlineb4itemsnewitemscharsetedecoder_s                  r   r`   zVFile.__next__  s   $$&D|#o%4yA~  #		#19Ve""$**3/A!Q&*E*J&+#2h#obSBx3 --/EQx;.ab	8E>D 2h#obS "(H8}!s"x{d':D%%'++D " 		#19 II.56IECKD&5\E!GH~##% 
  %dC G  G 	sA ||J'AB%,9 <<,Q8J5J"s**a3N.N!..t4D,&!..t4D"G ))=a)?@@1	sB x=A D!JKK d ++D,A,A,E,Egw,WX Q y H$7::<D~+  sa/G$adefagijlp%qrrs  d$V]_a%bccds%   +AJ1:K2 1	K/:0K**K/2Lc                 d    | j                   | j                   }d | _         |S | j                         S r   rW   _readandstriplinerX   r   s     r   rn   zVFile._getnextline  s0    ::!::DDJK))++r   c                     | j                   j                         }|1t        |      dk(  ry |dd  dk(  r|d d S |d   dk(  s|d   dk(  r|d d S |S )Nr   rg   
r7   
)rV   readliner   r   s     r   r   zVFile._readandstripline  sj    {{##%4yA~bcf$CRy bT!T"X%5CRy r   c                 `    | j                   J | j                         | _         | j                   S r   r   r[   s    r   rq   zVFile._lookahead  s,    zz!!!++-
zzr   N)rM   rN   rO   r   rY   r\   ra   r`   rn   r   rq   rP   r   r   rR   rR      s4    [

rj,r   rR   c                   (    e Zd ZdZd Zd Zd Zd Zy)VCardszUnderstands vcards in a vfilec                     || _         y r   )vfile)rX   r   s     r   rY   zVCards.__init__  s	    
r   c                     | S r   rP   r[   s    r   r\   zVCards.__iter__  r]   r   c                 "    | j                         S r   r_   r[   s    r   ra   zVCards.next  rb   r   c                     d x}}| j                   D ]  \  }}||fdgdfk7  rd} n ||fdgdfk7  r
t               g }| j                   D ]$  \  }}||fdgdfk7  r|j                  ||f       $ n ||fdgdfk7  rt        d      t	        |      S )Nrl   VCARDTrm   z'There is a BEGIN:VCARD but no END:VCARD)r   ro   ry   rL   VCard)rX   fieldvaluefoundliness        r   r`   zVCards.__next__  s    :: 	KE%e}'G 44E	 %=gY00/! :: 	KE%e}%' 22uUm-	 %=eWg.. !JKKU|r   N)rM   rN   rO   __doc__rY   r\   ra   r`   rP   r   r   r   r     s    #r   r   c                      e Zd ZdZd Zd Zd"dZd Zd Zd Z	d Z
e
Ze
Ze
Ze
Ze
Ze
Ze
Ze
Ze
Ze
Zd	 Zd
 Zd Zd Zd Zd ZeZd ZeZd Zd Zd Z d Z!d#dZ"d#dZ#d Z$d Z%e$Z&d Z'd Z(d Z)d Z*d$dZ+d Z,d Z-d Z.d  Z/y!)%r   zA single vcardc                    d| _         d | _        i | _        i | _        g | _        |D ];  \  }}t        |      sJ |dgk(  rd| _        |d   j                  d      r/|d   j                  d      s|d   j                  d      rd| _        t        |      r9|d   j                  d	      |d   j                  d
      cxkD  rdk\  r
n nd| _	        |dgk(  r2|j                  d      }	 |D cg c]  }t        |       }}|| _         |d   dk(  rddg|dd n/|d   dk(  rddg|dd n|d   dk(  rddg|dd n|d   dk(  rddg|dd | j                  j                  ||f       > | j                  | j                  | j                         | j!                  | j                         y c c}w # t        $ r t        |dz         w xY w)N)r6   r   zX-EVOLUTION-FILE-AS	evolutionr   ITEMz.X-ABADRz
.X-ABLABELapplez>!$_z_$!<VERSION.z is not a valid vcard versionzHOME.TELTELHOMEr   z
HOME.LABELLABELzWORK.TELWORKz
WORK.LABEL)_version_origin_data_groupsr   r   rx   endswithrp   originr   int
ValueErrorrL   ry   _parse_update_groups)rX   r   r;   vverxxs         r   rY   zVCard.__init__  s   

  $	'CAaq6M6*++*tv&AaDMM*,E1WcId&1v!A$))F+adii.?D1D%YKggclL-01r3r71C1 !$ tz!!A1%!6*!A1#!A1%!6*!AJJ!u&I$	'L 	DJJ

+DJJ'1 2! L(+J)JKKLs   &F,*F'<F,'F,,Gc                     | j                   S )z2Returns a dict of the data parsed out of the vcardr   r[   s    r   getdatazVCard.getdata  s    zzr   c                 :    | j                   j                  ||      S r   )r   r)   )rX   keydefaults      r   r)   z	VCard.get  s    zz~~c7++r   c                 r    ||vr|S t        dd      D ]"  }|t        |      z   |vs|t        |      z   c S  y)zReturns the fieldname to use in the dict.

        For example, if name is "email" and there is no "email" field
        in dict, then "email" is returned.  If there is already an "email"
        field then "email2" is returned, etcr6   韆 N)rangerepr)rX   r   dictrJ   s       r   _getfieldnamezVCard._getfieldname  sD     tKq 	$ADG|4'DG|#	$r   c                    |D ]  \  }}t        |j                               dk(  r#d|d   v r|d   |d   j                  d      dz   d  }n|d   }|j                  dd      }t	        | d|z   | j
                        } ||||        y )Nr   r   r   r    r   _field_)r   rt   rp   replacegetattr_default_field)rX   r   resultr   r   r;   tfuncs           r   r   zVCard._parse  s      	'KE%5;;=!Q&eAh!HU1X]]3/123!H		#s#A41d.A.ABDv&	'r   c                     t        | j                  j                               D ]  \  }} | j                  |g|   y)zUpdate the groups info N)listr   r   	_setvalue)rX   r   kr   s       r   r   zVCard._update_groups'  s:    **,- 	'CAaDNN6&A&	'r   c                      y r   rP   rX   r   r   r   s       r   _field_ignorezVCard._field_ignore/  s    r   c                 L    | j                  |      || j                  d|      <   y )Nr   unquoter   r   s       r   	_field_FNzVCard._field_FNA  s"    59\\%5Ht!!&&12r   c                 L    | j                  |      || j                  d|      <   y )Ntitler   r   s       r   _field_TITLEzVCard._field_TITLEE  "    6:ll56It!!'623r   c                 L    | j                  |      || j                  d|      <   y )Nr&   r   r   s       r   _field_NICKNAMEzVCard._field_NICKNAMEI  s"    9=e9Lt!!*f56r   c                 L    | j                  |      || j                  d|      <   y )Nnotesr   r   s       r   _field_NOTEzVCard._field_NOTEN  r   r   c                 ,    | j                  |      |d<   y )Nuid)r   r   s       r   
_field_UIDzVCard._field_UIDR  s    U+ur   c                    | j                  |      }d x}x}x}x}}	 |d   }|d   }|d   }|d   }|d   }| t        |      r||| j                  d|      <   | t        |      r||| j                  d|      <   | t        |      r||| j                  d|      <   | t        |      r||| j                  d	|      <   |"t        |      r||| j                  d
|      <   y y y # t        $ r Y w xY w)Nr   r   r6   r      z	last namez
first namezmiddle nameprefixsuffix)splitandunquote
IndexErrorr   r   )	rX   r   r   r   
familyname	givennameadditionalnameshonorificprefixeshonorificsuffixess	            r   _field_NzVCard._field_NZ  s4   $$U+[__
_Y__3DGX	qJaI#AhO %a %a !c*o>HF4%%k6:; S^?HF4%%lF;<&3+?@OF4%%mV<=(S1B-C;LF4%%h78(S1B-C;LF4%%h78 .D(  		s   C# #	C/.C/c                     | j                  |      }t        |      r|d   || j                  d|      <   |dd  D ]  }||| j                  d|      <    y )Nr   organisationr   zorganisational unit)r   r   r   )rX   r   r   r   r;   s        r   
_field_ORGzVCard._field_ORGy  sc    $$U+u:AFqF4%%nf=>qr 	JAHIF4%%&;VDE	Jr   c                 h   | j                  |      }g }|dd  D ]E  }|j                  d      r|t        d      d  j                  d      }n|g}|j	                  |       G d }|D ]  }|dk(  rd}|dk(  rd}|dk(  s y  d	|v }	|| j                  |d
||	       y ||d}
| j                  |d
|
|	       y )Nr   TYPE=r@   r   homer   businessX400PREFemail)r   typer   rx   r   r   extendr   rX   r   r   r   typesr;   ffr   r   	preferredaddrs              r   _field_EMAILzVCard._field_EMAIL  s    U#qr 	A||G$s7|}%++C0SLL	  	AF{F{F{	 eO	<NN67E9="D1DNN67D)<r   c                 \   | j                  |      }g }|dd  D ]E  }|j                  d      r|t        d      d  j                  d      }n|g}|j	                  |       G d }|D ]  }|dk(  rd}|dk(  sd} d|v }	|| j                  |d	||	       y ||d
}
| j                  |d	|
|	       y )Nr   r   r@   r   r   r   r   r   url)r
  r   r  r  s              r   
_field_URLzVCard._field_URL  s     U#qr 	A||G$s7|}%++C03LL	  	 AF{F{	  eO	<NN65%; $/DNN65$	:r   c                     d|d   v r|d   d |d   j                  d       }nd }|t        j                  d       y | j                  |ddt	        |      i|d       y )Nr   r   zspeeddial has no groupphone	speeddialF)rp   rr   rs   _setgroupvaluer   )rX   r   r   r   groups        r   _field_X_SPEEDDIALzVCard._field_X_SPEEDDIAL  sf    %(?!H0eAhmmC01EE= II./;E
1L %u.r   c                    | j                  |      }d|d   v r|d   d |d   j                  d       }nd }g }|dd  D ]E  }|j                  d      r|t        d      d  j	                  d      }n|g}|j                  |       G dddddd}|D 	cg c]  }	|j                  |	|	       }}	|D 	cg c]	  }	|	d	v s|	 }}	g d
}
d|v rd}nd}|
D ]
  }||v sd} n d|v }d}d}d|v rd}d|v rd}t        |      dk(  s|dgk(  rd}t        |      }|r|r| j                  |dd|d||       |r|r| j                  |dd|d||       |s|sd|v r| j                  |dd|d||       n<|rd|v r| j                  |dd|d||       |rd|v r| j                  |dd|d||       d|v r| j                  |dd|d||       d|v r| j                  |dd|d||       d|v r| j                  |dd|d||       y y c c}	w c c}	w )Nr   r   r   r   r@   DATACELL)BBSMODEMISDNCARPCS)
r   r   MSGr   VOICEFAXr  VIDEOPAGERr  )r  r  r  r  TFr   r   r   r  r   )r   numberr   r  faxzbusiness faxzhome faxcellr  pagerdata)	r   rp   rx   r   r   r  r)   r   r  )rX   r   r   r   r  r  r;   r  munger   	antivoicevoicer  isworkishomes                  r   
_field_TELzVCard._field_TEL  s   U#%(?!H0eAhmmC01EE qr 	A||G$s7|}%++C0SLL	  && +00Q1a00 " 6qQ +5 &5 6 6 -	eE E :!E
 eO	 U?FU?Fu:?ex/F &e,e"Z5$I )- e"Vu$E )- f%"Ue$D )-
 %5.##FG(6%H$i1 %5.##FG(2eD$i1 U?"Vu$E )- e"W$F )- U?"Vu$E )- Y 16s   G<0	H:Hc           	      "   || j                  ||||      S | j                  j                  |d      }||||g| j                  |<   y||d   k7  r%t        j	                  d|d|dt
        d          |rd|d<   |d   j                  |       y)	z) Set value of an item of a group
        Nr   zGroup z has different types: z, Tr6   r   )r   r   r)   rr   rs   groups_typeupdate)rX   r   r   r   r  r  
group_types          r   r  zVCard._setgroupvalue=  s     =>>&$yAA\\%%eT2
#'	":DLL z!}$		E4P[\]P^_` $
1qM  'r   c           	         ||vr|||<   y |s||| j                  ||      <   y |g}dgt        t        dd            z   D ]4  }|t        |      z   |v r!|j	                  ||t        |      z             4 n dgt        t        dt        |      dz               z   }t        t        |            D ]  }||   ||t        ||         z   <    y )Nr'   r6   c   r   )r   r   r   rw   ry   r   )	rX   r   r   r   r  valuesr   suffixesr=   s	            r   r   zVCard._setvalueT  s    v F4L7<F4%%dF34 d4a,, 	FCK6)fT#f+%567		 4U1S[]344s8}% 	6A,21IF4HQK(()	6r   c                 j   | j                  |d      }|D cg c]"  }|j                  dd      j                         $ }}|D cg c]  }t        |      s| }}|j	                  dd       }|r&dj                  |dj                  |      g      |d<   y dj                  |      |d<   y c c}w c c}w )Nr@   	seperatorre   r'   
categories)r   r   rt   r   r)   r   rX   r   r   r   r0  r   s         r   _field_CATEGORIESzVCard._field_CATEGORIESl  s    %%es%;6<=!))C$**,==#.s1v!..JJ|T*#&88Q0@,A#BF<  $'88F#3F<  >.s   'B+B0B0c                    | j                  |d      }|D cg c]"  }|j                  dd      j                         $ }}|D cg c]  }t        |      s| }}dj	                  |      || j                  d|      <   y c c}w c c}w )Nr@   r3  re   r'   	ringtones)r   r   rt   r   r   r   r6  s         r   _field_SOUNDzVCard._field_SOUNDz  s    %%es%;6<=!))C$**,==#.s1v!..:=((6:Jt!!+v67 >.s   'BBBc                    d}d}|dd  D ]J  }|j                  d      r|t        d      d  j                  d      }n|g}|D ]  }|dk(  rd}|dk(  sd	} L | j                  |      }d x}	x}
x}x}x}x}}	 |d
   }	|d   }
|d   }|d   }|d   }|d   }|d   }i }|	t        |	      r|	|d<   |
t        |
      r|
|d<   |t        |      r||d<   |t        |      r||d<   |t        |      r||d<   |t        |      r||d<   |t        |      r||d<   t        |      r||d<   | j                  |d||       y y # t        $ r Y w xY w)NFr   r   r   r@   r   r   r   Tr   r6   r   r      r   poboxstreet2streetcitystate
postalcodecountryr   address)rx   r   r   r   r   r   )rX   r   r   r   r  r   r;   r  r0   r=  extendedaddressstreetaddresslocalityregionrB  rC  r  s                    r   
_field_ADRzVCard._field_ADR  s   	qr 	%A||G$s7|}%++C0 S %;!D; $I	%	% $$U+]aaaa-a(aVajSZ		!HE#AhO!!HMQxH1XFqJAhG U!DM&3+?-DO$]);*DNCM#DL#f+"DM!c*o!+D3w<%DOt9DLNN69dI> 5  		s   7#E   	EEc                 >   |d   j                  d      }|d   }t        |      dkD  r|d   }nd}|j                  d      s|j                  d      r| j                  dg||       y |dk(  s|dk(  r| j	                  dg||       y t
        j                  d	|z         y )
Nr   r   r   r'   zX-PALM-CATEGORY
CATEGORIESzX-PALM-NICKNAMENICKNAMEzIgnoring PALM custom field: %s)r   r   rx   r7  r   rr   rs   rX   r   r   r   r  f0f1s          r   _field_X_PALMzVCard._field_X_PALM  s    1X^^C Ur7Q;ABB==*+r}}=N/O""L>5&A$$.?(?  *uf= II6>?r   c                    |d   j                  d      }|d   }t        |      dkD  r|d   }nd}|j                  d      s|j                  d      r| j                  |||       y |j                  d      s|j                  d      rt        j                  d|z         y t        j                  d|d	|d d
 d       y )Nr   r   r   r'   zX-PALM-zX-zIgnoring custom field: %szNo idea what to do with z (P   ))r   r   rx   rP  rr   rs   rM  s          r   r   zVCard._default_field  s    1X^^C Ur7Q;ABB==#r}}Y'?ueV4]]4 BMM$$7II1E9:		ueCRjIJr   c                     |j                  dd      j                  dd      j                  dd      j                  dd      j                  dd      j                  d	d      S )
N\;re   \,r@   z\nr   z\r\nr   r   r   )rX   r   s     r   r   zVCard.unquote  sQ    }}UC(s#t$(%d#	$r   c                    |j                  d|z         dk  r.|j                  |      D cg c]  }| j                  |       c}S g }d}d}|t        |      k  rV||   |k(  r|j	                  |       d}|dz  }/||   dk(  r||||dz    z  }|dz  }H|||   z  }|dz  }|t        |      k  rVt        |      r|j	                  |       |D cg c]  }| j                  |       c}S c c}w c c}w )N\r   r'   r   r6   )rp   r   r   r   ry   )rX   r   r4  r   resbuilds         r   r   zVCard.splitandunquote  s    ::d9n%a'-2[[-CDDLLODD #e*nQx9$

5!Q Qx4q1%QU1XEFA #e*n  u:JJu),-AQ--3 E2 .s   C+C0c                     | j                   S )zBest guess as to vcard version)r   r[   s    r   versionzVCard.version  s    }}r   c                     | j                   S )z-Best guess as to what program wrote the vcard)r   r[   s    r   r   zVCard.origin  s    ||r   c                      | j                   |   S r   r   )rX   items     r   __getitem__zVCard.__getitem__  s    zz$r   c                 ,    t        | j                        S r   )r   r   r[   s    r   __repr__zVCard.__repr__!  s    DJJr   N)r'   )Fre   )0rM   rN   rO   r   rY   r   r)   r   r   r   r   _field_LABEL_field_BDAY_field_ROLE_field_CALURI_field_CALADRURI_field_FBURL
_field_REV
_field_KEY_field_SOURCE_field_PHOTOr   r   r   r   r   r   _field_NAMEr   _field_Or  r  r  r)  r  r   r7  r:  _field_CATEGORYrI  rP  r   r   r   r]  r   ra  rc  rP   r   r   r   r     s    /(d,
$'' !LKK!M$ LJJ!M L
IJM
J,M8 KJ H=D;>.f-R(.604K (O8?v@(K*$.B

  r   r   c                 l    t        j                  |       j                  dd      j                  dd      S )zTMy own routine to do qouted printable since the builtin one doesn't encode CR or NL!r   z=0Dr   z=0A)rz   encodestringr   r   s    r   myqpencodestringru  &  s-    u%--dE:BB4OOr   c                 f    | j                  dd      j                  dd      j                  dd      S )zJReturn a vCard v2 string.  Any embedded commas or semi-colons are removed.rY  r'   r@   re   rW  rt  s    r   format_stringv2rw  +  s-    ==r"**33;;CDDr   c                 f    | j                  dd      j                  dd      j                  dd      S )zOReturn a vCard v3 string.  Embedded commas and semi-colons are backslash quotedrY  r'   r@   rV  re   rU  rW  rt  s    r   format_stringv3ry  0  s-    ==r"**36>>sEJJr   c                 H    t        j                  |       j                         S )zReturn base 64 encoded string)r|   rs  rstriprt  s    r   format_binaryr|  8  s     u%,,..r   c                 B    t        | t        d      t        g       f      S )zDetermine if v is a sequence such as passed to value in out_line.
    Note that a sequence of chars is not a sequence for our purposes.rP   )rv   r   )r   s    r   _is_sequencer~  >  s     a$*d2h/00r   c           	      6   |g }nt        |dd       }|t        v rt        |      r`d}|D ]  } ||      }t        |      |k7  sd} n |r)|j	                  d       |D cg c]  }t        |       }}|j                  |      }nL ||      }t        |      |k7  }|r4t        |      }|j	                  d       nt        |      rJ | ||      }dj                  | g|z         dz   }|t        |ddt        |      z
        z  }|d   d	k7  sJ |d	z   S c c}w )
a  Returns a single field correctly formatted and encoded (including trailing newline)

    @param name:  The field name
    @param attributes: A list of string attributes (eg "TYPE=intl,post" ).  Usually
                  empty except for TEL and ADR.  You can also pass in None.
    @param value: The field value.  You can also pass in a list of components which will be
                  joined with join_char such as the 6 components of N
    @param formatter:  The function that formats the value/components.  See the
                  various format_ functions.  They will automatically ensure that
                  ENCODING=foo attributes are added if appropriateNFTrj   re   rd   F   r7   r   )r   _string_formattersr~  ru  ry   r   _line_reformatr   )r   
attributesr   	formatter	join_charqpr;   rZ  s           r   out_liner  D  sA    
*Q-(
&&B aL#A&!+B	 !!"=>6;<)!,<<NN5)Ee$E!%(E1B(/!!"=>&&& e$E
((D6*$
%c
)C>%RC[11Cr7d??t8O' =s   !Dc                     |dk(  r|}t        |       |k  r| S d}|dkD  r|| d| z  }| |d } t        |       r-|d| d| z   z  }t        |       |k  r	 |S | |d } t        |       r-|S )a  Takes line string and inserts newlines
    and spaces on following continuation lines
    so it all fits in width characters

    @param width: how many characters to fit it in
    @param firstlinewidth: if >0 then first line is this width.
         if equal to zero then first line is same width as rest.
         if <0 then first line will go immediately to continuation.
         r   r'   Nz
 )r   )r   widthfirstlinewidthrZ  s       r   r  r  v  s     
4y>!
CtO^$$NO$
d)uT&5\!!t9U? J EF| d) Jr   c                     d}| d | D ]p  }|t        dd t        |      |      z  }t        |      \  }}}|t        dd |||ddf|      z  }|j                  dd      }t	        |      s`|t        dd ||      z  }r |S )Nr'   FNNr&   rL  )r  r+   r/   r)   r   )	valsr  limitrZ  r   r;   r<   r=   nns	            r   	out_namesr    s    
C&5\ 
=xd$?$BINN#A&!AxTAa"R=)<<UU:r"r78Jb)<<C
= Jr   c                     | D cg c]  }|j                  d       }}t        |      rt        |d ||d      S yc c}w )Ncategoryr@   )r  r'   r)   r   r  )r  r  r   r   catss        r   out_categoriesr    s@    '+,!AEE*,D,
4ytT9DD	 -s   ;c                     t        | |d      S )NCATEGORY)r   )r  r  r  s     r   out_categories_appler    s    $	<<r   c                 "   d}d}| D ]  }|j                  |      }|j                  dd      }t        |      r|dk(  rd}|j                         }|r
|dz   }n|rd}t        |      rd|z   dd	g|d
k(     z   g}nd }|t        ||||      z  }d} |S )Nr'   Tr   r   work,PREFr   r   z	,INTERNETEMAILF)r)   r   ru   r  )	r  r  r   bpkeyrZ  rF   r   valr   s	            r   out_eur    s    
CE eeEluuVR t9z!::<DG|Dt9DL"[!1%72B!CCDDDxtS)44-0 Jr   c                     t        | |dd      S )Nr  r   r  r  s     r   
out_emailsr    s    $	7G44r   c                     t        | |dd      S )NURLr
  r  r  s     r   out_urlsr    s    $	5%00r   r   r   r  r  r  r  r  )r   officer!  r   r"  r#  nonec           
         dgt        t        dt        |       dz               z   D cg c]  }dt        |      z    }}d}d}d}| D ]  }|j	                  dd       }|1|t        dd	t        |d
      d|   gt        |d         |      z  }n[|t        ||   dz   d	t        |d
      d|   gt        |d         |      z  }|t        ||   dz   d t        |      |      z  }|dz  }d} |S c c}w )Nr'   r6   r   r  Tr   r  r   r   r   r'   r  r  z.TELz.X-SPEEDDIALF)r   r   r   rw   r)   r  _out_tel_mappingr$   )	r  r  r0   phonesrZ  rF   idxr   sps	            r   out_telr    s/   ')d4aD	!0D+E&EFgc!fnFFF
CE
C UU;%:8E*:1V9*E}UZG[\],Qx[99F FC 8F3K.*:1V9*E}UZG[\],Qx[99F FC 8F3K6c"gyQQC1HC  J+ Gs   C0c                 .   d}d}| D ]  }|j                  dd      }t        |      r|t        dd ||      z  }|j                  d      dk(  rd}nd}d	|z   d
|   z   }|t        d|gdD cg c]  }|j                  |d       c}|      z  }d} |S c c}w )Nr'   TcompanyORGr   r   r   r   r   r  ADRNr>  r?  r@  rA  rB  rC  Fr  )r  r  rZ  rF   r   or   r   s           r   out_adrr    s    
CE EE)R q68E4I66C55=F"DDt|M%00xv  ?D  (Ea  (E  GP  Q  	Q J (Es   )Bc                 n    dj                  | d | D cg c]  }t        dd |d   |       c}      S c c}w )Nr'   NOTEmemo)r   r  )r  r  r  r   s       r   out_noter    s5    77$vPU,WQHVT1V9i@WXXWs   2c                     d}t        |       dkD  }|rd}nd}| D ]2  }|t        d|d|t        |d      gt        |d         |      z  }d}4 |S )	Nr'   r   zPREF,r   r   r   r  F)r   r  r  r$   )r  r  rZ  _prefr   r   s         r   out_tel_scp6600r    sx    
CIME xq&')9!F))DEF(85yB 	B  Jr   c                     d}t        t        t        |       d            D ]/  }| |   }|j                  dd       s|t	        ddg|d   |      z  }1 |S )Nr'   r6   r   r  zTYPE=INTERNET)r   minr   r)   r  )r  r  rZ  _idxr   s        r   out_email_scp6600r  ,  se    
Cc#d)Q'( 1J55$8Go%6G*i1 1C	1 Jr   c                 Z    | r)| d   j                  dd       rt        dd | d   d   |      S y)Nr   r
  r  r'   r)   r  r  s     r   out_url_scp660r  8  s2    QE4(tT!WU^Y??r   c                     | D ]M  }|j                  dd       dk(  rd}nd}t        dd|z  gdD cg c]  }|j                  |d       c}|      c S  yc c}w )	Nr   r   r   r   r  zTYPE=%sr  r'   r  )r  r  r   _typer   s        r   out_adr_scp6600r  >  sm     #55&(EE	E 12/tu!q"u!# 	##  vs   A)names
wallpapers	addressesnumbersr5  emailsurlsr9  flagsmemosserialsc                    |'t        |D cg c]  }|t        vs| c}      dk(  sJ |d   } j                         } |j                  t	        dd dd               |j                  t	        dd |d   d              |t        }nt        D cg c]	  }||v s| }}|D ]|  }|| v s||v s||   }d|j
                  j                  d |j
                  j                   v r || |   ||d   	      }n || |   |      }t        |      sk |j                  |       ~  |j                  t	        d
d d|              |j                         S c c}w c c}w )Nr   
_formatterrl   r   r   r   r  _limit)r  rm   )	r   _field_orderStringIOwriter  __code__co_varnamesco_argcountgetvalue)	entryprofilelimit_fieldsr;   fmtiofieldsr   r   s	            r   output_entryr  Q  s[    "-|E!q/DAEF!KKK
,
C	BBHHXgtWd34BHHXiwz':DAB)?Q,->!?? 	 :!w,1:D$--334NT]]5N5NOOU1XsGH4EFU1Xs+5z	  BHHXeT7C012;;=1 F @s   EE	EEz2.1)
r  r  r   r  r5  r  r  r  r  r  r  z3.0r   r5  r   r  )r  r  r  r  z
vCard v2.1)descriptionr  z
vCard v3.0ApplezFull vCard v3.0zSanyo SCP-6600 (Katana))vcard2vcard3r   fullv3scp6600rd  )r  r   )r   )rK  r   )Kgrz   r|   r~   r  r   _bomsencodings.utf_64	encodingsry   BOM64_BEBOM64_LEencodings.utf_32	BOM_UTF32BOM_UTF32_BEBOM_UTF32_LEencodings.utf_16	BOM_UTF16BOM_UTF16_BEBOM_UTF16_LEencodings.utf_8BOM_UTF8maxr   
_maxbomlenr   compiler   r"   r#   r   r$   r+   r(   r9   r>   rD   r/   r}   rL   rR   r   r   ru  rw  ry  r  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  profile_vcard2copyprofile_vcard3profile_appleprofile_fullprofile_scp6600r,  profiles)bomcodecs   00r   <module>r     s  F     	 	 	  	
\\FOOX.0
\\FOOX.0
\\F$$h/1
\\F''24
\\F''24
\\F$$h/1
\\F''57
\\F''57
\\FOOW-/ @ B @ B E2ys5#c(23
" RZZ	"
RZZ&
rzz,'$A6 )	3>$,).	Y 	
a aJ) )ZT	  T	 pP
E
K
 &7 /1/d>"=
<51 	
	 6,Y
&		L@ 
	
	  $$&.| "z ##%2l ""$X ##%L!   
 )^E(^E#]E-,G5'*w*     3s7   >K" $AK*  AK2 !K: &L
"K'*K/2K7:K?