U oÏ ažã@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 ¡rLdZ5nej6dkr^dZ5ndZ5e 8d¡Z9e9s„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#krBd$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Ú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©r6úZC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-6mt8ur68\pip\_vendor\distlib\wheel.pyÚ _derive_abi;s     r8zz (?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©Nr6©Úor6r6r7Ú]ór=cCs| tjd¡S)Nr9)ÚreplaceÚosÚsepr;r6r6r7r=_r>c@s6eZdZdd„Zdd„Zdd„Zd dd „Zd d „ZdS) ÚMountercCsi|_i|_dSr:)Ú impure_wheelsÚlibs©Úselfr6r6r7Ú__init__cszMounter.__init__cCs||j|<|j |¡dSr:)rCrDÚupdate)rFÚpathnameÚ extensionsr6r6r7Úaddgs z Mounter.addcCs0|j |¡}|D]\}}||jkr|j|=qdSr:)rCÚpoprD)rFrIrJÚkÚvr6r6r7Úremoveks   zMounter.removeNcCs||jkr|}nd}|Sr:)rD)rFÚfullnameÚpathÚresultr6r6r7Ú find_moduleqs zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|ƒ‚t ||j|¡}||_| dd¡}t|ƒdkrf|d|_ |S)Nzunable to find extension for %sr'rr) ÚsysÚmodulesrDÚ ImportErrorÚimpZ load_dynamicÚ __loader__ÚrsplitÚlenÚ __package__)rFrPrRr5r6r6r7Ú load_modulexs       zMounter.load_module)N)Ú__name__Ú __module__Ú __qualname__rGrKrOrSr\r6r6r6r7rBbs  rBc@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. r0ÚnoneÚanyNÚdummyz0.1ÚnmZvnr&r%ZbnzInvalid name or filename: %rr$r'ZbiÚar)ÚsignZ should_verifyÚbuildverÚPYVERÚpyverÚabiÚarchr@ÚgetcwdÚdirnameÚnameÚversionÚfilenameÚ _filenameÚNAME_VERSION_REÚmatchÚ groupdictr?rQÚsplitÚ FILENAME_RErÚabspath)rFrrrhÚverifyr,Úinforor6r6r7rGsD        ÿ    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%r0r'r&z%s-%s%s-%s-%s-%s.whl)rir4rkrlrmrqr?rp)rFrirkrlrmrqr6r6r7rr¹s     ÿzWheel.filenamecCstj |j|j¡}tj |¡Sr:)r@rQr4rorrÚisfile)rFrQr6r6r7ÚexistsÊsz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSr:)rkrlrm)rFrkrlrmr6r6r7Ú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øW5QRXWqtk rôYqXq| std d | ¡ƒ‚W5QRX| S)Nú%s-%sú %s.dist-infoúutf-8Úrú Wheel-Versionr'rcSsg|] }t|ƒ‘qSr6©Úint©Ú.0Úir6r6r7Ú ßsz"Wheel.metadata..raÚMETADATA)Úfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r@rQr4rorrrprqÚcodecsÚ getreaderrÚget_wheel_metadatarwÚtuplerrÚ posixpathÚopenr ÚKeyErrorÚ ValueError)rFrIÚname_verÚinfo_dirÚwrapperÚzfÚwheel_metadataÚwvÚ file_versionÚfnsrRÚfnÚmetadata_filenameÚbfÚwfr6r6r7ÚmetadataÖs6       ÿzWheel.metadatac CsXd|j|jf}d|}t |d¡}| |¡}t d¡|ƒ}t|ƒ}W5QRXt|ƒS)Nrr€ÚWHEELr) rprqrr4r‘rŒrrÚdict)rFr—r”r•rržrŸÚmessager6r6r7rŽôs  zWheel.get_wheel_metadatac Cs6tj |j|j¡}t|dƒ}| |¡}W5QRX|S)Nr‚)r@rQr4rorrrrŽ)rFrIr—rRr6r6r7r{ý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) rFÚdatar,r©ÚshebangZdata_after_shebangZshebang_pythonÚargsZcrÚlfZtermr6r6r7Ú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)rFr°r·ÚhasherrRr6r6r7Úget_hash"s zWheel.get_hashc Cs^t|ƒ}ttj ||¡ƒ}| |ddf¡| ¡t|ƒ}|D]}| |¡q@W5QRXdS)Nr0) ÚlistÚto_posixr@rQÚrelpathr3ÚsortrÚwriterow)rFÚrecordsÚ record_pathÚbaseÚpÚwriterÚrowr6r6r7Ú 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Ár@rQÚgetsizer3r4rÍrÃ)rFr{ÚlibdirÚ archive_pathsrÇÚdistinfor•rÀÚaprÊÚfr°r»Úsizer6r6r7Ú write_records6s    zWheel.write_recordsc CsFt|dtjƒ.}|D]"\}}t d||¡| ||¡qW5QRXdS)NÚwzWrote %s to %s in wheel)rÚzipfileÚ ZIP_DEFLATEDÚloggerÚdebugÚwrite)rFrIrÓr—rÕrÊr6r6r7Ú 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]´\}}}||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¡|  || 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:r6r;©Úpathsr6r7r=Tr>zWheel.build..)ÚpurelibÚplatlibrrãÚfalseÚtruercrdrkrlrmrú%s.datar€)r°ÚheadersÚscriptsrèú.exerÎÚwbz .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ÙÚ )$rÂr ÚIMPVERÚABIÚARCHrjÚgetrkrlrmrprqr@rQÚisdirÚwalkr r4rÄrÃr3Úendswithr‘rÐr´rÞÚ enumerateÚAssertionErrorÚlistdirÚ wheel_versionrr~rØrorrrß)!rFrár~r÷ZlibkeyÚis_pureZ default_pyverZ default_abiZ default_archrÒr”Údata_dirr•rÓÚkeyrQÚrootÚdirsÚfilesrœrÊÚrprÕrÖr°rÔrˆÚdnr˜rkrlrmrIr6ràr7ÚbuildLs–         ý  z Wheel.buildcCs | d¡S)zl Determine whether an archive entry should be skipped when verifying or installing. )r9z /RECORD.jws)ró)rFÚarcnamer6r6r7Ú 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|ƒ|ddkr|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 ¡}%| "|%¡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}5nnd}6|j6d }|d*krzt  | d+¡}7z˜| |7¡}t7|ƒ}8W5QRXi}6d,D]l}9d-|9}:|:|8kræi|6d.|9<};|8|: 8¡D]6}|6 d6i¡}?|>s|?r¨| dd¡}@tj >|@¡s*t?d7ƒ‚|@|_|> @¡D]*\}:}.zRoot-Is-Purelibrårârã©Ústreamrr0rè)Údry_runTNr#úsize mismatch for %sú=údigest mismatch for %szlib_only: skipping %srér9rÎ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 %szAUnable to read legacy script metadata, so cannot generate scriptsrJzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srÚlibÚprefixzinstallation failed.)Grrðr@rQr4rorrrprqrrrŒrrr‘rrwrr÷rrÚrecordrTÚdont_write_bytecodeÚtempfileÚmkdtempÚ source_dirÚ target_dirÚshutilÚrmtreeÚinfolistÚ isinstancer r¿rÚstrÚ file_sizerrÐrÁÚ startswithrÜrÝrórÚ copy_streamr3Ú 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)CrFráÚmakerÚkwargsrrrZbc_hashed_invalidationrIr”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úrMr*rNÚsÚconsole_scriptsÚ gui_scriptsZ script_dirÚscriptÚoptionsr6r6r7ÚinstallÄsT                   ÿ   ÿ   ÿ     þÿÿ                     ÿ  z Wheel.installcCs8tdkr4tj tƒtdƒdtjdd…¡}t|ƒatS)Nz dylib-cachez%s.%sr#) Úcacher@rQr4rrrTÚ version_infor)rFrÉr6r6r7Ú_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)r@rQr4rorrrprqrrŒrrr‘r)r*rIÚ prefix_to_dirrÉrñÚmakedirsr+rr}ÚstatÚst_mtimeÚdatetimeÚ fromtimestampÚgetinfoÚ date_timeÚextractr3r’)rFrIr”r•rr–rRr—ržrŸrJrGrZ cache_baserprÄÚdestrRZ file_timer{Z wheel_timer6r6r7Ú_get_extensions³s>             zWheel._get_extensionscCst|ƒS)zM Determine if a wheel is compatible with the running system. )Ú is_compatiblerEr6r6r7rUÕszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr6rEr6r6r7Ú 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)r@rQryr4rorrrUrrVrTrÜrÝr3ÚinsertrTÚ_hookÚ meta_pathrK)rFr3rIÚmsgrJr6r6r7Úmountás"   z Wheel.mountcCsrtj tj |j|j¡¡}|tjkr2t d|¡n.rrr9ú..úinvalid entry in wheel: %rr#rr r )r@rQr4rorrrprqrrrŒrrr‘rrwrrrrr r¿rrrrrÐrÁ)rFrIr”rùr•r0r1r2r–r—r3rŸr£r™ršrÇržr4rÌrÊr7rr8r9r:r°r&r»r6r6r7rzs\            ÿ ÿ   ÿ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©rQ)rr rq)Úpath_mapr•rqrQrúr6r6r7Ú 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 ||dt d||¡dS)Nr%rz%s+1cSsg|] }t|ƒ‘qSr6r„)r‡rAr6r6r7r‰]sz8Wheel.update..update_version..rr'r¥z%s+%scss|]}t|ƒVqdSr:)rr†r6r6r7Ú `sz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rr_)rQÚlegacyzVersion updated from %r to %r) rr¯rwr4rrÜrÝr rqrórrÞ)rqrQÚupdatedrNrˆr5Zmdrcr6r6r7Úupdate_versionUs.    ÿ ÿ   ÿz$Wheel.update..update_versionrr€rÏr‚rr]r^Nz.whlz wheel-update-)r'rÚdirzNot a directory: %r)r@rQr4rorrrprqrrrrrr r¿rrRrrÚmkstempÚcloserñrÂr+rØrßrÚcopyfile)rFÚmodifierÚdest_dirr/rarerIr”r•r2r6r—r`r7rr8rQZoriginal_versionr&ÚmodifiedÚcurrent_versionÚfdÚnewpathrÓrÔr{r6r6r7rH:s\       ÿ    þ      z Wheel.update)NFF)N)NN)F)N)r]r^r_Ú__doc__r÷r·rGÚpropertyrrr}r~rr rŽr{r´rÁrÍrØrßrrrFrIrTrUrVr[r\rzrHr6r6r6r7r`ˆs@ )         hg "  8r`c 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¥r0z.abir'r#rcÚdarwinz(\w+)_(\d+)_(\d+)_(\w+)$)Úi386ÚppcÚfat)rsrtÚx86_64Zfat3)Úppc64rvÚfat64)rsrvÚintel)rsrvryrtrwÚ universalz %s_%s_%s_%srdr$)r1ÚrangerTrHr3r4rrWZ get_suffixesrrwrÅrîrWrïÚplatformÚrerur®r…Ú IMP_PREFIXrôÚset)ÚversionsÚmajorÚminorÚabisr'r&rRÚarchesr,rprmÚmatchesrurArlrˆrqr6r6r7Úcompatible_tagsŸs`                 & " "r†cCs\t|tƒst|ƒ}d}|dkr"t}|D]0\}}}||jkr&||jkr&||jkr&d}qXq&|S)NFT)rr`ÚCOMPATIBLE_TAGSrkrlrm)Úwheelr~rRÚverrlrmr6r6r7rUâs rU)N)TÚ __future__rr¼rŒrNÚdistutils.utilÚ distutilsÚemailrr¹rWr)Úloggingr@rr}rrTrrÚr0rrÚcompatrrr r r Zdatabaser r r rrÚutilrrrrrrrrrrqrrÚ getLoggerr]rÜrGÚhasattrr~r|rr2r1rHrjríÚ get_platformr?rïrîr8ÚcompileÚ IGNORECASEÚVERBOSErxrtr¨r­r¬r«rArÃÚobjectrBrXr`r†r‡rUr6r6r6r7ÚsŠ   ,       ø  ü    #>