
    0i^p                     v   d Z dZdZdZdZdZdZdZdZdd	l	Z	dd	l
Z
dd	lZdd	lZdd
lT g dZd Z	 ddlmZmZmZ d Zn# e$ r d ZY nw xY wd Zd Zd Zd Zd Zej        j         e_         d Zd Zd Z d Z!	 ddl"m#Z# n# e$ r d	Z#Y nw xY wd Z$d Z%dZ&d	a'd	a(d Z)	 ddl"m*Z* d Z+n# e$ r d  Z+Y nw xY wd! Z,	 dd"l"m-Z- d# Z.n# e$ r e,Z.Y nw xY w	 dd$l"m/Z/m0Z1 e2fd%Z3e2fd&Z4d'd(d)Z5n# e$ r	 d'd(d*Z5Y nw xY w e6e
d+          o e
j7                    d,         d-k    Z8d1d.Z9d/ Z:	 dd0l"m;Z< d	S # e$ r Y d	S w xY w)2zCommon 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splitsplitextbasenamedirnamecommonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount
expanduser
expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefilesameopenfilesamestat
commonpathALLOW_MISSINGc                 4    t          | t                    rdS dS )N   \/\/)
isinstancebytespaths    /usr/lib64/python3.11/ntpath.py_get_bothsepsr9   $   s    $ vu    )LCMapStringExLOCALE_NAME_INVARIANTLCMAP_LOWERCASEc                    t          j        |           } | s| S t          | t                    rnt	          j                    }|                     |d                              dd          } t          t          t          |           } |                     |d          S t          t          t          |                     dd                    S )nNormalize case of pathname.

        Makes all characters lowercase and all slashes into backslashes.
        surrogateescaper   r   )osfspathr4   r5   sysgetfilesystemencodingdecodereplace_LCMapStringEx_LOCALE_NAME_INVARIANT_LCMAP_LOWERCASEencode)sencodings     r8   r
   r
   4   s    
 IaLL 	Ha 		8022H#455==c4HHA5/4 4A88H&7888!"8"2"#))C"6"68 8 8r:   c                 <   t          j        |           } t          | t                    rLt          j        t          j        |                               dd                                                    S |                     dd                                          S )r?   r   r   )rA   rB   r4   r5   fsencodefsdecoderF   lower)rK   s    r8   r
   r
   G   sx    
 IaLLa 	J;r{1~~55c4@@FFHHIIIyyd##))+++r:   c                    t          j        |           } t          | t                    rd}d}d}nd}d}d}| dd                             ||          } |                     |          s|                     |d	          rd
S dS )zTest whether a path is absolute   \   /s   :\r   r   z:\N      TF)rA   rB   r4   r5   rF   
startswith)rK   r#   r&   	colon_seps       r8   r   r   X   s    
	!A!U 				"1"fc""A 	||C ALLA66 t5r:   c                    t          j        |           } t          | t                    rd}d}d}nd}d}d}	 |s| d d         |z    t	          |           \  }}t          t           j        |          D ]x}t	          |          \  }}	|	r|	d         |v r	|s|s|}|	})|r7||k    r1|                                |                                k    r|}|	}`|}|r|d         |vr||z   }||	z   }y|r"|d         |vr|r|dd          |k    r||z   |z   S ||z   S # t          t          t          f$ r t          j        d	| g|R    w xY w)
NrR   r2      :r   r3   :r   r   )rA   rB   r4   r5   r   maprP   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)
r7   pathsr#   sepscolonresult_driveresult_pathpp_drivep_paths
             r8   r   r   l   s   9T??D$  	!HsNN$.t$4$4!kRY&& 	/ 	/A(mmOGV '&)t++ +, +#*L$ 'W44==??l&8&8&:&:::#*L"(K& 0{2d::)C/%.KK 	4KN$66 7)"##.%77#%33k))~|4   $VT:E::::s   CD D ,Ec                 \   t          j        |           } t          |           dk    rt          | t                    r	d}d}d}d}nd}d}d}d	}|                     ||          }|d
d         |dz  k    r|dd                                         |k    rdnd}|                    ||          }|dk    r| | dd
         fS |                    ||dz             }|dk    r| | dd
         fS | d|         | |d         fS |dd         |k    r| dd         | dd         fS | dd
         | fS )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.

       rR   rS   rY      \\?\UNC\r   r   rZ   \\?\UNC\r   N   r[   rU   )rA   rB   lenr4   r5   rF   upperfind)	rg   r#   r&   rd   
unc_prefixnormpstartindexindex2s	            r8   r   r      sd   & 		!A
1vv{{a 		(CFE(JJCFE'J		&#&&1:q   rr**j88AAaEJJsE**E{{!BQB%xZZUQY//F||!BQB%xWfW:qz))1:RaR5!ABB%<RaR5!8Or:   c                 4   t          j        |           } t          |           }t          |           \  }} t	          |           }|r!| |dz
           |vr|dz  }|r| |dz
           |v| d|         | |d         }}|                    |          p|}||z   |fS )z~Split a pathname.

    Return tuple (head, tail) where tail is everything after the final slash.
    Either part may be empty.rU   N)rA   rB   r9   r   ro   rstrip)rg   rc   diheadtails         r8   r   r      s    
 		!ADa==DAqAA
 !A#d""	Q  !A#d""2A2!""$D;;t$Dt8T>r:   c                     t          j        |           } t          | t                    rt	          j        | ddd          S t	          j        | ddd          S )NrR   rS      .r   r   r   )rA   rB   r4   r5   r`   	_splitextrg   s    r8   r   r      sO    
	!A!U 8$QtT:::$Qc3777r:   c                 ,    t          |           d         S )z)Returns the final component of a pathnamerU   r   r   s    r8   r   r          88A;r:   c                 ,    t          |           d         S )z-Returns the directory component of a pathnamer   r   r   s    r8   r   r      r   r:   c                     	 t          j        |           }n# t          t          t          f$ r Y dS w xY wt          j        |j                  S )zhTest whether a path is a symbolic link.
    This will always return false for Windows prior to 6.0.
    F)rA   lstatOSError
