<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
JZ              L   @   s  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ dd	lmZ dd
lmZ ddlmZ ddl m!Z! ddl"m#Z# ddl"m$Z$ ddl"m%Z% ddl"m&Z& ej'dk rjddl(Z)nddl)Z)yddl)m*Z* W n e+k
r   ddl*Z*Y nX ej'dkrddl,Z,ndZ,ddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYgDZ-ej.d"pZdZdkZ/d]ej0kZ1erpdndZ2e3ej4j5d#Z6e3ej4j5dZ7d_Z8dZ9dZ:ej.dbse/rdcndZ;e6se7re8d9 Z8e:d9 Z:ddZ<ej=j>ej=j?ej@ e<ZAeAde ZBeAe$df ZCejD jE dkZFej=jGej=j>ej=jHeIdidiZJej=j>eJdjZKej=jGej=jHeIZLeMejNdkZOeMedlZPeoze ZQeMejNdmZReMejNdnZSeMejNdoZTdpejN jU jVkZWeMejNdqZXeMejNdrZYeMejNdsZZeMejNdtZ[eMeduZ\e\oej] Z^eMedvZ_eMedwZ`dxdy Zaea ZbecejddzZed{d| efeD Zgehed}ei Zjehed~ei Zkel Zmel Znel Zoejpdd Zqejpdd ZrG dd dejsZtdd Zueuddd5Zveudd7 Zwdd6 Zxeudd3 Zyeudd Zzddd4Z{ddH Z|ddG Z}G dd deiZ~e~ejde:ddddJ Ze~eefde:dddddKZe~ede:ddddI ZddB Zdd ZejddA ZdddCZe<dZfddFZG dd de)jZee)_dd Zdd= Zdd> Zdd< Ze8fdd;Zddd9Zddd:ZdddNZejdddOZeedfddPZejfddQZdddRZddS ZejddT ZddM ZddL ZddU ZddV ZddW ZddY Zereje<fddXZneje<fddXZdS )z
Test utilities.
    )print_functionN)AF_INET)AF_INET6)
SOCK_DGRAM)SOCK_STREAM)OSX)POSIX)SUNOS)WINDOWS)supports_ipv6)PY3)u)unicode)which      )mock      APPVEYORDEVNULLGLOBAL_TIMEOUTMEMORY_TOLERANCE
NO_RETRIESPYPY
PYTHON_EXEROOT_DIRSCRIPTS_DIRTESTFILE_PREFIXTESTFNTESTFN_UNICODETOXTRAVISVALID_PROC_STATUSES	VERBOSITYHAS_CPU_AFFINITYHAS_CPU_FREQHAS_ENVIRONHAS_PROC_IO_COUNTERS
HAS_IONICEHAS_MEMORY_MAPSHAS_PROC_CPU_NUM
HAS_RLIMITHAS_SENSORS_BATTERYHAS_BATTERYHAS_SENSORS_FANSHAS_SENSORS_TEMPERATURESHAS_MEMORY_FULL_INFOpyrunreap_childrenget_test_subprocesscreate_zombie_proccreate_proc_children_pairZThreadTaskunittestskip_on_access_deniedskip_on_not_implementedretry_before_failingrun_test_module_by_name	get_suite	run_suiteZinstall_pipZinstall_test_depschdirsafe_rmpath
create_exeZdecode_pathZencode_pathunique_filename
get_winverget_kernel_version
call_untilwait_for_pidwait_for_filecheck_connection_ntuplecheck_net_addressget_free_portunix_socket_pathbind_socketbind_unix_sockettcp_socketpairunix_socketpaircreate_socketsreload_moduleimport_module_by_pathwarncopyload_shared_libis_namedtuple 1trueZ__pypy__   
   i  i   ZSILENT   z$testfnz	-internalu   -ƒőőasciius-asciiz..scriptsZcpu_affinityZcpu_freqenvironZio_countersZioniceZussmemory_mapsZcpu_numZrlimitZthreadssensors_batteryZsensors_fansZsensors_temperaturesc              C   sx   dd } t rb| tjpP| tjjtjpP| tdtjd d  pP| tj	 j
 }|s^td|S tjjtj}|S d S )Nc             S   s:   yt j| dgt jt jd W n tk
