Ë
    0A7hÛ›  ã                   ó&  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlmZ ddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, dd	l-m.Z.  ej^                  d
«      Z0 ej^                  dejb                  «      Z2 ej^                  d«      Z3 ej^                  dejb                  «      jh                  Z5djm                  «       Z7g d¢Z8dZ9dZ:e:jw                   djv                  ejx                  Ž e¬«      Z=d„ Z>d„ Z?d„ Z@d1d„ZAd1d„ZBd1d„ZCdedfd„ZDd„ ZE ej^                  dejb                  «      ZF	 eEd„ «       ZG G d„ d«      ZH G d „ d!eH«      ZI G d"„ d#e«      ZJ ej^                  d$«      j–                  ZLd%„ ZMd&„ ZNd2d'„ZOd(„ ZP G d)„ d*«      ZQ G d+„ d,ej¤                  «      ZSej¨                  jª                  fd-„ZVd.„ ZW  eOe9«      eV«      ZVd/„ ZXd0„ ZYy)3z$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Úparse_version)Úlog)ÚDistutilsError)Ú	translate)ÚWheel©Úunique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)zƒ<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz)ÚPackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameé   z<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})Úpy_majorÚ
setuptoolsc                 ón   — 	 t        j                  | «      S # t        $ r}t        d| ›�«      |‚d }~ww xY w)Nz/Not a URL, existing file, or requirement spec: )r   ÚparseÚ
ValueErrorr   )ÚspecÚes     ú:/usr/lib/python3/dist-packages/setuptools/package_index.pyÚparse_requirement_argr&   E   s>   € ðÜ× Ñ  Ó&Ð&øÜò ÝÙCGÐIó
àð	ûðús   ‚ —	4 /¯4c                 ó8  — | j                  «       }d\  }}}|j                  d«      ro|j                  d«      r| dd }d}nV|j                  dd«      r| d	d
 }| dd }d}n7|j                  d«      r| dd }d}n|j                  dd«      r| d	d
 }| dd }d}|||fS )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Úplats        r%   r   r   N   sÃ   € ð �J‰J‹L€EØ)Ñ€Dˆ&�$à‡~�~�fÔØ�>‰>˜,Ô'Ø˜˜�:ˆDØ‰DØ×Ñ˜k¨3Ô/Ø˜"˜R�[ˆFØ˜˜�:ˆDØ‰DØ�^‰^Ð,Ô-Ø˜˜�:ˆDØ‰DØ×Ñ˜o¨sÔ3Ø˜"˜R�[ˆFØ˜˜�:ˆDØˆDØ�˜ÐÐó    c                 ód  — t         j                  j                  | «      }|\  }}}}}}t         j                  j                  |j	                  d«      d   «      }|dk(  r6|dk(  r1t         j                  j                  |j	                  d«      d   «      }d|v r|j	                  dd«      \  }}||fS )Nú/éÿÿÿÿzsourceforge.netÚdownloadéþÿÿÿú#é   )Úurllibr!   ÚurlparseÚunquoteÚsplit)	ÚurlÚpartsÚschemeÚserverÚpathÚ
parametersÚqueryÚfragmentr/   s	            r%   Úegg_info_for_urlrF   f   sŸ   € Ü�L‰L×!Ñ! #Ó&€EØ8=Ñ5€FˆF�D˜* e¨XÜ�<‰<×Ñ §
¡
¨3£°Ñ 3Ó4€DØÐ"Ò" t¨zÒ'9Ü�|‰|×#Ñ# D§J¡J¨s£O°BÑ$7Ó8ˆØ
ˆd�{ØŸ™ C¨Ó+‰ˆˆhØ�ˆ>Ðr2   c              #   óà   K  — t        | «      \  }}t        | ||«      D ]  }|–— Œ |rDt        j                  |«      }|r,t	        | |j                  d«      |t        ¬«      D ]  }|–— Œ yyy­w)zEYield egg or source distribution objects that might be found at a URLr9   )Ú
precedenceN)rF   Údistros_for_locationÚEGG_FRAGMENTÚmatchr   Úgroupr   )r>   Úmetadatar/   rE   ÚdistrK   s         r%   r   r   q   s}   è ø€ ä% cÓ*�N€Dˆ(Ü$ S¨$°Ó9ò ˆØ‹
ðáÜ×"Ñ" 8Ó,ˆÙÜ-Ø�U—[‘[ “^ X¼-ôò �ð “
ñð ð ùs   ‚A,A.c                 ó&  — |j                  d«      r|dd }|j                  d«      rd|v rt        j                  | ||«      gS |j                  d«      rLd|v rHt        |«      }|j	                  «       sg S t        | |j
                  |j                  t        dz   ¬«      gS |j                  d	«      r%t        |«      \  }}}|�t        | |||t        |«      S t        D ]1  }|j                  |«      sŒ|dt        |«        }t        | ||«      c S  g S )