ValueErrorr^   statS_ISLNKst_moder7   sts     r8   r   r     sQ    Xd^^Z0   uu<
###s    22c                 b    	 t          j        |           }n# t          t          f$ r Y dS w xY wdS )zCTest whether a path exists.  Returns True for broken symbolic linksFT)rA   r   r   r   r   s     r8   r   r     sB    Xd^^Z    uu4s    ,,)_getvolumepathnamec                    t          j        |           } t          |           }t          |           } t	          |           \  }}|r|d         |v r| p||v S |r||v rdS t
          ra|                     |          }t          |                               |          }|                                |                                k    S dS )zaTest whether a path is a mount point (a drive root, the root of a
    share, or a mounted volume)r   TF)rA   rB   r9   r    r   r   rx   casefold)r7   rc   rootrestxys         r8   r   r   #  s     9T??DD4==DD!!JD$ ,Q4+ddl+ t KKd##**400zz||qzz||++ur:   c                    t          j        |           } t          | t                    rd}nd}|                     |          s| S dt          |           }}||k     r9| |         t          |           vr"|dz  }||k     r| |         t          |           v"dt           j        v rt           j        d         }nVdt           j        vr| S 	 t           j        d         }n# t          $ r d}Y nw xY wt          |t           j        d                   }|dk    r| d|         }t          |t                    rt          j
        |          }t           j                            d          }||k    r2|t          |          k    r| S t          t          |          |          }t          | t                    rt          j        |          }|| |d	         z   S )
zLExpand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing.   ~~rU   USERPROFILEHOMEPATH	HOMEDRIVE USERNAMEN)rA   rB   r4   r5   rV   ro   r9   environKeyErrorr   rO   getr   r   rN   )r7   tilderz   nuserhomedrivetarget_usercurrent_users           r8   r   r   @  s    9T??D$ ??5!! c$iiqA
a%%DG=#6#666	Q a%%DG=#6#666 
"":m,2:%%	J{+EE 	 	 	EEE	rz*566Avv1Q3ik5)) 	3+k22Kz~~j11,&& x1111GH--{;;H$ );x((d122hs   C C*)C*z.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)c                    t          j        |           } t          | t                    rrd| vrd| vr| S t          s;ddl}|                    t                                          |j	                  j
        at          }ddddt          t           dd          nUd| vrd	| vr| S t          s)ddl}|                    t          |j	                  j
        at          }d	d
