a XC?h�� @sdZdZdZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZz ddlZWney�dZYn0z ddlZWney�dZYn0eefZzeef7ZWney�Yn0gd�ZdZdZed Zd Zd Zd Zd Zd Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2e2Z3e!e"e#e$e'e(e)e%e&e*e+e,f Z4e!e"e)e,fZ5e*e+e,fZ6dZ7hd�Z8e9e9e9e:e:e:d �Z;ej�Z=d#d$�Z?d%d&�Z@d'd(�ZAd)e3fd*d+�ZBd,d-�ZCdedfd.d/�ZDd0d1�ZEGd2d3�d3eF�ZGGd4d5�d5eG�ZHGd6d7�d7eG�ZIGd8d9�d9eG�ZJGd:d;�d;eG�ZKGdd?�d?eL�ZMGd@dA�dAeL�ZNGdBdC�dCeL�ZOGdDdE�dEeL�ZPGdFdG�dGeL�ZQGdHdI�dI�ZRGdJdK�dK�ZSGdLdM�dMeT�ZUGdNdO�dOeT�ZVGdPdQ�dQejW�ZXGdRdS�dSeG�ZYGdTdU�dUeY�ZZGdVdW�dWeY�Z[GdXdY�dYeY�Z\GdZd[�d[eY�Z]Gd\d]�d]eY�Z^Gd^d_�d_eY�Z_eYeeHfZ`dtdadb�Zadcdd�Zbdedf�Zcdgdh�Zdebeceddi�ZeeT�Zfe�gdj�ZhGdkdl�dleT�ZiGdmdn�dneT�Zjdodp�ZkejjZdqdr�Zlemdsk�r�el�dS)uz0.9.0u"Lars Gustäbel ([email protected])u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.�)�openN)�TarFile�TarInfo� is_tarfile�TarError� ReadError�CompressionError� StreamError� ExtractError� HeaderError�ENCODING� USTAR_FORMAT� GNU_FORMAT� PAX_FORMAT�DEFAULT_FORMATr�i�sustar sustar00�d��0�1�2�3�4�5�6�7�L�K�S�x�g�X��)�path�linkpath�size�mtime�uid�gid�uname�gname>r+r%r,r&)Zatime�ctimer(r)r*r'�nt�utf-8cCs8|durtd��|�||�}|d|�|t|�tS)Nzmetadata cannot contain None)� ValueError�encode�len�NUL)�s�length�encoding�errors�r8�,/opt/alt/python39/lib64/python3.9/tarfile.py�stn�s r:cCs*|�d�}|dkr|d|�}|�||�S)Nr�����)�find�decode)r4r6r7�pr8r8r9�nts�s  r?cCs�|ddvrbd}tt|�d�D]}|dK}|||d7}q |ddkr�dt|�d| }n>z"t|dd�}t|��p|d d�}Wnty�td ��Yn0|S) Nr)���r#�rA��ascii�strict�0�invalid header)�ranger2r?�int�stripr0�InvalidHeaderError)r4�n�ir8r8r9�nti�s    rNrBcCs�t|�}d|kr$d|dkrDnntd|d|fd�t}n�|tkr�d|d |krrd|dkr�nnV|dkr�tdg�}ntdg�}d||}t|d�D]}|�d|d@�|dL}q�ntd ��|S) NrrBr#z%0*orDrCr@rAzoverflow in number field)rI�bytesr3r� bytearrayrH�insertr0)rL�digits�formatr4rMr8r8r9�itn�s  2    rTcCs0dtt�d|��}dtt�d|��}||fS)NrCZ 148B8x356BZ 148b8x356b)�sum�structZ unpack_from)�bufZunsigned_chksumZ signed_chksumr8r8r9� calc_chksums�s rXc Cs�|pd}|dkrdS|dur.t�|||�dSt||�\}}t|�D],}|�|�}t|�|krf|d��|�|�qD|dkr�|�|�}t|�|kr�|d��|�|�dS)Ni@r�unexpected end of data)�shutil� copyfileobj�divmodrH�readr2�write) �srcZdstr5� exception�bufsize�blocks� remainder�brWr8r8r9r[�s$       r[cCs8ttjdd�}|dur(|�|d��|�}t|dd�dS)Nr6�backslashreplace� )�end)�getattr�sys�stdoutr1r=�print)r4r6r8r8r9� _safe_printsrlc@s eZdZdS)rN��__name__� __module__� __qualname__r8r8r8r9rsrc@s eZdZdS)r Nrmr8r8r8r9r sr c@s eZdZdS)rNrmr8r8r8r9rsrc@s eZdZdS)rNrmr8r8r8r9rsrc@s eZdZdS)r Nrmr8r8r8r9r sr c@s eZdZdS)r Nrmr8r8r8r9r sr c@s eZdZdS)�EmptyHeaderErrorNrmr8r8r8r9rq srqc@s eZdZdS)�TruncatedHeaderErrorNrmr8r8r8r9rr#srrc@s eZdZdS)�EOFHeaderErrorNrmr8r8r8r9rs&srsc@s eZdZdS)rKNrmr8r8r8r9rK)srKc@s eZdZdS)�SubsequentHeaderErrorNrmr8r8r8r9rt,srtc@s,eZdZdd�Zdd�Zdd�Zdd�Zd S) � _LowLevelFilecCsFtjtjtjBtjBd�|}ttd�r2|tjO}t�||d�|_dS)N��r�w�O_BINARYi�) �os�O_RDONLY�O_WRONLY�O_CREAT�O_TRUNC�hasattrryr�fd)�self�name�moder8r8r9�__init__9s��  z_LowLevelFile.__init__cCst�|j�dS�N)rz�closer��r�r8r8r9r�Bsz_LowLevelFile.closecCst�|j|�Sr�)rzr]r��r�r'r8r8r9r]Esz_LowLevelFile.readcCst�|j|�dSr�)rzr^r��r�r4r8r8r9r^Hsz_LowLevelFile.writeN)rnrorpr�r�r]r^r8r8r8r9ru3s ruc@sneZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z ddd�Z dd�Z dd�Z dd�ZdS)�_Streamc Cs�d|_|durt||�}d|_|dkr6t|�}|��}|pd|fg}d|_g|_d}|j}|D]L\}}||kr||j� d||df�|j� d||||f�||7}||}qX||jkr�|j� d||jdf�dS)Nrr�FT) r��offsetr'�positionrhr�r�� map_index�mapr�)r�r�r�r'Z blockinfoZlastposZrealposr8r8r9r�as(    z_FileInFile.__init__cCsdSr�r8r�r8r8r9r�zsz_FileInFile.flushcCsdS�NTr8r�r8r8r9�readable}sz_FileInFile.readablecCsdS)NFr8r�r8r8r9�writable�sz_FileInFile.writablecCs |j��Sr�)r��seekabler�r8r8r9r��sz_FileInFile.seekablecCs|jSr�)r�r�r8r8r9r��sz_FileInFile.tellcCs�|tjkr tt|d�|j�|_nj|tjkr\|dkrFt|j|d�|_q�t|j||j�|_n.|tjkr�tt|j||j�d�|_ntd��|jS)NrzInvalid argument) �io�SEEK_SET�min�maxr'r��SEEK_CUR�SEEK_ENDr0)r�r��whencer8r8r9r��s   z_FileInFile.seekc Cs |dur|j|j}nt||j|j�}d}|dk�r|j|j\}}}}||jkr`|krhq�nq�q6|jd7_|jt|j�kr6d|_q6t|||j�}|r�|j�||j|�|j�|�}t|�|kr�t d��||7}n |t |7}||8}|j|7_q,|S)Nr�rr#rY) r'r�r�r�r�r2r�r�r]rr3) r�r'rW�data�start�stopr�r5rdr8r8r9r]�s,     z_FileInFile.readcCs&|�t|��}||dt|��<t|�Sr�)r]r2)r�rdrWr8r8r9�readinto�sz_FileInFile.readintocCs d|_dSr�)r�r�r8r8r9r��sz_FileInFile.close)N)N)rnrorpr�r�r�r�r�r�r�r�r�r]r�r�r8r8r8r9r�[s  r�cseZdZ�fdd�Z�ZS)� ExFileObjectcs&t|j|j|j|j�}t��|�dSr�)r�r�� offset_datar'�sparse�superr�)r��tarfile�tarinfor��� __class__r8r9r��s �zExFileObject.__init__�rnrorpr�� __classcell__r8r8r�r9r��sr�c@s eZdZdS)� FilterErrorNrmr8r8r8r9r��sr�cseZdZ�fdd�Z�ZS)�AbsolutePathErrorcs ||_t��d|j�d��dS)Nzmember z has an absolute path�r�r�r�r��r�r�r�r8r9r��szAbsolutePathError.__init__r�r8r8r�r9r��sr�cseZdZ�fdd�Z�ZS)�OutsideDestinationErrorcs.||_||_t��|j�d|�d�d�dS)Nz would be extracted to �, � which is outside the destination�r��_pathr�r�r��r�r�r%r�r8r9r��s �z OutsideDestinationError.__init__r�r8r8r�r9r��sr�cseZdZ�fdd�Z�ZS)�SpecialFileErrorcs||_t��|j�d��dS)Nz is a special filer�r�r�r8r9r��szSpecialFileError.__init__r�r8r8r�r9r��sr�cseZdZ�fdd�Z�ZS)�AbsoluteLinkErrorcs||_t��|j�d��dS)Nz is a link to an absolute pathr�r�r�r8r9r��szAbsoluteLinkError.__init__r�r8r8r�r9r��sr�cseZdZ�fdd�Z�ZS)�LinkOutsideDestinationErrorcs.||_||_t��|j�d|�d�d�dS)Nz would link to r�r�r�r�r�r8r9r��s �z$LinkOutsideDestinationError.__init__r�r8r8r�r9r��sr�cseZdZ�fdd�Z�ZS)�LinkFallbackErrorcs2||_||_t��d|j�d�d|�d��dS)Nzlink z would be extracted as a zcopy of z, which was rejectedr�r�r�r8r9r��s  �zLinkFallbackError.__init__r�r8r8r�r9r��sr�TcCs"i}|j}tjj|tjjd�}|�dtjf�rH|j�dtj�}|d<tj�|�r\t |��tjjtj� ||�tjjd�}tj� ||g�|kr�t ||��|j }|du�r|d@}|r�|��s�|��r�|d@s�|dM}|dO}n|��s�|��r�d}nt|��||j k�r||d<|�r|jdu�r*d|d <|jdu�r>d|d <|jdu�rRd|d <|jdu�rfd|d <|���sz|���rtj�|j��r�t|��tj�|j�}||jk�r�||d <|���r�tj� |tj�|�|j�}ntj� ||j�}tjj|tjjd�}tj� ||g�|k�rt||��|S)N)rE�/r�i��@i�����r�r)r*r+r,�linkname)r�rzr%�realpath� ALLOW_MISSINGr��sep�lstrip�isabsr�r�� commonpathr�r��isreg�islnk�isdir�issymr�r)r*r+r,r�r��normpath�dirnamer�)�member� dest_pathZfor_data� new_attrsr�Z target_pathr�Z normalizedr8r8r9�_get_filtered_attrs�sl �           ��� r cCs|Sr�r8)rrr8r8r9�fully_trusted_filter@sr cCs,t||d�}|r(|jfi|�ddi��S|S)NF�deep�r r��rrr r8r8r9� tar_filterCs rcCs,t||d�}|r(|jfi|�ddi��S|S)NTr Fr rr8r8r9� data_filterIs r)Z fully_trustedr�r�s([0-9]{1,20}) c@s�eZdZeddddddddd d d d d dddddddd�Zdhdd�Zedd��Zejdd��Zedd��Z e jdd��Z dd�Z e e e e e e e e de d � d!d"�Z d#d$�Z eed%fd&d'�Zd(d)�Zd*d+�Zd,d-�Zed.d/��Zd0d1�Zed2d3��Zed4d5��Zed6d7��Zed8d9��Zed:d;��Zedd?�Zd@dA�ZdBdC�Z dDdE�Z!dFdG�Z"dHdI�Z#dJdK�Z$dLdM�Z%dNdO�Z&dPdQ�Z'dRdS�Z(dTdU�Z)dVdW�Z*dXdY�Z+dZd[�Z,d\d]�Z-d^d_�Z.d`da�Z/dbdc�Z0ddde�Z1dfdg�Z2dS)irzName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.z�File type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.z User name.z Group name.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)r�r�r)r*r'r(�chksum�typer�r+r,�devmajor�devminorr�r�� pax_headersr�r��_sparse_structs� _link_targetr�cCsj||_d|_d|_d|_d|_d|_d|_t|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_i|_dS)Ni�rr�)r�r�r)r*r'r(r�REGTYPErr�r+r,rrr�r�r�r�r�r�r8r8r9r��s"zTarInfo.__init__cCs|jSr��r�r�r8r8r9r%�sz TarInfo.pathcCs ||_dSr�rrr8r8r9r%�scCs|jSr��r�r�r8r8r9r&�szTarInfo.linkpathcCs ||_dSr�r)r�r�r8r8r9r&�scCsd|jj|jt|�fS)Nz<%s %r at %#x>)r�rnr��idr�r8r8r9�__repr__�szTarInfo.__repr__T) r�r(r�r�r)r*r+r,r �_KEEPc Cs�| rt�|�} n t�|�} || ur(|| _|| ur6|| _|| urD|| _|| urR|| _|| ur`|| _|| urn|| _|| ur||| _|| ur�|| _ | Sr�) �copyZdeepcopyr�r(r�r�r)r*r+r,) r�r�r(r�r�r)r*r+r,r r�resultr8r8r9r��s(  zTarInfo.replacecCs�|jdurd}n |jd@}|j||j|j|j|j|j|j|j|j |j |j |j d� }|dt kr||d�d�s||dd7<|S)N��) r�r�r)r*r'r(rrr�r+r,rrrr�r�)r�r�r)r*r'r(rrr�r+r,rr�DIRTYPEr�)r�r��infor8r8r9�get_info�s(  �zTarInfo.get_info�surrogateescapecCsz|��}|��D]\}}|durtd|��q|tkrD|�|||�S|tkrZ|�|||�S|tkrn|�||�Std��dS)Nz%s may not be Nonezinvalid format) r$�itemsr0r �create_ustar_headerr�create_gnu_headerr�create_pax_header)r�rSr6r7r#r��valuer8r8r9�tobuf�s z TarInfo.tobufcCsnt|d<t|d�||��tkr(td��t|d�||��tkr^|�|d||�\|d<|d<|�|t||�S)N�magicr�zlinkname is too longr��prefix) � POSIX_MAGICr2r1� LENGTH_LINKr0� LENGTH_NAME�_posix_split_name�_create_headerr )r�r#r6r7r8r8r9r'�s zTarInfo.create_ustar_headercCs�t|d<d}t|d�||��tkr<||�|dt||�7}t|d�||��tkrl||�|dt||�7}||�|t ||�S)Nr,r�r�r�) � GNU_MAGICr2r1r/�_create_gnu_long_header�GNUTYPE_LONGLINKr0�GNUTYPE_LONGNAMEr2r)r�r#r6r7rWr8r8r9r(szTarInfo.create_gnu_headerc CsLt|d<|j��}ddtfddtfddfD]h\}}}||vr>q*z||�dd �Wn"tyt||||<Yq*Yn0t||�|kr*||||<q*d D]�\}}d }||} t| t �} | r�t | �n| } d | kr�d |dks�nd ||<d}n| �r| ||<d}|r�||vr�t | �||<q�|�r4|� |t |�} nd} | |�|tdd�S)Nr,r�r%r�r&)r+r+� )r,r,r7rDrE))r)rB)r*rB)r'� )r(r8FrrBr#Tr�r�)r.rrr0r/r1�UnicodeEncodeErrorr2� isinstance�float�round�str�_create_pax_generic_header�XHDTYPEr2r ) r�r#r6rr�Zhnamer5rRZ needs_pax�valZ val_is_floatZval_intrWr8r8r9r)s> �      zTarInfo.create_pax_headercCs|�|td�S)Nr/)r>�XGLTYPE)�clsrr8r8r9�create_pax_global_headerMsz TarInfo.create_pax_global_headercCs~|�d�}tdt|��D]T}d�|d|��}d�||d��}t|�||��tkrt|�||��tkrqvqtd��||fS)Nr�r#zname is too long)�splitrHr2r�r1� LENGTH_PREFIXr0r0)r�r�r6r7Z componentsrMr-r8r8r9r1Ss �zTarInfo._posix_split_namec Cs�|�d�ttfv}|r@t|�dd�d|�}t|�dd�d|�}ntdd||�}tdd||�}|�dt�}|durxtd��t|�dd�d ||�t|�d d�d @d|�t|�d d�d|�t|�d d�d|�t|�dd�d|�t|�dd�d|�d|t|�dd�d ||�|�dt�t|�dd�d||�t|�dd�d||�||t|�dd�d||�g}t� dt d� |��} t | t d��d} | dd�t d| d�| dd�} | S)NrrrrBrr�zTarInfo.type must not be Noner�rr�r!r)r*r'r8r(s r�r,r+r7r,r-rz%dsr�i����z%06orDi����)�get�CHRTYPE�BLKTYPErTr:rr0r.rVr�r�r�rXrO) r#rSr6r7Zhas_device_fieldsrrZfiletype�partsrWrr8r8r9r2cs:  �&zTarInfo._create_headercCs.tt|�t�\}}|dkr*|t|t7}|S)Nr)r\r2r�r3)Zpayloadrbrcr8r8r9�_create_payload�szTarInfo._create_payloadcCsR|�||�t}i}d|d<||d<t|�|d<t|d<|�|t||�|�|�S)Nz ././@LongLinkr�rr'r,)r1r3r2r3r2r rJ)rBr�rr6r7r#r8r8r9r4�s �zTarInfo._create_gnu_long_headerc Cs0d}|��D]6\}}z|�dd�Wq ty@d}YqDYq 0q d}|rT|d7}|��D]�\}}|�d�}|r�|�|d�}n |�d�}t|�t|�d}d } } |tt| ��} | | kr�q�| } q�|tt| �d �d |d |d 7}q\i} d| d<|| d<t|�| d<t| d<|�| td d�|� |�S)NFr/rETr�s21 hdrcharset=BINARY r%r�rrD� �=� z././@PaxHeaderr�rr'r,r�) r&r1r9r2r=rOr.r2r rJ) rBrrr6Zbinary�keywordr*Zrecords�lrLr>r#r8r8r9r>�s<   ( �z"TarInfo._create_pax_generic_headerc Cstt|�dkrtd��t|�tkr(td��|�t�tkr>td��t|dd��}|t|�vrbt d��|�}t |dd�||�|_ t|dd ��|_ t|d d ��|_ t|d d ��|_t|d d ��|_t|d d��|_||_|dd �|_t |d d�||�|_t |dd�||�|_t |dd�||�|_t|dd��|_t|dd��|_t |dd�||�}|jtk�r�|j �d��r�t|_|jtk�r6d}g}td�D]j} z0t|||d��} t||d|d��} Wnt�y�Y�qYn0|�| | f�|d7}�q�t|d�} t|dd��} || | f|_ |�!��rN|j �"d�|_ |�rp|jt#v�rp|d|j |_ |S)Nrz empty headerztruncated headerzend of file header��z bad checksumr�l�t�|��ii i)iIiQiYi�r�i�r�r8�i�i�i�)$r2rqr�rr�countr3rsrNrXrKr?r�r�r)r*r'r(rrr�r+r,rr�AREGTYPEr�r"�GNUTYPE_SPARSErHr0r��boolrr�rstrip� GNU_TYPES)rBrWr6r7r�objr-r��structsrMr��numbytes� isextended�origsizer8r8r9�frombuf�sZ         zTarInfo.frombufcCs8|j�t�}|�||j|j�}|j��t|_|�|�Sr�) r�r]r�rcr6r7r�r�� _proc_member)rBr�rWr^r8r8r9� fromtarfiles zTarInfo.fromtarfilecCsT|jttfvr|�|�S|jtkr,|�|�S|jtttfvrF|� |�S|� |�SdSr�) rr6r5� _proc_gnulongrZ� _proc_sparser?rA�SOLARIS_XHDTYPE� _proc_pax� _proc_builtin)r�r�r8r8r9rd/s    zTarInfo._proc_membercCsR|j��|_|j}|��s$|jtvr4||�|j�7}||_|� |j |j |j �|Sr�) r�r�r�rr�SUPPORTED_TYPES�_blockr'r��_apply_pax_inforr6r7)r�r�r�r8r8r9rj<s zTarInfo._proc_builtincCs�|j�|�|j��}z|�|�}Wnty<td��Yn0|j|_|jt krdt ||j |j �|_ n|jtkr�t ||j |j �|_|S)N� missing or bad subsequent header)r�r]rlr'rer rtr�rr6r?r6r7r�r5r�)r�r�rW�nextr8r8r9rfMs   zTarInfo._proc_gnulongc Cs�|j\}}}|`|r�|j�t�}d}td�D]l}z0t|||d��}t||d|d��} WntyxYq�Yn0|r�| r�|�|| f�|d7}q,t|d�}q||_ |j� �|_ |j |� |j �|_||_ |S)Nr�r8rWi�)rr�r]r�rHrNr0r�r[r�r�r�rlr'r�) r�r�r_rarbrWr�rMr�r`r8r8r9rgcs(       zTarInfo._proc_sparsecCs�|j�|�|j��}|jtkr&|j}n |j��}d}d}g}t|�|k�rh||dk�rht � ||�}spt d��zt |� d��}Wnty�t d��Yn0|dkr�t d��||t|�kr�t d��|�d�|d} ||�d�d| �} | �d�\} } } | �r| dk�s|| dk�r$t d��|�|| | f�| dk�r^|du�r^| dk�rZ|j}nd }||7}q<|du�rvd }|D]X\}} } |�| d d |j�}|tv�r�|�| ||j|j�}n|�| d d |j�}|||<�qzz|�|�}Wnt�y�td ��Yn0d |v�r|�||�nFd |v�r0|�||�n.|�d �dk�r^|�d�dk�r^|�|||�|jttfv�r�|� ||j|j�|j!|_!d|v�r�|j"}|�#��s�|jt$v�r�||�|j�7}||_!|S)NrrGr#�rLr�s hdrcharsetsBINARYr/rn�GNU.sparse.map�GNU.sparse.sizezGNU.sparse.major�1zGNU.sparse.minorrFr')%r�r]rlr'rrArrr2�_header_length_prefix_re�matchrKrI�groupr0r�rg� partitionr�r6�_decode_pax_fieldr7�PAX_NAME_FIELDSrer rt�_proc_gnusparse_01�_proc_gnusparse_00rF�_proc_gnusparse_10r?rhrmr�r�rrk)r�r�rWrr�r6� raw_headersrvr5Zheader_value_end_offsetZkeyword_and_valueZ raw_keywordZequalsZ raw_valuerNr*ror�r8r8r9ris|        �  � �     zTarInfo._proc_paxc Cs�g}g}|D]�\}}}|dkrRz|�t|����Wq�tyNtd��Yq�0q |dkr z|�t|����Wq ty�td��Yq 0q tt||��|_dS)NsGNU.sparse.offsetrGsGNU.sparse.numbytes)r�rIr=r0rK�list�zipr�)r�ror~Zoffsetsr`�_rNr*r8r8r9r|�s  zTarInfo._proc_gnusparse_00cCs@dd�|d�d�D�}tt|ddd�|ddd���|_dS)NcSsg|] }t|��qSr8)rI)�.0�xr8r8r9� r�z.TarInfo._proc_gnusparse_01..rr�,r$r#)rDrr�r�)r�rorr�r8r8r9r{ szTarInfo._proc_gnusparse_01cCs�d}g}|j�t�}|�dd�\}}t|�}t|�|dkrtd|vrT||j�t�7}|�dd�\}}|�t|��q,|j��|_t t |ddd�|ddd���|_ dS)NrMr#r$) r�r]r�rDrIr2r�r�r�rr�r�)r�rorr��fieldsr�rWZnumberr8r8r9r}s  zTarInfo._proc_gnusparse_10c Cs�|��D]�\}}|dkr&t|d|�q|dkr@t|dt|��q|dkrZt|dt|��q|tvr|tvr�zt||�}Wnty�d}Yn0|dkr�|�d�}t|||�q|��|_dS)NzGNU.sparse.namer%rsr'zGNU.sparse.realsizerr�) r&�setattrrI� PAX_FIELDS�PAX_NUMBER_FIELDSr0r\rr)r�rr6r7rNr*r8r8r9rm"s"   zTarInfo._apply_pax_infocCs2z|�|d�WSty,|�||�YS0dS)NrE)r=�UnicodeDecodeError)r�r*r6Zfallback_encodingZfallback_errorsr8r8r9ry9s zTarInfo._decode_pax_fieldcCs"t|t�\}}|r|d7}|tS)Nr#)r\r�)r�rXrbrcr8r8r9rlAszTarInfo._blockcCs |jtvSr�)r� REGULAR_TYPESr�r8r8r9rJsz TarInfo.isregcCs|��Sr�)rr�r8r8r9�isfileNszTarInfo.isfilecCs |jtkSr�)rr"r�r8r8r9rRsz TarInfo.isdircCs |jtkSr�)r�SYMTYPEr�r8r8r9rVsz TarInfo.issymcCs |jtkSr�)r�LNKTYPEr�r8r8r9rZsz TarInfo.islnkcCs |jtkSr�)rrGr�r8r8r9�ischr^sz TarInfo.ischrcCs |jtkSr�)rrHr�r8r8r9�isblkbsz TarInfo.isblkcCs |jtkSr�)r�FIFOTYPEr�r8r8r9�isfifofszTarInfo.isfifocCs |jduSr�)r�r�r8r8r9�issparsejszTarInfo.issparsecCs|jtttfvSr�)rrGrHr�r�r8r8r9�isdevmsz TarInfo.isdev)r�)3rnrorp�dict� __slots__r��propertyr%�setterr&rrr�r$rr r+r'r(r)� classmethodrCr1� staticmethodr2rJr4r>rcrerdrjrfrgrir|r{r}rmryrlrr�rrrr�r�r�r�r�r8r8r8r9r_s��     �  :  )   2 >  y rc @s�eZdZdZdZdZdZeZe Z dZ e Z eZdZdjdd�Zedddefd d ��Zedkd d ��Zedldd��Zedmdd��Zedndd��Zddddd�Zdd�Zdd�Zdd�Zdd �Zdod!d"�Zdpdd$�d%d&�Zdqdd'�d(d)�Z drd*d+�Z!d,d-�Z"dsddd/�d0d1�Z#d2d3�Z$dtddd/�d5d6�Z%d7d8�Z&dud9d:�Z'd;d<�Z(d=d>�Z)d?d@�Z*dvdddA�dBdC�Z+dDdE�Z,dFdG�Z-dHdI�Z.dJdK�Z/dLdM�Z0dNdO�Z1dPdQ�Z2dRdS�Z3dTdU�Z4dVdW�Z5dXdY�Z6dwdZd[�Z7d\d]�Z8dxd^d_�Z9d`da�Z:dbdc�Z;ddde�ZdS)yrrFr#Nrwr%c Cs�ddddd�}||vrtd��||_|||_|sh|jdkrTtj�|�sTd|_d|_t||j�}d |_n@|dur�t|d �r�t |j t t f�r�|j }t|d �r�|j|_d |_|r�tj� |�nd|_ ||_|dur�||_|dur�||_|dur�||_|dur�||_|du�r ||_| |_| du�r0|jtk�r0| |_ni|_| du�rF| |_| du�rV| |_| |_d |_g|_d |_|j��|_i|_z�|jd k�r�d|_ |�!�|_ |jdk�r2|j�"|j�z|j�#|�}|j�$|�WnXt%�y�|j�"|j�Y�q2Yn2t&�y,}zt't |���WYd}~n d}~00�q�|jdv�r|d |_|j�r||j�(|j�)��}|j�*|�|jt+|�7_Wn&|j�s�|j�,�d |_�Yn0dS)N�rbzr+b�wbZxb�rw�arxr��!mode must be 'r', 'a', 'w' or 'x'r�rxFr�r�Trw�r�rxr�)-r0r��_moderzr%�exists� bltn_openr�rr:r�r=rO�abspathr�rSr�� dereference� ignore_zerosr6r7rr�debug� errorlevel� copybufsizer��members�_loadedr�r��inodes� firstmemberror�rer�rsr rrCrr^r2r�)r�r�r�r�rSr�r�r�r6r7rr�r�r�Zmodes�erWr8r8r9r��s�   �          &   zTarFile.__init__c s�|s|std��|dvr��fdd�}t�j|d�D]l}t��j|�}|durV|��} z||d|fi|��WSttfy�|dur�|�| �Yq2Yq20q2td���nd|v�r|�dd �\} }| p�d} |p�d }|�jvr�t��j|�}n td |��||| |fi|��Sd |v�r�|�d d �\} }| �p4d} |�p>d }| d v�rRtd��t || |||�} z�|| | fi|��} Wn| � ��Yn0d| _ | S|dv�r��j |||fi|��Std��dS)Nznothing to open)rw�r:*cs�j|dkS)N�taropen)� OPEN_METH)r��rBr8r9�not_compressed'sz$TarFile.open..not_compressed)�keyrwz%file could not be opened successfully�:r#r�r��|rvzmode must be 'r' or 'w'Fr�zundiscernible mode) r0�sortedr�rhr�rrr�rDr�r�r�r�) rBr�r�r�ra�kwargsr�r��funcZ saved_pos�filemode�streamr�r8r�r9r�sP%            z TarFile.opencKs$|dvrtd��||||fi|��S)Nr�r�)r0)rBr�r�r�r�r8r8r9r�XszTarFile.taropenr�cKs�|dvrtd��zddlm}Wnty:td��Yn0z|||d||�}Wn,ty~|durx|dkrxtd���Yn0z|j|||fi|��}Wn@ty�|��|dkr�td���Yn|���Yn0d |_ |S) N�rwrxr��mode must be 'r', 'w' or 'x'r)�GzipFilezgzip module is not availablerdrwr�F) r0Zgzipr�r�rr�rr�r�r�)rBr�r�r�� compresslevelr�r�r�r8r8r9�gzopen`s0   zTarFile.gzopenc Ks�|dvrtd��zddlm}Wnty:td��Yn0||pD|||d�}z|j|||fi|��}WnDttfy�|��|dkr�t d���Yn|���Yn0d |_ |S) Nr�r�r)�BZ2Filer�)r�rwznot a bzip2 fileF) r0r�r�r�rr�r��EOFErrorr�rr�)rBr�r�r�r�r�r�r�r8r8r9�bz2open�s& zTarFile.bz2openc Ks�|dvrtd��zddlm}m}Wnty>td��Yn0||pH|||d�}z|j|||fi|��}WnD|tfy�|��|dkr�t d���Yn|���Yn0d |_ |S) Nr�r�r)�LZMAFiler�r�)�presetrwznot an lzma fileF) r0r�r�r�r�rr�r�r�rr�) rBr�r�r�r�r�r�r�r�r8r8r9�xzopen�s& zTarFile.xzopenr�r�r�r�)r�r�r�r�cCs�|jr dSd|_zp|jdvrn|j�ttd�|jtd7_t|jt�\}}|dkrn|j�tt|�W|j s�|j� �n|j s�|j� �0dS)NTr�r$r) r�r�r�r^r3r�r�r\� RECORDSIZEr�r�)r�rbrcr8r8r9r��s  �z TarFile.closecCs(|�|�d��}|dur$td|��|S)Nr�zfilename %r not found)� _getmemberr\�KeyError)r�r�r�r8r8r9� getmember�s zTarFile.getmembercCs|��|js|��|jSr�)�_checkr��_loadr�r�r8r8r9� getmembers�szTarFile.getmemberscCsdd�|��D�S)NcSsg|] }|j�qSr8r)r�r�r8r8r9r��r�z$TarFile.getnames..)r�r�r8r8r9�getnames�szTarFile.getnamesc CsZ|�d�|dur|j}|dur$|}tj�|�\}}|�tjd�}|�d�}|��}||_ |dur�|j stt� |�}q�t� |�}nt� |���}d}|j}t �|�r�|j|jf} |j s�|jdkr�| |jvr�||j| kr�t} |j| }nt} | dr�||j| <nht �|��rt} nVt �|��r"t} nDt �|��r>t} t�|�}n(t �|��rPt} nt � |��rbt!} ndS||_||_"|j#|_$|j%|_&| tk�r�|j'|_(nd|_(|j)|_*| |_+||_,t-�r�zt-�.|j$�d|_/Wnt0�y�Yn0t1�rzt1�2|j&�d|_3Wnt0�yYn0| tt!fv�rVt4td��rVt4td��rVt�5|j6�|_7t�8|j6�|_9|S)N�awxr�r�r#r�major�minor):r�r�rzr%� splitdriver�r�r�r�r�r��lstat�stat�fstat�fileno�st_mode�S_ISREG�st_ino�st_dev�st_nlinkr�r�r�S_ISDIRr"�S_ISFIFOr��S_ISLNKr��readlink�S_ISCHRrG�S_ISBLKrHr��st_uidr)�st_gidr*�st_sizer'�st_mtimer(rr��pwd�getpwuidr+r��grpZgetgrgidr,rr��st_rdevrr�r) r�r��arcnamer�Zdrvr�Zstatresr�Zstmd�inoderr8r8r9� gettarinfo�s�      � �          zTarFile.gettarinfoT)r�cCs*|��|dur|}|D�] }|r�|jdur6td�ntt�|j��td|jpT|j|jp^|jf�|� �sv|� �r�tdd|j |j f�ntd|j �|jdur�td�ntdt�|j�dd��t|j|��r�d nd �|�r|���rtd |j�|���rtd |j�t�qdS) Nz ??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02dr�r�r�z-> zlink to )r�r�rlr�r�r+r)r,r*r�r�rrr'r(r�� localtimer�rrr�rrk)r��verboser�r�r8r8r9rWs8    ��  �  z TarFile.list��filtercCsL|�d�|dur|}|jdurFtj�|�|jkrF|�dd|�dS|�d|�|�||�}|durz|�dd|�dS|dur�||�}|dur�|�dd|�dS|��r�t|d��}|� ||�Wd�n1s�0Ynb|� ��r>|� |�|�rHt t� |��D],}|j tj�||�tj�||�||d��qn |� |�dS) Nr�r$ztarfile: Skipped %rr#ztarfile: Unsupported type %r�tarfile: Excluded %rr�r�)r�r�rzr%r��_dbgr�rr��addfilerr��listdir�addr�)r�r�r�� recursiver�r��fr8r8r9r�}s6    ,  � z TarFile.addcCs�|�d�t�|�}|�|j|j|j�}|j�|�|jt |�7_|j }|dur�t ||j|j |d�t |j t�\}}|dkr�|j�tt|�|d7}|j|t7_|j�|�dS)Nr�)rarr#)r�rr+rSr6r7r�r^r�r2r�r[r'r\r�r3r�r�)r�r�r�rWrarbrcr8r8r9r��s   zTarFile.addfilecCsp|dur0|j}|durtSt|t�r,td��|St|�r<|Sz t|WStyjtd|�d��d�Yn0dS)NzrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.zfilter z not found) �extraction_filterr r:r=� TypeError�callable�_NAMED_FILTERSr�r0)r�r�r8r8r9�_get_filter_function�s �  zTarFile._get_filter_function�.)� numeric_ownerr�c Cs�g}|�|�}|dur|}|D]L}|�|||�\}} |dur>q|��rP|�| �|j|||�� ||d�q|jdd�dd�|D�]0} z�z|| |�}WnBty�} z*|�| t| ��WYd} ~ Wq�WYd} ~ n d} ~ 00|dur�|�| d�Wq�t j � ||j �} zt � | �} Wn&t�y8|�|d�YWq�Yn0t�| j��sX|�|d�Wq�|j|| |d �|�|| �|�|| �Wq�t�y�} z|�| �WYd} ~ q�d} ~ 00q�dS) N)� set_attrsr��filter_functioncSs|jSr�r)r�r8r8r9��r�z$TarFile.extractall..T)r��reversezexcluded by filterZmissingznot a directory)r�)r��_get_extract_tarinforr�� _extract_one�sort�_FILTER_ERRORS�_log_no_directory_fixup�reprrzr%r�r�r��FileNotFoundErrorr�r�r��chown�utime�chmodr �_handle_nonfatal_error)r�r%r�r�r�Z directoriesrrr�� unfiltered�exc�dirpathr�r�r8r8r9� extractall�sV � � $�    zTarFile.extractallcCs|�dd|j|f�dS)Nr$z(tarfile: Not fixing up directory %r (%s))r�r�)r�r�reasonr8r8r9r s�zTarFile._log_no_directory_fixupr�c Cs8|�|�}|�|||�\}}|dur4|�||||�dSr�)r�rr) r�rr%r�r�r�rr�rr8r8r9�extract$ s  �zTarFile.extractc Cs�t|t�r|�|�}n|}d}z|||�}Wn^ttfy^}z|�|�WYd}~n6d}~0ty�}z|�|�WYd}~n d}~00|dur�|�dd|j �dS|� �r�t � |�}t j �||j�|_||fS)Nr$r�)NN)r:r=r�r�r��_handle_fatal_errorr r r�r�rrrzr%r�r�r)r�rrr%r�filteredr�r8r8r9r8 s"    zTarFile._get_extract_tarinfoc Cs�|�d�z&|j|tj�||j�||||d�WnZty^}z|�|�WYd}~n6d}~0ty�}z|� |�WYd}~n d}~00dS)Nrw)r�r�r�extraction_root) r��_extract_memberrzr%r�r�r�rr r )r�r�r%r�r�rr�r8r8r9rV s � zTarFile._extract_onecCs"|jdkr�n|�dd|�dS)Nr#� tarfile: %s)r�r��r�r�r8r8r9r j s zTarFile._handle_nonfatal_errorcCsn|jdkr�n\t|t�rP|jdur6|�dd|j�qj|�dd|j|jf�n|�ddt|�j|f�dS)Nrr#rztarfile: %s %rztarfile: %s %s)r�r:r��filenamer��strerrorrrnrr8r8r9rq s   zTarFile._handle_fatal_errorcCs�|�d�t|t�r |�|�}n|}|��s6|jtvrB|�||�S|��sR|� �rzt|j t �rht d��q~|� |�|��SndSdS)Nrwz'cannot extract (sym)link as file object)r�r:r=r�rrrk� fileobjectrrr�r�r � extractfile�_find_link_target)r�rr�r8r8r9r} s      zTarFile.extractfile�rrcCsZ|�d�}|�dtj�}tj�|�}|r>tj�|�s>t�|�|��sN|� �rh|� dd|j |j f�n|� d|j �|� �r�|�||�n�|��r�|�||�n~|��r�|�||�nh|��s�|��r�|�||�nJ|��s�|� �r�|j||||d�n&|jtv�r|�||�n |�||�|�rV|�|||�|� ��sV|�||�|�||�dS)Nr�r#z%s -> %sr)r\r�rzr�r%rr��makedirsrrr�r�r�r�makefiler�makedirr��makefifor�r��makedev�makelink_with_filterrrk� makeunknownr r r )r�r�� targetpathr�r�rrZ upperdirsr8r8r9r� s<   �    zTarFile._extract_membercCs>z&|jdurt�|�n t�|d�Wnty8Yn0dS)Ni�)r�rz�mkdir�FileExistsError�r�r�r'r8r8r9r"� s    zTarFile.makedircCs�|j}|�|j�|j}t|d��l}|jdurn|jD]"\}}|�|�t|||t|�q4|�|j�|� �nt|||jt|�Wd�n1s�0YdS)Nr�) r�r�r�r�r�r�r[rr'�truncate)r�r�r'�sourcera�targetr�r'r8r8r9r!� s      zTarFile.makefilecCs"|�||�|�dd|j�dS)Nr#z9tarfile: Unknown file type %r, extracted as regular file.)r!r�rr*r8r8r9r&� s �zTarFile.makeunknowncCs"ttd�rt�|�ntd��dS)N�mkfifozfifo not supported by system)rrzr.r r*r8r8r9r#� s  zTarFile.makefifocCsjttd�rttd�std��|j}|dur.d}|��rB|tjO}n |tjO}t�||t� |j |j ��dS)N�mknodr$z'special devices not supported by systemr�) rrzr r�r�r��S_IFBLK�S_IFCHRr/r$rr)r�r�r'r�r8r8r9r$ s  �zTarFile.makedevcCs|�||dd�Sr�)r%r*r8r8r9�makelink szTarFile.makelinkc Cs(d}zX|��r8tj�|�r$t�|�t�|j|�WdStj�|j�rZt� |j|�WdSWnt yrd}Yn0z|� |�}Wn"t y�|r�t d��n�Yn0|dur�|}nT|dur�t d��z|||�}Wn4t�y}zt||j�|�WYd}~n d}~00|du�r$|j||||d�dS)NFTz%unable to resolve link inside archivez[makelink_with_filter: if filter_function is not None, extraction_root must also not be Noner)rrzr%�lexists�unlink�symlinkr�r�r�link�symlink_exceptionrr�r rr�r�r) r�r�r'rrZkeyerror_to_extracterrorrr�causer8r8r9r% sF       ��$ �zTarFile.makelink_with_filtercCs�ttd�r�t��dkr�|j}|j}|s�ztrB|jrBt�|j�d}WntyVYn0zt rt|j rtt � |j �d}Wnty�Yn0|dur�d}|dur�d}z4|� �r�ttd�r�t� |||�nt�|||�Wnty�td��Yn0dS)N�geteuidrr$r;�lchownzcould not change owner)rrzr9r*r)r�r,Zgetgrnamr�r�r+�getpwnamrr:r r�r )r�r�r'r��g�ur8r8r9r J s0     z TarFile.chowncCs@|jdurdSzt�||j�Wnty:td��Yn0dS)Nzcould not change mode)r�rzr r�r r*r8r8r9r k s   z TarFile.chmodcCsT|j}|durdSttd�s dSzt�|||f�WntyNtd��Yn0dS)Nr z"could not change modification time)r(rrzr r�r )r�r�r'r(r8r8r9r u s  z TarFile.utimec Csl|�d�|jdur$|j}d|_|S|j|j��krZ|j�|jd�|j�d�sZtd��d}z|j� |�}W�qJt y�}zD|j r�|� dd|j|f�|jt 7_WYd}~q^WYd}~�qJd}~0t�yD}z`|j �r|� dd|j|f�|jt 7_WYd}~q^n|jdk�r.tt|���WYd}~�qJd}~0t�yj|jdk�rftd��Yn�t�y�}z$|jdk�r�tt|���WYd}~n�d}~0t�y�}ztt|���WYd}~nvd}~0t�yB}zTz.ddl}t||j��rtd|����n|�Wnt�y,|�Yn0WYd}~n d}~00�qJq^|du�rb|j�|�nd |_|S) NZrar#rYr$z0x%X: %srz empty filez zlib error: T)r�r�r�r�r�r�r]rr�rersr�r�r�rKr=rqrrrt� Exceptionr�r:r�r�r�r�r�)r��mr�r�r�r8r8r9ro� sZ   " "       z TarFile.nextc Cs�|��}d}|durFz|�|�}Wnty8d}Yn0|d|�}|rVtj�|�}t|�D]D}|rx|j|jkr^d}q^|r�tj�|j�}n|j}||kr^|Sq^|r�t|��dS)NFT) r��indexr0rzr%r�reversedr�r�) r�r�r�� normalizer�Zskippingr@r� member_namer8r8r9r�� s,       zTarFile._getmembercCs|��}|durqqd|_dSr�)ror�r�r8r8r9r�� sz TarFile._loadcCs:|jrtd|jj��|dur6|j|vr6td|j��dS)Nz %s is closedzbad operation for mode %r)r�r�r�rnr�)r�r�r8r8r9r�� szTarFile._checkcCs`|��r.d�tdtj�|j�|jf��}d}n |j}|}|j||dd�}|dur\t d|��|S)Nr�T)r�rBzlinkname %r not found) rr�r�rzr%rr�r�r�r�)r�r�r��limitrr8r8r9r� s  zTarFile._find_link_targetccs�|jr|jEdHdSd}|jdur:|��}|d7}|V|t|j�krT|j|}n"|jsr|��}|svd|_dSndS|d7}|Vq:dS)Nrr#T)r�r�r�ror2)r�r@r�r8r8r9�__iter__ s$   zTarFile.__iter__cCs||jkrt|tjd�dS)N��file)r�rkri�stderr)r��level�msgr8r8r9r�/ s z TarFile._dbgcCs |��|Sr�)r�r�r8r8r9� __enter__5 szTarFile.__enter__cCs,|dur|��n|js"|j��d|_dSr�)r�r�r�r�)r�rr*� tracebackr8r8r9�__exit__9 s   zTarFile.__exit__) NrwNNNNNNr%NNNN)rwN)rwNr�)rwNr�)rwNN)NNN)T)NT)N)r�N)r�T)N)TF)NF)N)?rnrorpr�r�r�r�rrSr r6r7rr�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�rr�r�r�rrrrrr rrrr"r!r&r#r$r2r%r r r ror�r�r�rrEr�rKrMr8r8r8r9rrs�� oZ    �    c&3 � E� �   �� 82! ? ( rcCsFz,t|d�rt|d�}nt|�}|��WdSty@YdS0dS)Nr])r�TF)rrr�r)r�r�r8r8r9rG s   rc Cs`ddl}d}|j|d�}|jdddddd �|jd d td d �|jdd�}|jddddd�|jdddddd�|jdddddd�|jdd dd!d�|��}|jr�|jdur�|�d"d#�|j du�rJ|j }t |��r4t |d$��*}|� �t |� �tjd%�Wd�n1�s0Y|j�rFt d&�|��n|�d"d'�|���n|jdu�r�|j}t |��r�t� |d(��}|j|jd)�Wd�n1�s�0Yn|�d"d'�|���n�|jdu�r�t|j�d"k�r�|jd}tj}n,t|j�d*k�r|j\}}n|�d"|���t |��r�t� |d(�� }|j||jd+�Wd�n1�sR0Y|j�r�|d,k�rzd-�|�} n d.�||�} t | �n|�d"d'�|��n�|jdu�r\|j�d�} tj�| �\} } d/d/d0d0d1d1d1d1d2�} | | v�r�d3| | nd4}|j}t� | |��&}|D]}|�|��qWd�n1�s<0Y|j�r\t d5�| ��dS)6Nrz3A simple command-line interface for tarfile module.)� descriptionz-vz --verbose� store_trueFzVerbose output)�action�default�helpz--filterz zFilter for extraction)�metavar�choicesrRT)Zrequiredz-lz--list� zShow listing of a tarfile)rSrRz-ez --extract�+)rUz zExtract tarfile into target dir)�nargsrSrRz-cz--create)zzzCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#z&--filter is only valid for extraction rwrFz{!r} is a tar archive.z{!r} is not a tar archive. r�)r�r$)r%r�r�z{!r} file is extracted.z+{!r} file is extracted into {!r} directory.r�r�r�)r�z.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:rxz{!r} file created.)�argparse�ArgumentParser� add_argumentr�Zadd_mutually_exclusive_group� parse_argsr�r�exit�testrrr�rkrirHr�rSrrr2rz�curdirZ format_helprZcreate�popr%�splitextr�)rXrN�parserrw�argsr_r�Ztfr^rJZtar_namer�ZextZ compressionsZtar_modeZ tar_files� file_namer8r8r9�mainZ s�  ��  � � � �    2  0    0  �   � .rd�__main__)T)n�version� __author__� __credits__�builtinsrr�rirzr�rZr�r�rVr�re�warningsr�r�r��AttributeError�NotImplementedErrorr7r�� NameError�__all__r3r�r�r3r.r0r/rErrYr�r�rGrHr"r�ZCONTTYPEr6r5rZr?rArhr rrrrkr�r]r�rzr;rIr�r�r �getfilesystemencodingr:r?rNrTrXr[rlr>rr rrr r rqrrrsrKrtrur��objectr�r��BufferedReaderr�r�r�r�r�r�r�r�rr r rrr�r�compilerurrrrdrnr8r8r8r9� s         ����  sh   D�  ^_