a
    i\g                     @   s  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d Zdd Zdd Zdd Zdd Zdd Zdd Zejj e_ dd Zdd Zdd Zd d! Zzdd"lmZ W n ey   d	ZY n0 d#d$ Zd%d& Zd'Zd	a d	a!d(d) Z"d*d+ Z#d,d- Z$zdd.lm%Z% W n ey:   e$Z&Y n
0 d/d0 Z&zdd1lm'Z'm(Z) W n" eyz   d2d3d4d5Z*Y n(0 e+fd6d7Z,e+fd8d9Z-d2d3d:d5Z*e.e
d;oe
/ d< d=kZ0dCd>d?Z1d@dA Z2zddBlm3Z4 W n ey   Y n0 d	S )DzCommon 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                 C   s   t | trdS dS d S )N   \/\/)
isinstancebytespath r6   /usr/lib64/python3.9/ntpath.py_get_bothseps#   s    
r8   c                 C   s8   t | } t| tr$| dd S | dd S dS )zaNormalize case of pathname.

    Makes all characters lowercase and all slashes into backslashes.   /   \r   r   N)osfspathr2   r3   replacelowersr6   r6   r7   r	   -   s    

r	   c                 C   sj   t | } t| tr,| dddrBdS n| dddrBdS t| d } t| d	koh| d	 t| v S )
zTest whether a path is absoluter9   r:      \\?\Tr   r   \\?\   r   )	r;   r<   r2   r3   r=   
startswithr   lenr8   r?   r6   r6   r7   r
   >   s    

r
   c           
   
   G   sT  t | } t| tr"d}d}d}nd}d}d}z|sD| d d |  t| \}}tt j|D ]~}t|\}}	|	r|	d |v r|s|s|}|	}q\n*|r||kr| | kr|}|	}q\|}|r|d |vr|| }||	 }q\|r|d |vr|r|dd  |kr|| | W S || W S  ttt	fyN   t
jd	| g|R    Y n0 d S )
Nr:   r0      :r   r1   :r   r   )r;   r<   r2   r3   r   mapr>   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)
r5   pathsr"   sepscolonresult_driveresult_pathpp_drivep_pathr6   r6   r7   r   N   sL    



r   c                 C   s  t | } t| dkrt| tr0d}d}d}nd}d}d}| ||}|dd |d kr|dd	 |kr||d}|d
kr| dd | fS |||d }||d kr| dd | fS |d
krt| }| 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.

       r:   r9   rF   r   r   rG   r      rH   NrC   )r;   r<   rE   r2   r3   r=   find)rT   r"   r%   rQ   normpindexindex2r6   r6   r7   r   }   s.    

$r   c                 C   sx   t | } t| }t| \}} t| }|rD| |d  |vrD|d8 }q&| d| | |d  }}||pj|}|| |fS )z~Split a pathname.

    Return tuple (head, tail) where tail is everything after the final slash.
    Either part may be empty.rC   N)r;   r<   r8   r   rE   rstrip)rT   rP   diheadtailr6   r6   r7   r      s    

r   c                 C   s8   t | } t| tr$t| dddS t| dddS d S )Nr:   r9      .r   r   r   )r;   r<   r2   r3   rM   	_splitextrT   r6   r6   r7   r      s    

r   c                 C   s   t | d S )z)Returns the final component of a pathnamerC   r   rd   r6   r6   r7   r      s    r   c                 C   s   t | d S )z-Returns the directory component of a pathnamer   re   rd   r6   r6   r7   r      s    r   c              
   C   s6   zt | }W n tttfy(   Y dS 0 t|jS )zhTest whether a path is a symbolic link.
    This will always return false for Windows prior to 6.0.
    F)r;   lstatOSError
ValueErrorrK   statS_ISLNKst_moder5   str6   r6   r7   r      s
    r   c              	   C   s,   zt | }W n ttfy&   Y dS 0 dS )zCTest whether a path exists.  Returns True for broken symbolic linksFT)r;   rf   rg   rh   rl   r6   r6   r7   r      s
    r   )_getvolumepathnamec                 C   st   t | } t| }t| } t| \}}|rD|d |v rD| pB||v S ||v rPdS trl| |t| |kS dS dS )zaTest whether a path is a mount point (a drive root, the root of a
    share, or a mounted volume)r   TFN)r;   r<   r8   r   r   rn   r]   )r5   rP   rootrestr6   r6   r7   r     s    