ddt           j        fd} |||           S )zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.   $   %r   N   {   }environb$%{}c                    | j         }|| d         S | |         }|dk    r0|k    r|S |                              s| d         S |d d         }nD|k    r|S |                              r'|                              s| d         S |dd         }	 6t          j        t          j        t          j        |                             S |         S # t          $ r | d         cY S w xY w)Nr   rU   r[   )	lastindexendswithrV   rA   rN   r   rO   r   )mr   namebracedollarr   percentrbraces      r8   replzexpandvars.<locals>.repl  s   K	Q4K|>>w==)) t9DDv~~u%% "}}V,,  Q4KAbDz	{2:bk$.?.?#@AAAt}$ 	 	 	Q4KKK	s   7C C C+*C+)rA   rB   r4   r5   _varsubbrecompile_varpatternrJ   ASCIIsubgetattr_varsubr   )	r7   r   r   r   r   r   r   r   r   s	       @@@@@r8   r   r     sB    9T??D$ tD 0 0K 	FIIIzz+"4"4"6"6AAEH"j$//d??s$K 	<IIIjjbh77;G*        6 3tT??r:   )_path_normpathc                     t          j        |           } t          | t                    r5t          j        t          t          j        |                               pdS t          |           pdS )0Normalize path, eliminating double slashes, etc.r~   r   )rA   rB   r4   r5   rN   r   rO   r6   s    r8   r   r     s\    ydE"" 	J;~bk$.?.?@@AAITId##*s*r:   c                    t          j        |           } t          | t                    r	d}d}d}d}nd}d}d}d}|                     ||          } t          |           \  }} |                     |          r||z  }|                     |          } |                     |          }d	}|t          |          k     r||         r||         |k    r||= n\||         |k    rK|d	k    r ||d
z
           |k    r||d
z
  |d
z   = |d
z  }n*|d	k    r|
                    |          r||= n|d
z  }n|d
z  }|t          |          k     |s|s|                    |           ||                    |          z   S )r   rR   rS   r~      ..r   r   r   r   r   rU   )rA   rB   r4   r5   rF   r   rV   lstripr   ro   r   appendr   )r7   r#   r&   r!   r"   prefixcompsrz   s           r8   r   r     s   ydE"" 		CFFFFCFFF||FC((!$'' ??3 	$cMF;;s##D