r0   d S X | S d S )Nz-V)stdoutstderr)
subprocess
check_callPIPE	Exception)exe rg    /usr/lib64/python3.6/__init__.pyattempt   s    z_get_py_exe.<locals>.attemptzpython%s.%sr   z"can't find python exe real abspath)r   sys
executableospathrealpathr   version_infopsutilProcessrf   
ValueError)ri   rf   rg   rg   rh   _get_py_exe   s    	
rs   zr+c             C   s    g | ]}|j d rtt|qS )ZSTATUS_)
startswithgetattrrp   ).0xrg   rg   rh   
<listcomp>   s    rx   AF_UNIXSOCK_SEQPACKETc              C   s   t j  xbtjtdD ]P} t| tr0tt}nt}| j|ryt	|  W q t
k
rf   tj  Y qX qW x6tD ].}yt	| W qr t
k
r   tj  Y qrX qrW d S )N.)r   closerl   listdirr   
isinstancer   r   rt   r>   re   	traceback	print_exc_testfiles_created)nameprefixrm   rg   rg   rh   _cleanup_files   s    



r   c               C   s   t dd d S )NT)	recursive)r3   rg   rg   rg   rh   _cleanup_procs   s    r   c               @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )
ThreadTaskz6A thread task which does nothing expect staying alive.c             C   s&   t jj|  d| _d| _t j | _d S )NFgMbP?)	threadingThread__init___running	_intervalZEvent_flag)selfrg   rg   rh   r      s    zThreadTask.__init__c             C   s   | j j}d|| jt| f S )Nz<%s running=%s at %#x>)	__class____name__r   id)r   r   rg   rg   rh   __repr__   s    zThreadTask.__repr__c             C   s   | j   | S )N)start)r   rg   rg   rh   	__enter__   s    zThreadTask.__enter__c             O   s   | j   d S )N)stop)r   argskwargsrg   rg   rh   __exit__   s    zThreadTask.__exit__c             C   s(   | j rtdtjj|  | jj  dS )zStart thread and keep it running until an explicit
        stop() request. Polls for shutdown every 'timeout' seconds.
        zalready startedN)r   rr   r   r   r   r   wait)r   rg   rg   rh   r     s    zThreadTask.startc             C   s,   d| _ | jj  x| j r&tj| j qW d S )NT)r   r   settimesleepr   )r   rg   rg   rh   run  s    
zThreadTask.runc             C   s    | j stdd| _ | j  dS )z8Stop thread execution and and waits until it is stopped.zalready stoppedFN)r   rr   join)r   rg   rg   rh   r     s    zThreadTask.stopN)r   
__module____qualname____doc__r   r   r   r   r   r   r   rg   rg   rg   rh   r      s   	r   c                s   t j  fdd}|S )Nc                 s,   y
 | |S  t k
r&   t   Y nX d S )N)re   r3   )r   r   )funrg   rh   wrapper  s
    
