a
    IfVl                     @   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'd( Zd)d* Z d+d, Z!zdd-lm"Z" W n ey.   e!Z#Y n
0 d.d/ Z#zdd0lm$Z$m%Z& W n eyd   e#Z'Y n0 d1d2 Z(d3d4 Z)d5d6 Z'e*e
d7oe
+ d8 d9kZ,d?d:d;Z-d<d= Z.zdd>lm/Z0 W n ey   Y n0 d	S )@zCommon pathname manipulations, WindowsNT/95 version.

Instead of importing this module directly, import os and refer to this
module as os.path.
...\;/z.;C:\binZ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
commonpathc                 C   s   t | trdS dS d S )N   \/\/)
isinstancebytespath r4   lib/python3.9/ntpath.py_get_bothseps"   s    
r6   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fspathr0   r1   replacelowersr4   r4   r5   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 absoluter7   r8      \\?\Tr   r   \\?\   r   )	r9   r:   r0   r1   r;   
startswithr   lenr6   r=   r4   r4   r5   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 )
Nr8   r.      :r   r/   :r   r
   )r9   r:   r0   r1   r   mapr<   	TypeErrorAttributeErrorBytesWarninggenericpath_check_arg_types)
r3   pathsr!   sepscolonZresult_driveZresult_pathpZp_driveZp_pathr4   r4   r5   r
   M   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.

       r8   r7   rD   r   r   rE   r      rF   NrA   )r9   r:   rC   r0   r1   r;   find)rP   r!   r$   rO   ZnormpindexZindex2r4   r4   r5   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.rA   N)r9   r:   r6   r   rC   rstrip)rP   rN   diheadtailr4   r4   r5   r      s    

r   c                 C   s8   t | } t| tr$t| dddS t| dddS d S )Nr8   r7      .r   r   r   )r9   r:   r0   r1   rK   	_splitextrP   r4   r4   r5   r      s    

r   c                 C   s   t | d S )z)Returns the final component of a pathnamerA   r   r\   r4   r4   r5   r      s    r   c                 C   s   t | d S )z-Returns the directory component of a pathnamer   r]   r\   r4   r4   r5   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)r9   lstatOSError
ValueErrorrI   statS_ISLNKst_moder3   str4   r4   r5   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)r9   r^   r_   r`   rd   r4   r4   r5   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)r9   r:   r6   r   r   rf   rU   )r3   rN   rootrestr4   r4   r5   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.   ~~rA   ZUSERPROFILEZHOMEPATHZ	HOMEDRIVE N)r9   r:   r0   r1   rB   rC   r6   environKeyErrorr
   fsencoder   )r3   tilderW   nuserhomedriver4   r4   r5   r   !  s.    








r   c                 C   s&  t | } t| trhd| vr(d| vr(| S ddl}t|j|j d d}d}d}d}d	}d}tt d
d}nFd| vr|d| vr|| S ddl}|j|j d }d}d}d}d}d}t j}| dd }	d}
t	| }|
|k r"| |
|
d  }||krV| |
d d } t	| }z&| 
|}
|	|| d|
d   7 }	W n( tyP   |	||  7 }	|d }
Y n0 n||krD| |
d |
d  |kr|	|7 }	|
d7 }
n| |
d d } t	| }z| 
|}
W n( ty   |	||  7 }	|d }
Y nf0 | d|
 }z.|du rt t jt | }n|| }W n  ty6   || | }Y n0 |	|7 }	n||kr| |
d |
d  |kr||	|7 }	|
d7 }
q| |
d |
d  |krT| |
d d } t	| }z| 
|}
W n, ty   |	|| |  7 }	|d }
Y nj0 | d|
 }z.|du rt t jt | }n|| }W n$ tyH   || | | }Y n0 |	|7 }	n| dd }|
d7 }
| |
|
d  }|r||v r||7 }|
d7 }
| |
|
d  }qxz.|du rt t jt | }n|| }W n ty   || }Y n0 |	|7 }	|r|
d8 }
n|	|7 }	|
d7 }
q|	S )zfExpand shell variables of the forms $var, ${var} and %var%.

    Unknown variables are left unchanged.   $   %r   Nz_-ascii   '   {   }environb$%'{}rA   rQ   )r9   r:   r0   r1   stringZascii_lettersZdigitsgetattrrl   rC   rT   r`   rn   fsdecoderm   )r3   r   ZvarcharsZquoteZpercentZbraceZrbraceZdollarrl   resrT   Zpathlencvarvaluer4   r4   r5   r   Q  s    













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.r8   r7   rZ      ..)s   \\.\r?   r   r   r   r   )z\\.\r@   r   rA   )r9   r:   r0   r1   rB   r;   r   lstripr   rC   endswithappendr
   )	r3   r!   r$   r   r    Zspecial_prefixesprefixcompsrW   r4   r4   r5   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.

    )	r9   r:   r	   r0   r1   getcwdbgetcwdr
   r   )r3   cwdr4   r4   r5   _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   r_   r`   r   r2   r4   r4   r5   r     s    r   )_getfinalpathnamereadlinkc              
   C   s   d}t  }t| |vr|t|  z:| }t| } t| s\t|sJ|} W qttt|| } W q
 t	y } z$|j
|v rW Y d }~q W Y d }~q
d }~0  ty   Y qY q
0 q
| S )N)rA   rQ   rR             2   C   W   i&  i(  i)  )setr   add_nt_readlinkr	   r   r   r
   r   r_   winerrorr`   )r3   allowed_winerrorseenZold_pathexr4   r4   r5   _readlink_deep  s&    