z:Yield egg or source distribution objects based on basenameú.egg.zipNr*   z.eggú-z.whlr9   )ÚlocationÚproject_nameÚversionrH   r(   )r,   r   Úfrom_locationr   Úis_compatiblerS   rT   r   r   r   r   Ú
EXTENSIONSÚlen)rR   ÚbasenamerM   ÚwheelÚwin_baser0   ÚplatformÚexts           r%   rI   rI      s+  € à×Ñ˜Ô$Ø˜C˜R�=ˆØ×Ñ˜Ô  S¨H¡_ä×*Ñ*¨8°X¸xÓHÐIÐIØ×Ñ˜Ô  S¨H¡_Ü�h“ˆØ×"Ñ"Ô$ØˆIäØ!Ø"×/Ñ/ØŸ™ä# a™<ôð
ð 	
ð ×Ñ˜Ô Ü%8¸Ó%BÑ"ˆ�&˜(ØÐÜ(Ø˜( H¨f´kÀ8óð ô
 ò GˆØ×Ñ˜SÕ!Ø ¤3 s£8 )Ð,ˆHÜ(¨°8¸XÓFÒFðGð €Ir2   c                 óh   — t        t        | «      t        j                  j	                  | «      |«      S )zEYield possible egg or source distribution objects based on a filename)rI   r   ÚosrB   rY   )ÚfilenamerM   s     r%   Údistros_for_filenamera   ¢   s*   € äÜ�xÓ ¤"§'¡'×"2Ñ"2°8Ó"<¸hóð r2   c           
   #   óF  K  — |j                  d«      }|st        d„ |dd D «       «      ryt        t        |«      «      D ]  }||   dd j	                  «       sŒ n t        |«      }t        | |dj                  |d| «      dj                  ||d «      |||¬«      –— y­w)zÏGenerate the interpretation 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!
    rQ   c              3   óH   K  — | ]  }t        j                  d |«      –— Œ y­w)z	py\d\.\d$N)ÚrerK   )Ú.0Úps     r%   ú	<genexpr>z(interpret_distro_name.<locals>.<genexpr>´   s   è ø€ ÒK¸AœbŸh™h |°Q×7ÑKùs   ‚ "é   Nr9   )Ú
py_versionrH   r\   )r=   ÚanyÚrangerX   Úisdigitr   Újoin)rR   rY   rM   ri   rH   r\   r?   rf   s           r%   r   r   ©   s­   è ø€ ð �N‰N˜3Ó€EÙœ#ÑKÀÀqÀrÀÔKÔKàô ”3�u“:Óò ˆØ�‰8�B�Qˆ<×ÑÕ!Ùðô �‹Jˆä
ØØØ�‰��r˜�ÓØ�‰��q�r�ÓØØØôó ùs   ‚AB!ÁAB!c                 ó.   ‡ — t        ‰ «      ˆ fd„«       }|S )zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    c                  ó&   •— t         ‰| i |¤Ž«      S ©Nr   )ÚargsÚkwargsÚfuncs     €r%   Úwrapperzunique_values.<locals>.wrapperÑ   s   ø€ ä™t TÐ4¨VÑ4Ó5Ð5r2   r   )rs   rt   s   ` r%   Úunique_valuesru   Ë   s"   ø€ ô ˆ4ƒ[ó6ó ð6ð €Nr2   z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c           
   #   ó‚  K  — t         j                  |«      D ]²  }|j                  «       \  }}t        t	        t
        j                  |j                  «       j                  d«      «      «      }d|v sd|v sŒ_t        j                  |«      D ]<  }t        j                  j                  | t        |j                  d«      «      «      –— Œ> Œ´ dD ]l  }|j                  |«      }|dk7  sŒt        j!                  ||«      }|sŒ3t        j                  j                  | t        |j                  d«      «      «      –— Œn y­w)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Úhomepager6   r9   )z<th>Home Pagez<th>Download URLr5   N)ÚRELÚfinditerÚgroupsÚsetÚmapÚstrÚstripr+   r=   ÚHREFr:   r!   ÚurljoinÚ
htmldecoderL   ÚfindÚsearch)r>   ÚpagerK   ÚtagÚrelÚrelsÚposs          r%   Úfind_external_linksrŠ   Þ   s  è ø€ ô —‘˜dÓ#ò LˆØ—<‘<“>‰ˆˆSÜ”3”s—y‘y #§)¡)£+×"3Ñ"3°CÓ"8Ó9Ó:ˆØ˜Ñ ¨tÒ!3ÜŸ™ sÓ+ò L�Ü—l‘l×*Ñ*¨3´
¸5¿;¹;Àq»>Ó0JÓKÓKñLð	Lð 5ò LˆØ�i‰i˜‹nˆØ�"‹9Ü—K‘K  cÓ*ˆEÚÜ—l‘l×*Ñ*¨3´
¸5¿;¹;Àq»>Ó0JÓKÓKñLùs   ‚A4D?Á7A1D?Ã)D?Ä=D?c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚContentCheckerzP
    A null content checker that defines the interface for checking content
    c                  ó   — y)z3
        Feed a block of data to the hash.
        N© ©ÚselfÚblocks     r%   ÚfeedzContentChecker.feedö   s   € ð 	r2   c                  ó   — y)zC
        Check the hash. Return False if validation fails.
        TrŽ   ©r�   s    r%   Úis_validzContentChecker.is_validü   s   € ð r2   c                  ó   — y)zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        NrŽ   )r�   ÚreporterÚtemplates      r%   ÚreportzContentChecker.report  s   € ð
 	r2   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r’   r•   r™   rŽ   r2   r%   rŒ   rŒ   ñ   s   „ ñòòór2   rŒ   c                   óX   — e Zd Z ej                  d«      Zd„ Zed„ «       Zd„ Z	d„ Z
d„ Zy)ÚHashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c                 óT   — || _         t        j                  |«      | _        || _        y rp   )Ú	hash_nameÚhashlibÚnewÚhashÚexpected)r�   r¡   r¥   s      r%   Ú__init__zHashChecker.__init__  s    € Ø"ˆŒÜ—K‘K 	Ó*ˆŒ	Ø ˆ�r2   c                 óØ   — t         j                  j                  |«      d   }|s
t        «       S | j                  j                  |«      }|s
t        «       S  | di |j                  «       ¤ŽS )z5Construct a (possibly null) ContentChecker from a URLr5   rŽ   )r:   r!   r;   rŒ   Úpatternr„   Ú	groupdict)Úclsr>   rE   rK   s       r%   Úfrom_urlzHashChecker.from_url  s^   € ô —<‘<×(Ñ(¨Ó-¨bÑ1ˆÙÜ!Ó#Ð#Ø—‘×"Ñ" 8Ó,ˆÙÜ!Ó#Ð#ÙÑ'�U—_‘_Ó&Ñ'Ð'r2   c                 ó:   — | j                   j                  |«       y rp   )r¤   Úupdater�   s     r%   r’   zHashChecker.feed   s   € Ø�	‰	×Ñ˜Õr2   c                 óP   — | j                   j                  «       | j                  k(  S rp   )r¤   Ú	hexdigestr¥   r”   s    r%   r•   zHashChecker.is_valid#  s   € Ø�y‰y×"Ñ"Ó$¨¯©Ñ5Ð5r2   c                 ó0   — || j                   z  } ||«      S rp   )r¡   )r�   r—   r˜   Úmsgs       r%   r™   zHashChecker.report&  s   € Ø˜Ÿ™Ñ'ˆÙ˜‹}Ðr2   N)rš   r›   rœ   rd   Úcompiler¨   r¦   Úclassmethodr«   r’   r•   r™   rŽ   r2   r%   rŸ   rŸ   
  s?   „ Øˆb�j‰jð	#ó€Gò
!ð
 ñ(ó ð(ò ò6ór2   rŸ   c                   ó@  ‡ — e Zd ZdZ	 	 	 	 d'ˆ fd„	Zˆ fd„Zd(d„Zd(d„Zd(d„Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd)d„Zd„ Zd)ˆ fd„	Zd„ Zd„ Zd„ Zd„ Zd„ Z	 	 	 	 d*d„Zd+d„Zd„ ZdZd„ Zd„ Zd)d„Zed„ «       Zd„ Zed„ «       Z d„ Z!d„ Z"d „ Z#d!„ Z$d"„ Z%ed#„ «       Z&d$„ Z'd%„ Z(d&„ Z)ˆ xZ*S ),r   z;A distribution index that scans web pages for download URLsc                 óV  •— t        ‰| �  |i |¤Ž |dd |j                  d«        z   | _        i | _        i | _        i | _        t        j                  dj                  t        t        |«      «      «      j                  | _        g | _        t        j                   j"                  | _        y )Nr4   ú|)Úsuperr¦   r,   Ú	index_urlÚscanned_urlsÚfetched_urlsÚpackage_pagesrd   r²   rm   r}   r   rK   ÚallowsÚto_scanr:   ÚrequestÚurlopenÚopener)r�   r¸   ÚhostsÚ	ca_bundleÚ
verify_sslrq   ÚkwÚ	__class__s          €r%   r¦   zPackageIndex.__init__.  s�   ø€ ô 	‰Ñ˜$Ð% "Ò%Ø" SÐ)F¨y×/AÑ/AÀ#Ó/FÐ+FÐ%GÑGˆŒØˆÔØˆÔØˆÔÜ—j‘j §¡¬#¬i¸Ó*?Ó!@ÓA×GÑGˆŒØˆŒÜ—n‘n×,Ñ,ˆ�r2   c                 ól   •— 	 t        |j                  «       t        ‰| �  |«      S # t        $ r Y y w xY wrp   )r   rT   Ú	Exceptionr·   Úadd)r�   rN   rÅ   s     €r%   rÈ   zPackageIndex.add@  s9   ø€ ð	Ü˜$Ÿ,™,Ô'ô ‰w‰{˜4Ó Ð øô ò 	Ùð	ús   ƒ' §	3²3c           	      óÈ  — || j                   v r|syd| j                   |<   t        |«      s| j                  |«       yt        t	        |«      «      }|r$| j                  |«      sy| j                  d|«       |s|r|| j                  v r t        t        | j                  |«      «       y| j                  |«      sd| j                  |<   y| j                  d|«       d| j                  |<   d}| j                  |||z  «      }|€yt        |t        j                  j                  «      r-|j                   dk(  r| j                  d|j"                  z  «       d| j                  |j$                  <   d|j&                  j)                  d	d
«      j+                  «       vr|j-                  «        y|j$                  }|j/                  «       }t        |t0        «      sXt        |t        j                  j                  «      rd}n|j&                  j3                  d«      xs d}|j5                  |d«      }|j-                  «        t6        j9                  |«      D ]K  }	t        j:                  j=                  |t?        |	jA                  d«      «      «      }
| jC                  |
«       ŒM |jE                  | jF                  «      r$tI        |dd«      dk7  r| jK                  ||«      }yyy)z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!i‘  zAuthentication error: %sÚhtmlúcontent-typeÚ zlatin-1ÚcharsetÚignorer9   Úcodeé”  )&r¹   Ú
URL_SCHEMEÚprocess_filenameÚlistr   Úurl_okÚdebugrº   r}   rÈ   ÚinfoÚopen_urlÚ
isinstancer:   ÚerrorÚ	HTTPErrorrÏ   r±   r>   ÚheadersÚgetr+   ÚcloseÚreadr~   Ú	get_paramÚdecoder€   rz   r!   r�   r‚   rL   Úprocess_urlr-   r¸   ÚgetattrÚprocess_index)r�   r>   ÚretrieveÚdistsÚtmplÚfr/   r…   rÍ   rK   Úlinks              r%   rá   zPackageIndex.process_urlI  sV  € à�$×#Ñ#Ñ#©HØØ!%ˆ×Ñ˜#ÑÜ˜#ŒØ×!Ñ! #Ô&Øäœ¨Ó-Ó.ˆEÙØ—{‘{ 3Ô'ØØ—
‘
Ð+¨SÔ1á™ C¨4×+<Ñ+<Ñ$<Ü”�T—X‘X˜uÓ%Ô&Øà�{‰{˜3ÔØ%)ˆD×Ñ˜cÑ"Øà�	‰	�, Ô$Ø!%ˆ×Ñ˜#ÑØMˆØ�M‰M˜#˜t c™zÓ*ˆØˆ9ØÜ�aœŸ™×/Ñ/Ô0°Q·V±V¸s²]Ø�I‰IÐ0°1·5±5Ñ8Ô9Ø#'ˆ×Ñ˜!Ÿ%™%Ñ Ø˜Ÿ™Ÿ™ ~°rÓ:×@Ñ@ÓBÑBØ�G‰GŒIØà�u‰uˆØ�v‰v‹xˆÜ˜$¤Ô$ä˜!œVŸ\™\×3Ñ3Ô4à#‘àŸ)™)×-Ñ-¨iÓ8ÒE¸I�Ø—;‘;˜w¨Ó1ˆDØ	�‰Œ	Ü—]‘] 4Ó(ò 	#ˆEÜ—<‘<×'Ñ'¨¬j¸¿¹ÀQ»Ó.HÓIˆDØ×Ñ˜TÕ"ð	#ð �>‰>˜$Ÿ.™.Ô)¬g°a¸ÀÓ.FÈ#Ò.MØ×%Ñ% c¨4Ó0‰Dð /NÐ)r2   c                 óú  — t         j                  j                  |«      s| j                  d|«       y t         j                  j	                  |«      rk|sit         j                  j                  |«      }t        j                  |«      D ]2  }| j                  t         j                  j                  ||«      d«       Œ4 t        |«      }|r2| j                  d|«       t        t        | j                  |«      «       y y )NzNot found: %sTz	Found: %s)r_   rB   ÚexistsÚwarnÚisdirÚrealpathÚlistdirrÒ   rm   ra   rÕ   rÓ   r}   rÈ   )r�   ÚfnÚnestedrB   Úitemrå   s         r%   rÒ   zPackageIndex.process_filename~  s·   € ä�w‰w�~‰~˜bÔ!Ø�I‰I�o rÔ*Øä�7‰7�=‰=˜Ô¡VÜ—7‘7×#Ñ# BÓ'ˆDÜŸ
™
 4Ó(ò F�Ø×%Ñ%¤b§g¡g§l¡l°4¸Ó&>ÀÕEðFô % RÓ(ˆÙØ�J‰J�{ BÔ'Ü”�T—X‘X˜uÓ%Õ&ð r2   c                 ó  — t        |«      }|xr" |j                  d«      j                  «       dk(  }|s1| j                  t        j
                  j                  |«      d   «      ryd}|rt        ||z  «      ‚| j                  ||«       y )Nr9   ÚfileTz¡
Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details).
)	rÑ   rL   r+   r¼   r:   r!   r;   r   rë   )r�   r>   ÚfatalÚsÚis_filer±   s         r%   rÔ   zPackageIndex.url_okŽ  s}   € Ü�s‹OˆØÒ4˜Ÿ™ ›
×(Ñ(Ó*¨fÑ4ˆÙ�d—k‘k¤&§,¡,×"7Ñ"7¸Ó"<¸QÑ"?Ô@ØðWð 	ñ
 Ü   s¡Ó+Ð+à�I‰I�c˜3Õr2   c                 ó°   — t        t        j                  j                  |«      }d„ |D «       }t	        t        j                  | j                  |«      «       y )Nc              3   óz   K  — | ]3  }t        j                  |«      D ]  }|j                  d «      r||f–— Œ Œ5 y­w)z	.egg-linkN)r_   rî   r,   )re   rB   Úentrys      r%   rg   z.PackageIndex.scan_egg_links.<locals>.<genexpr>Ÿ  sF   è ø€ ò 
àÜŸ™ DÓ)ò
ð Ø�~‰~˜kÔ*ð �5ŒMð
Øñ
ùs   ‚9;)Úfilterr_   rB   rì   rÓ   Ú	itertoolsÚstarmapÚscan_egg_link)r�   Úsearch_pathÚdirsÚ	egg_linkss       r%   Úscan_egg_linkszPackageIndex.scan_egg_links�  sB   € Ü”b—g‘g—m‘m [Ó1ˆñ
àô
ˆ	ô 	ŒY×Ñ˜t×1Ñ1°9Ó=Õ>r2   c           
      óà  — t        t        j                  j                  ||«      «      5 }t	        t        d t        t        j                  |«      «      «      }d d d «       t        «      dk7  ry |\  }}t        t        j                  j                  ||«      «      D ]C  }t        j                  j                  |g|¢­Ž |_        t        |_        | j                  |«       ŒE y # 1 sw Y   Œ�xY w)Nrh   )Úopenr_   rB   rm   rÓ   rú   r}   r~   r   rX   r   rR   r	   rH   rÈ   )r�   rB   rù   Ú	raw_linesÚlinesÚegg_pathÚ
setup_pathrN   s           r%   rý   zPackageIndex.scan_egg_link§  s¸   € Ü”"—'‘'—,‘,˜t UÓ+Ó,ð 	B°	äœ ¤c¬#¯)©)°YÓ&?Ó@ÓAˆE÷	Bô ˆu‹:˜Š?àà$Ñˆ�*ä&¤r§w¡w§|¡|°D¸(Ó'CÓDò 	ˆDÜŸG™GŸL™L¨Ð6°Ò6ˆDŒMÜ)ˆDŒOØ�H‰H�T�Nñ	÷	Bð 	Bús   ª.C$Ã$C-c           	      óÐ  — d}|j                  | j                  «      s|S t        t        t        j
                  j                  |t        | j                  «      d  j                  d«      «      «      }t        |«      dk7  sd|d   v r|S t        |d   «      }t        |d   «      }d| j                  j                  |j                  «       i «      |<   t        |«      t        |«      fS )N)NNr4   rh   r8   r9   r   T)r-   r¸   rÓ   r}   r:   r!   r<   rX   r=   r   r   r»   Ú
setdefaultr+   r   )r�   rè   ÚNO_MATCH_SENTINELr?   ÚpkgÚvers         r%   Ú_scanzPackageIndex._scan·  sÇ   € à&ÐØ�‰˜tŸ~™~Ô.Ø$Ð$ä”SœŸ™×-Ñ-¨t´C¸¿¹Ó4GÐ4IÐ/J×/PÑ/PÐQTÓ/UÓVÓWˆÜˆu‹:˜Š?˜c U¨1¡X™oØ$Ð$ô ˜˜a™Ó!ˆÜ˜5 ™8Ó$ˆØ?Cˆ×Ñ×%Ñ% c§i¡i£k°2Ó6°tÑ<Ü˜3Ó¤¨SÓ!1Ð1Ð1r2   c                 ó  — t         j                  |«      D ]J  }	 | j                  t        j                  j                  |t        |j                  d«      «      «      «       ŒL | j                  |«      \  }}|syt        ||«      D ]S  }t        |«      \  }}|j                  d«      r!|s|r|d|›d|›�z  }n| j                  |«       | j                  |«       ŒU t        j                  d„ |«      S # t        $ r Y Œèw xY w)z#Process the contents of a PyPI pager9   rÌ   ú.pyz#egg=rQ   c                 ó.   — d| j                  ddd«      z  S )Nz<a href="%s#md5=%s">%s</a>r9   é   rh   )rL   )Úms    r%   ú<lambda>z,PackageIndex.process_index.<locals>.<lambda>á  s   € Ð2°Q·W±W¸QÀÀ1Ó5EÑE€ r2   )r€   rz   r  r:   r!   r�   r‚   rL   r"   rŠ   rF   r,   Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub)	r�   r>   r…   rK   r  r  Únew_urlr/   Úfrags	            r%   rã   zPackageIndex.process_indexÇ  sð   € ô —]‘] 4Ó(ò 	ˆEðØ—
‘
œ6Ÿ<™<×/Ñ/°´ZÀÇÁÈAÃÓ5OÓPÕQð	ð —:‘:˜c“?‰ˆˆSÙØô +¨3°Ó5ò 	#ˆGä)¨'Ó2‰JˆD�$Ø�}‰}˜UÔ#©DÙÙªs±CÐ8Ñ8‘Gà×*Ñ*¨3Ô/Ø�M‰M˜'Õ"ð	#ô �|‰|ÙEÀtó
ð 	
øô% ò Ùðús   šAC3Ã3	C?Ã>C?c                 ó(   — | j                  d|«       y )NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©r�   r>   s     r%   r  zPackageIndex.need_version_infoä  s   € Ø�‰ð àõ	
r2   c                 ó¶   — | j                   | j                  vr&|r | j                  |g|¢­Ž  | j                  d«       | j	                  | j                   «       y )Nz6Scanning index of all packages (this may take a while))r¸   rº   rë   rÖ   r  ©r�   r±   rq   s      r%   r  zPackageIndex.scan_allë  sG   € Ø�>‰> ×!2Ñ!2Ñ2ÙØ�—	‘	˜#Ð% Ó%Ø�I‰IÐNÔOØ�‰�d—n‘nÕ%r2   c                 óð  — | j                  | j                  |j                  z   dz   «       | j                  j	                  |j
                  «      s+| j                  | j                  |j                  z   dz   «       | j                  j	                  |j
                  «      s| j                  |«       t        | j                  j	                  |j
                  d«      «      D ]  }| j                  |«       Œ y )Nr4   rŽ   )	r  r¸   Úunsafe_namer»   rÜ   ÚkeyrS   Únot_found_in_indexrÓ   )r�   Úrequirementr>   s      r%   Úfind_packageszPackageIndex.find_packagesò  s·   € Ø�‰�d—n‘n {×'>Ñ'>Ñ>ÀÑDÔEà×!Ñ!×%Ñ% k§o¡oÔ6à�M‰M˜$Ÿ.™.¨;×+CÑ+CÑCÀcÑIÔJà×!Ñ!×%Ñ% k§o¡oÔ6à×#Ñ# KÔ0ä˜×*Ñ*×.Ñ.¨{¯©ÀÓCÓDò 	ˆCà�M‰M˜#Õñ	r2   c                 óÌ   •— | j                  «        | j                  |«       | |j                     D ]  }||v r|c S | j                  d||«       Œ t        t
        | �  ||«      S )Nz%s does not match %s)Úprescanr$  r!  rÕ   r·   r   Úobtain)r�   r#  Ú	installerrN   rÅ   s       €r%   r'  zPackageIndex.obtain  sh   ø€ Ø�‰ŒØ×Ñ˜;Ô'Ø˜Ÿ™Ñ)ò 	BˆDØ�{Ñ"Ø’Ø�J‰JÐ-¨{¸DÕAð	Bô ”\ 4Ñ/°¸YÓGÐGr2   c                 ó0  — |j                  | j                  d|z  «       |j                  «       sg|j                  «        t	        j
                  |«       t        |j                  j                  ›dt        j                  j                  |«      ›d�«      ‚y)z-
        checker is a ContentChecker
        zValidating %%s checksum for %sz validation failed for z; possible download problem?N)r™   rÕ   r•   rÝ   r_   Úunlinkr   r¤   r.   rB   rY   )r�   Úcheckerr`   Útfps       r%   Ú