3#e**nn8 uQx611!HHqV##q55U1Q3Z611ac!A#gFAA!VV 4 4VaFAAQ #e**nn  	!e 	!LL   ''r:   c                     t          j        |           } t          |           sLt          | t                    rt          j                    }nt          j                    }t          ||           } t          |           S )zReturn the absolute version of a path as a fallback function in case
    `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for
    more.

    )	rA   rB   r   r4   r5   getcwdbgetcwdr   r   )r7   cwds     r8   _abspath_fallbackr     sb     9T??D;; dE"" 	*,,CC)++CCD>>r:   )_getfullpathnamec                     	 t          t          |                     S # t          t          f$ r t	          |           cY S w xY w)z&Return the absolute version of a path.)r   r   r   r   r   r6   s    r8   r    r      sO    	+#HTNN333$ 	+ 	+ 	+$T*****	+s     A A)_getfinalpathnamereadlinkc                    d}t                      }t          |           |vr|                    t          |                      	 | }t          |           } t	          |           s<t          |          s|} nct          t          t          |          |                     } n'# |$ r}|j	        |v rY d }~n% d }~wt          $ r Y nw xY wt          |           |v| S )N)rU   rk   rT             2   C   W   i&  i(  i)  )setr
   add_nt_readlinkr   r   r   r   r   winerrorr   )r7   ignored_errorallowed_winerrorseenold_pathexs         r8   _readlink_deepr     s    LuutnnD((HHXd^^$$$#D)) T{{ C "(++ '#D):):D$A$ABBD    ;"222EEEE   ' tnnD((, s*   1B" 7*B" "C'	B65B66CCc                    d}| d d         }| r	 t          |           } |rt          | |          n| S # |$ r}|j        |vr 	 t          | |          }|| k    r|rt          ||          n|cY d }~S n# |$ r Y nw xY wt	          |           \  } }| r|s
| |z   cY d }~S |rt          ||          n|}Y d }~nd }~ww xY w| |S )N)rU   rk   rT   r   r   r   r   5   A   r   r   {      i  i  r   r   )r   r   r   r   r   )r7   r   r   r|   r   new_pathr   s          r8   _getfinalpathname_nonstrictr   G  si   $ X BQBx 	::(..+/9tD$'''T9  : : :;&666
  .d<I K  K  KH4''7;ItHd333IIIIII ($   D #4[[
d  ' '$;&&&&&&+/9tD$'''T):	  	:2 sJ   "3 B=
B8*A4-B=3B84A<9B8;A<<B8B=B88B=F)strictc                n   t          |           } t          | t                    rSd}d}d}t          j                    }t          |           t          t          j        t                              k    rdS n@d}d}d}t          j                    }t          |           t          t                    k    rdS | 	                    |          }|t          u r
t          }d	}n|rd
}nt          }|st          |           st          ||           } 	 t          |           } d}nj# t           $ r8}	|rt          t#          |	                    d t          |           } Y d }	~	n-d }	~	w|$ r"}	|	j        }t'          | |          } Y d }	~	nd }	~	ww xY w|s| 	                    |          r| 	                    |          r|| t)          |          d          z   }
n| t)          |          d          }
	 t          |
          | k    r|
} n6# t           $ r
}	Y d }	~	n'd }	~	wt          $ r}	|	j        |k    r|
} Y d }	~	nd }	~	ww xY w| S )Ns   \\?\rl   s   \\s   \\.\NULz\\?\rm   z\\z\\.\NULT r   r   )r   r4   r5   rA   r   r
   rN   r(   r   rV   r0   FileNotFoundErrorr   r   r   r   r   strr   r   ro   )r7   r   r   rr   new_unc_prefixr   
had_prefixr   initial_winerrorr   spaths              r8   r)   r)   y  s   ~~dE"" 	$F(J$N*,,C~~"+g*>*>!?!???$} @ F'J#N)++C~~'!2!222#|__V,,
]""-MFF 	$MM#M 	#%++ 	#T??D	L$T**D  	" 	" 	"
  1c"gg&&D0D>>DDDDDD 	L 	L 	L!{.t=JL L LDDDDDD	L  	!doof55 	! z** +&c*oo.>.>)??S[[\\*!$U++t33 D     ! ! ! ;"222 D	!
 sB   D   
F*.EF%FF)G? ?
H2H2H--H2c                     t          |           S N)r    )r7   r   s     r8   r)   r)     s    t}}r:   getwindowsversionrT   rk   c                    t          j        |           } t          | t                    rd}d}d}nd}d}d}||}| st	          d          t          j        |          }	 t          t          |                    }t          t          |                     }t          |          \  }}t          |          \  }	}
t          |          t          |	          k    rt	          d	|	d
|          d |	                    |          D             }d |
	                    |          D             }d}t          ||          D ],\  }}t          |          t          |          k    r n|dz  }-|gt          |          |z
  z  ||d         z   }|s|S t          | S # t          t          t          t          t           f$ r t#          j        d| |            w xY w)z#Return a relative version of a pathrR   r~   r   r   r   r   Nzno path specifiedzpath is on mount z, start on mount c                     g | ]}||S r   r   .0r   s     r8   
<listcomp>zrelpath.<locals>.<listcomp>  s    <<<A!<a<<<r:   c                     g | ]}||S r   r   r   s     r8   r   zrelpath.<locals>.<listcomp>  s    :::1:Q:::r:   r   rU   r+   )rA   rB   r4   r5   r   r    r   r   r
   r   zipro   r   r]   r^   r_   DeprecationWarningr`   ra   )r7   rt   r#   r!   r"   	start_abspath_absstart_drive
