U ��.e���@s�ddlmZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlm Z m!Z!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z/e �0e1�Z2da3e4ed ��r8d Z5n*ej6�7d ��rLdZ5nej6dk�r^dZ5ndZ5e�8d�Z9e9�s�dej:dd�Z9de9Z;e5e9Zdd��>dd�Z?e�8d�Z@e@�r�e@�7d��r�e@�>dd�Z@ndd�ZAeA�Z@[Ae�BdejCejDB�ZEe�BdejCejDB�ZFe�Bd�ZGe�Bd �ZHd!ZId"ZJe jKd#k�rBd$d%�ZLnd&d%�ZLGd'd(�d(eM�ZNeN�ZOGd)d*�d*eM�ZPd+d,�ZQeQ�ZR[Qd/d-d.�ZSdS)0�)�unicode_literalsN)�message_from_file�)� __version__�DistlibException)� sysconfig�ZipFile�fsdecode� text_type�filter)�InstalledDistribution)�Metadata�METADATA_FILENAME�WHEEL_METADATA_FILENAME) � FileOperator� convert_path� CSVReader� CSVWriter�Cache�cached_property�get_cache_base� read_exports�tempdir)�NormalizedVersion�UnsupportedVersionErrorZpypy_version_infoZpp�javaZjyZcliZip�cpZpy_version_nodotz%s%s��py�-�_�.ZSOABIzcpython-cCsRdtg}t�d�r|�d�t�d�r0|�d�t�d�dkrH|�d�d �|�S) NrZPy_DEBUG�dZ WITH_PYMALLOC�mZPy_UNICODE_SIZE��u�)� VER_SUFFIXr�get_config_var�append�join)�parts�r,�=/usr/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.py� _derive_abi;s     r.zz (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))? -(?P\w+\d+(\.\w+\d+)*) -(?P\w+) -(?P\w+(\.\w+)*) \.whl$ z7 (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ s \s*#![^\r\n]*s^(\s*#!("[^"]+"|\S+))\s+(.*)$s#!pythons #!pythonw�/cCs|S�Nr,��or,r,r-�]�r3cCs|�tjd�S)Nr/)�replace�os�sepr1r,r,r-r3_r4c@s6eZdZdd�Zdd�Zdd�Zd dd �Zd d �ZdS) �MountercCsi|_i|_dSr0)� impure_wheels�libs��selfr,r,r-�__init__cszMounter.__init__cCs||j|<|j�|�dSr0)r9r:�update)r<�pathname� extensionsr,r,r-�addgs z Mounter.addcCs0|j�|�}|D]\}}||jkr|j|=qdSr0)r9�popr:)r<r?r@�k�vr,r,r-�removeks   zMounter.removeNcCs||jkr|}nd}|Sr0)r:)r<�fullname�path�resultr,r,r-� find_moduleqs zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|��t�||j|�}||_|�dd�}t|�dkrf|d|_ |S)Nzunable to find extension for %sr!rr) �sys�modulesr:� ImportError�impZ load_dynamic� __loader__�rsplit�len� __package__)r<rFrHr+r,r,r-� load_modulexs       zMounter.load_module)N)�__name__� __module__� __qualname__r=rArErIrRr,r,r,r-r8bs  r8c@s�eZdZdZdZdZd4dd�Zedd ��Zed d ��Z ed d ��Z e dd��Z dd�Z e dd��Zdd�Zd5dd�Zdd�Zdd�Zdd�Zd6dd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd7d,d-�Zd.d/�Zd0d1�Zd8d2d3�ZdS)9�Wheelz@ Class to build and install from Wheel files (PEP 427). �rrZsha256NFcCs8||_||_d|_tg|_dg|_dg|_t��|_ |dkrRd|_ d|_ |j |_ n�t�|�}|r�|�d�}|d|_ |d�d d �|_ |d |_|j |_ n�tj�|�\}}t�|�}|s�td |��|r�tj�|�|_ ||_ |�d�}|d|_ |d|_ |d |_|d �d�|_|d�d�|_|d�d�|_dS)zB Initialise an instance using a (valid) filename. r&�none�anyNZdummyz0.1ZnmZvnr rZbnzInvalid name or filename: %rrr!ZbiZar)�signZ should_verify�buildver�PYVER�pyver�abi�archr6�getcwd�dirname�name�version�filenameZ _filename�NAME_VERSION_RE�match� groupdictr5rG�split� FILENAME_REr�abspath)r<rdrZ�verifyr#�inforar,r,r-r=�sD        �    zWheel.__init__cCs^|jrd|j}nd}d�|j�}d�|j�}d�|j�}|j�dd�}d|j|||||fS)zJ Build and return a filename from the various components. rr&r!r z%s-%s%s-%s-%s-%s.whl)r[r*r]r^r_rcr5rb)r<r[r]r^r_rcr,r,r-rd�s     �zWheel.filenamecCstj�|j|j�}tj�|�Sr0)r6rGr*rard�isfile)r<rGr,r,r-�exists�sz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr0)r]r^r_)r<r]r^r_r,r,r-�tags�s   z Wheel.tagsc Cstj�|j|j�}d|j|jf}d|}t�d�}t |d���}|� |�}|d� dd�}t dd �|D��}|d kr�t td g} nt tg} d} | D]f} zLt�|| �} |�| ��,} || �}t|d �} | r�W5QR�Wq�W5QRXWq�tk r�Yq�Xq�| �std d�| ���W5QRX| S)N�%s-%s� %s.dist-info�utf-8�r� Wheel-Versionr!rcSsg|] }t|��qSr,��int��.0�ir,r,r-� �sz"Wheel.metadata..rWZMETADATA)Zfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r6rGr*rardrbrc�codecs� getreaderr�get_wheel_metadatarh�tuplerr� posixpath�openr �KeyError� ValueError)r<r?�name_ver�info_dir�wrapper�zf�wheel_metadata�wv� file_versionZfnsrH�fn�metadata_filename�bf�wfr,r,r-�metadata�s6       �zWheel.metadatac CsXd|j|jf}d|}t�|d�}|�|��}t�d�|�}t|�}W5QRXt|�S)Nrprq�WHEELrr) rbrcrr*r�r{r|r�dict)r<r�r�r�r�r�r��messager,r,r-r}�s  zWheel.get_wheel_metadatac Cs6tj�|j|j�}t|d��}|�|�}W5QRX|S)Nrs)r6rGr*rardrr})r<r?r�rHr,r,r-rl�s z Wheel.infoc Cs�t�|�}|r||��}|d|�||d�}}d|��krBt}nt}t�|�}|rfd|��d}nd}||}||}nT|�d�}|�d�} |dks�|| kr�d} n|||d�d kr�d } nd} t| |}|S) Nspythonw� �����r4� � rrs ) � SHEBANG_RErf�end�lower�SHEBANG_PYTHONW�SHEBANG_PYTHON�SHEBANG_DETAIL_RE�groups�find) r<�datar#r�ZshebangZdata_after_shebangZshebang_python�argsZcrZlfZtermr,r,r-�process_shebangs,       zWheel.process_shebangcCsh|dkr|j}ztt|�}Wn tk r<td|��YnX||���}t�|��d�� d�}||fS)NzUnsupported hash algorithm: %r�=�ascii) � hash_kind�getattr�hashlib�AttributeErrorr�digest�base64Zurlsafe_b64encode�rstrip�decode)r<r�r��hasherrHr,r,r-�get_hash"s zWheel.get_hashc Cs^t|�}ttj�||��}|�|ddf�|��t|��}|D]}|�|�q@W5QRXdS)Nr&) �list�to_posixr6rG�relpathr)�sortrZwriterow)r<�recordsZ record_path�base�p�writer�rowr,r,r-� write_record-s zWheel.write_recordc Cs�g}|\}}tt|j�}|D]P\}} t| d��} | ��} W5QRXd|�| �} tj�| �} |� || | f�qtj� |d�} |� || |�t tj� |d��}|� || f�dS)N�rbz%s=%s�RECORD) r�r�r�r��readr�r6rG�getsizer)r*r�r�)r<rl�libdir� archive_pathsr��distinfor�r��apr��fr�r��sizer,r,r-� write_records6s    zWheel.write_recordsc CsFt|dtj��.}|D]"\}}t�d||�|�||�qW5QRXdS)N�wzWrote %s to %s in wheel)r�zipfileZ ZIP_DEFLATED�logger�debug�write)r<r?r�r�r�r�r,r,r-� build_zipFs zWheel.build_zipc! s~|dkr i}tt�fdd�d��d}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|�d |�|_|�d |�|_|�d |�|_ �|} d|j |j f} d| } d| } g} dD]�}|�kr�q��|}t j �|�r�t �|�D]�\}}}|D]�}tt j �||��}t j �||�}tt j �| ||��}| �||f�|dkr�|�d�s�t|d��}|��}W5QRX|�|�}t|d��}|�|�W5QRXq�q�q�| }d}t �|�D]�\}}}||k�r t|�D]8\}}t|�}|�d��r�t j �||�}||=�q��q�|�s td��|D]H}t|��d��r(�qt j �||�}tt j �||��}| �||f��q�q�t �|�}|D]B}|dk�rltt j �||��}tt j �| |��}| �||f��qld|�p�|jdtd|g}|jD] \}}}|�d|||f��q�t j �|d�}t|d��}|�d �|��W5QRXtt j �| d��}| �||f�|� || f| | �t j �|j!|j"�} |�#| | �| S)!z� Build a wheel from files in specified paths, and use any specified tags when determining the name of the wheel. Ncs|�kSr0r,r1��pathsr,r-r3Tr4zWheel.build..)�purelib�platlibrr�Zfalse�truerXrYr]r^r_rp�%s.datarq)r�Zheaders�scriptsr��.exer��wbz .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)r�Z INSTALLERZSHAREDr�zWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%sr�r�� )$r�r �IMPVER�ABI�ARCHr\�getr]r^r_rbrcr6rG�isdir�walkr r*r�r�r)�endswithr�r�r�r�� enumerate�AssertionError�listdir� wheel_versionrror�rardr�)!r<r�ror�ZlibkeyZis_pureZ default_pyverZ default_abiZ default_archr�r��data_dirr�r��keyrG�root�dirs�filesr�r��rpr�r�r�r�ry�dnr�r]r^r_r?r,r�r-�buildLs�         �  z Wheel.buildcCs |�d�S)zl Determine whether an archive entry should be skipped when verifying or installing. )r/z /RECORD.jws)r�)r<�arcnamer,r,r-� skip_entry�szWheel.skip_entrycC Ksf|j}|�d�}|�dd�}|�dd�}tj�|j|j�}d|j|jf} d| } d| } t �| t �} t �| d�} t �| d �}t � d �}t |d ����}|�| ��}||�}t|�}W5QRX|d �d d�}tdd�|D��}||jkr�|r�||j|�|ddk�r|d}n|d}i}|�|��8}t|d��"}|D]}|d}|||<�q8W5QRXW5QRXt �| d�}t �| d�}t �| dd�}t|d�}d|_tj } g}!t��}"|"|_d|_�z��z\|��D�]�}#|#j}$t|$t ��r�|$}%n |$�!d �}%|�"|%��r�q�||%}|d�r4t#|#j$�|dk�r4t%d|%��|d�r�|d�dd�\}&}'|�|$��}|�&�}(W5QRX|�'|(|&�\})}*|*|'k�r�t%d|$��|�r�|%�(||f��r�t)�*d |%��q�|%�(|��o�|%�+d!� }+|%�(|��r |%�d"d�\})},}-tj�||,t,|-��}.n$|%| |fk�r�q�tj�|t,|%��}.|+�s |�|$��}|�-||.�W5QRX|!�.|.�|�s�|d�r�t|.d#��4}|�&�}(|�'|(|&�\})}/|/|*k�r�t%d$|.��W5QRX| �r~|.�+d%��r~z|j/|.|d&�}0|!�.|0�Wn$t0k �rt)j1d'dd(�YnXnttj�2t,|$��}1tj�|"|1�}2|�|$��}|�-||2�W5QRXtj�|.�\}3}1|3|_|�3|1�}4|�4|4�|!�5|4��q�|�r�t)�*d)�d}5�nnd}6|j6d }|d*k�rzt �| d+�}7z�|�|7��}t7|�}8W5QRXi}6d,D]l}9d-|9}:|:|8k�r�i|6d.|9<};|8|:�8�D]6}|6�d6i�}?|>�s|?�r�|�dd�}@tj�>|@��s*t?d7��|@|_|>�@�D]*\}:}.zRoot-Is-Purelibr�r�r���streamrr&r�)�dry_runTNr�size mismatch for %s�=�digest mismatch for %szlib_only: skipping %sr�r/r�zdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)�exc_infozlib_only: returning Nonez1.0zentry_points.txt)Zconsole�guiz %s_scriptszwrap_%sz%s:%sz %szAUnable to read legacy script metadata, so cannot generate scriptsr@zpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %sr��lib�prefixzinstallation failed.)Gr�r�r6rGr*rardrbrcrrr{r|rr�rrhr~r�rr�recordrJ�dont_write_bytecode�tempfileZmkdtempZ source_dirZ target_dir�shutilZrmtree�infolist� isinstancer r�r��str� file_sizerr�r�� startswithr�r�r�rZ copy_streamr)Z byte_compile� ExceptionZwarning�basenameZmakeZset_executable_mode�extendrlr�valuesr��suffix�flags�json�loadr�r��itemsr r�Zwrite_shared_locationsZwrite_installed_filesZ exceptionZrollback)Cr<r�Zmaker�kwargsr�r�r�Zbc_hashed_invalidationr?r�r�r�� metadata_name�wheel_metadata_name� record_namer�r��bwfr�r�r�r�r�r�r��readerr�r�Zdata_pfxZinfo_pfxZ script_pfxZfileopZbcZoutfiles�workdir�zinfor�� u_arcname�kind�valuer�r r�Z is_script�wherer�ZoutfileZ newdigestZpycr�Zworknamer�� filenamesZdistZcommandsZepZepdatar�rCr"rD�sZconsole_scriptsZ gui_scriptsZ script_dirZscriptZoptionsr,r,r-�install�sT                   �   �   �     ���                     �  z Wheel.installcCs4tdkr0tj�t�td�tjdd��}t|�atS)Nz dylib-cache�) �cacher6rGr*rr�rJrcr)r<r�r,r,r-�_get_dylib_cache�s  �zWheel._get_dylib_cachec Cshtj�|j|j�}d|j|jf}d|}t�|d�}t� d�}g}t |d���}z�|� |���}||�} t � | �} |��} | �|�} tj�| j| �} tj�| �s�t�| �| ��D]�\}}tj�| t|��}tj�|�s�d}n6t�|�j}tj�|�}|�|�}tj|j�}||k}|�r&|�|| �|�||f�q�W5QRXWntk �rXYnXW5QRX|S)NrprqZ EXTENSIONSrrrsT)r6rGr*rardrbrcrr{r|rr�rrrZ prefix_to_dirr�r��makedirsrrrn�stat�st_mtime�datetimeZ fromtimestampZgetinfoZ date_time�extractr)r�)r<r?r�r�r�r�rHr�r�r�r@rr�Z cache_baserbr��destrZ file_timerlZ wheel_timer,r,r-�_get_extensions�s>             zWheel._get_extensionscCst|�S)zM Determine if a wheel is compatible with the running system. )� is_compatibler;r,r,r-r�szWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr,r;r,r,r-� is_mountable�szWheel.is_mountablecCs�tj�tj�|j|j��}|��s2d|}t|��|��sJd|}t|��|t jkrbt � d|�nN|rtt j� |�nt j� d|�|��}|r�tt jkr�t j� t�t�||�dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r6rGrjr*rardrrrrJr�r�r)�insertr�_hook� meta_pathrA)r<r)r?�msgr@r,r,r-�mount�s"   z Wheel.mountcCsrtj�tj�|j|j��}|tjkr2t�d|�n.r�rr/�..�invalid entry in wheel: %rrr�r�r�)r6rGr*rardrbrcrrr{r|rr�rrhr~rr�r�r r�rr�r�r�r�r�)r<r?r�r�r�rrrr�r�r r�r�r�r�r�r�r r�r�r r�r rrr�r r�r,r,r-rks\            � �   �z Wheel.verifyc Ks�dd�}dd�}tj�|j|j�}d|j|jf}d|}t�|d�} t����} t |d��|} i} | � �D]h} | j}t |t �r�|}n |� d �}|| kr�qhd |kr�td |��| �| | �tj�| t|��}|| |<qhW5QRX|| |�\}}|| f|�}|�r�|| |�\}}|�r$||k�r$|||�|d k�rNtjd d| d�\}}t�|�n*tj�|��shtd|��tj�||j�}t| ���}tj�| |�}||f}|�|| |�|�||�|d k�r�t�||�W5QRX|S)a� Update the contents of a wheel in a generic way. The modifier should be a callable which expects a dictionary argument: its keys are archive-entry paths, and its values are absolute filesystem paths where the contents the corresponding archive entries can be found. The modifier is free to change the contents of the files pointed to, add new entries and remove entries, before returning. This method will extract the entire contents of the wheel to a temporary location, call the modifier, and then use the passed (and possibly updated) dictionary to write a new wheel. If ``dest_dir`` is specified, the new wheel is written there -- otherwise, the original wheel is overwritten. The modifier should return True if it updated the wheel, else False. This method returns the same value the modifier returns. cSsHd}}d|tf}||kr$d|}||kr@||}t|d�j}||fS)Nz%s/%sz %s/PKG-INFO�rG)rr rc)�path_mapr�rcrGr�r,r,r-� get_versionKs  z!Wheel.update..get_versioncSs�d}z|t|�}|�d�}|dkr*d|}nTdd�||dd��d�D�}|dd7<d |d|�d�d d �|D��f}Wn tk r�t�d |�YnX|r�t|d �}||_|� t � }|j ||d�t�d||�dS)Nrrz%s+1cSsg|] }t|��qSr,ru)rxrr,r,r-rz]sz8Wheel.update..update_version..rr!r�z%s+%scss|]}t|�VqdSr0)r�rwr,r,r-� `sz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rr()rG�legacyzVersion updated from %r to %r) rr�rhr*rr�r�r rcr�rr�)rcrG�updatedrDryr+Zmdr,r,r,r-�update_versionUs.    � �   �z$Wheel.update..update_versionrprqr�rsrrr&r'Nz.whlz wheel-update-)rr��dirzNot a directory: %r)r6rGr*rardrbrcrrrr�r�r r�rrrr�Zmkstemp�closer�r�rr�r�r�Zcopyfile)r<ZmodifierZdest_dirrr*r.r?r�r�rr r�r)r r�r rGZoriginal_versionr ZmodifiedZcurrent_version�fd�newpathr�r�rlr,r,r-r>:s\       �    �      z Wheel.update)NFF)N)NN)F)N)rSrTrU�__doc__r�r�r=�propertyrdrnrorr�r}rlr�r�r�r�r�r�r�rrrrrr$r%rkr>r,r,r,r-rV�s@ )         hg "  8rVc Csxtg}td}ttjdddd�D]}|�d�|t|�g��q$g}t��D]*\}}}|� d�rN|�|� dd�d�qN|� �t dkr�|� dt �|�d�g}tg}tjd k�r�t�d t�}|�r�|��\} }}} t|�}| g} | d kr�| �d �| d k�r | �d�| dk�r | �d�| dk�r4| �d�| dk�rH| �d�|dk�r�| D]*} d| ||| f} | tk�rV|�| ��qV|d8}�qH|D]0}|D]$} |�d�t|df�|| f��q��q�t|�D]L\}}|�d�t|f�ddf�|dk�r�|�d�t|df�ddf��q�t|�D]L\}}|�d�d|f�ddf�|dk�r"|�d�d|df�ddf��q"t|�S)zG Return (pyver, abi, arch) tuples compatible with this Python. rrr�r&z.abir!rrX�darwinz(\w+)_(\d+)_(\d+)_(\w+)$)�i386�ppcZfat)r6r7�x86_64Zfat3)�ppc64r8Zfat64)r6r8�intel)r6r8r:r7r9Z universalz %s_%s_%s_%srYr)r'�rangerJ� version_infor)r*r�rMZ get_suffixesr�rhr�r�r r��platform�rerfr�rv� IMP_PREFIXr��set)Zversions�major�minorZabisrr rHZarchesr#rbr_Zmatchesrfrr^ryrcr,r,r-�compatible_tags�s`                 & " "rCcCs\t|t�st|�}d}|dkr"t}|D]0\}}}||jkr&||jkr&||jkr&d}qXq&|S)NFT)r�rV�COMPATIBLE_TAGSr]r^r_)ZwheelrorHZverr^r_r,r,r-r�s r)N)TZ __future__rr�r{rZdistutils.utilZ distutilsZemailrr�rMrZloggingr6rr>r�rJr�r�r&rr�compatrrr r r Zdatabaser r�r rr�utilrrrrrrrrrrcrrZ getLoggerrSr�r�hasattrr?r=r�r(r'r<r\r�Z get_platformr5r�r�r.�compile� IGNORECASE�VERBOSErirer�r�r�r�r7r��objectr8r!rVrCrDrr,r,r,r-�s�   ,       �  �    #>