a
    c_sj                     @   s  d Z g dZddlZddlZddlZddlZddlmZ ddlZddl	Z	ddl
Z
ddlZddlmZ ejddedZe ej G d	d
 d
ZdZe
dZd>ddZdd Ze
de
jZdd Zdd Zdd ZG dd dZG dd dZ G dd de Z!dd  Z"G d!d" d"e#Z$d#d$d%d&d'Z%e& Z'G d(d) d)Z(d*d+ Z)e*e+e,eje-fZ.G d,d- d-e&Z/d.d/ Z0e1e2e"ee!d0e3e2e0e(e/d0iZ4de2d1d2d3Z5de2d1d4d5Z6e1d6d7d8d9d:Z7e1d7d6d;d<d=Z8dS )?a  plistlib.py -- a tool to generate and parse MacOSX .plist files.

The property list (.plist) file format is a simple XML pickle supporting
basic object types, like dictionaries, lists, numbers and strings.
Usually the top level object is a dictionary.

To write out a plist file, use the dump(value, file)
function. 'value' is the top level object, 'file' is
a (writable) file object.

To parse a plist from a file, use the load(file) function,
with a (readable) file object as the only argument. It
returns the top level object (again, usually a dictionary).

To work with plist data in bytes objects, you can use loads()
and dumps().

Values can be strings, integers, floats, booleans, tuples, lists,
dictionaries (but only with string keys), Data, bytes, bytearray, or
datetime.datetime objects.

Generate Plist example:

    pl = dict(
        aString = "Doodah",
        aList = ["A", "B", 12, 32.1, [1, 2, 3]],
        aFloat = 0.1,
        anInt = 728,
        aDict = dict(
            anotherString = "<hello & hi there!>",
            aUnicodeValue = "M\xe4ssig, Ma\xdf",
            aTrueValue = True,
            aFalseValue = False,
        ),
        someData = b"<binary gunk>",
        someMoreData = b"<lots of binary gunk>" * 10,
        aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())),
    )
    with open(fileName, 'wb') as fp:
        dump(pl, fp)

Parse Plist example:

    with open(fileName, 'rb') as fp:
        pl = load(fp)
    print(pl["aKey"])
)InvalidFileExceptionFMT_XML
FMT_BINARYloaddumploadsdumpsUID    N)BytesIO)ParserCreatePlistFormatzFMT_XML FMT_BINARY)modulec                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s<   t |tstd|dkr"td|dk r2td|| _d S )Nzdata must be an int            zUIDs cannot be >= 2**64r	   UIDs must be positive)
isinstanceint	TypeError
ValueErrordataselfr    r   lib/python3.9/plistlib.py__init__E   s    
zUID.__init__c                 C   s   | j S N)r   r   r   r   r   	__index__N   s    zUID.__index__c                 C   s   d| j jt| jf S )Nz%s(%s))	__class____name__reprr   r   r   r   r   __repr__Q   s    zUID.__repr__c                 C   s   | j | jffS r   )r   r   r   r   r   r   
__reduce__T   s    zUID.__reduce__c                 C   s   t |tstS | j|jkS r   )r   r   NotImplementedr   )r   otherr   r   r   __eq__W   s    
z
UID.__eq__c                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__\   s    zUID.__hash__N)	r   
__module____qualname__r   r   r    r!   r$   r&   r   r   r   r   r   D   s   	r   s   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]L   c                 C   sP   |d d }g }t dt| |D ]$}| |||  }|t| q d|S )N      r	       )rangelenappendbinasciiZ
b2a_base64join)smaxlinelengthZ
maxbinsizepiecesichunkr   r   r   _encode_base64p   s    r7   c                 C   s(   t | trt| dS t| S d S )Nutf-8)r   strr0   Z
a2b_base64encode)r2   r   r   r   _decode_base64y   s    
r;   z{(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Zc                 C   sL   d}t |  }g }|D ]&}|| }|d u r2 qB|t| qtj| S )NZyearZmonthZdayZhourZminutesecond)_dateParsermatch	groupdictr/   r   datetime)r2   ordergdZlstkeyvalr   r   r   _date_from_string   s    rF   c                 C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZr<   )dr   r   r   _date_to_string   s    rH   c                 C   sZ   t | }|d urtd| dd} | dd} | dd} | dd} | d	d
} | S )Nz<strings can't contains control characters; use bytes insteadz

