eFSrSrSrSrSrSrSrSrSrSSK r SSK r SSK r SSK r SSK r SS K 7 /S QrS rS rS rSrSrSr\ R*R\lSrSSKJr SrSrSrSrSqSq Sr!SSKJ"r# Sr$SS.Sjr%\ RLS:Hr'S"S jr(S!r)g!\a SrNGf=f!\a Sr#Nr%s r7r r =s' ! A 1+C << r9cx[R"U5n[U5nUnUH]n[R"U5nURU5(dU(dUnM:UR U5(aX4- nMVX2U-- nM_ U$![ [ [4a [R"SU/UQ76 ef=f)zJoin two or more pathname components, inserting '/' as needed. If any component is an absolute path, all previous path components will be discarded. An empty last part will result in a path that ends with a separator.r ) r<r=r8r@endswith TypeErrorAttributeError BytesWarning genericpath_check_arg_types)apr%r6bs r7r r Hs ! A 1+C D A ! A||C  s## a K ~| 4$$VQ33 s A#B /B9c[R"U5n[U5nURU5S-nUSUXSpCU(a"X1[ U5-:waUR U5nX44$)z|Split a pathname. Returns tuple "(head, tail)" where "tail" is everything after the final slash. Either part may be empty.Nr<r=r8rfindlenrstrip)rIr%iheadtails r7r r dsc ! A 1+C  qA2A"$ CI %{{3 :r9c[R"U5n[U[5(aSnSnOSnSn[R "XSU5$)Nr2.rr)r<r=r3r4rF _splitext)rIr%r)s r7rrusE ! A!U  v 66r9c<[R"U5nUSSU4$)zFSplit a pathname into drive and path. On Posix, drive is always empty.Nrr;)rIs r7r r s  ! A Ra5!8Or9)_path_splitroot_exc[R"U5n[U[5(aSnSnOSnSnUSSU:waX"U4$USSU:wd USSU:XaX!USS4$X SSUSS4$) zWSplit a pathname into drive, root and tail. The tail contains anything after the root.r2r9rNrL)r<r=r3r4)rIr%emptys r7r r s IIaL a  CECE Ra5C<? " qVs]a!fmqu$ $BQ%12& &r9ct[R"U5n[U5nURU5S-nXS$)z)Returns the final component of a pathnamerLN)r<r=r8rN)rIr%rQs r7rrs3 ! A 1+C  qA R5Lr9c[R"U5n[U5nURU5S-nUSUnU(a"X1[ U5-:waUR U5nU$)z-Returns the directory component of a pathnamerLNrM)rIr%rQrRs r7rrsX ! A 1+C  qA Ra5D CI %{{3 Kr9cX[R"U5n[R"UR5(ag[R"U5n[U[5(a [US5nO [US5n[R"U5nURUR:g=(d URUR:H$![ [ 4a gf=f![ a6 [U5n[R"U5nN}![ a gf=ff=f)z$Test whether a path is a mount pointF..r)r<lstatstatS_ISLNKst_modeOSError ValueErrorr=r3r4r r+st_devst_ino)r6s1parents2s r7rrs XXd^ << # # $ 99T?D$dE"dD! XXf  99 ! ;RYY"))%;;/ Z  &! &!B   s;CC)C&%C&)D)?D D%!D)$D%%D)c[R"U5n[U[5(aSnOSnUR U5(dU$[ U5nUR US5nUS:a [U5nUS:Xa]S[R;a5SSK nUR[R"55RnOg[RSnOSSSK nUSUn[U[5(a[R"U5nUR!U5nURnUc["R$S:XaU$[U[5(a[R&"U5nUR)U5nXPUS-=(d U$![a Us$f=f![a Us$f=f![a Us$f=f![a Us$f=f)zKExpand ~ and ~user constructions. If user or $HOME is unknown, do nothing.~~rLrHOMENvxworks)r<r=r3r4r@r8findrOenvironpwd ImportErrorgetpwuidgetuidpw_dirKeyErrorfsdecodegetpwnamsysplatformfsencoderP)r6tilder%rQrtuserhomenamepwents r7rrs 99T?D$ ??5 ! ! 4.C #qA1u IAv  #  << 4;; zz&)H  Aay dE " ";;t$D LL&E <<CLLI5 $;;x(s#H ABx  'C'C        K  K sHF.F$F6G F! F!$ F32F36 GG GGcr[R"U5n[U[5(aYSU;aU$[(d SSKnUR SUR5q[RnSnSn[[SS5nOWSU;aU$[(d SSKnUR S UR5q [RnS nS n[RnSnU"X5nU(dU$URS5uphURS 5n U RU5(aU RU5(aU S S n Uc<[R "[R[R""U 55n OXYn XSn USUU -n[%U5nX - nM![&a UnNf=f)zVExpand shell variables of form $var and ${var}. Unknown variables are left unchanged.$rNs\$(\w+|\{[^}]*\}){}environb$z\$(\w+|\{[^}]*\}){}rL)r<r=r3r4 _varprogbrecompileASCIIsearchgetattr_varprogrsspangroupr@rBr~rzrOry) r6rrstartendrsrQmjrvaluerSs r7rr"s 99T?D$ t Ky  #8"((CI!!"j$/ d?Kx zz"6AH** A  4O " K!vvaywwqz ??5 ! !dmmC&8&8":D  BJJr{{4/@$AB 8D8e#DD A LD'  A sAF'' F65F6)_path_normpathc[R"U5n[U[5(aSnSnSnOSnSnSnU(dU$[ U5upEnUR U5n/nUH`nU(aX:XaMX:wdU(dU(aU(aUSU:XaUR U5 MGU(dMPUR5 Mb UnXQRU5-nU=(d U$)z0Normalize path, eliminating double slashes, etc.r2rUrarrrr) r<r=r3r4r r appendpopr ) r6r%dotdotdot_initial_slashescomps new_compscomps r7rr[syy dE " "CCFCCFJ#,T? D 3 D4;y "  7  & %0{sr9cD[R"U5n[U[5(a6UR S5(d[ [R "5U5nO5UR S5(d[ [R"5U5n[U5$)zReturn an absolute path.r2r) r<r=r3r4r@r getcwdbgetcwdrr5s r7rrxsi 99T?D$t$$ d+Ds## T*D D>r9F)strictc:[R"U5n[U[5(aSnSnSn[RnOSnSnSn[R nUR U5SSS2n[U5nURU5(aUOU"5n0n U(GaUR5n U cXUR5'M/US -nU (aX:XaMBX:XaUSURU5=(d UnMfX:XaX-n OX-U -n [R"U 5Rn [R"U 5(dkU(a_U(aX[R"U 5(d=[!["R$[R&"["R$5U 5eU nGMX;a,XnUbGM-U(a[R"U 5 U nGMO[R("U 5n SX'U RU5(aUnUR+U 5 UR+S5 U R U5SSS2nUR-U5 U[U5- nU(aGMU$![ a U(aeU nGMf=f) zlReturn the canonical path of the specified filename, eliminating any symbolic links encountered in the path.r2rUrarrrNrrL)r<r=r3r4rrr rOr@rrindexrbrercrdS_ISDIRrferrnoENOTDIRstrerrorreadlinkrextend)filenamerr%r#r$rrest part_countr6seenrnewpathretarget target_partss r7r+r+sCyy"H(E"" >># tt $DTJ%%c**3D D xxz <#  a t~  >)S)*1cD  ;kGj4'G hhw'//G<<((jg1F1F!%--U]]1K")++}#GGG$[[)F   S ! !D G D||C(2.  L!c,'' s *v K) D   s%B#J: J J+JJJdarwinc[R"U5nU(d [S5e[U[5(aSnSnSnOSnSnSnUcUnO[R"U5n[ U5R U5n[ U5R U5nU(aURU5O/nU(aURU5O/n[[Xx/55n U/[U5U - -XS-n U (dU$URU 5$![[[[4a [R "S X5 ef=f) z#Return a relative version of a pathzno path specifiedrUr2rarrrNr-)r<r=rgr3r4rlstripr rOrr rCrDrEDeprecationWarningrFrG) r6rr#r%r$ start_tail path_tail start_list path_listrQrel_lists r7r-r-s) 99T?D ,--$ } % U^**3/ DM((- .8Z%%c*b ,5IOOC(2  j45 68s:q01IbMAMxx!! ~|5G H$$Y< s(BDD3E c  [[[RU55nU(d [ S5e[ US[ 5(aSnSnOSnSnUVs/sHo3RU5PM nnUVs1sHoURU5iM snunUVVs/sH$owVs/sHo(dM X:wdMUPM snPM& nnn[U5n [U5n U n [U 5HupXU :wdMU SU n O U(aUOUSSn XRU 5-$s snfs snf![a [ S5Sef=fs snfs snnf![[4a [R "S /UQ76 ef=f) zDGiven a sequence of path names, returns the longest common sub-path.z%commonpath() arg is an empty sequencerr2rUrrz%Can't mix absolute and relative pathsNr.)tuplemapr<r=rgr3r4r r@minmax enumerater rCrDrFrG)pathsr%r#r6 split_pathsrIr r>crjrlcommonrQprefixs r7r.r.s} #bii' (E @AA%(E""38954zz#5 9 P167All3'7FEEPPKq1:1aak1:K P    bMDAqEzBQ" 3r7(((#:8 PDE4 O P;P ~ &$$\:E: s~ED+6E9D5=D0D5E! E* E 8E ?E E 1E)E+E0D55E  EEE)F)N)*__doc__r#r$r)r%r&r'r(r*rr<r|rcrF__all__r8rr r r rrVr posixrXr rurrrrrrrrrrr+r}r,r-r.r9r7rs           48 "7((00 '56=B>