ó
    Lƒwj#:  ã                  ó0  • S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJrJrJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  SSKJrJr  SSK J r   \(       a  SSK!J"r"J#r#  \"" S5      r$\RJ                  r%\RL                  r&\RN                  r'\RP                  r)\RT                  r+\RX                  r-\R\                  r/S S jr0\S!S j5       r1      S"S jr2\Rf                  S#S j5       r4S$S jr5S r6S%S&S jjr7\Rp                  " S\	Rr                   S35      r:\Rp                  " S5      r;\Rp                  " S5      r<S'S jr=  S(         S)S jjr>S*S jr?      S+               S,S jjr@S-S jrAS.S jrBg)/zudistutils.util

Miscellaneous utility functions -- anything that doesn't fit into
one of the other *util.py modules.
é    )ÚannotationsN)ÚCallableÚIterableÚMapping)ÚTYPE_CHECKING)Ú	pass_noneé   )Úlog)Únewer)ÚdetectÚmacos)ÚDistutilsByteCompileErrorÚDistutilsPlatformError)Úspawn)ÚTypeVarTupleÚUnpackÚ_Tsc                ób   • U R                  S5       Vs/ s H  n[        U5      PM     sn$ s  snf )zEConvert a dot-separated string into a list of numbers for comparisonsÚ.)ÚsplitÚint)ÚsÚns     Ú¨C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\setuptools/_distutils/util.pyÚsplit_versionr   .   s&   € àŸG™G CœLÓ)šL�qŒC�ŽF™LÑ)Ð)ùÒ)s   ”,c                óV   • [         R                  " [        R                  " U 5      5      $ )a
  
Allow for pathlib.Path inputs, coax to a native path string.

If None is passed, will just pass it through as
Setuptools relies on this behavior.

>>> convert_path(None) is None
True

Removes empty paths.