&z&amp;<z&lt;>z&gt;)_controlCharPatsearchr   replace)textmr   r   r   _escape   s    
rS   c                   @   s   e 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 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S )(_PlistParserc                 C   s   g | _ d | _d | _|| _d S r   )stackcurrent_keyroot
_dict_typer   	dict_typer   r   r   r      s    z_PlistParser.__init__c                 C   s8   t  | _| j| j_| j| j_| j| j_| j| | j	S r   )
r   parserhandle_begin_elementZStartElementHandlerhandle_end_elementZEndElementHandlerhandle_dataZCharacterDataHandlerZ	ParseFilerW   )r   Zfileobjr   r   r   parse   s    


z_PlistParser.parsec                 C   s*   g | _ t| d| d }|d ur&|| d S )NZbegin_)r   getattr)r   elementattrshandlerr   r   r   r\      s    z!_PlistParser.handle_begin_elementc                 C   s"   t | d| d }|d ur|  d S )NZend_)r`   )r   ra   rc   r   r   r   r]      s    z_PlistParser.handle_end_elementc                 C   s   | j | d S r   )r   r/   r   r   r   r   r^      s    z_PlistParser.handle_datac                 C   s   | j d urFt| jd ti s.td| jj || jd | j < d | _ nB| jsT|| _n4t| jd tg sxtd| jj | jd | d S )Nzunexpected element at line %d)	rV   r   rU   typer   r[   CurrentLineNumberrW   r/   r   valuer   r   r   
add_object   s    
z_PlistParser.add_objectc                 C   s   d | j}g | _|S )N )r1   r   r   r   r   r   get_data   s    z_PlistParser.get_datac                 C   s"   |   }| | | j| d S r   )rX   ri   rU   r/   )r   rb   rG   r   r   r   
begin_dict   s    
z_PlistParser.begin_dictc                 C   s*   | j rtd| j | jjf | j  d S )Nz%missing value for key '%s' at line %d)rV   r   r[   rf   rU   popr   r   r   r   end_dict   s
    z_PlistParser.end_dictc                 C   s8   | j st| jd ti s*td| jj |  | _ d S )Nrd   zunexpected key at line %d)rV   r   rU   re   r   r[   rf   rk   r   r   r   r   end_key   s
    z_PlistParser.end_keyc                 C   s   g }|  | | j| d S r   )ri   rU   r/   )r   rb   ar   r   r   begin_array   s    
z_PlistParser.begin_arrayc                 C   s   | j   d S r   )rU   rm   r   r   r   r   	end_array   s    z_PlistParser.end_arrayc                 C   s   |  d d S )NTri   r   r   r   r   end_true   s    z_PlistParser.end_truec                 C   s   |  d d S )NFrs   r   r   r   r   	end_false   s    z_PlistParser.end_falsec                 C   s   |  t|   d S r   )ri   r   rk   r   r   r   r   end_integer   s    z_PlistParser.end_integerc                 C   s   |  t|   d S r   )ri   floatrk   r   r   r   r   end_real   s    z_PlistParser.end_realc                 C   s   |  |   d S r   )ri   rk   r   r   r   r   
end_string   s    z_PlistParser.end_stringc                 C   s   |  t|   d S r   )ri   r;   rk   r   r   r   r   end_data   s    z_PlistParser.end_datac                 C   s   |  t|   d S r   )ri   rF   rk   r   r   r   r   end_date  s    z_PlistParser.end_dateN)r   r'   r(   r   r_   r\   r]   r^   ri   rk   rl   rn   ro   rq   rr   rt   ru   rv   rx   ry   rz   r{   r   r   r   r   rT      s&   rT   c                   @   s8   e Zd ZdddZdd Zdd Zdd
dZdd Zd	S )_DumbXMLWriterr	   	c                 C   s   || _ g | _|| _|| _d S r   )filerU   _indent_levelindent)r   r~   indent_levelr   r   r   r   r     s    z_DumbXMLWriter.__init__c                 C   s,   | j | | d|  |  jd7  _d S )Nz<%s>   )rU   r/   writelnr   r   ra   r   r   r   begin_element  s    z_DumbXMLWriter.begin_elementc                 C   s@   | j dksJ | j |ks J |  j d8  _ | d|  d S )Nr	   r   z</%s>)r   rU   rm   r   r   r   r   r   end_element  s    z_DumbXMLWriter.end_elementNc                 C   s8   |d ur&t |}| d|||f  n| d|  d S )Nz<%s>%s</%s>z<%s/>)rS   r   )r   ra   rh   r   r   r   simple_element  s    z_DumbXMLWriter.simple_elementc                 C   sH   |r8t |tr|d}| j| j| j  | j| | jd d S )Nr8      
)r   r9   r:   r~   writer   r   )r   liner   r   r   r   !  s    