z _cleanup_on_err.<locals>.wrapper)	functoolswraps)r   r   rg   )r   rh   _cleanup_on_err  s    r   c             K   s   |j dt |j dt |j dtj  |j dtj trF|j dd | dkrtt dt }td	|g} t	j
| f|}tj| ttd
d
d n"t	j
| f|}tj| t|j |S )a{  Creates a python subprocess which does nothing for 60 secs and
    return it as subprocess.Popen instance.
    If "cmd" is specified that is used instead of python.
    By default stdin and stdout are redirected to /dev/null.
    It also attemps to make sure the process is in a reasonably
    initialized state.
    The process is registered for cleanup on reap_children().
    stdinr`   cwdenvcreationflagsi   Nz:from time import sleep;open(r'%s', 'w').close();sleep(60);z-cT)deleteempty)
setdefaultr   rl   getcwdr]   r
   r>   _TESTFNr   rb   Popen_subprocesses_startedaddrE   rD   pid)cmdkwdsZpylineZsprocrg   rg   rh   r4   )  s$    




c              C   s   t jjtd } tjd| tf }tr4t|dd}nt|}t	j
|j}t| ddd}t j|  t|}tj| t	j
|}||fS )a  Create a subprocess which creates another one as in:
    A (us) -> B (child) -> C (grandchild).
    Return a (child, grandchild) tuple.
    The 2 processes are fully initialized and will live for 60 secs
    and are registered for cleanup on reap_children().
    2a          import subprocess, os, sys, time
        s = "import os, time;"
        s += "f = open('%s', 'w');"
        s += "f.write(str(os.getpid()));"
        s += "f.close();"
        s += "time.sleep(60);"
        subprocess.Popen(['%s', '-c', s])
        time.sleep(60)
        r   )r   F)r   r   )rl   rm   basenamer   textwrapdedentr   r
   r2   rp   rq   r   rE   removeint_pids_startedr   )Z_TESTFN2ssubpZchild1dataZ
child2_pidZchild2rg   rg   rh   r6   J  s    	


c                 s   t rtjtdnt} tjd|  }tjt	j	t	j
}|jt |j|  |jd t| |j \}}zNtj|j gg g t t|jd}tj| tj| t fddd |S |j  X W dQ R X dS )	z+Create a zombie process and return its PID.)r   a          import os, sys, time, socket, contextlib
        child_pid = os.fork()
        if child_pid > 0:
            time.sleep(3000)
        else:
            # this is the zombie process
            s = socket.socket(socket.AF_UNIX)
            with contextlib.closing(s):
                s.connect('%s')
                if sys.version_info < (3, ):
                    pid = str(os.getpid())
                else:
                    pid = bytes(str(os.getpid()), 'ascii')
                s.sendall(pid)
        rY   i   c                  s    j  S )N)Zstatusrg   )zprocrg   rh   <lambda>  s    z$create_zombie_proc.<locals>.<lambda>zret == psutil.STATUS_ZOMBIEN)r   tempfilemktempr   r   r   r   
contextlibclosingsocketry   Z
settimeoutr   bindlistenr2   acceptselectfilenor   Zrecvr   r   rp   rq   rC   r|   )Z	unix_filesrcsockconn_Zzpidrg   )r   rh   r5   m  s"    





c          
   K   sr   |j dd |j dd tjtddd@}tj|j |j|  |j  t	t
|jgf|}t|j W dQ R X |S )zeRun python 'src' code string in a separate interpreter.
    Returns a subprocess.Popen instance.
    r`   Nra   wtF)r   moder   )r   r   NamedTemporaryFiler   r   r   r   writeflushr4   r   rD   r   )r   r   fr   rg   rg   rh   r2     s    
c             K   s   t | ttfrdnd}tr"|r"dnd}|jd| |jdtj |jdtj |jdd |jd	| tj| f|}tj	| |j
 \}}|jdkrt||rt| |jd
r|dd }|S )zUrun cmd in a subprocess and return its output.
    raises RuntimeError on error.
    TFi   r   shellr`   ra   Zuniversal_newlinesr   
NrY   )r~   strr   r
   r   rb   rd   r   r   r   Zcommunicate
returncodeRuntimeErrorrQ   endswith)r   r   r   flagspr`   ra   rg   rg   rh   sh  s"    


r   Fc       	   '   C   s*  dd }| r"t tj jdd}nt  }xtrtj }tj|j y|j	  W n0 t
k
r~ } z|jtjkrn W Y dd}~X nX |jr|jj  |jr|jj  z|jr|jj  W dy|j  W n0 t
k
r } z|jtjkr W Y dd}~X nX X q*W xLtrFtj }ytj|}W n  tjk
r8   || Y qX |j| qW |r&x4|D ],}y|j	  W n tjk
r|   Y nX qTW tj|td\}}x@|D ]8}td|  y|j  W n tjk
r   Y nX qW tj|td\}}|rx|D ]}td|  qW x|D ]}||j qW dS )	a#  Terminate and wait() any subprocess started by this test suite
    and ensure that no zombies stick around to hog resources and
    create problems  when looking for refleaks.

    If resursive is True it also tries to terminate and wait()
    all grandchildren started by this process.
    c             S   s*   yt j| }W n t jk
r$   Y nX d S )N)rp   rq   NoSuchProcess)r   r   rg   rg   rh   assert_gone  s    
z"reap_children.<locals>.assert_goneT)r   N)timeoutz0couldn't terminate process %r; attempting kill()zprocess %r survived kill())r   rp   rq   childrenr   popr   r   r   Z	terminateOSErrorerrnoZESRCHr`   r|   ra   r   r   ZECHILDr   Z
wait_procsr   rQ   kill)	r   r   r   r   errr   r   Zgonealiverg   rg   rh   r3     sd    





