U e5d�}� @s>dZddddddddd d d d d g ZddlZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl mZddlmZejdded�Ze��ej�ejdd��Zdd�Zdd�Zdd�Zdd�ZGdd�d�ZGdd �d �ZdZe � d�Z!dLd!d"�Z"d#d$�Z#e � d%e j$�Z%d&d'�Z&d(d)�Z'd*d+�Z(Gd,d-�d-�Z)Gd.d/�d/�Z*Gd0d1�d1e*�Z+d2d3�Z,Gd4d�de-�Z.d5d6d7d8d9�Z/e0�Z1Gd:d;�d;�Z2dd?�d?e0�Z9d@dA�Z:e;eddCe", someMoreData = b"" * 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"]) � readPlist� writePlist�readPlistFromBytes�writePlistToBytes�Data�InvalidFileException�FMT_XML� FMT_BINARY�load�dump�loads�dumps�UID�N)�BytesIO)�warn)� ParserCreate� PlistFormatzFMT_XML FMT_BINARY)�modulec cs2t|t�r(t||�� }|VW5QRXn|VdS�N)� isinstance�str�open)� pathOrFile�mode�fp�r� /usr/lib64/python3.8/plistlib.py� _maybe_openOs  rc Cs<tdtd�t|d��}t|ddd�W5QR�SQRXdS)z� Read a .plist from a path or file. pathOrFile should either be a file name, or a readable binary file object. This function is deprecated, use load instead. z8The readPlist function is deprecated, use load() instead��rbNF��fmt�use_builtin_types)r�DeprecationWarningrr )rrrrrrYs � c Cs8tdtd�t|d��}t||tddd�W5QRXdS)z� Write 'value' to a .plist file. 'pathOrFile' may either be a file name or a (writable) file object. This function is deprecated, use dump instead. z9The writePlist function is deprecated, use dump() insteadr�wbTF�r!� sort_keys�skipkeysN)rr#rr r)�valuerrrrrrfs � cCstdtd�tt|�ddd�S)z} Read a plist data from a bytes object. Return the root object. This function is deprecated, use loads instead. zBThe readPlistFromBytes function is deprecated, use loads() insteadrNFr )rr#r r��datarrrrss �cCs,tdtd�t�}t||tddd�|��S)zp Return 'value' as a plist-formatted bytes object. This function is deprecated, use dumps instead. zAThe writePlistToBytes function is deprecated, use dumps() insteadrTFr%)rr#rr r�getvalue)r(�frrrr~s�c@s>eZdZdZdd�Zedd��Zddd�Zd d �Zd d �Z d S)rz] Wrapper for binary data. This class is deprecated, use a bytes object instead. cCst|t�std��||_dS)Nzdata must be as bytes)r�bytes� TypeErrorr*��selfr*rrr�__init__�s z Data.__init__cCs |t|��Sr)�_decode_base64)�clsr*rrr� fromBase64�szData.fromBase64�LcCs t|j|�Sr)�_encode_base64r*)r0� maxlinelengthrrr�asBase64�sz Data.asBase64cCs4t||j�r|j|jkSt|t�r,|j|kStSdSr)r� __class__r*r-�NotImplemented�r0�otherrrr�__eq__�s     z Data.__eq__cCsd|jjt|j�fS�Nz%s(%s)�r9�__name__�reprr*�r0rrr�__repr__�sz Data.__repr__N)r5) r@� __module__� __qualname__�__doc__r1� classmethodr4r8r=rCrrrrr�s  c@s<eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd S)r cCs<t|t�std��|dkr"td��|dkr2td��||_dS)Nzdata must be an int�zUIDs cannot be >= 2**64r�UIDs must be positive)r�intr.� ValueErrorr*r/rrrr1�s z UID.__init__cCs|jSrr)rBrrr� __index__�sz UID.__index__cCsd|jjt|j�fSr>r?rBrrrrC�sz UID.__repr__cCs|j|jffSr)r9r*rBrrr� __reduce__�szUID.__reduce__cCst|t�stS|j|jkSr)rr r:r*r;rrrr=�s z UID.__eq__cCs t|j�Sr)�hashr*rBrrr�__hash__�sz UID.__hash__N) r@rDrEr1rLrCrMr=rOrrrrr �s  s� 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]r5cCsP|dd}g}tdt|�|�D]$}||||�}|�t�|��q d�|�S)N��r�)�range�len�append�binasciiZ b2a_base64�join)�sr7Z maxbinsize�pieces�i�chunkrrrr6�s  r6cCs(t|t�rt�|�d��St�|�SdS)N�utf-8)rrrVZ a2b_base64�encode)rXrrrr2�s r2z{(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?ZcCsLd}t�|���}g}|D]&}||}|dkr2qB|�t|��qtj|�S)N�ZyearZmonthZdayZhourZminute�second)� _dateParser�match� groupdictrUrJ�datetime)rX�orderZgdZlst�key�valrrr�_date_from_string�srgcCs d|j|j|j|j|j|jfS)Nz%04d-%02d-%02dT%02d:%02d:%02dZr^)�drrr�_date_to_strings�ricCsZt�|�}|dk rtd��|�dd�}|�dd�}|�dd�}|�dd�}|�d d �}|S) Nzz>)�_controlCharPat�searchrK�replace)�text�mrrr�_escapes      rtc@s�eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)S)*� _PlistParsercCs"g|_d|_d|_||_||_dSr)�stack� current_key�root�_use_builtin_types� _dict_type�r0r"� dict_typerrrr1s z_PlistParser.__init__cCsBt�|_|j|j_|j|j_|j|j_|j|j_ |j� |�|j Sr) r�parser�handle_begin_elementZStartElementHandler�handle_end_elementZEndElementHandler� handle_dataZCharacterDataHandler�handle_entity_declZEntityDeclHandlerZ ParseFilerx)r0Zfileobjrrr�parses     z_PlistParser.parsecCs td��dS)Nz8XML entity declarations are not supported in plist files)r)r0Z entity_nameZis_parameter_entityr(�baseZ system_idZ public_idZ notation_namerrrr�$sz_PlistParser.handle_entity_declcCs*g|_t|d|d�}|dk r&||�dS)NZbegin_)r*�getattr)r0�element�attrs�handlerrrrr~*sz!_PlistParser.handle_begin_elementcCs"t|d|d�}|dk r|�dS)NZend_)r�)r0r�r�rrrr0sz_PlistParser.handle_end_elementcCs|j�|�dSr)r*rUr/rrrr�5sz_PlistParser.handle_datacCs�|jdk rFt|jdti��s.td|jj��||jd|j<d|_nB|jsT||_n4t|jdtg��sxtd|jj��|jd�|�dS)N�����zunexpected element at line %d) rwrrv�typerKr}�CurrentLineNumberrxrU�r0r(rrr� add_object8s ��z_PlistParser.add_objectcCsd�|j�}g|_|S)N�)rWr*r/rrr�get_dataHs z_PlistParser.get_datacCs"|��}|�|�|j�|�dSr)rzr�rvrU)r0r�rhrrr� begin_dictOs z_PlistParser.begin_dictcCs*|jrtd|j|jjf��|j��dS)Nz%missing value for key '%s' at line %d)rwrKr}r�rv�poprBrrr�end_dictTs  �z_PlistParser.end_dictcCs8|jst|jdti��s*td|jj��|��|_dS)Nr�zunexpected key at line %d)rwrrvr�rKr}r�r�rBrrr�end_keyZs �z_PlistParser.end_keycCsg}|�|�|j�|�dSr)r�rvrU)r0r��arrr� begin_array`s z_PlistParser.begin_arraycCs|j��dSr)rvr�rBrrr� end_arrayesz_PlistParser.end_arraycCs|�d�dS)NT�r�rBrrr�end_truehsz_PlistParser.end_truecCs|�d�dS)NFr�rBrrr� end_falseksz_PlistParser.end_falsecCs@|��}|�d�s|�d�r.|�t|d��n|�t|��dS)NZ0xZ0X�)r�� startswithr�rJ)r0�rawrrr� end_integernsz_PlistParser.end_integercCs|�t|����dSr)r��floatr�rBrrr�end_realusz_PlistParser.end_realcCs|�|���dSr)r�r�rBrrr� end_stringxsz_PlistParser.end_stringcCs2|jr|�t|����n|�t�|����dSr)ryr�r2r�rr4rBrrr�end_data{sz_PlistParser.end_datacCs|�t|����dSr)r�rgr�rBrrr�end_date�sz_PlistParser.end_dateN)r@rDrEr1r�r�r~rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrus( ruc@s8eZdZddd�Zdd�Zdd�Zdd d �Zd d �Zd S)�_DumbXMLWriterr� cCs||_g|_||_||_dSr)�filerv� _indent_level�indent)r0r�� indent_levelr�rrrr1�sz_DumbXMLWriter.__init__cCs,|j�|�|�d|�|jd7_dS)Nz<%s>�)rvrU�writelnr��r0r�rrr� begin_element�s z_DumbXMLWriter.begin_elementcCs |jd8_|�d|�dS)Nr�z)r�r�r�rrr� end_element�sz_DumbXMLWriter.end_elementNcCs8|dk r&t|�}|�d|||f�n|�d|�dS)Nz <%s>%sz<%s/>)rtr�)r0r�r(rrr�simple_element�sz_DumbXMLWriter.simple_elementcCsH|r8t|t�r|�d�}|j�|j|j�|j�|�|j�d�dS)Nr\� )rrr]r��writer�r�)r0�linerrrr��s    z_DumbXMLWriter.writeln)rr�)N)r@rDrEr1r�r�r�r�rrrrr��s   r�c@sFeZdZddd�Zdd �Zd d �Zd d �Zdd�Zdd�Zdd�Z dS)� _PlistWriterr� r�TFcCs.|r|�t�t�||||�||_||_dSr)r�� PLISTHEADERr�r1� _sort_keys� _skipkeys)r0r�r�r�Z writeHeaderr&r'rrrr1�s  z_PlistWriter.__init__cCs"|�d�|�|�|�d�dS)Nzz)r�� write_valuer�rrrr��s  z_PlistWriter.writecCs4t|t�r|�d|��n|dkr0|�d��n|dkrD|�d�n�t|t�r�d|krbdkrxnn|�dd |�nt|��n�t|t�r�|�d t|��n�t|t�r�|�|�n|t|t �r�|� |�nft|t t f�r�|� |�nLt|tj��r|�d t|��n,t|ttf��r |�|�ntd t|���dS) N�stringT�trueFZfalsel����rHZintegerz%d�real�datezunsupported type: %s)rrr�rJ� OverflowErrorr�rA�dict� write_dictr� write_datar-� bytearray� write_bytesrcri�tuple�list� write_arrayr.r�r�rrrr��s.           z_PlistWriter.write_valuecCs|�|j�dSr)r�r*r/rrrr��sz_PlistWriter.write_datacCsz|�d�|jd8_tddt|j�dd�|j��}t||��d�D]}|rJ|�|�qJ|jd7_|� d�dS)Nr*r�r�r5r�s r�) r�r��maxrTr�rqr6�splitr�r�)r0r*r7r�rrrr��s � z_PlistWriter.write_bytescCs�|rt|�d�|jr"t|���}n|��}|D]8\}}t|t�sP|jrHq.td��|�d|�|� |�q.|� d�n |�d�dS)Nr��keys must be stringsre) r�r��sorted�itemsrrr�r.r�r�r�)r0rhr�rer(rrrr��s      z_PlistWriter.write_dictcCs<|r.|�d�|D]}|�|�q|�d�n |�d�dS)N�array)r�r�r�r�)r0r�r(rrrr�s    z_PlistWriter.write_arrayN)rr�r�TF) r@rDrEr1r�r�r�r�r�r�rrrrr��s� % r�cCs�d}|D]}|�|�rdSqtjdftjdftjdffD]N\}}|�|�sNq:|D]4}||�d��|�}|dt|��|krRdSqRq:dS)N)s6xBBQQQ)�_fp�seek�os�SEEK_END�readrTr�struct�unpack� _ref_size� _read_ints�_object_offsets� _undefined�_objects� _read_object�OSError� IndexError�errorr�rK)r0r�trailer� offset_size� num_objects� top_object�offset_table_offsetrrrr�Es*   �    � z_BinaryPlistParser.parsecCsL|dkrH|j�d�dd@}d|>}dt|}t�||j�|��dS|S)z$ return the size of the next object.�r�rrQrn)r�r��_BINARY_FORMATr�r�)r0�tokenLrsrXr,rrr� _get_size^s  z_BinaryPlistParser._get_sizecst|j��|���tkr2t�d|�t�����S�rFt���|krLt��t��fdd�td�|��D��SdS)Nrnc3s&|]}t��||��d�VqdS)�bigN)rJ� from_bytes)�.0rZ�r*�sizerr� os�z0_BinaryPlistParser._read_ints..r) r�r�r�r�r�rTrr�rS)r0�nr�rr�rr�hs�z_BinaryPlistParser._read_intscCs|�||j�Sr)r�r�)r0r�rrr� _read_refsrsz_BinaryPlistParser._read_refscs�j|}|tk r|S�j|}�j�|��j�d�d}|d@|d@}}|dkr^d}�n�|dkrnd}�n�|dkr~d }�n�|dkr�d }�n�|d kr�tj�j�d|>�d |d kd�}�nT|dkr�t� d�j�d��d}�n0|dk�rt� d�j�d��d}�n |dk�rDt� d�j�d��d}t � ddd�t j |d�}�n�|dk�r��� |�}�j�|�}t |�|k�rxt���j�st|�}�n�|dk�rΈ� |�}�j�|�} t | �|k�r�t��| �d�}�n@|dk�r�� |�d}�j�|�} t | �|k�rt��| �d�}n�|dk�r:tt��j�d|�d ��}n�|dk�r��� |�}��|�} g}|�j|<|��fdd �| D��n�|d!k�r�� |�}��|�} ��|�} ���}|�j|<z.t| | �D]\} } ��| �|��| �<�q�Wntk �rt��YnXnt��|�j|<|S)"zx read the object by reference. May recursively read sub-objects (content of an array/dict/set) r�r��r�Nr�F� TrRr�r�rQ�Zsigned�"z>frP�#z>d�3��)Zseconds�@�Pr��`r�utf-16be��c3s|]}��|�VqdSr)r�)r��xrBrrr��sz2_BinaryPlistParser._read_object..��)r�r�r�r�r�r�rJr�r�r�rcZ timedeltar�rTrryrr�r r��extendrz�zipr�r.)r0�ref�result�offset�tokenZtokenHr�r,rXr*Zobj_refsZkey_refs�k�orrBrr�us�   �     �                     z_BinaryPlistParser._read_objectN) r@rDrErFr1r�r�r�r�r�rrrrr�9s  r�cCs,|dkr dS|dkrdS|dkr$dSdSdS)N�r��r�rPr�r)�countrrr�_count_to_size�src@s<eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd S)�_BinaryPlistWritercCs||_||_||_dSr)r�r�r�)r0rr&r'rrrr1�sz_BinaryPlistWriter.__init__c Cs�g|_i|_i|_|�|�t|j�}dg||_t|�|_t|j|_ |j � d�|jD]}|� |�qZ|� |�}|j ��}t|�}dt||}|j � tj|f|j���d}|||j|||f} |j � tjd| ���dS)Nr�bplist00rn� >5xBBBQQQ)r)�_objlist� _objtable� _objidtable�_flattenrTr�rr�r�� _ref_formatr�r�� _write_object� _getrefnum�tellr��pack) r0r(r��objr�r�r�Z offset_formatZ sort_versionr�rrrr��s2          �z_BinaryPlistWriter.writec Csrt|t�r"t|�|f|jkrZdSn8t|t�rHt|j�|jf|jkrZdSnt|�|jkrZdSt|j �}|j � |�t|t�r�||jt|�|f<n0t|t�r�||jt|j�|jf<n||jt|�<t|t ��rHg}g}|� �}|j r�t|�}|D]:\}}t|t��s|j�r q�td��|� |�|� |�q�t�||�D]}|�|��q4n&t|ttf��rn|D]}|�|��q\dS)Nr�)r�_scalarsr�r rr*�idr!rTrrUr�r�r�r�rr�r.� itertools�chainr"r�r�) r0r(Zrefnum�keys�valuesr�r�vrrrrr"sB           z_BinaryPlistWriter._flattencCsNt|t�r|jt|�|fSt|t�r<|jt|j�|jfS|jt|�SdSr)rr)r r�rr*r!r*r�rrrr%Ns   z_BinaryPlistWriter._getrefnumcCs�|dkr"|j�t�d||B��n�|dkrH|j�t�d|dBd|��nh|dkrn|j�t�d|dBd|��nB|d kr�|j�t�d |dBd |��n|j�t�d |dBd |��dS)Nr�z>Brz>BBBr�rz>BBH�rz>BBL�z>BBQ�)r�r�r�r')r0rr�rrr� _write_sizeVsz_BinaryPlistWriter._write_sizec s���|�}�j���j|<|dkr2�j�d��nl|dkrJ�j�d��nT|dkrb�j�d��nBqr2rz>BBr�rz>BHr0rz>BLr1lz>BQrH�r�rz>Bdrrr�rrr�rr r rrIr ���csg|]}��|��qSr)r%)r�rrBrr� �sz4_BinaryPlistWriter._write_object..r rnr�r)$r%r�r&r�r�rrJr�r'r�r��to_bytesr�rcZ total_secondsrr3rTr*r-r�rr]�UnicodeEncodeErrorr rKr�r�r#r�r�r�r�r�r.rU) r0r(rr,�tZrefsrXZkeyRefsZvalRefsZ rootItemsrr/rrBrr$fs�                    $     "$z _BinaryPlistWriter._write_objectN) r@rDrEr1r�r"r%r3r$rrrrr�s -0rcCs|dd�dkS)Nr�rr)r�rrr�_is_fmt_binary�sr>)�detectr}�writerT�r!r"r|cCsl|dkrJ|�d�}|�d�t��D]}|d|�r$|d}qVq$t��n t|d}|||d�}|�|�S)z�Read a .plist file. 'fp' should be a readable and binary file object. Return the unpacked root object (which usually is a dictionary). Nr�rr?r})r"r|)r�r��_FORMATSr.rr�)rr!r"r|r��info�P�prrrr �s      cCst|�}t||||d�S)zqRead a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). rA)rr )r(r!r"r|rrrrr �s�Fr%cCs:|tkrtd|f��t|d|||d�}|�|�dS)zWWrite 'value' to a .plist file. 'fp' should be a writable, binary file object. zUnsupported format: %rr@)r&r'N)rBrKr�)r(rr!r&r'r@rrrr s�r!r'r&cCs t�}t|||||d�|��S)z?Return a bytes object with the contents for a .plist file. rF)rr r+)r(r!r'r&rrrrr s)r5)CrF�__all__rVr�� contextlibrc�enum�iorr+r��rer��warningsrZxml.parsers.expatr�Enumr@r�globals�update� __members__�contextmanagerrrrrrrr r��compileror6r2�ASCIIr`rgrirtrur�r�r�rKrr��objectr�r�rrrJr�r-r)rr>rr�rrBr r r r rrrr�s�0�         '"�    s&d!$ a ���