
    F\h&                        S r SrSrSrSrSrSrSrSrSS	K	r	SS	K
r
SS	KrSS
K7  / SQrS r SSKJrJrJr  S rS rS rS r SSKJr  S rS r\R>                  R                   \l         S r S r! SSKJ"r"  S r#\$" \%" S5       V s1 s H  n \&" U 5      iM     sn 1 Sk-  5      r'\$" 1 SkS Vs1 s H  nSU 3iM
     sn-  S Vs1 s H  nS U 3iM
     sn-  5      r(S! r)S" r*S# r+S$ r, SS%KJ-r.   SS'KJ/r/  S( r0 SS*KJ1r1J2r2J3r4  \54S+ jr6\54S, jr7S-S..S/ jr8S1r9S<S2 jr:S3 r; SS4KJ<r=  SS5KJ>r?  SS6KJ@rA  SS7KJBrC  SS8KJDrE  SS9KJFrG   SS:KJHrH  S; rIg	! \ a    S r GN$f = f! \ a    S r GN$f = f! \ a    S	r" GNf = fs  sn f s  snf s  snf ! \ a    S& r. Nf = f! \ a    S) r0 Nf = f! \ a
    S-S..S0 jr8 Nf = f! \ a     Nf = f! \ a     g	f = f)=zCommon pathname manipulations, WindowsNT/95 version.