c              C   s   t stdd} tj d }x(|D ] }|j s6|dkr@| |7 } q"P q"W | sVtd| d}d}| jd}t|d }t|dkrt|d }t|dkrt|d }|||fS )	z"Return a tuple such as (2, 6, 36).z	not POSIXrT   r   r{   zcan't parse %rr   rY   r   )	r   NotImplementedErrorrl   unameisdigitrr   splitr   len)r   r   cminormicroZnumsmajorrg   rg   rh   rB     s&    


c              C   sd   t stdtj } t| dr*| jp&d}n(tjd| d }|rNt|j	d}nd}| d | d |fS )Nznot WINDOWSservice_pack_majorr   z\s\d$r   rY   )
r
   r   rj   Zgetwindowsversionhasattrr   researchr   group)ZwvZsprrg   rg   rh   rA   3  s    
c               @   s@   e Zd ZdZeddddd fddZdd	 Zd
d Zdd ZdS )retryzA retry decorator.NgMbP?c             C   s   t | tjdS )N)file)printrj   ra   )r   rg   rg   rh   r   O  s    zretry.<lambda>c             C   s2   |r|rt d|| _|| _|| _|| _|| _d S )Nz/timeout and retries args are mutually exclusive)rr   	exceptionr   retriesintervallogfun)r   r   r   r   r   r   rg   rg   rh   r   J  s    zretry.__init__c             c   s`   | j r.tj | j  }xFtj |k r*d V  qW n.| jrPx&t| jD ]
}d V  q@W nx
d V  qRW d S )N)r   r   r   range)r   Zstop_atr   rg   rg   rh   __iter__Y  s    zretry.__iter__c             C   s   | j d k	rtj| j  d S )N)r   r   r   )r   rg   rg   rh   r   e  s    
zretry.sleepc                s"   t j  fdd}|_|S )Nc                 st   d }x^D ]V}y
 | |S  j k
r^ } z(|}jd k	rDj| j  w
W Y d d }~X q
X q
W trn|n d S )N)r   r   r   r   )r   r   excr   )r   r   rg   rh   r   j  s    



zretry.__call__.<locals>.wrapper)r   r   	decorator)r   r   r   rg   )r   r   rh   __call__i  s    zretry.__call__)	r   r   r   r   re   r   r  r   r  rg   rg   rg   rh   r   G  s   
r   gMbP?)r   r   r   r   c             C   s   t j|  trtjd dS )zWait for pid to show up in the process list then return.
    Used in the test suite to give time the sub process to initialize.
    g{Gz?N)rp   rq   r
   r   r   )r   rg   rg   rh   rD     s    
Tc          	   C   s4   t | d}|j }W dQ R X |s"|r0tj|  |S )z8Wait for a file to be written on disk with some content.rbN)openreadrl   r   )Zfnamer   r   r   r   rg   rg   rh   rE     s    
c             C   s
   |  }|S )zVKeep calling function for timeout secs and exit if eval()
    expression is True.
    rg   )r   exprretrg   rg   rh   rC     s    c             C   sf   y0t j| }tj|jr$t j|  n
t j|  W n0 tk
r` } z|jtjkrP W Y dd}~X nX dS )z>Convenience function for removing temporary test files or dirsN)	rl   statS_ISDIRst_modermdirr   r   r   ENOENT)rm   str   rg   rg   rh   r>     s    
c             C   sD   yt j|  W n0 tk
r> } z|jtjkr. W Y dd}~X nX dS )z-Convenience function for creating a directoryN)rl   mkdirr   r   ZEEXIST)dirr   rg   rg   rh   
safe_mkdir  s
    r  c             c   s.   t j }zt j|  dV  W dt j| X dS )z@Context manager which temporarily changes the current directory.N)rl   r   r=   )dirnamecurdirrg   rg   rh   r=     s
    

c             C   s   |rvt dstdt|tr(tjd}tjdddd}|j| W dQ R X zt	j
d|jd	| g W dt|j X n.tjt|  trtj| }tj| |jtjB  dS )
z1Creates an executable file in the given location.gcczgcc is not installedz
                #include <unistd.h>
                int main() {
                    pause();
                    return 1;
                }
                z.cFr   )suffixr   r   Nz-o)r   rr   r~   boolr   r   r   r   r   rb   rc   r   r>   shutilcopyfiler   r   rl   r
  chmodr  S_IEXEC)ZoutpathZc_coder   r  rg   rg   rh   r?     s     