z_DumbXMLWriter.writeln)r	   r}   )N)r   r'   r(   r   r   r   r   r   r   r   r   r   r|     s
   

r|   c                   @   s>   e Zd ZdddZdd	 Zd
d Zdd Zdd Zdd ZdS )_PlistWriterr	      	r   TFc                 C   s.   |r| t t| ||| || _|| _d S r   )r   PLISTHEADERr|   r   
_sort_keys	_skipkeys)r   r~   r   r   ZwriteHeader	sort_keysskipkeysr   r   r   r   .  s
    
z_PlistWriter.__init__c                 C   s"   |  d | | |  d d S )Nz<plist version="1.0">z</plist>)r   write_valuerg   r   r   r   r   8  s    

z_PlistWriter.writec                 C   s  t |tr| d| n|du r,| d n|du r@| d nt |tr~d|  kr^dk rtn n| dd	|  nt|nt |tr| d
t| nzt |tr| | ndt |t	t
fr| | nJt |tjr| dt| n,t |ttfr| | ntdt| d S )NstringTtrueFZfalsel         r   Zintegerz%drealdatezunsupported type: %s)r   r9   r   r   OverflowErrorrw   r   dict
write_dictbytes	bytearraywrite_bytesrA   rH   tuplelistwrite_arrayr   re   rg   r   r   r   r   =  s*    




z_PlistWriter.write_valuec                 C   sz   |  d |  jd8  _tddt| jdd| j  }t||dD ]}|rJ| | qJ|  jd7  _| 	d d S )Nr   r      r)   r   s           r   )
r   r   maxr.   r   rP   r7   splitr   r   )r   r   r3   r   r   r   r   r   _  s    
z_PlistWriter.write_bytesc                 C   s   |rt|  d | jr"t| }n| }|D ]8\}}t|tsP| jrHq.td| d| | 	| q.| 
d n
| d d S )Nr   keys must be stringsrD   )r   r   sorteditemsr   r9   r   r   r   r   r   )r   rG   r   rD   rh   r   r   r   r   l  s    

z_PlistWriter.write_dictc                 C   s<   |r.|  d |D ]}| | q| d n
| d d S )Narray)r   r   r   r   )r   r   rh   r   r   r   r     s    
z_PlistWriter.write_arrayN)r	   r   r   TF)	r   r'   r(   r   r   r   r   r   r   r   r   r   r   r   -  s     

"r   c                 C   s   d}|D ]}|  |r dS qtjdftjdftjdffD ]N\}}|  |sNq:|D ]4}||d| }| d t| |krR  dS qRq:dS )N)s   <?xmls   <plistTr8   z	utf-16-bez	utf-16-leasciiF)
startswithcodecsBOM_UTF8BOM_UTF16_BEBOM_UTF16_LEdecoder:   r.   )headerprefixesZpfxZbomencodingstartprefixr   r   r   _is_fmt_xml  s    

r   c                   @   s   e Zd ZdddZdS )r   Invalid filec                 C   s   t | | d S r   )r   r   )r   messager   r   r   r     s    zInvalidFileException.__init__N)r   )r   r'   r(   r   r   r   r   r   r     s   r   BHLQ)r      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S )_BinaryPlistParsera  
    Read or write a binary plist file, following the description of the binary
    format.  Raise InvalidFileException in case of error, otherwise return the
    root object.

    see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c
    c                 C   s
   || _ d S r   )rX   rY   r   r   r   r     s    z_BinaryPlistParser.__init__c                 C   s   z~|| _ | j dtj | j d}t|dkr6t td|\}| _	}}}| j | | 