check_hashzPackageIndex.check_hash
  su   € ð 	�‰�t—z‘zÐ#CÀhÑ#NÔOØ×ÑÔ!Ø�I‰IŒKÜ�I‰I�hÔÜ ð —<‘<×$Ó$¤b§g¡g×&6Ñ&6°xÕ&@ðBóð ð "r2   c                 óä   — |D ]k  }| j                   �0t        |«      r%|j                  d«      st        t	        |«      «      r| j                  |«       ŒQ| j                   j                  |«       Œm y)z;Add `urls` to the list that will be prescanned for searchesNúfile:)r½   rÑ   r-   rÓ   r   r  Úappend)r�   Úurlsr>   s      r%   Úadd_find_linkszPackageIndex.add_find_links  s]   € àò 	)ˆCà—‘Ð$Ü! #”Ø—>‘> 'Ô*Üœ¨Ó,Ô-ð —‘˜cÕ"ð —‘×#Ñ# CÕ(ñ	)r2   c                 ó|   — | j                   r)t        t        | j                  | j                   «      «       d| _         y)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r½   rÓ   r}   r  r”   s    r%   r&  zPackageIndex.prescan'  s'   € à�<Š<Ü”�T—]‘] D§L¡LÓ1Ô2Øˆ�r2   c                 ó¢   — | |j                      r| j                  d}}n| j                  d}} |||j                  «       | j	                  «        y )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r!  rÖ   rë   r   r  )r�   r#  Úmethr±   s       r%   r"  zPackageIndex.not_found_in_index-  sJ   € Ø�—‘Ò ØŸ	™	Ð#H�#‰Dð —	‘	ØEð ˆDñ 	ˆS�+×)Ñ)Ô*Ø�‰�r2   c                 óZ  — t        |t        «      st        |«      }|rF| j                  ||«      }t	        |«      \  }}|j                  d«      r| j                  |||«      }|S t        j                  j                  |«      r|S t        |«      }t        | j                  ||«      dd«      S )a  Locate 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.
        r  rR   N)rØ   r   rÑ   Ú_download_urlrF   r,   Ú	gen_setupr_   rB   rê   r&   râ   Úfetch_distribution)r�   r#   Útmpdirr@   Úfoundr/   rE   s          r%   r6   zPackageIndex.download8  s™   € ô$ ˜$¤Ô,Ü Ó%ˆFÙà×*Ñ*¨4°Ó8�Ü!1°$Ó!7‘��hØ—=‘= Ô'Ø ŸN™N¨5°(¸FÓC�EØ�Ü—‘—‘ Ô%à�ä,¨TÓ2�Ü�t×.Ñ.¨t°VÓ<¸jÈ$ÓOÐOr2   c                 óÚ  ‡ ‡‡‡‡	— ‰ j                  d|«       i Š	d}d	ˆˆ ˆ	ˆˆfd„	}|r)‰ j                  «        ‰ j                  |«        ||«      }|s|�	 |||«      }|€$‰ j                  �‰ j                  «         ||«      }|€|s‰ j                  |«        ||«      }|€‰ j	                  d‰xr dxs d|«       y‰ j                  d|«       |j                  |j                  ¬«      S )
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.
        zSearching for %sNc                 óz  •— |€‰}|| j                      D ]¤  }|j                  t        k(  r‰s|‰vr‰j                  d|«       d‰|<   Œ4|| v xr |j                  t        k  xs ‰ }|sŒU‰j                  |j                  ‰	«      }||_        t        j                  j                  |j                  «      sŒ¢|c S  y )Nz&Skipping development or system egg: %sr9   )r!  rH   r   rë   r	   r6   rR   Údownload_locationr_   rB   rê   )