start_rest
path_drive	path_rest
start_list	path_listrz   e1e2rel_lists                    r8   r+   r+     s   9T??D$ } .,---IeEHUOO,,	8D>>**",Y"7"7Z *8 4 4
IK  HZ$8$888*

KK) * * * =<!1!1#!6!6<<<
::	 4 4:::	*i00 	 	FB||x||++FAA8s:q01IabbMA 	MXz><AST   $Ye<<<s   !D2F F ;Gc                     | st          d          t          t          t          j        |                     } t          | d         t                    rdddnddd	 fd	| D             }fd
|D             }	 t          fd|D                       \  }n# t           $ r t          d          dw xY wt          t          d |D                                 dk    rt          d          t          | d         
                                        \  }}|                              }fd|D             }fd|D             }t          |          }t          |          }t          |          D ]\  }	}
|
||	         k    r|d|	         } n|dt          |                   }|r|z   n|}|                    |          z   S # t           t"          f$ r t%          j        dg| R    w xY w)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencer   rR   rS   r~   r   r   r   c                 z    g | ]7}t          |                                                                        8S r   )r   rF   rP   )r   rg   r&   r#   s     r8   r   zcommonpath.<locals>.<listcomp>  s;    QQQaz!))FC"8"8">">"@"@AAQQQr:   c                 @    g | ]\  }}|                               S r   r   r   ry   rg   r#   s      r8   r   zcommonpath.<locals>.<listcomp>  s'    <<<1qwws||<<<r:   c              3   :   K   | ]\  }}|d d         k    V  d S )NrU   r   r  s      r8   	<genexpr>zcommonpath.<locals>.<genexpr>  s3      >>$!Q2A2#>>>>>>r:   z%Can't mix absolute and relative pathsNc              3       K   | ]	\  }}|V  
d S r   r   )r   ry   rg   s      r8   r  zcommonpath.<locals>.<genexpr>  s&      --A1------r:   rU   zPaths don't have the same drivec                 $    g | ]}||k    
|S r   r   r   cr!   s     r8   r   zcommonpath.<locals>.<listcomp>  s#    999q9Q&[[![[[r:   c                 ,    g | ]}fd |D             S )c                 $    g | ]}||k    
|S r   r   r  s     r8   r   z)commonpath.<locals>.<listcomp>.<listcomp>  s#    :::a:a6kkkkkr:   r   )r   rK   r!   s     r8   r   zcommonpath.<locals>.<listcomp>  s.    PPPq::::1:::PPPr:   r/   )r   tupler\   rA   rB   r4   r5   r   ro   r   rF   r   minmax	enumerater   r]   r^   r`   ra   )rb   drivesplitssplit_pathsr   r   r7   commons1s2rz   r  r   r&   r!   r#   s               @@@r8   r/   r/     sw     B@AAA#bi''((E%(E"" !QQQQQ5QQQ<<<<<<<	P>>>>+>>>>>FEE 	P 	P 	PDEE4O	P s-------..!33>??? q!1!1&#!>!>??tC9999V999PPPPKPPPbMM 	& 	&DAqBqEzz  HSWWH%F %05((((~&   $\:E::::s%   %G B!  G !B<<DG %G=)_isdirr   )=__doc__r!   r"   r'   r#   r$   r&   r%   r(   rA   rC   r   r`   __all__r9   _winapir;   rG   r<   rH   r=   rI   r
   ImportErrorr   r   r   r   r   r   r   r   r   r   ntr   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r)   hasattrr   r*   r+   r/   r"  r   r   r:   r8   <module>r)     sG    
		

	

 				 



             !,- - - - - - - - - -
8 8 8 8$  	, 	, 	,, , , , ,	,$  () ) )^. . .l  .8 8 8 (0 
    $ $ $  $%%%%%%%     :- - -z @
: : :@3+!!!!!!Z+ + + +W  (( (( (('( '( '( '( '(((f  "+######+ + + +	       GGG g>>>>>>>> ,3 ( ( ( (T 9@ 0 0 0 0d "' D D D D D DC    !&       R &gc+>?? >3c355a8A= + + + +p1 1 1h	
 #""""""" 	 	 	DD	si   = AA8A? ?B	B	B& &B10B18C CCC) )C76C7'D/ /D87D8