r   c                 C   s   d}d}| rzt | } |r$t| |n| W S  ty } z|j|vrD z4t| }|| krv|rdt||n|W W  Y d }~S W n ty   Y n0 t| \} }| r|s| | W  Y d }~S |rt||n|}W Y d }~qd }~0 0 q|S )N)rA   rQ   rR   r   r   r   r   r   r   {   i  i  rk   )r   r
   r_   r   r   r   )r3   r   rY   r   new_pathnamer4   r4   r5   _getfinalpathname_nonstrictC  s(    
$*r   c           	   
   C   sd  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 | 	|}|st
| st|| } zt| } d	}W n2 ty } z|j}t| } W Y d }~n
d }~0 0 |s`| 	|r`| 	|r|| t|d   }n| t|d  }zt|| kr&|} W n6 ty^ } z|j|krJ|} W Y d }~n
d }~0 0 | S )
Nr?   s   \\?\UNC\s   \\s   \\.\NULr@   z\\?\UNC\z\\z\\.\NULr   )r   r0   r1   r9   r   r   rn   r&   r   rB   r	   r
   r   r_   r   r   rC   )	r3   r   Z
unc_prefixZnew_unc_prefixr   Z
had_prefixZinitial_winerrorr   Zspathr4   r4   r5   r'   q  sD    


r'   getwindowsversionrR   rQ   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 pathr8   rZ   r   r   r   r   Nzno path specifiedz&path is on mount %r, start on mount %rc                 S   s   g | ]}|r|qS r4   r4   .0xr4   r4   r5   
<listcomp>      zrelpath.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r4   r4   r   r4   r4   r5   r     r   r   rA   r)   )r9   r:   r0   r1   r`   r   r   r   r   r   ziprC   r
   rH   rI   rJ   DeprecationWarningrK   rL   )r3   startr!   r   r    Z	start_absZpath_absZstart_driveZ
start_restZ
path_driveZ	path_rest
start_list	path_listrW   Ze1Ze2rel_listr4   r4   r5   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   r8   r7   rZ   r   r   r   c                    s    g | ]}t |  qS r4   )r   r;   r<   )r   rP   )r$   r!   r4   r5   r     r   zcommonpath.<locals>.<listcomp>c                    s   g | ]\}}|  qS r4   r]   r   rV   rP   r!   r4   r5   r     r   c                 3   s"   | ]\}}|d d  kV  qd S )NrA   r4   r   r   r4   r5   	<genexpr>  r   zcommonpath.<locals>.<genexpr>z%Can't mix absolute and relative pathsNc                 s   s   | ]\}}|V  qd S )Nr4   r   r4   r4   r5   r     r   rA   zPaths don't have the same drivec                    s   g | ]}|r| kr|qS r4   r4   r   r   r   r4   r5   r     r   c                    s   g | ]} fd d|D qS )c                    s   g | ]}|r| kr|qS r4   r4   r   r   r4   r5   r     r   z)commonpath.<locals>.<listcomp>.<listcomp>r4   )r   r>   r   r4   r5   r     r   r-   )r`   tuplerG   r9   r:   r0   r1   r   rC   r   r;   r   minmax	enumerater
   rH   rI   rK   rL   )rM   Zdrivesplitssplit_pathsr	   rr   r3   commons1s2rW   r   r   r4   )r$   r   r!   r5   r-     sF    

r-   )_isdir)N)1__doc__r   r    r%   r!   r"   r$   r#   r&   r9   sysra   rK   __all__r6   r   r	   r
   r   r   r   r[   r   r   r   r   ntrf   ImportErrorr   r   r   r   r   r   r   r   r   r   r'   r   r   hasattrr   r(   r)   r-   r   r   r4   r4   r4   r5   <module>   sp   	
/8

0q2

*.2
84