ÚreqÚenvrN   ÚtestÚlocÚ
develop_okr�   ÚskippedÚsourcer:  s
        €€€€€r%   rƒ   z-PackageIndex.fetch_distribution.<locals>.findx  s´   ø€ Øˆ{Ø�ð ˜CŸG™G™ò $�Ø—?‘?¤lÒ2¹:Ø 7Ñ*ØŸ	™	ØDØ ôð )*˜ ™Øà˜s�{ÒU¨¯©¼;Ñ(FÒ(TÈfÈ*�ÚØŸ-™-¨¯©°vÓ>�CØ-0�DÔ*Ü—w‘w—~‘~ d×&<Ñ&<Õ=Ø#šñ$r2   z:No local packages or working download links found for %s%sza source distribution of rÌ   zBest match: %s)rR   rp   )rÖ   r&  r$  r½   rë   Úcloner>  )
r�   r#  r:  Ú
force_scanrE  rC  Úlocal_indexrN   rƒ   rD  s
   ` ` ``   @r%   r9  zPackageIndex.fetch_distributionZ  sð   ü€ ð4 	�	‰	Ð$ kÔ2ØˆØˆ÷	$ñ 	$ñ, Ø�L‰LŒNØ×Ñ˜{Ô+Ù˜Ó$ˆDá˜Ð/Ù˜ [Ó1ˆDàˆ<Ø�|‰|Ð'Ø—‘”Ù˜Ó$ˆDàˆ<¡
Ø×Ñ˜{Ô+Ù˜Ó$ˆDàˆ<Ø�I‰IØLØÒ7Ð7Ò=¸2Øõð �I‰IÐ&¨Ô-Ø—:‘: t×'=Ñ'=�:Ó>Ð>r2   c                 óH   — | j                  ||||«      }|�|j                  S y)a3  Obtain 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)r9  rR   )r�   r#  r:  rG  rE  rN   s         r%   ÚfetchzPackageIndex.fetch©  s-   € ð ×&Ñ& {°F¸JÈÓOˆØÐØ—=‘=Ð Ør2   c                 óª  — t         j                  |«      }|xr6 t        ||j                  d«      d «      D �cg c]  }|j                  r|‘Œ c}xs g }t        |«      dk(  �rBt        j                  j                  |«      }t        j                  j                  |«      |k7  rwt        j                  j                  ||«      }t        j                  j                  |«      r t        j                  j                  ||«      st        j                  ||«       |}t        t        j                  j                  |d«      d«      5 }	|	j!                  d|d   j"                  ›d|d   j                  ›dt        j                  j%                  |«      d   ›d�«       d d d «       |S |rt'        d	|›d
|›�«      ‚t'        d«      ‚c c}w # 1 sw Y   |S xY w)Nr9   zsetup.pyÚwz(from setuptools import setup
setup(name=r   z
, version=z, py_modules=[z])
z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rJ   rK   r   rL   rT   rX   r_   rB   rY   Údirnamerm   rê   ÚsamefileÚshutilÚcopy2r  ÚwriterS   Úsplitextr   )
r�   r`   rE   r:  rK   Údrå   rY   Údstró   s
             r%   r8  zPackageIndex.gen_setup¶  s�  € Ü×"Ñ" 8Ó,ˆàò ô /¨x¸¿¹ÀQ»ÈÓNöàØ—9’9ò òòð ð 	ô ˆu‹:˜‹?Ü—w‘w×'Ñ'¨Ó1ˆHô �w‰w�‰˜xÓ(¨FÒ2Ü—g‘g—l‘l 6¨8Ó4�ÜŸ™Ÿ™ sÔ+´·±×0@Ñ0@ÀÈ3Ô0OÜ—L‘L ¨3Ô/Ø"�Hä”b—g‘g—l‘l 6¨:Ó6¸Ó<ð 	ÀØ—
’
ð ˜a™×-Ó-Ø˜a™×(Ó(ÜŸ™×(Ñ(¨Ó2°1Ó5ðô÷	ð ˆOáÝ ò &.©uð6óð ô !ðGóð ùòK÷$	ð ˆOús   ¸GÅAGÇGi    c                 ó>  — | j                  d|«       d }	 t        j                  |«      }| j                  |«      }t	        |t
        j                  j                  «      r(t        d|›d|j                  ›d|j                  ›�«      ‚|j                  «       }d}| j                  }d}d|v r?|j                  d«      }	t        t        t        |	«      «      }| j!                  |||||«       t#        |d	«      5 }
	 |j%                  |«      }|r=|j'                  |«       |
j)                  |«       |d
z  }| j!                  |||||«       nnŒR| j+                  |||
«       d d d «       ||r|j-                  «        S S # 1 sw Y   ŒxY w# |r|j-                  «        w w xY w)NzDownloading %szCan't download ú: ú r   r5   zcontent-lengthzContent-LengthÚwbr9   )rÖ   rŸ   r«   r×   rØ   r:   rÙ   rÚ   r   rÏ   r±   Údl_blocksizeÚget_allÚmaxr}   ÚintÚ
reporthookr  rÞ   r’   rQ  r-  rÝ   )r�   r>   r`   Úfpr+  rÛ   ÚblocknumÚbsÚsizeÚsizesr,  r‘   s               r%   Ú_download_tozPackageIndex._download_toæ  sv  € Ø�	‰	Ð" CÔ(àˆð	Ü!×*Ñ*¨3Ó/ˆGØ—‘˜sÓ#ˆBÜ˜"œfŸl™l×4Ñ4Ô5Ý$Ú25°r·w³wÀÇÂÐGóð ð —g‘g“iˆGØˆHØ×"Ñ"ˆBØˆDØ 7Ñ*àŸ™Ð(8Ó9�Üœ3œs E›?Ó+�Ø—‘  X¨x¸¸TÔBÜ�h Ó%ð 
8¨ØØŸG™G B›K�EÙØŸ™ UÔ+ØŸ	™	 %Ô(Ø  A™˜ØŸ™¨¨X°xÀÀTÕJàð ð —‘ ¨°3Ô7÷
8ð áØ—‘•
ð ÷
8ð 
8ûñ Ø—‘•
ð ús%   –C!F Ã7A'E;Å	F Å;FÆ F ÆFc                  ó   — y rp   rŽ   )r�   r>   r`   r_  Úblksizera  s         r%   r]  zPackageIndex.reporthook
  s   € Ør2   c           	      ó  — |j                  d«      rt        |«      S 	 t        || j                  «      S # t        t
        j                  j                  f$ rh}dj                  |j                  D �cg c]  }t        |«      ‘Œ nc c}w c}«      }|r| j                  ||«       nt        |›d|›�«      |‚Y d }~y d }~wt        j                  j                  $ r}|cY d }~S d }~wt        j                  j                   $ rE}|r| j                  ||j"                  «       nt        d|›d|j"                  ›�«      |‚Y d }~y d }~wt
        j                  j$                  $ rD}|r| j                  ||j&                  «       nt        |›d|j&                  ›�«      |‚Y d }~y d }~wt
        j                  j(                  t*        j                  f$ r1}|r| j                  ||«       nt        d|›d|›�«      |‚Y d }~y d }~ww xY w)Nr/  rW  zDownload error for rV  z7 returned a bad status line. The server might be down, )r-   Ú
