U Wzf_¢žã@sšdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#ddlm$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*dd l+m,Z,e -d ¡Z.e -d ej/¡Z0e -d ¡Z1e -d ej/¡j2Z3d 4¡Z5ddddgZ6dZ7dZ8e8j9dj9ej:ŽedZ;dd„ZdCdd„Z?dDdd„Z@dEdd „ZAdedfd!d„ZBdFd"d#„ZCd$d%„ZDe -d&ej/¡ZEeDd'd(„ƒZFGd)d*„d*ƒZGGd+d,„d,eGƒZHGd-d„deƒZIe -d.¡jJZKd/d0„ZLd1d2„ZMdGd3d4„ZNd5d6„ZOGd7d8„d8ƒZPGd9d:„d:e jQƒZRejSjTfd;d<„ZUd=d>„ZVeNe7ƒeUƒZUd?d@„ZWdAdB„ZXdS)Hz#PyPI and direct package downloadingéN©Úwraps) Ú CHECKOUT_DISTÚ DistributionÚ BINARY_DISTÚnormalize_pathÚ SOURCE_DISTÚ EnvironmentÚfind_distributionsÚ safe_nameÚ safe_versionÚ to_filenameÚ RequirementÚ DEVELOP_DISTÚEGG_DIST)Ú ssl_support)Úlog)ÚDistutilsError)Ú translate)ÚWheelz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)zƒ([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgzÚ PackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameéz}ztd|fƒ|‚W5d}~XYnXdS)Nz1Not a URL, existing file, or requirement spec: %r)rÚparseÚ ValueErrorr)ÚspecÚe©r úp/private/var/folders/n9/53xbvtmd7sjg1q1l55xmpg58n4mgng/T/pip-unpacked-wheel-slp6y8a5/setuptools/package_index.pyÚparse_requirement_arg5s ÿþr"cCs°| ¡}d\}}}| d¡r¦| d¡r8|dd…}d}nn| dd¡rb|d d …}|dd…}d}nD| d ¡r~|dd …}d }n(| dd¡r¦|d d …}|dd…}d }|||fS)z=Return (base,pyversion) or (None,None) for possible .exe name)NNNú.exez .win32.exeNiöÿÿÿÚwin32z .win32-pyiðÿÿÿiùÿÿÿéüÿÿÿz.win-amd64.exeiòÿÿÿz win-amd64z .win-amd64-pyiìÿÿÿ)ÚlowerÚendswithÚ startswith)Únamer&ÚbaseÚpy_verÚplatr r r!r>s$            c Csxtj |¡}|\}}}}}}tj | d¡d¡}|dkrX|dkrXtj | d¡d¡}d|krp| dd¡\}}||fS)Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#é)ÚurllibrÚurlparseÚunquoteÚsplit) ÚurlÚpartsÚschemeÚserverÚpathÚ parametersÚqueryÚfragmentr*r r r!Úegg_info_for_urlVs r?ccs\t|ƒ\}}t|||ƒD] }|Vq|rXt |¡}|rXt|| d¡|tdD] }|VqLdS)zEYield egg or source distribution objects that might be found at a URLr2)Ú precedenceN)r?Údistros_for_locationÚ EGG_FRAGMENTÚmatchrÚgroupr)r7Úmetadatar*r>ÚdistrCr r r!ras  ÿ cCsä| d¡r|dd…}| d¡r8d|kr8t |||¡gS| d¡rxd|krxt|ƒ}| ¡s^gSt||j|jtddgS| d ¡rªt|ƒ\}}}|dk rªt ||||t |ƒSt D]0}| |¡r®|dt |ƒ …}t |||ƒSq®gS) z:Yield egg or source distribution objects based on basenameú.egg.zipNr%z.eggú-z.whlr2)ÚlocationÚ project_nameÚversionr@r#) r'rÚ from_locationrÚ is_compatiblerJrKrrrrÚ EXTENSIONSÚlen)rIÚbasenamerEÚwheelZwin_baser+ÚplatformÚextr r r!rAos<  û ÿ rAcCstt|ƒtj |¡|ƒS)zEYield possible egg or source distribution objects based on a filename)rArÚosr;rP)ÚfilenamerEr r r!Údistros_for_filenames  ÿrVc cs|| d¡}|s,tdd„|dd…Dƒƒr,dStdt|ƒdƒD]8}t||d |d|…¡d ||d…¡|||dVq>dS)zØGenerate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! rHcss|]}t d|¡VqdS)z py\d\.\d$N)ÚrerC)Ú.0Úpr r r!Ú ®sz(interpret_distro_name..éNr2)Ú py_versionr@rR)r6ÚanyÚrangerOrÚjoin)rIrPrEr\r@rRr8rYr r r!r—s ýccsdtƒ}|j}|dkr8t |j|¡D]}||ƒ|Vq"n(|D]"}||ƒ}||kr<||ƒ|Vq.wrapperr)rorpr rnr!Ú unique_valuesÍsrqz(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c csºt |¡D]d}| ¡\}}tttj| ¡ d¡ƒƒ}d|ksDd|kr t  |¡D]}t j   |t | d¡ƒ¡VqNq dD]@}| |¡}|dkrtt  ||¡}|rtt j   |t | d¡ƒ¡VqtdS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Zhomepager/r2)z Home PagezDownload URLr.N)ÚRELÚfinditerÚgroupsr`ÚmapÚstrÚstripr&r6ÚHREFr3rÚurljoinÚ htmldecoderDÚfindÚsearch)r7ÚpagerCÚtagÚrelZrelsÚposr r r!Úfind_external_linksÞs   r‚c@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr ©ÚselfÚblockr r r!ÚfeedöszContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr ©r…r r r!Úis_validüszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr )r…ÚreporterÚtemplater r r!ÚreportszContentChecker.reportN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r‡r‰rŒr r r r!rƒñsrƒc@sBeZdZe d¡Zdd„Zedd„ƒZdd„Z dd „Z d d „Z d S) Ú HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_t |¡|_||_dSrk)Ú hash_nameÚhashlibÚnewÚhashÚexpected)r…r’r–r r r!Ú__init__s zHashChecker.__init__cCs>tj |¡d}|stƒS|j |¡}|s0tƒS|f| ¡ŽS)z5Construct a (possibly null) ContentChecker from a URLr.)r3rr4rƒÚpatternr}Ú groupdict)Úclsr7r>rCr r r!Úfrom_urls zHashChecker.from_urlcCs|j |¡dSrk)r•Úupdater„r r r!r‡ szHashChecker.feedcCs|j ¡|jkSrk)r•Ú hexdigestr–rˆr r r!r‰#szHashChecker.is_validcCs||j}||ƒSrk)r’)r…rŠr‹Úmsgr r r!rŒ&s zHashChecker.reportN) rrŽrrWÚcompiler˜r—Ú classmethodr›r‡r‰rŒr r r r!r‘ sÿ r‘cs<eZdZdZdJdd„ZdKd d „ZdLd d „ZdMd d„Zdd„Zdd„Z dd„Z dd„Z dNdd„Z dd„Z dO‡fdd„ Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„ZdPd'd(„ZdQd)d*„Zd+d,„Zd-Zd.d/„Zd0d1„ZdRd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zdd?„ƒZ!d@dA„Z"dBdC„Z#dDdE„Z$dFdG„Z%dHdI„Z&‡Z'S)Trz;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTcOs”tj|f|ž|Ž|dd| d¡ …|_i|_i|_i|_t d  t t |ƒ¡¡j |_ g|_|ortjor|prt ¡}|r†t |¡|_n tjj|_dS)Nr-ú|)r r—r'Ú index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesrWrŸr_rvrrCÚallowsÚto_scanrZ is_availableZfind_ca_bundleZ opener_forÚopenerr3ÚrequestÚurlopen)r…r¥ÚhostsZ ca_bundleZ verify_sslrlÚkwZuse_sslr r r!r—.sÿ ýzPackageIndex.__init__Fc Csâ||jkr|sdSd|j|<t|ƒs2| |¡dStt|ƒƒ}|r\| |¡sPdS| d|¡|sn|rn||jkr‚tt|j |ƒƒdS| |¡sšd|j|<dS|  d|¡d|j|<d}|  |||¡}|dkrÐdSt |t jjƒrø|jdkrø|  d|j¡d|j|j<d|j d d ¡ ¡kr(| ¡dS|j}| ¡}t |tƒsvt |t jjƒrXd }n|j d ¡phd }| |d ¡}| ¡t |¡D](} t j |t|   d¡ƒ¡} | !| ¡qˆ| "|j#¡rÞt$|ddƒdkrÞ| %||¡}dS)z.)ÚfilterrTr;rÑr¹rbÚstarmapÚ scan_egg_link)r…Ú search_pathÚdirsZ egg_linksr r r!Úscan_egg_links•s þzPackageIndex.scan_egg_linksc CsŒttj ||¡ƒ}ttdttj|ƒƒƒ}W5QRXt |ƒdkrDdS|\}}t tj ||¡ƒD](}tjj|f|žŽ|_ t |_ | |¡q^dS)Nr[)ÚopenrTr;r_r¹rÜrvrwrxrOr rIrr@ra)r…r;rÛZ raw_linesÚlinesZegg_pathZ setup_pathrFr r r!rÞŸs  zPackageIndex.scan_egg_linkc s·fdd„}t |¡D]:}z |tj |t| d¡ƒ¡ƒWqtk rNYqXq||ƒ\}}|rÆt||ƒD]H}t |ƒ\}} |  d¡rª| sª|r |d||f7}n ˆ  |¡ˆ  |¡qlt  dd„|¡SdSd S) z#Process the contents of a PyPI pagecsŒ| ˆj¡rˆtttjj|tˆjƒd… d¡ƒƒ}t|ƒdkrˆd|dkrˆt |dƒ}t |dƒ}dˆj   |  ¡i¡|<t|ƒt|ƒfSdS)Nr-r[r1r2rT)NN)r(r¥r¹rvr3rr5rOr6r r r¨Ú setdefaultr&r )rÎr8ÚpkgÚverrˆr r!Úscan²s ÿ  z(PackageIndex.process_index..scanr2ú.pyz #egg=%s-%scSsd| ddd¡S)Nz%sr2ér[)rD)Úmr r r!ÚÕóz,PackageIndex.process_index..r²N)ryrtr3rrzr{rDrr‚r?r'Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub) r…r7r~rçrCråræÚnew_urlr*Úfragr rˆr!rɯs(      ÿzPackageIndex.process_indexcCs| d|¡dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©r…r7r r r!ríÚsþzPackageIndex.need_version_infocGs:|j|jkr*|r |j|f|žŽ| d¡| |j¡dS)Nz6Scanning index of all packages (this may take a while))r¥r§rÐr¼rî©r…ržrlr r r!róàs ÿzPackageIndex.scan_allcCsz| |j|jd¡|j |j¡s:| |j|jd¡|j |j¡sR| |¡t|j |jd¡ƒD]}| |¡qfdS)Nr-r ) rîr¥Ú unsafe_namer¨rÂrfrJÚnot_found_in_indexr¹)r…Ú requirementr7r r r!Ú find_packagesés zPackageIndex.find_packagescsR| ¡| |¡||jD]"}||kr0|S| d||¡qtt|ƒ ||¡S)Nz%s does not match %s)Úprescanrùrfr»ÚsuperrÚobtain)r…røÚ installerrF©Ú __class__r r!rüøs zPackageIndex.obtaincCsL| |jd|¡| ¡sH| ¡t |¡td|jjtj   |¡fƒ‚dS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) rŒr»r‰rÃrTÚunlinkrr•r)r;rP)r…ÚcheckerrUÚtfpr r r!Ú check_hashsþ þÿzPackageIndex.check_hashcCsN|D]D}|jdks0t|ƒr0| d¡s0tt|ƒƒr<| |¡q|j |¡qdS)z;Add `urls` to the list that will be prescanned for searchesNúfile:)rªr·r(r¹rrîÚappend)r…Úurlsr7r r r!Úadd_find_linkssÿþý ü zPackageIndex.add_find_linkscCs"|jrtt|j|jƒƒd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rªr¹rvrîrˆr r r!rú szPackageIndex.prescancCs<||jr|jd}}n |jd}}|||jƒ| ¡dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rfr¼rÐröró)r…røÚmethržr r r!r÷&s þ zPackageIndex.not_found_in_indexcCs~t|tƒsjt|ƒ}|rR| | d¡||¡}t|ƒ\}}| d¡rN| |||¡}|Stj   |¡rb|St |ƒ}t |  ||¡ddƒS)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r2rèrIN)r¾rr·Ú _download_urlrDr?r'Ú gen_setuprTr;rÏr"rÈÚfetch_distribution)r…rÚtmpdirr9Úfoundr*r>r r r!r/0s    zPackageIndex.downloadc s܈ d|¡i‰d}d ‡‡‡‡‡fdd„ }|rHˆ ¡ˆ |¡||ƒ}|s^|dk r^|||ƒ}|dkr€ˆjdk rxˆ ¡||ƒ}|dkrž|sžˆ |¡||ƒ}|dkr¾ˆ dˆr´dp¶d|¡nˆ d|¡|j|jd SdS) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNcs’|dkr ˆ}||jD]v}|jtkrFˆsF|ˆkrˆ d|¡dˆ|<q||ko\|jtkp\ˆ }|rˆ |jˆ¡}||_tj   |j¡r|SqdS)Nz&Skipping development or system egg: %sr2) rfr@rrÐrr/rIÚdownload_locationrTr;rÏ)ÚreqÚenvrFÚtestÚloc©Ú develop_okr…ÚskippedÚsourcer r r!r|js&ÿþz-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of r²zBest match: %s)rI)N)r¼rúrùrªrÐÚcloner) r…rør Ú force_scanrrZ local_indexrFr|r rr!r Rs2        ý zPackageIndex.fetch_distributioncCs"| ||||¡}|dk r|jSdS)a3Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)r rI)r…rør rrrFr r r!ÚfetchžszPackageIndex.fetchc Csüt |¡}|r*dd„t|| d¡dƒDƒp,g}t|ƒdkrÚtj |¡}tj |¡|krŠtj  ||¡}ddl m }|||ƒsŠt   ||¡|}ttj  |d¡dƒ2} |  d|dj|djtj |¡df¡W5QRX|S|rðtd ||fƒ‚ntd ƒ‚dS) NcSsg|]}|jr|‘qSr )rK)rXÚdr r r!Ú ­sÿz*PackageIndex.gen_setup..r2r)Úsamefilezsetup.pyÚwzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) z†Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rBrCrrDrOrTr;rPÚdirnamer_Zsetuptools.command.easy_installrÚshutilÚcopy2râÚwriterJrKÚsplitextr) r…rUr>r rCrËrPÚdstrr×r r r!r «sB  þý     þþÿþÿÿzPackageIndex.gen_setupi c Cs| d|¡d}zît |¡}| |¡}t|tjjƒrJt d||j |j fƒ‚| ¡}d}|j }d}d|kr’|  d¡} ttt| ƒƒ}| |||||¡t|dƒV} | |¡} | rà| | ¡|  | ¡|d7}| |||||¡qžqàqž| ||| ¡W5QRX|W¢S|r| ¡XdS) NzDownloading %szCan't download %s: %s %srr.zcontent-lengthzContent-LengthÚwbr2)r¼rÃr‘r›r½r¾r3r¿rÀrrµržÚ dl_blocksizeÚget_allÚmaxrvÚintÚ reporthookrârÄr‡r!r) r…r7rUÚfprrÁÚblocknumÚbsÚsizeÚsizesrr†r r r!Ú _download_toÖs:   ÿ     zPackageIndex._download_tocCsdSrkr )r…r7rUr+Zblksizer-r r r!r)úszPackageIndex.reporthookc Cs¨| d¡rt|ƒSzt||jƒWSttjjfk r†}z>d dd„|j Dƒ¡}|rb|  ||¡nt d||fƒ|‚W5d}~XYnt j jk r²}z |WY¢Sd}~XYnòt j jk r}z,|rÜ|  ||j¡nt d||jfƒ|‚W5d}~XYn¤tjjk rP}z.|r,|  ||j¡nt d||jfƒ|‚W5d}~XYnTtjjtj fk r¢}z*|r€|  ||¡nt d||fƒ|‚W5d}~XYnXdS)Nrú cSsg|] }t|ƒ‘qSr )rw)rXÚargr r r!rsz)PackageIndex.open_url..z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r(Ú local_openÚopen_with_authr«rÚhttpÚclientÚ InvalidURLr_rlrÐrr3r¿rÀÚURLErrorÚreasonÚ BadStatusLineÚlineÚ HTTPExceptionÚsocket)r…r7ÚwarningÚvržr r r!r½ýsJ $ÿÿþÿüÿÿzPackageIndex.open_urlcCsæt|ƒ\}}|r0d|kr4| dd¡ dd¡}qnd}| d¡rJ|dd…}tj ||¡}|dksj| d ¡rv| ||¡S|d ksˆ| d ¡r”| ||¡S| d ¡rª|  ||¡S|d krÊt j   t j  |¡d¡S| |d¡| ||¡SdS)Nz..Ú.ú\Ú_Z__downloaded__rGr%Úsvnzsvn+Úgitzgit+zhg+r×r[T)r?Úreplacer'rTr;r_r(Ú _download_svnÚ _download_gitÚ _download_hgr3r¬Ú url2pathnamerr4rºÚ_attempt_download)r…r9r7r r)r>rUr r r!r  s$        zPackageIndex._download_urlcCs| |d¡dS)NT)rÇrôr r r!rî=szPackageIndex.scan_urlcCs6| ||¡}d| dd¡ ¡kr.| |||¡S|SdS)Nr°r±r²)r/rÂr&Ú_download_html)r…r7rUrÁr r r!rI@s zPackageIndex._attempt_downloadcCsnt|ƒ}|D]>}| ¡r t d|¡rF| ¡t |¡| ||¡SqLq | ¡t |¡td|ƒ‚dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) râ���rx���rW���r}���rÃ���rT���r���rE��r���)r…���r7���rÁ���rU���r×���r:��r ���r ���r!���rJ��G��s����   zPackageIndex._download_htmlc�����������������C���s��t� dt¡�| dd¡d�}d}| ¡� d¡râd|krâtj |¡\}}}}}} |sâ| d¡râd |d d�…�krâ|d d�…� d d¡\}}t |ƒ\} } | râd | krº|  d d¡\} } d | | f�}nd | �}| }|||||| f}tj  |¡}|�  d||¡�t   d|||f�¡�|S�)Nz"SVN download support is deprecatedr1���r2���r���r²���zsvn:ú@z//r-���r[���ú:z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)ÚwarningsrÐ���Ú UserWarningr6���r&���r(���r3���r���r4���Ú _splituserÚ urlunparser¼���rT���Úsystem)r…���r7���rU���Úcredsr9���Únetlocr;���rY���ÚqrÍ���ÚauthÚhostÚuserÚpwr8���r ���r ���r!���rE��V��s&����   zPackageIndex._download_svnc�����������������C���sp���t�j |�¡\}}}}}| dd¡d�}| dd¡d�}d�}d|krR| dd¡\}}t�j ||||df¡}�|�|fS�)Nú+r2���r.���r1���r���rK��r²���)r3���r���Úurlsplitr6���ÚrsplitÚ urlunsplit)r7���Ú pop_prefixr9���rS��r;���r=���rò���Úrevr ���r ���r!���Ú_vcs_split_rev_from_urll��s����z$PackageIndex._vcs_split_rev_from_urlc�����������������C���sl���| �dd¡d�}|�j|dd\}}|� d||¡�t d||f�¡�|d�k rh|� d|¡�t d ||f�¡�|S�) Nr1���r2���r���T©r]��zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %s©r6���r_��r¼���rT���rQ��©r…���r7���rU���r^��r ���r ���r!���rF��~��s���� þzPackageIndex._download_gitc�����������������C���sl���| �dd¡d�}|�j|dd\}}|� d||¡�t d||f�¡�|d�k rh|� d|¡�t d ||f�¡�|S�) Nr1���r2���r���Tr`��zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qra��rb��r ���r ���r!���rG��Ž��s���� þzPackageIndex._download_hgc�����������������G���s���t�j|f|žŽ��d�S�rk���)r���r»���rõ���r ���r ���r!���r»���ž��s����zPackageIndex.debugc�����������������G���s���t�j|f|žŽ��d�S�rk���)r���r¼���rõ���r ���r ���r!���r¼���¡��s����zPackageIndex.infoc�����������������G���s���t�j|f|žŽ��d�S�rk���)r���rÐ���rõ���r ���r ���r!���rÐ���¤��s����zPackageIndex.warn)r¡���r¢���NT)F)F)F)N)N)FFFN)FF)N)F)(r���rŽ���r���r���r—���rÇ���r¸���rº���rá���rÞ���rÉ���rí���ró���rù���rü���r��r��rú���r÷���r/���r ��r��r ��r%��r/��r)��r½���r ��rî���rI��rJ��rE��Ú staticmethodr_��rF��rG��r»���r¼���rÐ���Ú __classcell__r ���r ���rþ���r!���r���+��sX���������þ  5   +   #������þ L )$ # z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�����������������C���s���|� �d¡}t |¡S�)Nr���)rD���r°���Úunescape)rC���Úwhatr ���r ���r!���Ú decode_entity­��s���� rg��c�����������������C���s ���t�t|�ƒS�)a�� Decode HTML entities in the given text. >>> htmldecode( ... 'https://../package_name-0.1.2.tar.gz' ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' )Ú entity_subrg��)Útextr ���r ���r!���r{���²��s���� r{���c��������������������s���‡�fdd„}|S�)Nc��������������������s���‡�‡fdd„}|S�)Nc��������������� ������s2���t� ¡�}t� ˆ¡�zˆ�|�|ŽW�¢S�t� |¡�X�d�S�rk���)r<��ÚgetdefaulttimeoutÚsetdefaulttimeout)rl���rm���Z old_timeout)ro���Útimeoutr ���r!���Ú_socket_timeoutÀ��s ���� z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr ���)ro���rm��©rl��rn���r!���rm��¿��s����z'socket_timeout.<locals>._socket_timeoutr ���)rl��rm��r ���rn��r!���Úsocket_timeout¾��s���� ro��c�����������������C���s2���t�j |�¡}| ¡�}t |¡}| ¡�}| dd¡S�)a9�� Encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False Ú r²���)r3���r���r5���ÚencodeÚbase64Ú b64encoderÆ���rD��)rU��Zauth_sZ auth_bytesZ encoded_bytesÚencodedr ���r ���r!���Ú _encode_authÍ��s ����  ru��c�������������������@���s(���e�Zd�ZdZdd„�Zdd„�Zdd„�ZdS�) Ú Credentialz: A username/password pair. Use like a namedtuple. c�����������������C���s���||�_�||�_d�S�rk���©ÚusernameÚpassword)r…���rx��ry��r ���r ���r!���r—���ç��s����zCredential.__init__c�����������������c���s���|�j�V��|�jV��d�S�rk���rw��rˆ���r ���r ���r!���Ú__iter__ë��s����zCredential.__iter__c�����������������C���s ���dt�|�ƒ�S�)Nz%(username)s:%(password)s)Úvarsrˆ���r ���r ���r!���Ú__str__ï��s����zCredential.__str__N)r���rŽ���r���r���r—���rz��r|��r ���r ���r ���r!���rv��â��s���rv��c�������������������@���s0���e�Zd�Zdd„�Zedd„�ƒZdd„�Zdd„�Zd S�) Ú PyPIConfigc�����������������C���sP���t� dddgd¡}tj |�|¡�tj tj d¡d¡}tj  |¡rL|�  |¡�dS�)z% Load from ~/.pypirc rx��ry��Ú repositoryr²���ú~z.pypircN) ÚdictÚfromkeysÚ configparserÚRawConfigParserr—���rT���r;���r_���Ú expanduserrÏ���rÄ���)r…���ÚdefaultsÚrcr ���r ���r!���r—���ô��s ���� zPyPIConfig.__init__c��������������������s&���‡�fdd„ˆ� �¡�D�ƒ}ttˆ�j|ƒƒS�)Nc��������������������s ���g�|�]}ˆ� �|d�¡ ¡�r|‘qS�)r~��)rÂ���rx���)rX���Úsectionrˆ���r ���r!���r����s���ÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Úsectionsr€��rv���Ú_get_repo_cred)r…���Zsections_with_repositoriesr ���rˆ���r!���Úcreds_by_repositoryÿ��s���� ÿzPyPIConfig.creds_by_repositoryc�����������������C���s6���|� �|d¡ ¡�}|t|� �|d¡ ¡�|� �|d¡ ¡�ƒfS�)Nr~��rx��ry��)rÂ���rx���rv��)r…���r‡��Úrepor ���r ���r!���r‰����s ����þzPyPIConfig._get_repo_credc�����������������C���s*���|�j� ¡�D�]\}}| |¡r |��S�q dS�)zŒ If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)rŠ��Úitemsr(���)r…���r7���r~��Úcredr ���r ���r!���Úfind_credential��s���� zPyPIConfig.find_credentialN)r���rŽ���r���r—���ÚpropertyrŠ��r‰��rŽ��r ���r ���r ���r!���r}��ó��s ���  r}��c�����������������C���s<��t�j |�¡}|\}}}}}}| d¡r2tj d¡‚|dkrHt|ƒ\} } nd} | s€tƒ�  |�¡} | r€t | ƒ} | j |�f} t j d | žŽ��| rÆdt| ƒ�} || ||||f} t�j | ¡}t�j |¡}| d| ¡�n t�j |�¡}| dt¡�||ƒ}| r8t�j |j¡\}}}}}}||kr8|| kr8||||||f} t�j | ¡|_|S�) z4Open a urllib2 request, handling HTTP authenticationrL��znonnumeric port: '')r4��ÚhttpsNú*Authenticating as %s for %s (from .pypirc)zBasic Ú Authorizationz User-Agent)r‘��)r3���r���r4���r'���r4��r5��r6��rO��r}��rŽ��rw���rx��r���r¼���ru��rP��r¬���ÚRequestÚ add_headerÚ user_agentr7���)r7���r«���Úparsedr9���rS��r;���Úparamsr=���rò���rU��Úaddressr��r¼���r8���rñ���r¬���r*��Ús2Úh2Úpath2Zparam2Zquery2Zfrag2r ���r ���r!���r3����s8����          r3��c�����������������C���s ���|� �d¡\}}}�|r|nd|�fS�)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.rK��N)Ú rpartition)rV��rW��Údelimr ���r ���r!���rO��H��s����rO��c�����������������C���s���|�S�rk���r ���)r7���r ���r ���r!���Ú fix_sf_urlS��s����rž��c�������������� ���C���s��t�j |�¡\}}}}}}t�j |¡}tj |¡r<t�j |�¡S�|  d¡rètj  |¡règ�}t  |¡D�]d} tj  || ¡} | dkržt | dƒ} |  ¡�} W�5�Q�R�X��qÞntj  | ¡r²| d7�} | dj| d¡�q`d} | j|�d  |¡d} d \}}n d \}}} d d i}t | ¡}t�j |�||||¡S�) z7Read a local path, with special support for directoriesr-���z index.htmlÚrz<a href="{name}">{name}</a>)r)���zB<html><head><title>{url}{files}rp)r7Úfiles)éÈÚOK)r¶zPath not foundz Not foundr±z text/html)r3rr4r¬rHrTr;Úisfiler­r'rÑrÓr_rârÄrÚformatÚioÚStringIOr¿rÀ)r7r9r:r;Úparamr=ròrUr rÍÚfilepathr*ÚbodyrÌÚstatusÚmessagerÁZ body_streamr r r!r2Ws.     ÿ   r2)N)N)N)N)r)YrÚsysrTrWr¥rr<rrr“rbrMr‚r°Ú http.clientr4Ú urllib.parser3Úurllib.requestÚ urllib.errorÚ functoolsrrÚ pkg_resourcesrrrrrr r r r r rrrrÚ distutilsrÚdistutils.errorsrÚfnmatchrZsetuptools.wheelrrŸrBÚIryrïrCr·r6rNÚ__all__Z_SOCKET_TIMEOUTZ_tmplr¤Ú version_infor•r"rr?rrArVrrjrqrsr‚rƒr‘rrðrhrgr{rorurvrƒr}r¬r­r3rOržr2r r r r!Úsš <      ÿþ ÿ   ! þ $   !  &/