Instead of importing this module directly, import os and refer to this
module as os.path.
...\;/z.;C:\binnul    N)*)+normcaseisabsjoin
splitdrive	splitrootsplitsplitextbasenamedirnamecommonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount
isreserved
expanduser
expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefilesameopenfilesamestat
commonpath
isjunction
isdevdriveALLOW_MISSINGc                 0    [        U [        5      (       a  gg)N   \/\/)
isinstancebytespaths    /usr/lib/python3.13/ntpath.py_get_bothsepsr=   "   s    $    )LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEc                 p   [         R                  " U 5      n U (       d  U $ [        U [        5      (       a^  [        R
                  " 5       nU R                  US5      R                  SS5      n [        [        [        U 5      n U R                  US5      $ [        [        [        U R                  SS5      5      $ )^Normalize case of pathname.

Makes all characters lowercase and all slashes into backslashes.
surrogateescaper   r   )osfspathr8   r9   sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodings     r<   r
   r
   2   s    
 IIaLHa002H#45==c4HA5/4A88H&788!"8"2"#))C"68 8r>   c                 (   [         R                  " U 5      n [        U [        5      (       aH  [         R                  " [         R
                  " U 5      R                  SS5      R                  5       5      $ U R                  SS5      R                  5       $ )rC   r   r   )rE   rF   r8   r9   fsencodefsdecoderJ   lower)rO   s    r<   r
   r
   E   se    
 IIaLa;;r{{1~55c4@FFHIIyyd#))++r>   c                     [         R                  " U 5      n [        U [        5      (       a	  SnSnSnSnOSnSnSnSnU S	S
 R	                  X!5      n U R                  US5      =(       d    U R                  U5      $ )zTest whether a path is absolute   \   /s   :\   \\r   r   z:\\\N      )rE   rF   r8   r9   rJ   
startswith)rO   r%   r(   	colon_sep
double_seps        r<   r   r   P   sw    
		!A!U	
	
	"1f"A<<	1%Aj)AAr>   c                 T   [         R                  " U 5      n [        U [        5      (       a  SnSnSnOSnSnSn [	        U 5      u  pVnU H~  n[	        U5      u  pnU
(       a  U	(       d  U(       d  U	nU
nUnM.  U	(       a1  X:w  a,  U	R                  5       UR                  5       :w  a  U	nU
nUnMd  U	nU(       a  US   U;  a  Xr-   nX{-   nM     U(       a  U(       d  U(       a  US   U;  a  XR-   U-   $ XV-   U-   $ ! [        [        [        4 a    [        R                  " SU /UQ76   e f = f)	NrV   r6   s   :\/r   r7   z:\/r   )rE   rF   r8   r9   r   rT   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)r;   pathsr%   seps
colon_sepsresult_driveresult_rootresult_pathpp_drivep_rootp_paths               r<   r   r   c   s3   99T?D$

1:4.;A&/l#GV,#*L$$W4==?l&8&8&::#*L"(K"(K&{2d:)/%.K+ . \"-Z?%33)K77~|4 $$VT:E:s   B6C8 1C8 8/D'c                 *    [        U 5      u  pnXU-   4$ )a  Split a pathname into drive/UNC sharepoint and relative path specifiers.
Returns a 2-tuple (drive_or_unc, path); either part may be empty.

If you assign
    result = splitdrive(p)
It is always true that:
    result[0] + result[1] == p

If the path contained a drive letter, drive_or_unc will contain everything
up to and including the colon.  e.g. splitdrive("c:/dir") returns ("c:", "/dir")

If the path contained a UNC path, the drive_or_unc will contain the host name
and share up to but not including the fourth directory separator character.
e.g. splitdrive("//host/computer/dir") returns ("//host/computer", "/dir")

Paths cannot contain both a drive letter and a UNC path.

)r   )rl   driveroottails       r<   r   r      s    & "!E+r>   )_path_splitroot_exc                    [         R                  " U 5      n [        U [        5      (       a  SnSnSnSnSnO
SnSnSnS	nS
nU R	                  X!5      nUSS U:X  ay  USS U:X  af  USS R                  5       U:X  a  SOSnUR                  X5      nUS:X  a  XU4$ UR                  XS-   5      n	U	S:X  a  XU4$ U SU	 X	U	S-    X	S-   S 4$ XPSS U SS 4$ USS U:X  a!  USS U:X  a  U SS U SS U SS 4$ U SS XPSS 4$ XUU 4$ )zWSplit a pathname into drive, root and tail.

The tail contains anything after the root.rV   rW      :   \\?\UNC\r>   r   r   :\\?\UNC\ Nr[         r`   rZ   )rE   rF   r8   r9   rJ   upperfind)
rl   r%   r(   colon
unc_prefixemptynormpstartindexindex2s
             r<   r   r      sv    IIaLaCFE(JECFE'JE		&&!9QqzS  #2AY__.*<!

3.B;U?*C3R<U?*&z1FQJ#7A:;GG eQqrU**1QZ5 QqzS !ua!fae++ !ueqrU** ?"r>   c                    [         R                  " U 5      n [        U 5      n[        U 5      u  p#n [	        U 5      nU(       a$  XS-
     U;  a  US-  nU(       a  XS-
     U;  a  M  U SU XS peX#-   UR                  U5      -   U4$ )zvSplit a pathname.

Return tuple (head, tail) where tail is everything after the final slash.
Either part may be empty.r[   N)rE   rF   r=   r   lenrstrip)rl   rg   driheadrs   s          r<   r   r      s    
 			!ADlGA!AA
A#d"	Q A#d"2A"$54;;t$$d**r>   c                     [         R                  " U 5      n [        U [        5      (       a  [        R
                  " U SSS5      $ [        R
                  " U SSS5      $ )NrV   rW      .r   r   r   )rE   rF   r8   r9   rd   	_splitextrl   s    r<   r   r      sJ    
		!A!U$$QtT::$$Qc377r>   c                     [        U 5      S   $ )z)Returns the final component of a pathnamer[   r   r   s    r<   r   r          8A;r>   c                     [        U 5      S   $ )z-Returns the directory component of a pathnamer   r   r   s    r<   r   r     r   r>   )_getvolumepathnamec                 r   [         R                  " U 5      n [        U 5      n[        U 5      n [	        U 5      u  p#nU(       a  US   U;   a  U(       + $ U(       a  U(       d  g[
        (       aL  U R                  U5      n[        U 5      R                  U5      nUR                  5       UR                  5       :H  $ g)z]Test whether a path is a mount point (a drive root, the root of a
share, or a mounted volume)r   TF)rE   rF   r=   r"   r   r   r   casefold)r;   rg   rq   rr   restxys          r<   r   r     s     99T?DD4=D!$EqT!xDKKd#**40zz|qzz|++r>       >	   "r	   r   rx   <>?r   |>   AUXCONNULPRNCONIN$CONOUT$u   123456789¹²³COMLPTc                     [         R                  " [        U 5      S   5      R                  [        [
        5      n [        S [        U R                  [
        5      5       5       5      $ )z6Return true if the pathname is reserved by the system.r{   c              3   8   #    U  H  n[        U5      v   M     g 7fN)_isreservedname).0names     r<   	<genexpr>isreserved.<locals>.<genexpr><  s     K1Jt$$1Js   )	rE   rS   r   rJ   r(   r%   anyreversedr   r:   s    r<   r   r   7  sF     ;;yq)*2263?DK$**S/1JKKKr>   c                     U SS S;   a  U S;  $ [         R                  U 5      (       a  gU R                  S5      S   R                  S5      R	                  5       [
        ;   $ )	z6Return true if the filename is reserved by the system.r`   N)r    )r   r   Tr   r   r   )_reserved_charsintersection	partitionr   r}   _reserved_names)r   s    r<   r   r   >  sb     BCyJ;&& ##D)) >>#q!((-335HHr>   c                 N   [         R                  " U 5      n [        U [        5      (       a  SnSnOSnSnU R	                  U5      (       d  U $ S[        U 5      pCX4:  a  X   U;  a  US-  nX4:  a
  X   U;  a  M  S[         R                  ;   a  [         R                  S   nOSS[         R                  ;  a  U $ [         R                  R                  SS	5      n[        U[         R                  S   5      nUS:w  az  U SU n[        U[        5      (       a  [         R                  " U5      n[         R                  R                  S
5      nXx:w  a&  U[        U5      :w  a  U $ [        [        U5      U5      n[        U [        5      (       a  [         R                  " U5      nXPUS -   $ )zHExpand ~ and ~user constructs.

If user or $HOME is unknown, do nothing.r6      ~r7   ~r[   USERPROFILEHOMEPATH	HOMEDRIVErz   USERNAMEN)rE   rF   r8   r9   r\   r   environgetr   rS   r   r   rR   )	r;   rg   tilder   nuserhomerq   target_usercurrent_users	            r<   r   r   W  sb    99T?D$??5!!c$iq
%DG4'	Q %DG4' 

"::m,	2::	%

{B/rzz*56Av1Qik5))++k2Kzz~~j1& x11GH-{;H$;;x(12hr>   c                 &   [         R                  " U 5      n [        U [        5      (       aT  SU ;  a  SU ;  a  U $ SSKn[        UR
                  UR                  -   S-   S5      nSnSnSnS	nSn[        [         S
S5      nOHSU ;  a  SU ;  a  U $ SSKnUR
                  UR                  -   S-   nSnSnSnSnSn[         R                  nU SS n	Sn
[        U 5      nX:  Ga  X
U
S-    nX:X  a3  X
S-   S n [        U 5      n U R                  U5      n
XU SU
S-    -   -  n	GOX:X  a  X
S-   U
S-    U:X  a  X-  n	U
S-  n
GOX
S-   S n [        U 5      n U R                  U5      n
U SU
 n Uc<  [         R                  " [         R                  [         R                  " U5         5      nOX   n X-  n	GO5X:X  Ga+  X
S-   U
S-    U:X  a  X-  n	U
S-  n
GOX
S-   U
S-    U:X  as  X
S-   S n [        U 5      n U R                  U5      n
U SU
 n Uc<  [         R                  " [         R                  [         R                  " U5         5      nOX   n X-  n	OU SS nU
S-  n
X
U
S-    nU(       a#  X;   a  X-  nU
S-  n
X
U
S-    nU(       a  X;   a  M   Uc<  [         R                  " [         R                  [         R                  " U5         5      nOX   n X-  n	U(       a  U
S-  n
OX-  n	U
S-  n
X:  a  GM  U	$ ! [         a    XU -   -  n	US-
  n
 N'f = f! [         a    XM-   U-   n GNzf = f! [         a    XU -   -  n	US-
  n
 N[f = f! [         a    Xu-   U-   U-   n GNf = f! [         a    XU-   U -   -  n	US-
  n
 Nf = f! [         a    X}-   n Nf = f)zbExpand shell variables of the forms $var, ${var} and %var%.

Unknown variables are left unchanged.   $   %r   Nz_-ascii   '   {   }environb$%'{}r[   r{   )rE   rF   r8   r9   stringascii_lettersdigitsgetattrr   r   r   
ValueErrorrR   rS   KeyError)r;   r   varcharsquotepercentbracerbracedollarr   resr   pathlencvarvalues                  r<   r    r      s
    99T?D$tD 0K--=DgN"j$/d?s$K''&--7$>**
r(CE$iG
/uQw:	
#D$iG$

14
+++ \AIeai(G3
!GH~d)! JJw/E
 v,C8"?$&KK

2;;s;K0L$ME$+LE LC[AIeai(F2
ai	*e3!GH~d)! JJv.E
 v,C>"?$&KK

2;;s;K0L$ME$+LE LC2Ah
uqy)AMHCQJE519-A AM) "BJJr{{37G,H I ' QJEHC
W /X JI  $4x!$, $ 8 ' 78 " (T>)C#aKE(@ $ > & 4v => " (E>D00C#aKE(4   )"LE)s~   ?K5 L) '>L &L 1M  >M M >M? M? 5LLL&%L&)MMMM M<;M<?NN)_path_normpathc                 :   [         R                  " U 5      n [        U [        5      (       a	  SnSnSnSnOSnSnSnSnU R	                  X!5      n [        U 5      u  pVn XV-   nU R                  U5      nS	n	U	[        U5      :  ai  X   (       a  X   U:X  a  X	 ODX   U:X  a7  U	S	:  a  XS
-
     U:w  a  XS
-
  U	S
-   2	 U	S
-  n	OU	S	:X  a
  U(       a  X	 OU	S
-  n	OU	S
-  n	U	[        U5      :  a  Mi  U(       d  U(       d  UR                  U5        XqR                  U5      -   $ )z0Normalize path, eliminating double slashes, etc.rV   rW   r      ..r   r   r   r   r   r[   )
rE   rF   r8   r9   rJ   r   r   r   appendr   )
r;   r%   r(   r#   r$   rq   rr   prefixcompsr   s
             r<   r!   r!     s    yydE""CFFFCFFF||F(%dOT

3#e*n8ux61HV#q5UQ3Z61c!A#gFA!VFAQ #e*n eLL ''r>   )_getfullpathnamec                     [        [        U 5      5      $ ! [        [        4 a     Of = f[        R
                  " U 5      n [        U 5      (       d  [        U [        5      (       a  Sn[        R                  nOSn[        R                  n[        U 5      u  p4n U(       d  U(       a6   [        [        X4-   5      U 5      n O.! [        [        4 a
    X1-   U -   n  Of = f[        U" 5       U 5      n [        U 5      $ )&Return the absolute version of a path.rV   r   )r   r!   OSErrorr   rE   rF   r   r8   r9   getcwdbgetcwdr   r   )r;   r%   r   rq   rr   s        r<   r"   r"   =  s    	#HTN33$ 		 yyT{{$&& )$E. 0 >ED, . ;-D. FHd+~s    )))C CCc                     [         R                  " U 5      n [        U 5      (       dK  [        U [        5      (       a  [         R
                  " 5       nO[         R                  " 5       n[        X5      n [        U 5      $ )r   )	rE   rF   r   r8   r9   r   r   r   r!   )r;   cwds     r<   r"   r"   1  sN    yyT{{$&&jjliik?D~r>   )_findfirstfile_getfinalpathnamereadlinkc                    Sn[        5       n[        U 5      U;  a|  UR                  [        U 5      5         U n[        U 5      n [	        U 5      (       d3  [        U5      (       d  Un  U $ [        [        [        U5      U 5      5      n [        U 5      U;  a  M|  U $ ! U a  nUR                  U;   a   S nAU $ e S nAf[         a     U $ f = f)N)r[   r{   rZ         r   2   C   W   i&  i(  i)  )setr
   add_nt_readlinkr   r   r!   r   r   winerrorr   )r;   ignored_errorallowed_winerrorseenold_pathexs         r<   _readlink_deepr  _  s     LutnD(HHXd^$#D) T{{ "(++'  $D):D$ABD tnD(,  ! ;;"22
 	  s)   /B )B C B76B77CCc                 "   SnU S S nU (       a    [        U 5      n U(       a  [        X5      $ U $ U$ ! U a  nUR                  U;  a  e  [        U US9nXP:w  a  U(       a  [        XS5      OUs S nA$ O! U a     Of = fUR                  S;   a3   [	        U 5      n[        U 5      u  pO&! U a    [        U 5      u  p Of = f[        U 5      u  pU (       a  U(       d	  X-   s S nA$ U(       a  [        Xc5      OUn S nAOS nAff = fU (       a  GM  N)N)r[   r{   rZ   r   r   r   r   5   A   r   r   {      i      r   r   )r[   r   r   r   r   r  r  )r   r   r   r  r   r   )r;   r   r  rs   r  new_pathr   _s           r<   _getfinalpathname_nonstrictr    s   & ^ BQx:(.+/tD'9T96 5 ! :;;&66
  .d<I KH'7;tH3I ($  ;;"@@1-d3"'+a( 1%*4[
d1 "'tJD;&+/tD'T3:	 dsr   1 1 DC>	"A2+D1C>2A;8C>:A;;C>B('C>(B>;C>=B>>!C>D%C>>DF)strictc                   [        U 5      n [        U [        5      (       a.  SnSnSn[        R                  " 5       nSn[        U 5      U:X  a  gO-SnSnSn[        R                  " 5       nS	n[        U 5      U:X  a  g
U R                  U5      nU[        L a	  [        nSnOU(       a  SnO[        nU(       d  [        U 5      (       d  [        XP5      n  [        U 5      n Sn	U(       d_  U R                  U5      (       aI  U R                  U5      (       a  X@[%        U5      S  -   nOU [%        U5      S  n [        U5      U :X  a  Un U $ U $ ! [         a1  n
U(       a  [        [        U
5      5      S e[        U 5      n  S n
A
NS n
A
fU a   n
U
R                   n	[#        U US9n  S n
A
NS n
A
ff = f! [         a  n
 S n
A
U $ S n
A
f[         a  n
U
R                   W	:X  a  Un  S n
A
U $ S n
A
ff = f)Ns   \\?\rw   rX   s   nuls   \\.\NULz\\?\ry   rY   r   z\\.\NULT r   r  )r!   r8   r9   rE   r   r
   r   r\   r4   FileNotFoundErrorr   r   r   r   r   strr   r  r   )r;   r  r   r   new_unc_prefixr   r*   
had_prefixr   initial_winerrorr  spaths               r<   r+   r+     s   ~dE""F(J$N**,CG~($ ) F'J#N))+CG~(#__V,
]"-MFM#M%++?D	L$T*D   doof55 z**&c*o.>)??S[\*!$U+t3 D tG  	"
 c"g&D0D>D 	L!{{.t=JLD	L$      ! ;;"22 D!sB   E 2F) 
F&'E==	F&F!!F&)
G#9G#GG#c                    [        U 5      $ r   )r"   )r;   r  s     r<   r+   r+   \  s    t}r>   Tc                 6   [         R                  " U 5      n U (       d  [        S5      e[        U [        5      (       a  SnSnSnOSnSnSnUc  UnO[         R                  " U5      n [        U5      n[        U 5      n[        U5      u  pxn	[        U5      u  pn[        U5      [        U
5      :w  a  [        S	U
< S
U< 35      eU	(       a  U	R                  U5      O/ nU(       a  UR                  U5      O/ nSn[        X5       H%  u  nn[        U5      [        U5      :w  a    O	US-  nM'     U/[        U5      U-
  -  XS -   nU(       d  U$ UR                  U5      $ ! [        [        [        [        [        4 a    [         R"                  " SX5        e f = f)z#Return a relative version of a pathzno path specifiedrV   r   r   r   r   r   Nzpath is on mount z, start on mount r   r[   r-   )rE   rF   r   r8   r9   r"   r   r
   r   zipr   r   ra   rb   rc   DeprecationWarningrd   re   )r;   r   r%   r#   r$   	start_abspath_absstart_driver  
start_rest
path_drive	path_rest
start_list	path_listr   e1e2rel_lists                     r<   r-   r-     s   99T?D,--$}		% EN	4=%.y%9"
#,X#6 
yK HZ$88K) * * /9Z%%c*b
,5IOOC(2	*0FB|x|+FA 1
 8s:q01IbMAMxx!!z><AST $$Y<s   (C&E  E   8Fc           
         [        [        [        R                  U 5      5      n U (       d  [	        S5      e[        U S   [        5      (       a  SnSnSnOSnSnSn U  Vs/ s H+  n[        UR                  X!5      R                  5       5      PM-     nnU VVVs/ s H  u  pgoDR                  U5      PM     nnnn[        U VVVs1 s H  u  pgoFiM	     snnn5      S	:w  a  [	        S
5      e[        U S   R                  X!5      5      u  pn[        U VVVs1 s H  u  pgoGiM	     snnn5      S	:w  a  U	(       a  [	        S5      e[	        S5      eUR                  U5      nU Vs/ s H  o(       d  M  X:w  d  M  UPM     nnU VVs/ s H$  o Vs/ s H  o(       d  M  X:w  d  M  UPM     snPM&     nnn[        U5      n[        U5      n[        U5       H  u  nnUUU   :w  d  M  USU n  O   US[        U5       nX-   UR                  U5      -   $ s  snf s  snnnf s  snnnf s  snnnf s  snf s  snf s  snnf ! [         ["        4 a    [$        R&                  " S/U Q76   e f = f)zEGiven an iterable of path names, returns the longest common sub-path.z%commonpath() arg is an empty iterabler   rV   rW   r   r   r   r   r[   zPaths don't have the same drivez%Can't mix absolute and relative pathsz%Can't mix rooted and not-rooted pathsNr1   )tuplemaprE   rF   r   r8   r9   r   rJ   rT   r   r   minmax	enumerater   ra   rb   rd   re   )rf   r%   r(   r#   rl   drivesplitsr   r   split_pathsrq   rr   r;   commonr   rO   s1s2r   s                     r<   r1   r1   F  s/   #bii'(E@AA%(E""!JOP%Qy6!7!=!=!?@%P3>?;awws|;?
 -gaA-.!3>??%eAh&6&6v&CDT-gaA-.!3 !HII !HIIC#9Vq!Q[!V9DOPKq1:1aak1:KPbMDAqBqEz "
 HSW%F|chhv...; Q?
 . . ::P ~& $$\:E:s   H=  2HH= H7H= HAH= H&%?H= $
H-2H-9H-?H= 	H7
H2H2$H2*H711H= &,H= H= 2H77H= =)I&)_path_isdir)_path_isfile)_path_islink)_path_isjunction)_path_exists)_path_lexists)_path_isdevdrivec                 L     [        [        U 5      5      $ ! [         a     gf = f)z@Determines whether the specified path is on a Windows Dev Drive.F)r:  r"   r   r:   s    r<   r3   r3     s(    	#GDM22 		s    
##r   )J__doc__r#   r$   r)   r%   r&   r(   r'   r*   rE   rG   rd   __all__r=   _winapir?   rK   r@   rL   rA   rM   r
   ImportErrorr   r   r   ntrt   r   r   r   r   r   r   r   r   	frozensetrangechrr   r   r   r   r   r    r   r!   r   r"   r   r   r   r   r   r  r  r+   r,   r-   r1   r4  r   r5  r   r6  r   r7  r2   r8  r   r9  r   r:  r3   )r   r   s   00r<   <module>rD     s   
		

	

 	 
  *!,- -
8<B&)^.-#2h+*8 ((00 
%( 2YYSVY23
 5/0/1s1#Y/01/0/1s1#Y/01LI2,xj`&(-R)#6oNN ,3 (T 9@ 6p "' FT " ,r0f	 ())1)+
	#M  	,,	,N  +#*#+#V  .   10d  #("(#(T  
	
T  !& R	  		  		s   E E! 1E1 F -F
F

)F 0F :
F- "$G  	G 	EE!	E.-E.1E=<E=	FF	F*)F*-F=<F= G	G	GG