local_openÚopen_with_authrÀ   r"   ÚhttpÚclientÚ
InvalidURLrm   rq   r~   rë   r   r:   rÙ   rÚ   ÚURLErrorÚreasonÚBadStatusLineÚlineÚHTTPExceptionÚsocket)r�   r>   ÚwarningÚvÚargr±   s         r%   r×   zPackageIndex.open_url  s–  € Ø�>‰>˜'Ô"Ü˜c“?Ð"ð	TÜ! # t§{¡{Ó3Ð3øÜœDŸK™K×2Ñ2Ð3ò 	BØ—(‘(°·±Ö7¨œC �HÑ7ùÔ7Ó8ˆCÙØ—	‘	˜' 3Õ'ä$²±SÐ%9Ó:ÀÐAô (ûô �|‰|×%Ñ%ò 	Ø�HûÜ�|‰|×$Ñ$ò 	ÙØ—	‘	˜' 1§8¡8Õ,å$Ú36¸¿ºÐAóàðô -ûô
 �{‰{×(Ñ(ò 	ÙØ—	‘	˜' 1§6¡6Õ*ä$â"% q§v¢vð/óð ðô +ûô —‘×)Ñ)¬6¯<©<Ð8ò 	TÙØ—	‘	˜' 1Õ%å$ÂCÉÐ%KÓLÐRSÐSô &ûð	TúsW   ž4 ´#HÁB:Á0B
Â3B:Â: HÃC!ÃHÃ! HÄ;EÅ HÅ!:F Æ 0HÇ'G<Ç<Hc                 ó>  — t        | «      \  }}|r,d|v r*|j                  dd«      j                  dd«      }d|v rŒ'nd}|j                  d«      r|dd }t        j                  j                  ||«      }|j                  t        |«      «      st        d	|› �«      ‚|S )
aB  
        >>> import pathlib
        >>> du = PackageIndex._resolve_download_filename
        >>> root = getfixture('tmp_path')
        >>> url = 'https://files.pythonhosted.org/packages/a9/5a/0db.../setuptools-78.1.0.tar.gz'
        >>> str(pathlib.Path(du(url, root)).relative_to(root))
        'setuptools-78.1.0.tar.gz'

        Ensures the target is always in tmpdir.

        >>> url = 'https://anyhost/%2fhome%2fuser%2f.ssh%2fauthorized_keys'
        >>> du(url, root)
        Traceback (most recent call last):
        ...
        ValueError: Invalid filename...
        z..ú.ú\Ú_Ú__downloaded__rP   Nr*   zInvalid filename )	rF   Úreplacer,   r_   rB   rm   r-   r~   r"   )r>   r:  r.   rE   r`   s        r%   Ú_resolve_download_filenamez'PackageIndex._resolve_download_filename0  s    € ô$ *¨#Ó.‰ˆˆhÙØ˜$‘,Ø—|‘| D¨#Ó.×6Ñ6°t¸SÓA�ð ˜$“,ð $ˆDà�=‰=˜Ô$Ø˜˜�9ˆDä—7‘7—<‘< ¨Ó-ˆð ×"Ñ"¤3 v£;Ô/ÜÐ0°°
