a i\g@sdZdZdZdZdZdZdZdZdZdd l Z dd l Z dd l Z dd l Z dd l Tgd Z d d ZddZddZddZddZddZddZe jje_ddZddZddZd d!Zzdd"lmZWneyd ZYn0d#d$Zd%d&Zd'Zd a d a!d(d)Z"d*d+Z#d,d-Z$zdd.lm%Z%Wney:e$Z&Yn 0d/d0Z&zdd1lm'Z'm(Z)Wn"eyzd2d3d4d5Z*Yn(0e+fd6d7Z,e+fd8d9Z-d2d3d:d5Z*e.e d;oe /d<d=kZ0dCd>d?Z1d@dAZ2zddBlm3Z4WneyYn0d 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:\binnulN)*)'normcaseisabsjoin splitdrivesplitsplitextbasenamedirname commonprefixgetsizegetmtimegetatimegetctimeislinkexistslexistsisdirisfileismount expanduser expandvarsnormpathabspathcurdirpardirseppathsepdefpathaltsepextsepdevnullrealpathsupports_unicode_filenamesrelpathsamefile sameopenfilesamestat commonpath ALLOW_MISSINGcCst|trdSdSdS)N\/\/) isinstancebytespathr6/usr/lib64/python3.9/ntpath.py _get_bothseps#s r8cCs8t|}t|tr$|ddS|ddSdS)zaNormalize case of pathname. Makes all characters lowercase and all slashes into backslashes./\rrN)osfspathr2r3replacelowersr6r6r7r -s  r cCsjt|}t|tr,|dddrBdSn|dddrBdSt|d}t|d koh|d t|vS) zTest whether a path is absoluter9r:\\?\Trr\\?\r) r;r<r2r3r= startswithr lenr8r?r6r6r7r >s   r c GsTt|}t|tr"d}d}d}n d}d}d}z|sD|dd|t|\}}ttj|D]~}t|\}} | r| d|vr|s|s|}| }q\n*|r||kr||kr|}| }q\|}|r|d|vr||}|| }q\|r|d|vr|r|dd|kr|||WS||WSttt fyNt j d |g|RYn0dS) Nr:r0:rr1:rr ) r;r<r2r3r mapr> TypeErrorAttributeError BytesWarning genericpath_check_arg_types) r5pathsr"sepscolon result_drive result_pathpp_drivep_pathr6r6r7r NsL       r cCst|}t|dkrt|tr0d}d}d}n d}d}d}|||}|dd|dkr|dd |kr||d}|d kr|d d|fS|||d }||d kr|d d|fS|d krt|}|d |||d fS|d d|kr|d d|dd fS|d d|fS) aSplit 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:r9rFrrrGrrHNrC)r;r<rEr2r3r=find)rTr"r%rQnormpindexindex2r6r6r7r }s.   $  r cCsxt|}t|}t|\}}t|}|rD||d|vrD|d8}q&|d|||d}}||pj|}|||fS)z~Split a pathname. Return tuple (head, tail) where tail is everything after the final slash. Either part may be empty.rCN)r;r<r8r rErstrip)rTrPdiheadtailr6r6r7r s   r cCs8t|}t|tr$t|dddSt|dddSdS)Nr:r9.rrr)r;r<r2r3rM _splitextrTr6r6r7rs  rcCs t|dS)z)Returns the final component of a pathnamerCr rdr6r6r7rsrcCs t|dS)z-Returns the directory component of a pathnamerrerdr6r6r7rsrc Cs6zt|}Wntttfy(YdS0t|jS)zhTest whether a path is a symbolic link. This will always return false for Windows prior to 6.0. F)r;lstatOSError ValueErrorrKstatS_ISLNKst_moder5str6r6r7rs rc Cs,zt|}Wnttfy&YdS0dS)zCTest whether a path exists. Returns True for broken symbolic linksFT)r;rfrgrhrlr6r6r7rs r)_getvolumepathnamecCstt|}t|}t|}t|\}}|rD|d|vrD| pB||vS||vrPdStrl||t||kSdSdS)zaTest whether a path is a mount point (a drive root, the root of a share, or a mounted volume)rTFN)r;r<r8rr rnr])r5rProotrestr6r6r7rs  rcCst|}t|trd}nd}||s,|Sdt|}}||kr\||t|vr\|d7}q:dtjvrrtjd}nDdtjvr|Sztjd}Wntyd}Yn0t |tjd}t|trt |}|dkrt t ||d|}|||dS) zLExpand ~ and ~user constructs. If user or $HOME is unknown, do nothing.~~rC USERPROFILEHOMEPATH HOMEDRIVEN) r;r<r2r3rDrEr8environKeyErrorr fsencoder)r5tilder_nuserhomedriver6r6r7r"s.           rz.'[^']*'?|%(%|[^%]*%?)|\$(\$|[-\w]+|\{[^}]*\}?)cst|}t|trjd|vr(d|vr(|StsHddl}|t|j j at}ddddt tddnJd|vr~d |vr~|St sddl}|t|j j a t }d d d dtj fd d }|||S)zfExpand shell variables of the forms $var, ${var} and %var%. Unknown variables are left unchanged.$%rN{}environb$%{}cs|j}|dur|dS||}|dkrR|kr2|S|sD|dS|dd}n4|kr^|S|r|sz|dS|dd}z.durttjt|WS|WSWnty|dYS0dS)NrrCrH) lastindexendswithrDr;ryrwfsdecoderx)mrnamebracedollarrwpercentrbracer6r7replus,     zexpandvars..repl)r;r<r2r3_varsubbrecompile _varpatternencodeASCIIsubgetattr_varsubrw)r5rrrr6rr7rVs4  rc CsPt|}t|tr*d}d}d}d}d}nd}d}d}d }d }||rL|S|||}t|\}}||r||7}||}||}d }|t |kr,||r|||kr||=q|||kr"|d kr||d |kr||d |d =|d 8}n&|d kr| |r||=n|d 7}q|d 7}q|sB|sB| ||| |S) z0Normalize path, eliminating double slashes, etc.r:r9rb..)s\\.\rArrrr)z\\.\rBrrC) r;r<r2r3rDr=r lstripr rErappendr ) r5r"r%r r!special_prefixesprefixcompsr_r6r6r7rsF             rcCs@t|}t|s8t|tr&t}nt}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 r2r3getcwdbgetcwdr r)r5cwdr6r6r7_abspath_fallbacks    r)_getfullpathnamec Cs2ztt|WSttfy,t|YS0dS)z&Return the absolute version of a path.N)rrrgrhrr4r6r6r7rsr)_getfinalpathnamereadlinkF)strictcCst|SN)r)r5rr6r6r7r(sr(c Csd}t}t||vr|t|z:|}t|}t|s\t|sJ|}Wqttt||}Wq |y}z$|j |vrWYd}~qWYd}~q d}~0t yYqYq 0q |S)N) rCrWrX 2CWi&i(i)) setr add _nt_readlinkr rrr rwinerrorrh)r5 ignored_errorallowed_winerrorseenZold_pathexr6r6r7_readlink_deeps&     rc Csd}d}|rzt|}|r$t||n|WS|y}z|j|vrDz8t||d}||krz|rht||n|WWYd}~SWn|yYn0t|\}}|r|s||WYd}~S|rt||n|}WYd}~qd}~00q|S)N)rCrWrXrrrr5Arr{iirvr)rr rrr )r5rrrarnew_pathrr6r6r7_getfinalpathname_nonstricts, $  *rc Cst|}t|trBd}d}d}t}t|tttkrjdSn(d}d}d}t}t|ttkrjdS| |}|t urt }d }n|rd }nt }|st |st||}zt|}d }Wn6|y} z| j}t||d }WYd} ~ n d} ~ 00|s| |r| |r&||t|d} n|t|d} zt| |krJ| }Wn6t y} z| j|krn| }WYd} ~ n d} ~ 00|S) NrAs\\?\UNC\s\\s\\.\NULrBz\\?\UNC\z\\z\\.\NULTr6rr)rr2r3r;rr ryr'rrDr/FileNotFoundErrorrgr r rrrrE) r5rrZ unc_prefixZnew_unc_prefixrZ had_prefixrZinitial_winerrorrZspathr6r6r7r(KsT      getwindowsversionrXrWc Csdt|}t|tr"d}d}d}n d}d}d}|dur:|}|sFtdt|}ztt|}tt|}t|\}}t|\} } t|t| krtd | |fd d | |D} d d | |D} d } t | | D]$\}}t|t|krq| d7} q|gt | | | | d}|s(|WSt |WSt ttttfy^td||Yn0dS)z#Return a relative version of a pathr:rbrrrrNzno path specifiedz&path is on mount %r, start on mount %rcSsg|] }|r|qSr6r6.0xr6r6r7 zrelpath..cSsg|] }|r|qSr6r6rr6r6r7rrrrCr*)r;r<r2r3rhrrr r r ziprEr rJrKrLDeprecationWarningrMrN)r5startr"r r! start_abspath_abs start_drive start_rest path_drive path_rest start_list path_listr_e1e2rel_listr6r6r7r*sH         r*c s|s tdtttj|}t|dtr8dddn dddz>fd d |D}fd d |D}ztfd d |D\}WntytddYn0ttdd |Ddkrtdt |d \}}| }fdd |D}fdd |D}t |}t |}t|D]*\} } | || kr(|d| }qdq(|dt|}|rr|n|} | |WSttfytjdg|RYn0dS)zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerr:r9rbrrrcs g|]}t|qSr6)r r=r>)rrT)r%r"r6r7rrzcommonpath..csg|]\}}|qSr6rerr^rTr"r6r7rrc3s"|]\}}|ddkVqdS)NrCr6rrr6r7 rzcommonpath..z%Can't mix absolute and relative pathsNcss|]\}}|VqdSrr6rr6r6r7rrrCzPaths don't have the same drivecsg|]}|r|kr|qSr6r6rcr r6r7rrcsg|]}fdd|DqS)csg|]}|r|kr|qSr6r6rrr6r7rrz)commonpath...r6)rr@rr6r7rrr.)rhtuplerIr;r<r2r3rrEr r=r minmax enumerater rJrKrMrN) rO drivesplits split_pathsr r}r5commons1s2r_rrr6)r%r r"r7r.sF    r.)_isdir)N)5__doc__r r!r&r"r#r%r$r'r;sysrirM__all__r8r r r r r rrcrrrrntrn ImportErrorrrrrrrrrrrrrrr(rgrrhasattrrr)r*r.rrr6r6r6r7sv   /8    0A2  * 2<  84