||| _tg| | _| |W S  tttjttfy   t Y n0 d S )Ni    z>6xBBQQQ)_fpseekosSEEK_ENDreadr.   r   structunpack	_ref_size
_read_ints_object_offsets
_undefined_objects_read_objectOSError
IndexErrorerrorr   UnicodeDecodeError)r   fptraileroffset_sizenum_objects
top_objectoffset_table_offsetr   r   r   r_     s$    


z_BinaryPlistParser.parsec                 C   sL   |dkrH| j dd d@ }d|> }dt|  }t|| j |d S |S )z$ return the size of the next object.   r   r	   r+   rM   )r   r   _BINARY_FORMATr   r   )r   tokenLrR   r2   fr   r   r   	_get_size  s    z_BinaryPlistParser._get_sizec                    sr   | j |  tv r0tdt |   S rDt | krJt t fddtd| D S d S )NrM   c                 3   s&   | ]}t  ||  d V  qdS )bigN)r   
from_bytes).0r5   r   sizer   r   	<genexpr>  s   z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r	   )	r   r   r   r   r   r.   r   r   r-   )r   nr   r   r   r   r     s    z_BinaryPlistParser._read_intsc                 C   s   |  || jS r   )r   r   )r   r   r   r   r   
_read_refs  s    z_BinaryPlistParser._read_refsc                    s   j | }|tur|S  j| } j|  jdd }|d@ |d@  }}|dkr^d}n:|dkrnd}n*|dkr~d	}n|dkrd
}n
|dkrtj jd|> d|dkd}n|dkrt	d jdd }n|dkrt	d jdd }n|dkrDt	d jdd }t

dddt
j|d }nT|dkrh |} j|}n0|dkr |} j|d}n|dkr |} j|d d}n|dkrtt jd| d}n|dkr, |} |}	g }| j |< | fdd |	D  nl|d!kr |} |}
 |}	  }| j |< t|
|	D ]\}} || |< qpnt | j |< |S )"zx
        read the object by reference.

        May recursively read sub-objects (content of an array/dict/set)
        r   r	      r   Nr   F	   Tr,   r   r   r+   Zsigned"   z>fr*   #   z>d3     )Zseconds@   P   r   `   r   utf-16be      c                 3   s   | ]}  |V  qd S r   )r   )r   xr   r   r   r   3  r,   z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r   r   r   r   r   r   r   rA   Z	timedeltar   r   r   r   extendrX   zipr   r   )r   refresultoffsettokenZtokenHr   r   r2   Zobj_refsZkey_refskor   r   r   r     sp    






















z_BinaryPlistParser._read_objectN)
r   r'   r(   __doc__r   r_   r   r   r   r   r   r   r   r   r     s   

r   c                 C   s0   | dk rdS | dk rdS | d> d> r(dS dS d S )N   r      r   r   r*   r   r   )countr   r   r   _count_to_sizeJ  s    r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )_BinaryPlistWriterc                 C   s   || _ || _|| _d S r   )r   r   r   )r   r   r   r   r   r   r   r   Z  s    z_BinaryPlistWriter.__init__c           
      C   s   g | _ i | _i | _| | t| j }dg| | _t|| _t| j | _	| j
d | j D ]}| | qZ| |}| j
 }t|}dt| |  }| j
tj|g| jR   d}||| j|||f}	| j
tjdg|	R   d S )Nr	      bplist00rM   z	>5xBBBQQQ)_objlist	_objtable_objidtable_flattenr.   r   r   r   r   _ref_formatr   r   _write_object
_getrefnumtellr   pack)
r   rh   r   objr   r   r   Zoffset_formatZsort_versionr   r   r   r   r   _  s*    






z_BinaryPlistWriter.writec           	      C   s"  t |tr"t||f| jv r4d S nt|| jv r4d S t| j}| j| t |trh|| jt||f< n|| jt|< t |t	rg }g }|
 }| jrt|}|D ]6\}}t |ts| jrqtd|| || qt||D ]}| | qn&t |ttfr|D ]}| | qd S )Nr   )r   _scalarsre   r  idr  r.   r   r/   r   r   r   r   r9   r   r   	itertoolschainr  r   r   )	r   rh   Zrefnumkeysvaluesr   r   vr   r   r   r   r    s8    