r   c                 C   s   t | } t| trd}nd}| |s,| S dt|  }}||k r\| | t| vr\|d7 }q:dt jv rrt jd }nDdt jvr| S zt jd }W n ty   d}Y n0 t	|t jd }t| trt 
|}|dkrt	t|| d| }|| |d  S )	zLExpand ~ and ~user constructs.

    If user or $HOME is unknown, do nothing.   ~~rC   USERPROFILEHOMEPATH	HOMEDRIVE N)r;   r<   r2   r3   rD   rE   r8   environKeyErrorr   fsencoder   )r5   tilder_   nuserhomedriver6   r6   r7   r   "  s.    








r   z.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)c                    s   t | } t| trjd| vr(d| vr(| S tsHddl}|t |j	j
at}dd ddtt ddnJd| vr~d	| vr~| S tsddl}|t|j	j
at}d	d
 ddt j fdd}||| S )zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.   $   %r   N   {   }environb$%{}c                    s   | j }|d u r| d S | | }|dkrR|kr2|S |sD| d S |d d }n4|kr^|S | r|sz| d S |dd }z.d u rttjt| W S | W S W n ty   | d  Y S 0 d S )Nr   rC   rH   )	lastindexendswithrD   r;   ry   rw   fsdecoderx   )mr   namebracedollarrw   percentrbracer6   r7   replu  s,    


zexpandvars.<locals>.repl)r;   r<   r2   r3   _varsubbrecompile_varpatternencodeASCIIsubgetattr_varsubrw   )r5   r   r   r   r6   r   r7   r   V  s4    

r   c           	      C   sP  t | } t| tr*d}d}d}d}d}nd}d}d}d	}d
}| |rL| S | ||} t| \}} | |r||7 }| |} | |}d}|t	|k r,|| r|| |kr||= q|| |kr"|dkr||d  |kr||d |d = |d8 }n&|dkr|
|r||= n|d7 }q|d7 }q|sB|sB|| ||| S )z0Normalize path, eliminating double slashes, etc.r:   r9   rb      ..)s   \\.\rA   r   r   r   r   )z\\.\rB   r   rC   )r;   r<   r2   r3   rD   r=   r   lstripr   rE   r   appendr   )	r5   r"   r%   r    r!   special_prefixesprefixcompsr_   r6   r6   r7   r     sF    









r   c                 C   s@   t | } t| s8t| tr&t  }nt  }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.

    )	r;   r<   r
   r2   r3   getcwdbgetcwdr   r   )r5   cwdr6   r6   r7   _abspath_fallback  s    



r   )_getfullpathnamec              	   C   s2   zt t| W S  ttfy,   t|  Y S 0 dS )z&Return the absolute version of a path.N)r   r   rg   rh   r   r4   r6   r6   r7   r     s    r   )_getfinalpathnamereadlinkF)strictc                C   s   t | S N)r   )r5   r   r6   r6   r7   r(     s    r(   c              
   C   s   d}t  }t| |vr|t|  z:| }t| } t| s\t|sJ|} W qttt|| } W q
 |y } z$|j	|v rW Y d }~q W Y d }~q
d }~0  t
y   Y qY q
0 q
| S )N)rC   rW   rX             2   C   W   i&  i(  i)  )setr	   add_nt_readlinkr
   r   r   r   r   winerrorrh   )r5   ignored_errorallowed_winerrorseenZold_pathexr6   r6   r7   _readlink_deep  s&    
r   c                 C   s   d}d}| rzt | } |r$t| |n| W S  |y } z|j|vrD z8t| |d}|| krz|rht||n|W W  Y d }~S W n |y   Y n0 t| \} }| r|s| | W  Y d }~S |rt||n|}W Y d }~qd }~0 0 q|S )N)rC   rW   rX   r   r   r   r   5   A   r   r   {      i  i  rv   r   )r   r   r   r   r   )r5   r   r   ra   r   new_pathr   r6   r6   r7   _getfinalpathname_nonstrict  s,    
$*r   c             
   C   s  t | } t| trBd}d}d}t }t| tttkrjdS n(d}d}d}t }t| ttkrjdS | 	|}|t