>>> convert_path('foo/./bar').replace('\\', '/')
'foo/bar'
)ÚosÚfspathÚpathlibÚPurePath)Úpathnames    r   Úconvert_pathr"   3   s   € ô  �9Š9”W×%Ò% hÓ/Ó0Ð0ó    c                ó"  • [         R                  S:X  ao  [         R                  R                  U5      (       d  [         R                  R	                  X5      $ [         R                  R	                  U [        U5      SS 5      $ [         R                  S:X  a\  [         R                  R                  U5      u  p#US   [         R                  :X  a  USS n[         R                  R	                  X5      $ [        S[         R                   S35      e)zùReturn 'pathname' with 'new_root' prepended.  If 'pathname' is
relative, this is equivalent to "os.path.join(new_root,pathname)".
Otherwise, it requires making 'pathname' relative and then joining the
two, which is tricky on DOS/Windows and Mac OS.
Úposixr	   NÚntr   znothing known about platform 'Ú')	r   ÚnameÚpathÚisabsÚjoinÚstrÚ
splitdriveÚsepr   )Únew_rootr!   Ú_driver)   s       r   Úchange_rootr1   F   sÀ   € ô 
‡w�w�'ÓÜ�w‰w�}‰}˜X×&Ñ&Ü—7‘7—<‘< Ó3Ð3ô —7‘7—<‘< ¬#¨h«-¸¸Ð*;Ó<Ð<ä	�‰�D‹ÜŸ™×+Ñ+¨HÓ5‰ˆØ�‰7”b—f‘fÓØ˜˜�8ˆDÜ�w‰w�|‰|˜HÓ+Ð+ä
 Ð#AÄ"Ç'Á'ÀÈ!Ð!LÓ
MÐMr#   c                 óZ  • [         R                  S:X  aQ  S[         R                  ;  a=   SSKn U R	                  [         R
                  " 5       5      S   [         R                  S'   S[         R                  ;  a  [        5       [         R                  S'   gg! [        [        4 a     NCf = f)a4  Ensure that 'os.environ' has all the environment variables we
guarantee that users can use in config files, command-line options,
etc.  Currently this includes:
  HOME - user's home directory (Unix only)
  PLAT - description of the current platform, including hardware
         and OS (see 'get_platform()')
r%   ÚHOMEr   Né   ÚPLAT)	r   r(   ÚenvironÚpwdÚgetpwuidÚgetuidÚImportErrorÚKeyErrorÚget_platform)r7   s    r   Úcheck_environr=   `   sƒ   € ô 
‡w�w�'Ó˜f¬B¯J©JÓ6ð	Ûà!$§¡¬b¯iªi«kÓ!:¸1Ñ!=ŒB�J‰J�vÑð ”R—Z‘ZÓÜ)›^Œ�
‰
�6Òð  øô œXÐ&ó 	ñ ð	ús   ª<B ÂB*Â)B*c                ó
  • [        5         [        [        R                  5      nUR	                  S UR                  5        5       5         [        U 5      R                  U5      $ ! [         a  n[        SU 35      eSnAff = f)a£  
Perform variable substitution on 'string'.
Variables are indicated by format-style braces ("{var}").
Variable is substituted by the value found in the 'local_vars'
dictionary or in 'os.environ' if it's not in 'local_vars'.
'os.environ' is first checked/augmented to guarantee that it contains
certain values: see 'check_environ()'.  Raise ValueError for any
variables not found in either 'local_vars' or 'os.environ'.
c              3  ó@   #   • U  H  u  pU[        U5      4v •  M     g 7f©N©r,   )Ú.0r(   Úvalues      r   Ú	<genexpr>Úsubst_vars.<locals>.<genexpr>ƒ   s   é € ÐKÒ8J©¨�4œ˜U›Õ$Ò8Jùs   ‚zinvalid variable N)
r=   Údictr   r6   ÚupdateÚitemsÚ_subst_compatÚ
format_mapr;   Ú
ValueError)r   Ú
local_varsÚlookupÚvars       r   Ú
subst_varsrO   w   sp   € ô „OÜ”"—*‘*Ó€FØ
‡M�MÑK¸
×8HÑ8HÔ8JÓKÔKð4Ü˜QÓ×*Ñ*¨6Ó2Ð2øÜó 4ÜÐ,¨S¨EÐ2Ó3Ð3ûð4ús   ÁA% Á%
BÁ/A=Á=Bc                óx   • S n[         R                  " SX5      nX :w  a  SSKnUR                  S[        5        U$ )zV
Replace shell/Perl-style variable substitution with
format-style. For compatibility.
c                ó,   • SU R                  S5       S3$ )NÚ{r	   Ú})Úgroup)Úmatchs    r   Ú_substÚ_subst_compat.<locals>._subst�   s   € Ø�E—K‘K “NÐ# 2Ð&Ð&r#   z\$([a-zA-Z_][a-zA-Z_0-9]*)r   Nz-shell/Perl-style substitutions are deprecated)ÚreÚsubÚwarningsÚwarnÚDeprecationWarning)r   rV   ÚreplrZ   s       r   rI   rI   Š   s;   € ò'ô �6Š6Ð/°Ó;€DØƒyÛà�‰Ø;Üô	
ð €Kr#   c                ó   • U[        U 5      -   $ r@   rA   )ÚexcÚprefixs     r   Úgrok_environment_errorra   ž   s   € ð ”C˜“HÑÐr#   z[^\\\'\"z ]*z'(?:[^'\\]|\\.)*'z"(?:[^"\\]|\\.)*"c                ó"  • U R                  5       n / nSnU (       Gar  [        R                  X5      nUc   eUR                  5       nU[	        U 5      :X  a  UR                  U SU 5         U$ X   [        R                  ;   a)  UR                  U SU 5        XS R                  5       n SnO¶X   S:X  a  U SU XS-   S -   n US-   nO›X   S:X  a  [        R                  X5      nO/X   S:X  a  [        R                  X5      nO[        SX    S35      eUc  [        S	X    S
35      eUR                  5       u  pTU SU XS-   US-
   -   XS -   n UR                  5       S-
  nU[	        U 5      :¼  a  UR                  U 5         U$ U (       a  GMr  U$ )aæ  Split a string up according to Unix shell-like rules for quotes and
backslashes.  In short: words are delimited by spaces, as long as those
spaces are not escaped by a backslash, or inside a quoted string.
Single and double quotes are equivalent, and the quote characters can
be backslash-escaped.  The backslash is stripped from any two-character
escape sequence, leaving only the escaped character.  The quote
characters are stripped from any quoted string.  Returns a list of
words.
r   NÚ\r	   r'   Ú"zthis can't happen (bad char 'z')zbad string (mismatched z	 quotes?)é   )ÚstripÚ_wordchars_rerU   ÚendÚlenÚappendÚstringÚ
whitespaceÚlstripÚ
_squote_reÚ
_dquote_reÚRuntimeErrorrK   Úspan)r   ÚwordsÚposÚmrh   Úbegs         r   Úsplit_quotedrv   «   s¨  € ð 	
�‰‹	€AØ€EØ
€Cç
Ü×Ñ Ó'ˆØ‰}Ðˆ}Ø�e‰e‹gˆØ”#�a“&‹=Ø�L‰L˜˜4˜C˜Ô!ØðD €LðA ‰6”V×&Ñ&Ó&ð �L‰L˜˜4˜C˜Ô!Ø�$�—‘Ó ˆAØ‰Cà‰V�t‹^ð �$�3�˜! !™G˜I˜,Ñ&ˆAØ˜‘'‰Cð ‰v˜‹}Ü×$Ñ$ QÓ,‘Ø‘˜3“Ü×$Ñ$ QÓ,‘ä"Ð%BÀ1Á6À(È"Ð#MÓNÐNà‰yÜ Ð#:¸1¹6¸(À)Ð!LÓMÐMàŸ™›‰JˆSØ�$�3�˜! !™G c¨A¡gÐ.Ñ.°°4°Ñ8ˆAØ—%‘%“'˜A‘+ˆCà”#�a“&‹=Ø�L‰L˜ŒOØà€L÷Q ‰!ðP €Lr#   c                ó„   • Uc"  U R                    U< 3nUSS S:X  a  USS S-   n[        R                  " U5        U " U6   g)z®
Perform some action that affects the outside world (e.g. by
writing to the filesystem). Was previously used to deal with
"dry run" operations, but now runs unconditionally.
Néþÿÿÿz,)r   Ú))Ú__name__r
   Úinfo)ÚfuncÚargsÚmsgÚverboses       r   Úexecuter€   é   sJ   € ð �{Ø—‘� ™xÐ(ˆØˆrˆsˆ8�tÓØ�a˜�)˜c‘/ˆCä‡H‚HˆS„MÙˆ$‚Kr#   c                ó\   • U R                  5       n U S;   a  gU S;   a  g[        SU < 35      e)zäConvert a string representation of truth to true (1) or false (0).

True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
are 'n', 'no', 'f', 'false', 'off', and '0'.  Raises ValueError if
'val' is anything else.
)ÚyÚyesÚtÚtrueÚonÚ1T)r   ÚnoÚfÚfalseÚoffÚ0Fzinvalid truth value )ÚlowerrK   )Úvals    r   Ú	strtoboolr�   ý   s:   € ð �)‰)‹+€CØ
Ð2Ó2ØØ	Ð5Ó	5ØäÐ/°©wÐ7Ó8Ð8r#   c                óf  • [         R                  (       a  [        S5      eUc  US:H  nU(       Gd)  [        R                  " S5      u  px[
        R                  " SU5        [        R                  " USSS9n	U	   U	R                  S	5        U	R                  S
R                  [        [        U 5      5      S-   5        U	R                  SU< SU< SU< SU< SU< S35        SSS5        [         R                  /n
U
R                  [        R                   " 5       5        U
R#                  U5        [%        U
5        ['        [        R(                  U4SU 35        gSSKJn  U  GH9  nUSS S:w  a  M  US:¼  a(  US:X  a  SOUn[.        R0                  R3                  XÍS9nO[.        R0                  R3                  U5      nUnU(       a3  US[5        U5       U:w  a  [7        SU< SU< 35      eU[5        U5      S nU(       a  [        R8                  R                  XO5      n[        R8                  R;                  U5      nU(       d  Mæ  U(       d  [=        XÎ5      (       a$  [
        R                  " SUU5        U" XÎU5        GM!  [
        R>                  " SUU5        GM<     g! , (       d  f       GNÇ= f)aÈ  Byte-compile a collection of Python source files to .pyc
files in a __pycache__ subdirectory.  'py_files' is a list
of files to compile; any files that don't end in ".py" are silently
skipped.  'optimize' must be one of the following:
  0 - don't optimize
  1 - normal optimization (like "python -O")
  2 - extra optimization (like "python -OO")
If 'force' is true, all files are recompiled regardless of
timestamps.

The source filename encoded in each bytecode file defaults to the
filenames listed in 'py_files'; you can modify these with 'prefix' and
'basedir'.  'prefix' is a string that will be stripped off of each
source filename, and 'base_dir' is a directory name that will be
prepended (after 'prefix' is stripped).  You can supply either or both
(or neither) of 'prefix' and 'base_dir', as you wish.

Byte-compilation is either done directly in this interpreter process
with the standard py_compile module, or indirectly by writing a
temporary script and executing it.  Normally, you should let
'byte_compile()' figure out to use direct compilation or not (see
the source for details).  The 'direct' flag is used by the script
generated in indirect mode; unless you know what you're doing, leave
it set to None.
zbyte-compiling is disabled.Nr   z.pyz$writing byte-compilation script '%s'Úwzutf-8)Úencodingz2from distutils.util import byte_compile
files = [
z,
z]
z
byte_compile(files, optimize=z, force=z,
         prefix=z, base_dir=z,
         verbose=z,
         direct=True)
z	removing )ÚcompileéýÿÿÿÚ )Úoptimizationzinvalid prefix: filename z doesn't start with zbyte-compiling %s to %sz%skipping byte-compilation of %s to %s) ÚsysÚdont_write_bytecoder   ÚtempfileÚmkstempr
   r{   r   ÚfdopenÚwriter+   ÚmapÚreprÚ
executableÚextendÚ
subprocessÚ"_optim_args_from_interpreter_flagsrj   r   r€   ÚremoveÚ
py_compiler“   Ú	importlibÚutilÚcache_from_sourceri   rK   r)   Úbasenamer   Údebug)Úpy_filesÚoptimizeÚforcer`   Úbase_dirr   ÚdirectÚ	script_fdÚscript_nameÚscriptÚcmdr“   ÚfileÚoptÚcfileÚdfileÚ
cfile_bases                    r   Úbyte_compiler¸     sM  € ôH ××Ü'Ð(EÓFÐFð �~Ø'¨1™}ˆ÷ Ü#+×#3Ò#3°EÓ#:Ñ ˆÜ�ŠÐ7¸ÔEÜ—’˜9 c°GÑ<ˆâØ�L‰Lðôð" �L‰L˜Ÿ™¤C¬¨hÓ$7Ó8¸5Ñ@ÔAØ�L‰LðØ&™\¨°%±ð ;Ø‘
˜+ h¡\ð 2Ø‘ð ðô÷' ô8 �~‰~ÐˆØ�
‰
”:×@Ò@ÓBÔCØ�
‰
�;ÔÜˆcŒ
Ü”—	‘	˜K˜>¨Y°{°mÐ+DÕEõ 	'äˆDØ�B�Cˆy˜EÓ!ñ ð
 ˜1‹}Ø$¨›M‘b¨x�Ü!Ÿ™×8Ñ8¸Ð8ÐP‘ä!Ÿ™×8Ñ8¸Ó>�ØˆEÞØ˜œ#˜f›+Ð&¨&Ó0Ü$Ø3°D±8Ð;OÐPVÉzÐZóð ð œc &›k˜mÐ,�ÞÜŸ™Ÿ™ XÓ5�äŸ™×)Ñ)¨%Ó0ˆJßˆvÞœE $×.Ñ.Ü—H’HÐ6¸¸jÔIÙ˜D¨×/ä—I’IÐEÀtÈZ×Xò= ÷S ŽVús   Á8A)J!Ê!
J0c                ó¬   • SnU R                  SS9nU=(       a    US   R                  5       S   US   :g  nU(       a  UOSnUR                  U5      U-   $ )z„Return a version of the string escaped for inclusion in an
RFC-822 header, by ensuring there are 8 spaces space after each newline.
z        T)Úkeependséÿÿÿÿr   r•   )Ú
splitlinesr+   )ÚheaderÚindentÚlinesÚends_in_newlineÚsuffixs        r   Úrfc822_escaperÂ   ’  s`   € ð €FØ×Ñ tÐÐ,€Eð ×F  b¡	× 4Ñ 4Ó 6°qÑ 9¸UÀ2¹YÑ F€OÞ&‰V¨B€Fà�;‰;�uÓ Ñ&Ð&r#   c                 ó@   • [        [        R                  " S5      5      $ )zKReturn True if the Python interpreter is built with free threading support.ÚPy_GIL_DISABLED)ÚboolÚ	sysconfigÚget_config_var© r#   r   Úis_freethreadedrÉ   ¡  s   € ä”	×(Ò(Ð):Ó;Ó<Ð<r#   )r   r,   Úreturnz	list[int])r!   ústr | os.PathLike[str]rÊ   r,   )r/   rË   r!   rË   rÊ   r,   )rÊ   ÚNone)rL   zMapping[str, object]rÊ   r,   )zerror: )r_   Úobjectr`   r,   rÊ   r,   )r   r,   rÊ   z	list[str])NF)
r|   zCallable[[Unpack[_Ts]], object]r}   ztuple[Unpack[_Ts]]r~   rÍ   r   rÅ   rÊ   rÌ   )rŽ   r,   rÊ   rÅ   )r   FNNTN)rª   zIterable[str]r«   r   r¬   rÅ   r`   ú
str | Noner­   rÎ   r   rÅ   r®   zbool | NonerÊ   rÌ   )r½   r,   rÊ   r,   )rÊ   rÅ   )CÚ__doc__Ú
__future__r   Ú	functoolsÚimportlib.utilr¥   r   r   rX   rk   r¡   r—   rÆ   r™   Úcollections.abcr   r   r   Útypingr   Újaraco.functoolsr   Ú_logr
   Ú	_modifiedr   Úcompilers.platformr   r   Úerrorsr   r   r   Útyping_extensionsr   r   r   Úget_host_platformr<   Úis_mingwÚVERSION_VARÚMACOSX_VERSION_VARÚ
target_verÚget_macosx_target_verÚ_target_ver_from_syscfgÚ!get_macosx_target_ver_from_syscfgÚ_clear_cached_target_verÚ_clear_cached_macosx_verr   r"   r1   Ú	lru_cacher=   rO   rI   ra   r“   rl   rg   rn   ro   rv   r€   r�   r¸   rÂ   rÉ   rÈ   r#   r   Ú<module>ræ      s  ðñõ #ã Û Û 	Û Û 	Û Û Û 
Û Û ß 7Ñ 7Ý  å &å Ý ß -ß EÝ æß6á
�uÓ
€Cð ×,Ñ,Ð Ø×"Ñ"€Ø�?‰?€Ø×&Ñ&Ð Ø×(Ñ(Ð Ø$)×$AÑ$AÐ !Ø ×9Ñ9Ð ô*ð
 ó1ó ð1ð$NØ$ðNà$ðNð 	ôNð4 ×Ñó,ó ð,ô,4ò&ö(ð —
’
˜h v×'8Ñ'8Ð&9¸Ð=Ó>€Ø�ZŠZÐ,Ó-€
Ø�ZŠZÐ,Ó-€
ô;ðB Øð	Ø
)ðà
ðð 
ðð ð	ð
 
õô(9ð$ ØØØØØðBYØðBYàðBYð ðBYð ð	BYð
 ðBYð ðBYð ðBYð 
õBYôJ'õ=r#   