Ð;Ó<Ð<àˆr2   c                 ór   — | j                  ||«      }| j                  ||«      xs | j                  ||«      S )z2
        Determine the download filename.
        )r{  Ú_download_vcsÚ_download_other)r�   r>   r:  r`   s       r%   r7  zPackageIndex._download_urlT  s;   € ð ×2Ñ2°3¸Ó?ˆØ×!Ñ! # xÓ0ÒW°D×4HÑ4HÈÈhÓ4WÐWr2   c                 óê   — t         j                  j                  | «      j                  }|j	                  d«      \  }}}t        ddgdgt        |«      z  z   «      }t        t        |h|z  «      d«      S )a  
        >>> rvcs = PackageIndex._resolve_vcs
        >>> rvcs('git+http://foo/bar')
        'git'
        >>> rvcs('hg+https://foo/bar')
        'hg'
        >>> rvcs('git:myhost')
        'git'
        >>> rvcs('hg:myhost')
        >>> rvcs('http://foo/bar')
        ú+ÚsvnÚgitÚhgN)	r:   r!   Úurlsplitr@   Ú	partitionr|   ÚboolÚnextÚiter)r>   r@   ÚpreÚsepÚpostÚalloweds         r%   Ú_resolve_vcszPackageIndex._resolve_vcs[  sj   € ô —‘×&Ñ& sÓ+×2Ñ2ˆØ×)Ñ)¨#Ó.‰ˆˆS�$ä�u˜e�n¨ v´°S³	Ñ'9Ñ9Ó:ˆÜ”D˜#˜ ™Ó)¨4Ó0Ð0r2   c                 ó   — | j                  |«      }|sy |dk(  rt        d|› �«      ‚|j                  d«      \  }}}| j                  |«      \  }}| j	                  d|› d|› d|› �«       t        j                  |dd||g«       t        |d	|d
d|g|d|dd	d|dg¬«      }|�,| j	                  d|› �«       t        j                  ||   «       |S )Nr�  z/Invalid config, SVN download is not supported: r8   zDoing z clone from z to rF  z--quietz-CÚcheckoutz--cwdÚupz-rz-q)r‚  rƒ  zChecking out )r�  r   r…  Ú_vcs_split_rev_from_urlrÖ   Ú
subprocessÚ
check_callÚdict)r�   r>   Úspec_filenameÚvcsr`   rx  ÚrevÚco_commandss           r%   r}  zPackageIndex._download_vcsn  sú   € Ø×Ñ Ó$ˆÙØØ�%Š<Ü ØAÀ#ÀÐGóð ð '×0Ñ0°Ó5‰ˆ�!�QØ×/Ñ/°Ó4‰ˆˆSà�	‰	�F˜3˜%˜|¨C¨5°°X°JÐ?Ô@Ü×Ñ˜s G¨Y¸¸XÐFÔGäØ�d˜H j°)¸SÐAØ�W˜h¨¨d°D¸#¸tÐDô
ˆð ˆ?Ø�I‰I˜ c UÐ+Ô,Ü×!Ñ! +¨cÑ"2Ô3àˆr2   c                 ó2  — t         j                  j                  |«      j                  }|dk(  rFt         j                  j                  t         j                  j                  |«      j                  «      S | j                  |d«       | j                  ||«      S )Nró   T)
r:   r!   r„  r@   r¾   Úurl2pathnamer;   rB   rÔ   Ú_attempt_download)r�   r>   r`   r@   s       r%   r~  zPackageIndex._download_other‡  so   € Ü—‘×&Ñ& sÓ+×2Ñ2ˆØ�VÒÜ—>‘>×.Ñ.¬v¯|©|×/DÑ/DÀSÓ/I×/NÑ/NÓOÐOà�‰�C˜ÔØ×%Ñ% c¨8Ó4Ð4r2   c                 ó(   — | j                  |d«       y )NT)rá   r  s     r%   r  zPackageIndex.scan_url�  s   € Ø×Ñ˜˜dÕ#r2   c                 ó”   — | j                  ||«      }d|j                  dd«      j                  «       v r| j                  |||«      S |S )NrÊ   rË   rÌ   )rc  rÜ   r+   Ú_invalid_download_html)r�   r>   r`   rÛ   s       r%   r›  zPackageIndex._attempt_download’  sJ   € Ø×#Ñ# C¨Ó2ˆØ�W—[‘[ °Ó4×:Ñ:Ó<Ñ<Ø×.Ñ.¨s°G¸XÓFÐFàˆOr2   c                 óH   — t        j                  |«       t        d|› �«      ‚)NzUnexpected HTML page found at )r_   r*  r   )r�   r>   rÛ   r`   s       r%   rž  z#PackageIndex._invalid_download_html™  s!   € Ü
�	‰	�(ÔÜÐ=¸c¸UÐCÓDÐDr2   c                 óL  — t         j                  j                  | «      }|j                  j	                  dd«      d   }|j
                  j                  d«      \  }}}|j                  d«      \  }}}|r||fn|df\  }}	|j                  ||d¬«      j                  «       }
|
|	fS )	aò  
        Given a possible VCS URL, return a clean URL and resolved revision if any.

        >>> vsrfu = PackageIndex._vcs_split_rev_from_url
        >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', 'v69.0.0')
        >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools')
        ('https://github.com/pypa/setuptools', None)
        >>> vsrfu('http://foo/bar')
        ('http://foo/bar', None)
        r€  r9   r5   r8   ú@NrÌ   )r@   rB   rE   )
