U vÆ_¸ ã@s’ddlmZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlm Z m!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/m0Z0e  1e2¡Z3da4e5ed ƒr¡ ?dd¡ ?dd¡Z@e 9d¡ZAeArÜeA 8d¡rÜeA ?dd¡ZAndd„ZBeBƒZA[Be CdejDejEB¡ZFe CdejDejEB¡ZGe Cd¡ZHe Cd ¡ZId!ZJd"ZKe jLd#krFd$d%„ZMnd&d%„ZMGd'd(„d(eNƒZOeOƒZPGd)d*„d*eNƒZQd+d,„ZReRƒZS[Rd/d-d.„ZTdS)0é)Úunicode_literalsN)Úmessage_from_fileé)Ú __version__ÚDistlibException)Ú sysconfigÚZipFileÚfsdecodeÚ text_typeÚfilter)ÚInstalledDistribution)ÚMetadataÚMETADATA_FILENAMEÚWHEEL_METADATA_FILENAMEÚLEGACY_METADATA_FILENAME) Ú FileOperatorÚ convert_pathÚ CSVReaderÚ CSVWriterÚCacheÚcached_propertyÚget_cache_baseÚ read_exportsÚtempdir)ÚNormalizedVersionÚUnsupportedVersionErrorÚpypy_version_infoÚppÚjavaÚjyÚcliÚipÚcpÚpy_version_nodotz%s%séÚpyú-Ú_Ú.ÚSOABIzcpython-cCsRdtg}t d¡r| d¡t d¡r0| d¡t d¡dkrH| d¡d  |¡S) Nr"ÚPy_DEBUGÚdÚ WITH_PYMALLOCÚmÚPy_UNICODE_SIZEéÚuÚ)Ú VER_SUFFIXrÚget_config_varÚappendÚjoin)Úparts©r7úˆ/builddir/build/BUILDROOT/alt-python38-pip-20.2.4-1.el7.x86_64/opt/alt/python38/lib/python3.8/site-packages/pip/_vendor/distlib/wheel.pyÚ _derive_abi<s     r9zz (?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©Nr7©Úor7r7r8Ú^ór>cCs| tjd¡S)Nr:)ÚreplaceÚosÚsepr<r7r7r8r>`r?c@s6eZdZdd„Zdd„Zdd„Zd dd „Zd d „ZdS) ÚMountercCsi|_i|_dSr;)Ú impure_wheelsÚlibs©Úselfr7r7r8Ú__init__dszMounter.__init__cCs||j|<|j |¡dSr;)rDrEÚupdate)rGÚpathnameÚ extensionsr7r7r8Úaddhs z Mounter.addcCs0|j |¡}|D]\}}||jkr|j|=qdSr;)rDÚpoprE)rGrJrKÚkÚvr7r7r8Úremovels   zMounter.removeNcCs||jkr|}nd}|Sr;)rE)rGÚfullnameÚpathÚresultr7r7r8Ú find_modulers zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|ƒ‚t ||j|¡}||_| dd¡}t|ƒdkrf|d|_ |S)Nzunable to find extension for %sr(rr) ÚsysÚmodulesrEÚ ImportErrorÚimpZ load_dynamicÚ __loader__ÚrsplitÚlenÚ __package__)rGrQrSr6r7r7r8Ú load_moduleys       zMounter.load_module)N)Ú__name__Ú __module__Ú __qualname__rHrLrPrTr]r7r7r7r8rCcs  rCc@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). )rrÚsha256NFcCs8||_||_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. r1ÚnoneÚanyNÚdummyz0.1ÚnmZvnr'r&ZbnzInvalid name or filename: %rr%r(ZbiÚar)ÚsignZ should_verifyÚbuildverÚPYVERÚpyverÚabiÚarchrAÚgetcwdÚdirnameÚnameÚversionÚfilenameÚ _filenameÚNAME_VERSION_REÚmatchÚ groupdictr@rRÚsplitÚ FILENAME_RErÚabspath)rGrrrhÚverifyr-Úinforor7r7r8rH‘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. r&r1r(r'z%s-%s%s-%s-%s-%s.whl)rir5rkrlrmrqr@rp)rGrirkrlrmrqr7r7r8rrºs     ÿzWheel.filenamecCstj |j|j¡}tj |¡Sr;)rArRr5rorrÚisfile)rGrRr7r7r8ÚexistsËsz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr;)rkrlrm)rGrkrlrmr7r7r8ÚtagsÐs   z Wheel.tagsc Cstj |j|j¡}d|j|jf}d|}t d¡}t |dƒÀ}|  |¡}|d  dd¡}t dd „|Dƒƒ}t tg} d} | D]f} zLt || ¡} | | ¡,} || ƒ}t|d } | rÀW5QR£WqäW5QRXWq|tk ràYq|Xq|| sútd d  | ¡ƒ‚W5QRX| S) Nú%s-%sú %s.dist-infoúutf-8Úrú Wheel-Versionr(rcSsg|] }t|ƒ‘qSr7©Úint©Ú.0Úir7r7r8Ú àsz"Wheel.metadata..)Úfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )rArRr5rorrrprqÚcodecsÚ getreaderrÚget_wheel_metadatarwÚtuplerrÚ posixpathÚopenr ÚKeyErrorÚ ValueError)rGrJÚname_verÚinfo_dirÚwrapperÚzfÚwheel_metadataÚwvÚ file_versionÚfnsrSÚfnÚmetadata_filenameÚbfÚwfr7r7r8Úmetadata×s2      ÿzWheel.metadatac CsXd|j|jf}d|}t |d¡}| |¡}t d¡|ƒ}t|ƒ}W5QRXt|ƒS)Nrr€ÚWHEELr) rprqrr5rr‹rŒrÚdict)rGr–r“r”rœrržÚmessager7r7r8r÷s  zWheel.get_wheel_metadatac Cs6tj |j|j¡}t|dƒ}| |¡}W5QRX|S)Nr‚)rArRr5rorrrr)rGrJr–rSr7r7r8r{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ó éÿÿÿÿr?ó ó rr$s ) Ú SHEBANG_REruÚendÚlowerÚSHEBANG_PYTHONWÚSHEBANG_PYTHONÚSHEBANG_DETAIL_REÚgroupsÚfind) rGÚdatar-r¨ÚshebangZdata_after_shebangZshebang_pythonÚargsZcrÚlfZtermr7r7r8Ú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Úbase64Úurlsafe_b64encodeÚrstripÚdecode)rGr¯r¶ÚhasherrSr7r7r8Úget_hash%s zWheel.get_hashc CsVt|ƒ}ttj ||¡ƒ}| |ddf¡t|ƒ}|D]}| |¡q8W5QRXdS)Nr1)ÚlistÚto_posixrArRÚrelpathr4rÚwriterow)rGÚrecordsÚ record_pathÚbaseÚpÚwriterÚrowr7r7r8Ú write_record0s  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ÀrArRÚgetsizer4r5rËrÂ)rGr{ÚlibdirÚ archive_pathsrÅÚdistinfor”r¿ÚaprÈÚfr¯rºÚsizer7r7r8Ú write_records8s    zWheel.write_recordsc CsFt|dtjƒ.}|D]"\}}t d||¡| ||¡qW5QRXdS)NÚwzWrote %s to %s in wheel)rÚzipfileÚ ZIP_DEFLATEDÚloggerÚdebugÚwrite)rGrJrÑr–rÓrÈr7r7r8Ú build_zipHs 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]´\}}}||kr t|ƒD]8\}}t|ƒ}| d¡rÄt j  ||¡}||=qþqÄ|s tdƒ‚|D]H}t|ƒ d¡r(qt j  ||¡}tt j  ||¡ƒ}|  ||f¡qq¨t  |¡}|D]B}|dkrltt j  ||¡ƒ}tt j  | |¡ƒ}|  ||f¡qld|p¼|jdtd|g}|jD] \}}}| d|||f¡qÔt j  |d¡}t|dƒ}| d  |¡¡W5QRXtt j  | d¡ƒ}|  ||f¡d!d"„} t | | d#} | !|| 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|ˆkSr;r7r<©Úpathsr7r8r>Vr?zWheel.build..)ÚpurelibÚplatlibrráÚfalseÚtruercrdrkrlrmrú%s.datar€)r¯ÚheadersÚscriptsræú.exerÌÚwbú .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)rÍÚ INSTALLERZSHAREDr zWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%sr r×Ú cSs*|d}| d¡}d|kr"|d7}||fS)Nrr:réi')Úcount)ÚtrÓÚnr7r7r8Úsorter²s  zWheel.build..sorter)Úkey)%rÁr ÚIMPVERÚABIÚARCHrjÚgetrkrlrmrprqrArRÚisdirÚwalkr r5rÃrÂr4ÚendswithrrÎr³rÜÚ enumerateÚAssertionErrorÚlistdirÚ wheel_versionrr~ÚsortedrÖrorrrÝ)"rGrßr~rûZlibkeyÚis_pureZ default_pyverZ default_abiZ default_archrÐr“Údata_dirr”rÑrðrRÚrootÚdirsÚfilesr›rÈÚrprÓrÔr¯rÒrˆÚdnr—rkrlrmrïrJr7rÞr8ÚbuildNsš         ý   z Wheel.buildcCs | d¡S)zl Determine whether an archive entry should be skipped when verifying or installing. )r:z /RECORD.jws)r÷)rGÚarcnamer7r7r8Ú skip_entryÂszWheel.skip_entrycC Ksl|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|ƒ|ddkr|d}n|d}i}| |¡8}t|d"}|D]}|d}|||<q8W5QRXW5QRXt  | d¡}t  | d¡}t  | dd¡}t|d}d|_tj } g}!t ¡}"|"|_d|_z”zb| ¡D]´}#|#j}$t|$t ƒrè|$}%n |$ !d ¡}%| "|%¡rqÊ||%}|dr4t#|#j$ƒ|dkr4t%d|%ƒ‚|dr–|d dd¡\}&}'| |$¡}| &¡}(W5QRX| '|(|&¡\})}*|*|'kr–t%d|$ƒ‚|r¼|% (||f¡r¼t) *d |%¡qÊ|% (|¡oÒ|% +d!¡ }+|% (|¡r |% d"d¡\})},}-tj ||,t,|-ƒ¡}.n$|%| |fkrqÊtj |t,|%ƒ¡}.|+s | |$¡}| -||.¡W5QRX|! .|.¡|s´|dr´t|.d#ƒ4}| &¡}(| '|(|&¡\})}/|/|*krª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}5ntd}6|j6d }|d*kr€t  | d+¡}7zž| |7¡}t7|ƒ}8W5QRXi}6d,D]r}9d-|9}:|:|8kræi|6d.|9<};|8|: 8¡D]<}|6 d7i¡}?|>s|?r®| dd¡}@tj >|@¡s0t?d8ƒ‚|@|_|> @¡D]*\}:}|?r®d:di}B|? @¡D],\}:}a~ Install a wheel to the specified paths. If kwarg ``warner`` is specified, it should be a callable, which will be called with two tuples indicating the wheel version of this software and the wheel version in the file, if there is a discrepancy in the versions. This can be used to issue any warnings to raise any exceptions. If kwarg ``lib_only`` is True, only the purelib/platlib files are installed, and the headers, scripts, data and dist-info metadata are not written. If kwarg ``bytecode_hashed_invalidation`` is True, written bytecode will try to use file-hash based invalidation (PEP-552) on supported interpreter versions (CPython 2.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. ÚwarnerÚlib_onlyFZbytecode_hashed_invalidationrrär€r rÍrr‚rƒr(rcSsg|] }t|ƒ‘qSr7r„r†r7r7r8r‰øsz!Wheel.install..zRoot-Is-Purelibrãràrá©Ústreamrr1ræ)Údry_runTNr$úsize mismatch for %sú=údigest mismatch for %szlib_only: skipping %srçr:rÌzdigest mismatch on write for %sz.py)Úhashed_invalidationzByte-compilation failed)Úexc_infozlib_only: returning Nonez1.0zentry_points.txt)ÚconsoleÚguiz %s_scriptszwrap_%sz%s:%sz [%s]ú,zAUnable to read legacy script metadata, so cannot generate scriptsrKzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srÚlibÚprefixzinstallation failed.)Gr rôrArRr5rorrrprqrrr‹rŒrrrrwrŽrûrrÚrecordrUÚdont_write_bytecodeÚtempfileÚmkdtempÚ source_dirÚ target_dirÚshutilÚrmtreeÚinfolistÚ isinstancer r¾rÚstrÚ file_sizerrÎrÀÚ startswithrÚrÛr÷rÚ copy_streamr4Ú byte_compileÚ ExceptionÚwarningÚbasenameÚmakeÚset_executable_modeÚextendr{rÚvaluesrÚsuffixÚflagsÚjsonÚloadrõr’Úitemsr r¡Zwrite_shared_locationsZwrite_installed_filesÚ exceptionÚrollback)CrGrßÚmakerÚkwargsr rrZbc_hashed_invalidationrJr“rþr”Ú metadata_nameÚwheel_metadata_nameÚ record_namer•r–Úbwfržr¢r˜r™rÐrÅrÚreaderrÊrÈZdata_pfxZinfo_pfxZ script_pfxÚfileopZbcZoutfilesÚworkdirÚzinforÚ u_arcnameÚkindÚvaluer¯r'rºZ is_scriptÚwhererÚoutfileZ newdigestZpycr›ZworknamerÚ filenamesÚdistÚcommandsÚepZepdatarðrNr+rOÚsÚconsole_scriptsÚ gui_scriptsZ script_dirÚscriptÚoptionsr7r7r8ÚinstallÒsT                   ÿ   ÿ   ÿ     þÿÿ                     ÿ  z Wheel.installcCs8tdkr4tj tƒtdƒdtjdd…¡}t|ƒatS)Nz dylib-cachez%s.%sr$) ÚcacherArRr5rr rUÚ version_infor)rGrÇr7r7r8Ú_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)Nrr€Z EXTENSIONSrr‚T)rArRr5rorrrprqrr‹rŒrrr.r/rNÚ prefix_to_dirrÇrõÚmakedirsr0rr}ÚstatÚst_mtimeÚdatetimeÚ fromtimestampÚgetinfoÚ date_timeÚextractr4r‘)rGrJr“r”rr•rSr–rržrKrLrZ cache_baserprÃÚdestrWZ file_timer{Z wheel_timer7r7r8Ú_get_extensionsÁs>             zWheel._get_extensionscCst|ƒS)zM Determine if a wheel is compatible with the running system. )Ú is_compatiblerFr7r7r8rZãszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr7rFr7r7r8Ú 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)rArRryr5rorrrZrr[rUrÚrÛr4ÚinsertrYÚ_hookÚ meta_pathrL)rGr4rJÚmsgrKr7r7r8Úmountïs"   z Wheel.mountcCsrtj tj |j|j¡¡}|tjkr2t d|¡n.r rr:ú..úinvalid entry in wheel: %rr$r r r)rArRr5rorrrprqrrr‹rŒrrrrwrŽrrrr r¾rrr r!rÎrÀ)rGrJr“rþr”r5r6r7r•r–r8ržr¢r˜r™rÅrr9rÊrÈr<rr=r>r?r¯r'rºr7r7r8rzs\            ÿ ÿ   ÿ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$||kr$|||ƒ|d krNtjd d| d\}}t |¡n*tj |¡shtd|ƒ‚tj ||j¡}t|  ¡ƒ}tj | |¡}||f}| || |¡| ||¡|d krÊ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|dj}||fS)Nz%s/%sz %s/PKG-INFO©rR)rr rq)Úpath_mapr”rqrRrðr7r7r8Ú get_versionYs  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 ||dt d||¡dS)Nr&rz%s+1cSsg|] }t|ƒ‘qSr7r„)r‡rFr7r7r8r‰ksz8Wheel.update..update_version..rr(r¤z%s+%scss|]}t|ƒVqdSr;)r r†r7r7r8Ú nsz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rrd)rRÚlegacyzVersion updated from %r to %r) rr®rwr5rrÚrÛr rqr÷rrÜ)rqrRÚupdatedrOrˆr6Zmdrhr7r7r8Úupdate_versioncs.    ÿ ÿ   ÿz$Wheel.update..update_versionrr€rÍr‚rrbrcNz.whlz wheel-update-)r,rÚdirzNot a directory: %r)rArRr5rorrrprqrrrrrr r¾rrWrrÚmkstempÚcloserõrÁr0rÖrÝrÚcopyfile)rGÚmodifierÚdest_dirr4rfrjrJr“r”r7r;r–rer<rr=rRZoriginal_versionr'ÚmodifiedÚcurrent_versionÚfdÚnewpathrÑrÒr{r7r7r8rIHs\       ÿ    þ      z Wheel.update)NFF)N)NN)F)N)r^r_r`Ú__doc__rûr¶rHÚpropertyrrr}r~rrŸrr{r³rÀrËrÖrÝrrrKrNrYrZr[r`rarzrIr7r7r7r8ra‰s@ )        tg "  8rac Csxtg}td}ttjddddƒD]}| d |t|ƒg¡¡q$g}t ¡D]*\}}}|  d¡rN| |  dd¡d¡qN|  ¡t dkr–|  dt ¡| d¡g}tg}tjd krŽt d t¡}|rŽ| ¡\} }}} t|ƒ}| g} | d krø|  d ¡| d kr |  d¡| dkr |  d¡| dkr4|  d¡| dkrH|  d¡|dkrŽ| D]*} d| ||| f} | tkrV| | ¡qV|d8}qH|D]0}|D]$} | d t|df¡|| f¡qšq’t|ƒD]L\}}| d t|f¡ddf¡|dkrÌ| d t|df¡ddf¡qÌt|ƒD]L\}}| d d|f¡ddf¡|dkr"| d d|df¡ddf¡q"t|ƒS)zG Return (pyver, abi, arch) tuples compatible with this Python. rrr¤r1z.abir(r$rcÚdarwinz(\w+)_(\d+)_(\d+)_(\w+)$)Úi386ÚppcÚfat)rxryÚx86_64Zfat3)Úppc64r{Úfat64)rxr{Úintel)rxr{r~ryr|Ú universalz %s_%s_%s_%srdr%)r2ÚrangerUrMr4r5r rXZ get_suffixesr"rwÚsortròr\róÚplatformÚrerur­r…Ú IMP_PREFIXrøÚset)ÚversionsÚmajorÚminorÚabisr,r'rSÚarchesr-rprmÚmatchesrurFrlrˆrqr7r7r8Úcompatible_tags­s`                 & " "rŒcCs\t|tƒst|ƒ}d}|dkr"t}|D]0\}}}||jkr&||jkr&||jkr&d}qXq&|S)NFT)rraÚCOMPATIBLE_TAGSrkrlrm)Úwheelr~rSÚverrlrmr7r7r8rZðs rZ)N)UÚ __future__rr»r‹rSÚdistutils.utilÚ distutilsÚemailrr¸rXr.ÚloggingrArrƒrrUrrØr1rrÚcompatrrr r r Zdatabaser rŸr rrrÚutilrrrrrrrrrrqrrÚ getLoggerr^rÚrLÚhasattrr„r‚r"r3r2rMrjrñÚ get_platformr@róròr9ÚcompileÚ IGNORECASEÚVERBOSErxrtr§r¬r«rªrBrÂÚobjectrCr]rarŒrrZr7r7r7r8ÚsŠ   ,       ø  ü    #*>