u rt}d	}n|rd
}nt}|st| st|| } zt| } d}W n6 |y }	 z|	j}t| |d} W Y d }	~	n
d }	~	0 0 |s| 	|r| 	|r&|| t|d   }
n| t|d  }
zt|
| krJ|
} W n6 ty }	 z|	j|krn|
} W Y d }	~	n
d }	~	0 0 | S )NrA   s   \\?\UNC\s   \\s   \\.\NULrB   z\\?\UNC\z\\z\\.\NULTr6   r   r   )r   r2   r3   r;   r   r	   ry   r'   r   rD   r/   FileNotFoundErrorrg   r
   r   r   r   r   rE   )r5   r   r   Z
unc_prefixZnew_unc_prefixr   Z
had_prefixr   Zinitial_winerrorr   Zspathr6   r6   r7   r(   K  sT    


getwindowsversionrX   rW   c                 C   sd  t | } t| tr"d}d}d}nd}d}d}|du r:|}| sFtdt |}ztt|}tt| }t|\}}t|\}	}
t|t|	krtd	|	|f d
d |	|D }dd |
	|D }d}t
||D ]$\}}t|t|kr q|d7 }q|gt||  ||d  }|s(|W S t| W S  tttttfy^   td| |  Y n0 dS )z#Return a relative version of a pathr:   rb   r   r   r   r   Nzno path specifiedz&path is on mount %r, start on mount %rc                 S   s   g | ]}|r|qS r6   r6   .0xr6   r6   r7   
<listcomp>      zrelpath.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r6   r6   r   r6   r6   r7   r     r   r   rC   r*   )r;   r<   r2   r3   rh   r   r   r   r	   r   ziprE   r   rJ   rK   rL   DeprecationWarningrM   rN   )r5   startr"   r    r!   	start_abspath_absstart_drive
start_rest
path_drive	path_rest
start_list	path_listr_   e1e2rel_listr6   r6   r7   r*     sH    




r*   c              	      s  | st dtttj| } t| d tr8dd dndd dz> fd	d
| D }fdd
|D }ztfdd|D \}W n t y   t ddY n0 ttdd |D dkrt dt	| d 
 \}}|}fdd
|D }fdd
|D }t|}t|}t|D ]*\}	}
|
||	 kr(|d|	 } qdq(|dt| }|rr| n|}|| W S  ttfy   tjdg| R    Y n0 dS )zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencer   r:   r9   rb   r   r   r   c                    s    g | ]}t |  qS r6   )r   r=   r>   )r   rT   )r%   r"   r6   r7   r     r   zcommonpath.<locals>.<listcomp>c                    s   g | ]\}}|  qS r6   re   r   r^   rT   r"   r6   r7   r     r   c                 3   s"   | ]\}}|d d  kV  qd S )NrC   r6   r   r   r6   r7   	<genexpr>  r   zcommonpath.<locals>.<genexpr>z%Can't mix absolute and relative pathsNc                 s   s   | ]\}}|V  qd S r   r6   r   r6   r6   r7   r     r   rC   zPaths don't have the same drivec                    s   g | ]}|r| kr|qS r6   r6   r   cr    r6   r7   r     r   c                    s   g | ]} fd d|D qS )c                    s   g | ]}|r| kr|qS r6   r6   r   r   r6   r7   r     r   z)commonpath.<locals>.<listcomp>.<listcomp>r6   )r   r@   r   r6   r7   r     r   r.   )rh   tuplerI   r;   r<   r2   r3   r   rE   r   r=   r   minmax	enumerater   rJ   rK   rM   rN   )rO   drivesplitssplit_pathsr
   r}   r5   commons1s2r_   r   r   r6   )r%   r    r"   r7   r.     sF    

r.   )_isdir)N)5__doc__r    r!   r&   r"   r#   r%   r$   r'   r;   sysri   rM   __all__r8   r	   r
   r   r   r   r   rc   r   r   r   r   ntrn   ImportErrorr   r   r   r   r   r   r   r   r   r   r   r   r   r(   rg   r   r   hasattrr   r)   r*   r.   r   r   r6   r6   r6   r7   <module>   sv   		
/8

0A2
*2<
84