r:   r!   r„  r@   r=   rB   r…  Ú
rpartitionÚ_replaceÚgeturl)r>   r?   Úclean_schemeÚno_fragment_pathrx  r‰  rŠ  r‹  Ú
clean_pathr—  Úresolveds              r%   r‘  z$PackageIndex._vcs_split_rev_from_url�  s°   € ô —‘×%Ñ% cÓ*ˆà—|‘|×)Ñ)¨#¨qÓ1°"Ñ5ˆð "'§¡×!5Ñ!5°cÓ!:ÑÐ˜!˜Qà)×4Ñ4°SÓ9‰ˆˆS�$Ù),˜3 ™+°4¸°,‰ˆ
�Cà—>‘>ØØàð	 "ó 
÷
 ‰&‹(ð 	ð ˜ˆ}Ðr2   c                 ó0   — t        j                  |g|¢­Ž  y rp   )r   rÕ   r  s      r%   rÕ   zPackageIndex.debug½  s   € Ü�	‰	�#Ð˜Ôr2   c                 ó0   — t        j                  |g|¢­Ž  y rp   )r   rÖ   r  s      r%   rÖ   zPackageIndex.infoÀ  ó   € Ü�‰�Ð�tÔr2   c                 ó0   — t        j                  |g|¢­Ž  y rp   )r   rë   r  s      r%   rë   zPackageIndex.warnÃ  r«  r2   )zhttps://pypi.org/simple/)Ú*NT)Frp   )FFFN)FF)+rš   r›   rœ   r�   r¦   rÈ   rá   rÒ   rÔ   r  rý   r  rã   r  r  r$  r'  r-  r2  r&  r"  r6   r9  rJ  r8  rY  rc  r]  r×   Ústaticmethodr{  r7  r�  r}  r~  r  r›  rž  r‘  rÕ   rÖ   rë   Ú__classcell__©rÅ   s   @r%   r   r   +  s  ø„ ÙEð -ØØØõ-ô$!ó31ój'ó  ò?òò 2ò 