c             C   s   t j| |dS )N)r   r  )r   r   )r   r  rg   rg   rh   r@     s    c               @   s(   e Zd Zdd Zeejds$ejjZdS )TestCasec             C   s   d| j j| j j| jf S )Nz%s.%s.%s)r   r   r   Z_testMethodName)r   rg   rg   rh   __str__  s    zTestCase.__str__assertRaisesRegexN)	r   r   r   r  r   unittestr  ZassertRaisesRegexpr  rg   rg   rg   rh   r    s   r  c               C   s$   dt jkrdt jd< tjjj  d S )NZPSUTIL_TESTINGrU   )rl   r]   rp   Z_psplatformZcextZset_testingrg   rg   rg   rh   _setup_tests  s    

r   c              C   s`   dd t jtD } dt jkr,dd | D } tj }x&| D ]}d| }|jtjj| q:W |S )Nc             S   s<   g | ]4}|j d r|jdr|jd rtjj|d qS )z.pyZtest_Ztest_memory_leaksr   )r   rt   rl   rm   splitext)rv   rw   rg   rg   rh   rx     s    zget_suite.<locals>.<listcomp>ZWHEELHOUSE_UPLOADER_USERNAMEc             S   s   g | ]}|j ds|qS )osxposixlinux)r"  r#  r$  )r   )rv   rw   rg   rg   rh   rx     s    zpsutil.tests.%s)	rl   r}   HEREr]   r  	TestSuiteaddTestdefaultTestLoaderloadTestsFromName)ZtestmodssuiteZtmrg   rg   rh   r;     s    

c              C   s8   t   tjtdjt } | j }tj|r.dnd d S )N)	verbosityr   rY   )	r   r  TextTestRunnerr$   r   r;   wasSuccessfulrj   exit)resultsuccessrg   rg   rh   r<     s    c             C   sh   t   tjjtjj| d } tj }|jtjj	|  tj
tdj|}|j }tj|r^dnd d S )Nr   )r+  rY   )r   rl   rm   r!  r   r  r&  r'  r(  r)  r,  r$   r   r-  rj   r.  )r   r*  r/  r0  rg   rg   rh   r:   #  s    c             C   s   t td| dS )zZDecorator which runs a test function and retries N times before
    actually failing.
    N)r   r   r   )r   AssertionError)r   rg   rg   rh   r9   /  s    c                s    fdd}|S )z,Decorator to Ignore AccessDenied exceptions.c                s   t j  fdd}|S )Nc                 s>   y
 | |S  t jk
r8   d k	r*s* tjdY nX d S )Nzraises AccessDenied)rp   ZAccessDeniedr  SkipTest)r   r   )r   only_ifrg   rh   r   9  s    
z9skip_on_access_denied.<locals>.decorator.<locals>.wrapper)r   r   )r   r   )r3  )r   rh   r  8  s    	z(skip_on_access_denied.<locals>.decoratorrg   )r3  r  rg   )r3  rh   r7   6  s    c                s    fdd}|S )z3Decorator to Ignore NotImplementedError exceptions.c                s   t j  fdd}|S )Nc                 sF   y
 | |S  t k
r@   d k	r(s( d j }tj|Y nX d S )Nz4%r was skipped because it raised NotImplementedError)r   r   r  r2  )r   r   msg)r   r3  rg   rh   r   I  s    
z;skip_on_not_implemented.<locals>.decorator.<locals>.wrapper)r   r   )r   r   )r3  )r   rh   r  H  s    z*skip_on_not_implemented.<locals>.decoratorrg   )r3  r  rg   )r3  rh   r8   F  s    	127.0.0.1c             C   sF   t jtj .}|jtjtjd |j| df |j d S Q R X dS )zReturn an unused TCP port.rY   r   N)r   r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRr   getsockname)hostr   rg   rg   rh   rH   ]  s    c             c   s@   t | d}z
|V  W dytj| W n tk
r8   Y nX X dS )zaA context manager which returns a non-existent file name
    and tries to delete it on exit.
    )r  N)r@   rl   unlinkr   )r  rm   rg   rg   rh   rI   e  s    

c             C   s|   |dkr| t tfkrd}tj| |}y4|jtjtjd |j| |tjkrV|jd |S  t	k
rv   |j
   Y nX dS )zBinds a generic socket.NrT   r   rY   rX   )rT   r   )r   r   r   r6  r7  r8  r   r   r   re   r|   )familytypeaddrr   rg   rg   rh   rJ   u  s    


c             C   sT   t j t j|}y"|j|  |t jkr.|jd W n tk
rN   |j   Y nX |S )zBind a UNIX socket.rX   )r   ry   r   r   r   re   r|   )r   r=  r   rg   rg   rh   rK     s    

c             C   s   t jtj| t}|j| |jd |j }tj| t}y@|j| |j }x(|j \}}||krn||fS |j	  qRW W n t
k
r   |j	   Y nX W dQ R X dS )z^Build a pair of TCP sockets connected to each other.
    Return a (server, client) tuple.
    rX   N)r   r   r   r   r   r   r9  connectr   r|   r   )r<  r>  Zllr   Zcaddrarg   rg   rh   rL     s     


c             C   s   d }}y@t | tjd}|jd tjtjtj}|jd |j|  W n6 tk
r~   |dk	rh|j  |dk	rx|j   Y nX ||fS )zBuild a pair of UNIX sockets connected to each other through
    the same UNIX file name.
    Return a (server, client) tuple.
    N)r=  r   )rK   r   r   Zsetblockingry   r?  re   r|   )r   ZserverZclientrg   rg   rh   rM     s    

c              c   s   g } d }}z| j ttjtj | j ttjtj t rd| j ttjtj | j ttjtj trt	rt
 j }t
 j }t|\}}t|tjd}x|||fD ]}| j | qW | V  W dx| D ]}|j  qW |dk	rt| |dk	rt| X dS )z1Open as many socket families / types as possible.N)r=  )appendrJ   r   r   r   r   r   r   r   HAS_CONNECTIONS_UNIXrI   r   rM   rK   r|   r>   )ZsocksZfname1Zfname2s1s2Zs3r   rg   rg   rh   rN     s,    



c             C   s   ddl }trtr|tjkrTdd | jdD }x|D ]}q4W tsHt| } |j|  n8|tjkrvtsjt| } |j	|  n|t
jkrn
td|dS )z[Check a net address validity. Supported families are IPv4,
    IPv6 and MAC addresses.
    r   Nc             S   s   g | ]}t |qS rg   )r   )rv   rw   rg   rg   rh   rx     s    z%check_net_address.<locals>.<listcomp>r{   zunknown family %r)	ipaddressenumr   r   r   r   r   ZIPv4Addressr   ZIPv6Addressrp   ZAF_LINKrr   )r>  r<  rE  ZoctsZnumrg   rg   rh   rG     s     



c          (   C   s  t | dk}t| dd	d
k}|r |rttdrt rytj| j| j| j}W n: tj	t
fk
r } z|jd tjkrv W Y dd}~X nX tj| W dQ R X | jttfkr2| jtkr>tj| j| j}tj|V y|j| jd df W n6 tj	k
r$ } z|jtjkr W Y dd}~X nX W dQ R X n| jtkr>| jtkrJxL| j| jfD ]<}| jttfkr|svqXt|j| j n| jtkrXqXW dd ttD }dS )z*Check validity of a connection namedtuple.r   fdrY   fromfdr   Nc             S   s    g | ]}|j d rtt|qS )ZCONN_)rt   ru   rp   )rv   rw   rg   rg   rh   rx   =  s    z+check_connection_ntuple.<locals>.<listcomp>r   r   )r   ru   r   r   r
   rH  rG  r<  r=  errorr   r   r   ZEBADFr   r   r   r   r   ZladdrZEADDRNOTAVAILry   r   ZraddrrG   Zipr  rp   )r   Zhas_pidZhas_fdZdupsockr   r   r>  Zvalidsrg   rg   rh   rF     s@    
 c             C   sL   yddl }t|dstW n" tk
r<   ddl}|j| S X |j| S dS )z,Backport of importlib.reload of Python 3.3+.r   Nreload)	importlibr   ImportErrorimprJ  )modulerK  rM  rg   rg   rh   rO   F  s    
c             C   s   t jjt jj| d }tjd dkr:dd l}|j|| S tjd d dkrfddlm	} ||| j
 S dd l}|jj|| }|jj|}|jj| |S d S )Nr   r   r   r   )SourceFileLoader)r   r   )rl   rm   r!  r   rj   ro   rM  Zload_sourceZimportlib.machineryrO  load_moduleimportlib.utilutilspec_from_file_locationmodule_from_specloaderexec_module)rm   r   rM  rO  rK  specmodrg   rg   rh   rP   S  s    c             C   s   t j| t dS )zRaise a warning msg.N)warningsrQ   UserWarning)r4  rg   rg   rh   rQ   h  s    c             C   sV   t | }|j}t|dks&|d tkr*dS t|dd}t|tsDdS tdd |D S )z-Check if object is an instance of namedtuple.rY   r   F_fieldsNc             s   s   | ]}t |tkV  qd S )N)r=  r   )rv   nrg   rg   rh   	<genexpr>v  s    z is_namedtuple.<locals>.<genexpr>)r=  	__bases__r   tupleru   r~   all)rw   tbr   rg   rg   rh   rS   m  s    
c             #   sf   d t j|  d} fddtj j D }tj|}tj|| zt	j
| |V  W dt| X dS )zCtx manager which picks up a random shared CO lib used
        by this process, copies it in another location and loads it
        in memory via ctypes. Return the new absolutized path.
        z.so)r   r  c                s6   g | ].}t jj|jd   krd|jj kr|jqS )rY   python)rl   rm   r!  lower)rv   rw   )extrg   rh   rx     s    z'copyload_shared_lib.<locals>.<listcomp>N)r   r   rp   rq   r^   randomchoicer  r  ctypesZCDLLr>   )
dst_prefixdstlibsr   rg   )re  rh   rR   z  s    


c       	      #   s   ddl m} ddl m} d tj|  d} fddtj j D }tj	|}t
j|| d}zt j|}|V  W d|dk	rt jjj}|jg|_||j}|dkr|  t| X dS )	zCtx manager which picks up a random shared DLL lib used
        by this process, copies it in another location and loads it
        in memory via ctypes.
        Return the new absolutized, normcased path.
        r   )wintypes)WinErrorz.dll)r   r  c                sP   g | ]H}t jj|jd  j  krdt jj|jj krd|jj kr|jqS )rY   rc  Zwow64)rl   rm   r!  rd  r   )rv   rw   )re  rg   rh   rx     s    z'copyload_shared_lib.<locals>.<listcomp>N)rh  rl  rm  r   r   rp   rq   r^   rf  rg  r  r  ZWinDLLZwindllZkernel32FreeLibraryZHMODULEZargtypesZ_handler>   )	ri  rl  rm  rj  rk  r   cfilern  r	  rg   )re  rh   rR     s$    





)r   r   )r   r   )rU   rV   )rW   r   r   i  )rZ   r[   )N)F)TF)N)N)N)r5  )rT   rT   r   )rp  )r   Z
__future__r   atexitr   rh  r   r   rl   rf  r   r   r  r   r
  rb   rj   r   r   r   r   r   rY  r   r   r   r   rp   r   r   r	   r
   Zpsutil._commonr   Zpsutil._compatr   r   r   r   ro   Z	unittest2r  r   rL  rF  __all__getenvr!   builtin_module_namesr   Z	WIN_VISTAr  r]   getr"   r   r   r   r   r$   r   rm   r   rn   r   r   r   r    getfilesystemencodingrd  ZASCII_FSabspathr  __file__r   r   r%  r   rq   r%   r&   rB  r'   r(   r)   Zmemory_full_infor[  r1   r*   r+   r,   ZHAS_THREADSr-   r_   r.   r/   r0   rs   r   r  devnullr   r  r#   ru   objectry   rz   r   r   r   r   registerr   r   r   r   r   r4   r6   r5   r2   r   r3   rB   rA   r   r   rD   EnvironmentErrorr1  rE   rC   r>   r  contextmanagerr=   r?   r@   r  r   r;   r<   r:   r9   r7   r8   rH   rI   rJ   rK   rL   rM   rN   rG   rF   rO   rP   rQ   rS   rR   rg   rg   rg   rh   <module>	   sN  








 




0 #%
_:

	
	



L