z_BinaryPlistWriter._flattenc                 C   s.   t |tr| jt||f S | jt| S d S r   )r   r
  r  re   r  r  rg   r   r   r   r    s    
z_BinaryPlistWriter._getrefnumc                 C   s   |dk r"| j td||B  n|dk rH| j td|dB d| nh|dk rn| j td|dB d| nB|d	k r| j td
|dB d| n| j td|dB d| d S )Nr   z>Br   z>BBBr   r   z>BBH           z>BBL   z>BBQ   )r   r   r   r  )r   r   r   r   r   r   _write_size  s    z_BinaryPlistWriter._write_sizec                    st    |} j  j|< |d u r2 jd n>|du rJ jd n&|du rb jd nt|trj|dk rz jtdd| W n tj	y   t
|d Y n0 n|d	k r҈ jtd
d| n|dk r jtdd| nt|dk r jtdd| nR|dk r6 jtdd| n0|dk r^ jd|jdddd  nt
|nt|tr jtdd| nt|tjr|tddd  } jtdd| nt|ttfr dt|  j| nrt|trlz|d} dt| W n2 tyZ   |d } d!t|d"  Y n0  j| nt|tr*|jdk rtd#n|jd	k r jtd
d$| nt|jdk rֈ jtdd%| nP|jdk r jtdd&| n,|jdk r jtdd'| nt
|nFt|ttfr fd(d)|D }t|} d*|  jtjd+ j|  g|R   nt|trhg g  }} jrt| }	n| }	|	D ]J\}
}t|
ts j rސqt!d,|"  |
 |"  | qt|} d-|  jtjd+ j|  g|R    jtjd+ j|  g|R   nt!|d S ).N    F   Tr   r	   z>Bqr  r   z>BBr   r   z>BHr  r  z>BLr  l            z>BQr      r   r   z>Bdr   r   r   r   r   r   r   r   r   r   r   r            c                    s   g | ]}  |qS r   )r  )r   r   r   r   r   
<listcomp>  r,   z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r   rM   r   r   )#r  r   r  r   r   r   r   r   r  r   r   to_bytesrw   rA   Ztotal_secondsr   r   r  r.   r9   r:   UnicodeEncodeErrorr   r   r   r   r   r  r   r   r   r   r   r   r/   )r   rh   r   r   tZrefsr2   ZkeyRefsZvalRefsZ	rootItemsr   r  r   r   r   r    s    






&
$&z _BinaryPlistWriter._write_objectN)	r   r'   r(   r   r   r  r  r  r  r   r   r   r   r   Y  s   -*r   c                 C   s   | d d dkS )Nr   r   r   )r   r   r   r   _is_fmt_binary-  s    r   )detectr[   writerfmtrZ   c                C   sj   |du rJ|  d}| d t D ]}|d |r$|d } qVq$t nt| d }||d}|| S )zRead a .plist file. 'fp' should be a readable and binary file object.
    Return the unpacked root object (which usually is a dictionary).
    Nr   r	   r!  r[   )rZ   )r   r   _FORMATSr  r   r_   )r   r$  rZ   r   infoPpr   r   r   r   C  s    


r   c                C   s   t | }t|||dS )zqRead a .plist file from a bytes object.
    Return the unpacked root object (which usually is a dictionary).
    r#  )r
   r   )rh   r$  rZ   r   r   r   r   r   Y  s    r   TF)r$  r   r   c                C   s:   |t vrtd|f t | d |||d}||  dS )zWWrite 'value' to a .plist file. 'fp' should be a writable,
    binary file object.
    zUnsupported format: %rr"  )r   r   N)r%  r   r   )rh   r   r$  r   r   r"  r   r   r   r   a  s    r   r$  r   r   c                C   s    t  }t| ||||d | S )z?Return a bytes object with the contents for a .plist file.
    r)  )r
   r   getvalue)rh   r$  r   r   r   r   r   r   r   l  s    r   )r)   )9r   __all__r0   r   rA   enumior
   r  r   rer   Zxml.parsers.expatr   Enumr   r   globalsupdate__members__r   r   compilerN   r7   r;   ASCIIr>   rF   rH   rS   rT   r|   r   r   r   r   r   objectr   r   r   r9   r   rw   r   r
  r   r   r   r   r   r%  r   r   r   r   r   r   r   r   <module>   sj   /!
	
c&^!  U	