ò:
ó&òõHòò)òò	ò PðL ØØØóM?ó^ò,ð\ €Lò"òHó TðD ñ!ó ð!òFXð ñ1ó ð1ò$ò25ò$òòEð ñó ðò>òör2   r   z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 óN   — | j                  d«      }t        j                  |«      S )Nr   )rL   rÊ   Úunescape)rK   Úwhats     r%   Údecode_entityr´  Ì  s   € Ø�;‰;�q‹>€DÜ�=‰=˜ÓÐr2   c                 ó"   — t        t        | «      S )a  
    Decode HTML entities in the given text.

    >>> htmldecode(
    ...     'https://../package_name-0.1.2.tar.gz'
    ...     '?tokena=A&amp;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_subr´  )Útexts    r%   r‚   r‚   Ñ  s   € ô ”m TÓ*Ð*r2   c                 ó   ‡ — ˆ fd„}|S )Nc                 ó   •‡ — ˆ ˆfd„}|S )Nc                  óÆ   •— t        j                  «       }t        j                  ‰«       	  ‰| i |¤Žt        j                  |«       S # t        j                  |«       w xY wrp   )rq  ÚgetdefaulttimeoutÚsetdefaulttimeout)rq   rr   Úold_timeoutrs   Útimeouts      €€r%   Ú_socket_timeoutz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutß  sN   ø€ Ü ×2Ñ2Ó4ˆKÜ×$Ñ$ WÔ-ð6Ù˜TÐ, VÑ,ä×(Ñ(¨Õ5ø”×(Ñ(¨Õ5ús   ¬A	 Á	A rŽ   )rs   r¿  r¾  s   ` €r%   r¿  z'socket_timeout.<locals>._socket_timeoutÞ  s   ù€ õ	6ð Ðr2   rŽ   )r¾  r¿  s   ` r%   Úsocket_timeoutrÀ  Ý  s   ø€ ô	ð Ðr2   c                 óÎ   — t         j                  j                  | «      }|j                  «       }t	        j
                  |«      }|j                  «       }|j                  dd«      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Ì   )r:   r!   r<   ÚencodeÚbase64Ú	b64encoderà   rz  )ÚauthÚauth_sÚ
auth_bytesÚencoded_bytesÚencodeds        r%   Ú_encode_authrË  ì  sR   € ô �\‰\×!Ñ! $Ó'€Fà—‘“€JÜ×$Ñ$ ZÓ0€Mà×"Ñ"Ó$€Gà�?‰?˜4 Ó$Ð$r2   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)Ú
Credentialz:
    A username/password pair. Use like a namedtuple.
    c                 ó    — || _         || _        y rp   ©ÚusernameÚpassword)r�   rÐ  rÑ  s      r%   r¦   zCredential.__init__  s   € Ø ˆŒØ ˆ�r2   c              #   óD   K  — | j                   –— | j                  –— y ­wrp   rÏ  r”   s    r%   Ú__iter__zCredential.__iter__
  s   è ø€ Ø�m‰mÒØ�m‰mÓùs   ‚ c                 ó   — dt        | «      z  S )Nz%(username)s:%(password)s)Úvarsr”   s    r%   Ú__str__zCredential.__str__  s   € Ø*¬T°$«ZÑ7Ð7r2   N)rš   r›   rœ   r�   r¦   rÓ  rÖ  rŽ   r2   r%   rÍ  rÍ    s   „ ñò!òó8r2   rÍ  c                   ó:   ‡ — e Zd Zˆ fd„Zed„ «       Zd„ Zd„ Zˆ xZS )Ú
PyPIConfigc                 ó0  •— t         j                  g d¢d«      }t        ‰| �  |«       t        j
                  j                  t        j
                  j                  d«      d«      }t        j
                  j                  |«      r| j                  |«       yy)z%
        Load from ~/.pypirc
        )rÐ  rÑ  Ú
repositoryrÌ   ú~z.pypircN)
r”  Úfromkeysr·   r¦   r_   rB   rm   Ú
expanduserrê   rÞ   )r�   ÚdefaultsÚrcrÅ   s      €r%   r¦   zPyPIConfig.__init__  sf   ø€ ô —=‘=Ò!GÈÓLˆÜ‰Ñ˜Ô"ä�W‰W�\‰\œ"Ÿ'™'×,Ñ,¨SÓ1°9Ó=ˆÜ�7‰7�>‰>˜"ÔØ�I‰I�b�Mð r2   c                 óÄ   — | j                  «       D �cg c]$  }| j                  |d«      j                  «       r|‘Œ& }}t        t	        | j
                  |«      «      S c c}w )NrÚ  )ÚsectionsrÜ   r   r”  r}   Ú_get_repo_cred)r�   ÚsectionÚsections_with_repositoriess      r%   Úcreds_by_repositoryzPyPIConfig.creds_by_repository  s_   € ð  Ÿ=™=›?ö&
àØ�x‰x˜ Ó.×4Ñ4Ô6ò ð&
Ð"ð &
ô ”C˜×+Ñ+Ð-GÓHÓIÐIùò&
s   “)Ac                 óÖ   — | j                  |d«      j                  «       }|t        | j                  |d«      j                  «       | j                  |d«      j                  «       «      fS )NrÚ  rÐ  rÑ  )rÜ   r   rÍ  )r�   rã  Úrepos      r%   râ  zPyPIConfig._get_repo_cred(  s]   € Ø�x‰x˜ Ó.×4Ñ4Ó6ˆØ”ZØ�H‰H�W˜jÓ)×/Ñ/Ó1Ø�H‰H�W˜jÓ)×/Ñ/Ó1ó
ð 
ð 	
r2   c                 ór   — | j                   j                  «       D ]  \  }}|j                  |«      sŒ|c S  y)zŒ
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)rå  Úitemsr-   )r�   r>   rÚ  Úcreds       r%   Úfind_credentialzPyPIConfig.find_credential/  s8   € ð
 !%× 8Ñ 8× >Ñ >Ó @ò 	ÑˆJ˜Ø�~‰~˜jÕ)Ø’ñ	r2   )	rš   r›   rœ   r¦   Úpropertyrå  râ  rë  r¯  r°  s   @r%   rØ  rØ    s(   ø„ ô	ð ñJó ðJò
ör2   rØ  c                 ó”  — t         j                  j                  | «      }|\  }}}}}}|j                  d«      rt        j
                  j                  d«      ‚|dv rt        |«      \  }	}
nd}	|	sJt        «       j                  | «      }|r/t        |«      }	|j                  | f}t        j                  dg|¢­Ž  |	rgdt        |	«      z   }	|
||||f}t         j                  j                  |«      }t         j                   j#                  |«      }|j%                  d|	«       nt         j                   j#                  | «      }|j%                  dt&        «        ||«      }|	rft         j                  j                  |j(                  «      \  }}}}}}||k(  r1|
k(  r,||||||f}t         j                  j                  |«      |_        |S )	z4Open a urllib2 request, handling HTTP authenticationú:znonnumeric port: '')ri  ÚhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic ÚAuthorizationz
User-Agent)r:   r!   r;   r,   ri  rj  rk  Ú
_splituserrØ  rë  r~   rÐ  r   rÖ   rË  Ú
urlunparser¾   ÚRequestÚ
add_headerÚ
user_agentr>   )r>   rÀ   Úparsedr@   ÚnetlocrB   ÚparamsrD   r  rÆ  Úaddressrê  rÖ   r?   r  r¾   r^  Ús2Úh2Úpath2Úparam2Úquery2Úfrag2s                          r%   rh  rh  9  s˜  € ô �\‰\×"Ñ" 3Ó'€FØ06Ñ-€FˆF�D˜& %¨ð ‡��sÔÜ�k‰k×$Ñ$Ð%:Ó;Ð;àÐ"Ñ"Ü" 6Ó*‰ˆ‰gàˆáÜ‹|×+Ñ+¨CÓ0ˆÙÜ�t“9ˆDØ—=‘= #Ð%ˆDÜ�H‰HÐAÐIÀDÓIáØœ, tÓ,Ñ,ˆØ˜  v¨u°dÐ:ˆÜ—,‘,×)Ñ)¨%Ó0ˆÜ—.‘.×(Ñ(¨Ó1ˆØ×Ñ˜?¨DÕ1ä—.‘.×(Ñ(¨Ó-ˆà×Ñ�|¤ZÔ0Ù	�‹€Báô 06¯|©|×/DÑ/DÀRÇVÁVÓ/LÑ,ˆˆB��v˜v uØ�Š<˜B 'šMØ˜  v¨v°uÐ<ˆEÜ—\‘\×,Ñ,¨UÓ3ˆBŒFà€Ir2   c                 ó@   — | j                  d«      \  }}} |r|| fS d| fS )zNsplituser('user[:passwd]@host[:port]')
    --> 'user[:passwd]', 'host[:port]'.r¡  N)r¢  )ÚhostÚuserÚdelims      r%   rñ  rñ  h  s0   € ð Ÿ™¨Ó,Ñ€Dˆ%�ÙˆD dÐ*Ð*˜t dÐ*Ð*r2   c                 ó   — | S rp   rŽ   )r>   s    r%   Ú
fix_sf_urlr  s  s   € Ø€Jr2   c                 ó²  — t         j                  j                  | «      \  }}}}}}t         j                  j	                  |«      }t
        j                  j                  |«      rt         j                  j                  | «      S |j                  d«      röt
        j                  j                  |«      r×g }t        j                  |«      D ]“  }	t
        j                  j                  ||	«      }
|	dk(  r't        |
d«      5 }|j                  «       }ddd«        nkt
        j                  j                  |
«      r|	dz  }	|j                  dj!                  |	¬«      «       Œ• d}|j!                  | dj                  |«      ¬	«      }d
\  }}nd\  }}}ddi}t#        j$                  «      }t         j&                  j)                  | ||||«      S # 1 sw Y   Œ¾xY w)z7Read a local path, with special support for directoriesr4   z
index.htmlÚrNz<a href="{name}">{name}</a>)r.   zB<html><head><title>{url}</title></head><body>{files}</body></html>rÂ  )r>   Úfiles)éÈ   ÚOK)rÐ   zPath not foundz	Not foundrË   z	text/html)r:   r!   r;   r¾   rš  r_   rB   Úisfiler¿   r,   rì   rî   rm   r  rÞ   r0  ÚformatÚioÚStringIOrÙ   rÚ   )r>   r@   rA   rB   ÚparamrD   r  r`   r  rç   Úfilepathr^  Úbodyræ   ÚstatusÚmessagerÛ   Úbody_streams                     r%   rg  rg  w  s‡  € ä/5¯|©|×/DÑ/DÀSÓ/IÑ,€FˆF�D˜% ¨Ü�~‰~×*Ñ*¨4Ó0€HÜ	‡w�w‡~�~�hÔÜ�~‰~×%Ñ% cÓ*Ð*Ø	�‰�sÔ	¤§¡§¡¨hÔ 7ØˆÜ—‘˜HÓ%ò 	@ˆAÜ—w‘w—|‘| H¨aÓ0ˆHØ�LÒ Ü˜( CÓ(ð %¨BØŸ7™7›9�D÷%áÜ—‘—‘˜xÔ(Ø�S‘�Ø�L‰LÐ6×=Ñ=À1Ð=ÓEÕFð	@ð Xð ð —;‘; 3¨d¯i©i¸Ó.>�;Ó?ˆDØ#‰ˆ‘à BÑˆ�˜à˜{Ð+€GÜ—+‘+˜dÓ#€KÜ�<‰<×!Ñ! # v¨w¸ÀÓMÐM÷#%ð %ús   Ã?GÇG	rp   )r   )Zr�   Úsysr’  r_   rd   r  rO  rq  rÄ  r¢   rû   ÚconfigparserrÊ   Úhttp.clientri  Úurllib.parser:   Úurllib.requestÚurllib.errorÚ	functoolsr   r   Úpkg_resourcesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Ú	distutilsr   Údistutils.errorsr   Úfnmatchr   Úsetuptools.wheelr   Ú setuptools.extern.more_itertoolsr   r²   rJ   ÚIr€   r  rK   rÑ   r=   rW   Ú__all__Ú_SOCKET_TIMEOUTÚ_tmplr  Úversion_inforõ  r&   r   rF   r   rI   ra   r   ru   ry   rŠ   rŒ   rŸ   r   r  r¶  r´  r‚   rÀ  rË  rÍ  ÚRawConfigParserrØ  r¾   r¿   rh  rñ  r  rg  rŽ   r2   r%   ú<module>r(     s  ðÙ *ã 
Û Û 	Û 	Û 	Û Û Û Û Û Û Û Û Û Û Û Ý ã ÷÷ ÷ ÷ õ  Ý +Ý Ý "Ý <ð ˆr�z‰zÐ6Ó7€Ø€r‡z�zÐ3°R·T±TÓ:€Øˆ2�:‰:ðJó€ð ˆR�Z‰ZÐ,¨b¯d©dÓ3×9Ñ9€
Ø.×4Ñ4Ó6€
ò€ð €àF€Ø�\‰\ØˆW�^‰^˜S×-Ñ-Ð.¸:ð ó €
ò
òò0óó óFð .2¸kÐTXóòD
ð €b‡j�jÐKÈRÏTÉTÓR€ðð
 ñLó ðL÷$ñ ô2�.ô ôBY
�;ô Y
ð| ˆR�Z‰ZÐ<Ó=×AÑA€
òò
	+óò%÷*8ñ 8ô"$�×-Ñ-ô $ðN  &Ÿ~™~×5Ñ5ó +ò^+ð 1‘ Ó0°Ó@€òóNr2   