U
    ˜Ëj¦b  ã                ?   @   sª  d 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 zddlmZ W n ek
r˜   dZY nX zddlmZ W n ek
rÂ   dZY nX ee d¡ƒZeƒ 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"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGg?ZejdHkZejdIkZej dJ¡Zej dK¡ZeZej dL¡Zej dM¡Zej dN¡Z e�p¼e�p¼e Z!ej dO¡Z"ej dP¡Z#dQZ$dRZ%dSZ&dTZ'dUZ(dVZ)dWZ*dXZ+dYZ,dZZ-d[Z.d\Z/d]Z0d^Z1d_Z2d`Z3daZ4dbZ5dcZ6ddZ7deZ8dfZ9dgZ:dhZ;diZ<djZ=G dkdl„ dlej>ƒZ?e@ƒ  Ae?jB¡ G dmdn„ dnej>ƒZCe@ƒ  AeCjB¡ e D¡ ZEe F¡ ZGe
eegeegfe
egegfe
gegfe
egegfe
gegfe
egeegfe
geegfegeegfdoœZHedk	�r eH Aegegfegegfdpœ¡ edk	�rHe"�sHeH Adqegeegfi¡ G drds„ dseIƒZJG dtdu„ dueJƒZKG dvdw„ dweKƒZLG dxdy„ dyeJƒZMG dzd{„ d{eJƒZNd�d|d9„ZOd}d6„ ZPd~d„ ZQd€d5„ ZRd�d8„ ZSd‚d:„ ZTdƒd7„ ZUd„d;„ ZVd…d<„ ZWdžd†dC„ZXd‡dˆ„ ZYd‰d4„ ZZG dŠd‹„ d‹ƒZ[dŒd=„ Z\e[ƒ Z]e]j^e\_^e]j_e\__d�Z`dŽd?„ Zad�d>„ Zbeebfd�d@„Zcefd‘dA„ZddŸd“dB„Zed”d•„ Zfd–d—„ ZgePejhfd˜dF„ƒZid dšdE„Zjdd™ejhfd›dG„ZkdœdD„ ZldS )¡z�Common objects shared by __init__.py and _ps*.py modules.

Note: this module is imported by setup.py, so it should not import
psutil or third-party modules.
é    N)ÚAF_INET)Ú
SOCK_DGRAM)ÚSOCK_STREAM)ÚAF_INET6)ÚAF_UNIXÚPSUTIL_DEBUGÚFREEBSDÚBSDÚLINUXÚNETBSDÚOPENBSDÚMACOSÚOSXÚPOSIXÚSUNOSÚWINDOWSÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_CLOSINGÚCONN_ESTABLISHEDÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_LAST_ACKÚCONN_LISTENÚ	CONN_NONEÚCONN_SYN_RECVÚCONN_SYN_SENTÚCONN_TIME_WAITÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNÚSTATUS_DEADÚSTATUS_DISK_SLEEPÚSTATUS_IDLEÚSTATUS_LOCKEDÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_STOPPEDÚSTATUS_SUSPENDEDÚSTATUS_TRACING_STOPÚSTATUS_WAITINGÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_ZOMBIEÚSTATUS_PARKEDÚENCODINGÚENCODING_ERRSr   Ú	conn_tmapÚdeprecated_methodÚisfile_strictÚmemoizeÚparse_environ_blockÚpath_exists_strictÚusage_percentÚsupports_ipv6Úsockfam_to_enumÚsocktype_to_enumÚwrap_numbersÚ	open_textÚopen_binaryÚcatÚbcatÚbytes2humanÚconn_to_ntupleÚdebugÚhiliteÚterm_supports_colorsÚprint_colorÚposixÚntÚlinuxÚdarwin)ZfreebsdZmidnightbsdZopenbsdZnetbsd)ÚsunosÚsolarisÚaixZrunningZsleepingz
disk-sleepÚstoppedztracing-stopZzombieZdeadz	wake-killZwakingZidleÚlockedZwaitingZ	suspendedZparkedZESTABLISHEDZSYN_SENTZSYN_RECVZ	FIN_WAIT1Z	FIN_WAIT2Z	TIME_WAITZCLOSEZ
CLOSE_WAITZLAST_ACKZLISTENZCLOSINGÚNONEc                   @   s   e Zd ZdZdZdZdS )Ú	NicDuplexé   é   r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r    © rV   rV   ú2/tmp/pip-unpacked-wheel-3no1_rt3/psutil/_common.pyrP   z   s   rP   c                   @   s   e Zd ZdZdZdS )ÚBatteryTimeéÿÿÿÿéþÿÿÿN)rS   rT   rU   ZPOWER_TIME_UNKNOWNZPOWER_TIME_UNLIMITEDrV   rV   rV   rW   rX   „   s   rX   )ÚallZtcpZtcp4ZudpZudp4ZinetZinet4Zinet6)Ztcp6Zudp6Úunixc                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
ÚErrorzQBase exception class. All other psutil exceptions inherit
    from this one.
    Úpsutilc                 C   s>   t  ¡ }|D ],}t| |d ƒ}|s0|dkr|dkr|||< q|S )NÚpidr   )ÚcollectionsÚOrderedDictÚgetattr)ÚselfÚattrsÚinfoÚnameÚvaluerV   rV   rW   Ú	_infodict·   s    
zError._infodictc                 C   sR   |   d¡}|r.d d dd„ | ¡ D ƒ¡¡}nd }d dd„ t| dd	ƒ|fD ƒ¡S )
N)r_   Úppidrf   z({})ú, c                 S   s   g | ]\}}|› d |›�‘qS ©ú=rV   ©Ú.0ÚkÚvrV   rV   rW   Ú
<listcomp>Ä   s     z!Error.__str__.<locals>.<listcomp>ú c                 S   s   g | ]}|r|‘qS rV   rV   )rn   ÚxrV   rV   rW   rq   È   s      ÚmsgÚ )rh   ÚformatÚjoinÚitemsrb   ©rc   re   ÚdetailsrV   rV   rW   Ú__str__¿   s    
ÿzError.__str__c                 C   s8   |   d¡}d dd„ | ¡ D ƒ¡}d| jj› d|› d�S )N)r_   ri   rf   Úsecondsrt   rj   c                 S   s   g | ]\}}|› d |›�‘qS rk   rV   rm   rV   rV   rW   rq   Í   s     z"Error.__repr__.<locals>.<listcomp>zpsutil.ú(ú))rh   rw   rx   Ú	__class__rS   ry   rV   rV   rW   Ú__repr__Ê   s    
zError.__repr__N)rS   rT   rU   Ú__doc__rh   r{   r€   rV   rV   rV   rW   r]   °   s
   r]   c                   @   s&   e Zd ZdZdZddd„Zdd„ ZdS )	ÚNoSuchProcesszXException raised when a process with a certain PID doesn't
    or no longer exists.
    r^   Nc                 C   s$   t  | ¡ || _|| _|pd| _d S )Nzprocess no longer exists©r]   Ú__init__r_   rf   rt   ©rc   r_   rf   rt   rV   rV   rW   r„   Ø   s    
zNoSuchProcess.__init__c                 C   s   | j | j| j| jffS ©N©r   r_   rf   rt   ©rc   rV   rV   rW   Ú
__reduce__Þ   s    zNoSuchProcess.__reduce__)NN©rS   rT   rU   r�   r„   r‰   rV   rV   rV   rW   r‚   Ñ   s   
r‚   c                   @   s&   e Zd ZdZdZddd„Zdd„ ZdS )	ÚZombieProcessa1  Exception raised when querying a zombie process. This is
    raised on macOS, BSD and Solaris only, and not always: depending
    on the query the OS may be able to succeed anyway.
    On Linux all zombie processes are querable (hence this is never
    raised). Windows doesn't have zombie processes.
    r^   Nc                 C   s$   t  | |||¡ || _|pd| _d S )Nz"PID still exists but it's a zombie)r‚   r„   ri   rt   )rc   r_   rf   ri   rt   rV   rV   rW   r„   ì   s    zZombieProcess.__init__c                 C   s   | j | j| j| j| jffS r†   )r   r_   rf   ri   rt   rˆ   rV   rV   rW   r‰   ñ   s    zZombieProcess.__reduce__)NNNrŠ   rV   rV   rV   rW   r‹   â   s   
r‹   c                   @   s&   e Zd ZdZdZddd„Zdd„ ZdS )	ÚAccessDeniedz@Exception raised when permission to perform an action is denied.r^   Nc                 C   s$   t  | ¡ || _|| _|pd| _d S )Nru   rƒ   r…   rV   rV   rW   r„   ú   s    
zAccessDenied.__init__c                 C   s   | j | j| j| jffS r†   r‡   rˆ   rV   rV   rW   r‰      s    zAccessDenied.__reduce__)NNNrŠ   rV   rV   rV   rW   rŒ   õ   s   
rŒ   c                   @   s&   e Zd ZdZdZddd„Zdd„ ZdS )	ÚTimeoutExpiredzWRaised on Process.wait(timeout) if timeout expires and process
    is still alive.
    r^   Nc                 C   s.   t  | ¡ || _|| _|| _d|› d�| _d S )Nztimeout after z seconds)r]   r„   r|   r_   rf   rt   )rc   r|   r_   rf   rV   rV   rW   r„     s
    
zTimeoutExpired.__init__c                 C   s   | j | j| j| jffS r†   )r   r|   r_   rf   rˆ   rV   rV   rW   r‰     s    zTimeoutExpired.__reduce__)NNrŠ   rV   rV   rV   rW   r�     s   
r�   c                 C   sF   zt | ƒ| d }W n tk
r*   Y dS X |dk	r>t||ƒ}|S dS )z5Calculate percentage usage of 'used' against 'total'.éd   g        N)ÚfloatÚZeroDivisionErrorÚround)ÚusedÚtotalZround_ÚretrV   rV   rW   r7     s    
c                    s2   t  ˆ¡‡ ‡fdd„ƒ}‡ fdd„}i ‰ ||_|S )a¹  A simple memoize decorator for functions supporting (hashable)
    positional arguments.
    It also provides a cache_clear() function for clearing the cache:

    >>> @memoize
    ... def foo()
    ...     return 1
        ...
    >>> foo()
    1
    >>> foo.cache_clear()
    >>>

    It supports:
     - functions
     - classes (acts as a @singleton)
     - staticmethods
     - classmethods

    It does NOT support:
     - methods
    c                     s|   | t t| ¡ ƒƒf}z
ˆ | W S  tk
rv   zˆ| |Ž }ˆ |< W n( tk
rl } z
|d ‚W 5 d }~X Y nX | Y S X d S r†   )Ú	frozensetÚsortedrx   ÚKeyErrorÚ	Exception)ÚargsÚkwargsÚkeyr”   Úerr©ÚcacheÚfunrV   rW   Úwrapper?  s    
zmemoize.<locals>.wrapperc                      s   ˆ   ¡  dS )zClear cache.N)ÚclearrV   )rž   rV   rW   Úcache_clearK  s    zmemoize.<locals>.cache_clear)Ú	functoolsÚwrapsr¢   )rŸ   r    r¢   rV   r�   rW   r4   '  s    c                    s6   t  ˆ ¡‡ fdd„ƒ}dd„ }dd„ }||_||_|S )aú  A memoize decorator which is disabled by default. It can be
    activated and deactivated on request.
    For efficiency reasons it can be used only against class methods
    accepting no arguments.

    >>> class Foo:
    ...     @memoize
    ...     def foo()
    ...         print(1)
    ...
    >>> f = Foo()
    >>> # deactivated (default)
    >>> foo()
    1
    >>> foo()
    1
    >>>
    >>> # activated
    >>> foo.cache_activate(self)
    >>> foo()
    1
    >>> foo()
    >>> foo()
    >>>
    c                    sÌ   z| j ˆ  }W n¸ tk
rZ   zˆ | ƒW  Y S  tk
rT } z
|d ‚W 5 d }~X Y nX Y nn tk
rÆ   zˆ | ƒ}W n( tk
rœ } z
|d ‚W 5 d }~X Y nX z|| j ˆ < W n tk
rÀ   Y nX Y nX |S r†   )Ú_cacheÚAttributeErrorr˜   r—   )rc   r”   rœ   ©rŸ   rV   rW   r    o  s"    z'memoize_when_activated.<locals>.wrapperc                 S   s
   i | _ dS )zsActivate cache. Expects a Process instance. Cache will be
        stored as a "_cache" instance attribute.
        N)r¥   ©ÚprocrV   rV   rW   Úcache_activate‰  s    z.memoize_when_activated.<locals>.cache_activatec                 S   s"   z| ` W n tk
r   Y nX dS )zDeactivate and clear cache.N)r¥   r¦   r¨   rV   rV   rW   Úcache_deactivate�  s    z0memoize_when_activated.<locals>.cache_deactivate)r£   r¤   rª   r«   )rŸ   r    rª   r«   rV   r§   rW   Úmemoize_when_activatedT  s    r¬   c                 C   sJ   zt  | ¡}W n* tk
r$   ‚ Y n" tk
r8   Y dS X t |j¡S dS )z�Same as os.path.isfile() but does not swallow EACCES / EPERM
    exceptions, see:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html.
    FN)ÚosÚstatÚPermissionErrorÚOSErrorÚS_ISREGÚst_mode)ÚpathÚstrV   rV   rW   r3   ›  s    c                 C   sB   zt  | ¡ W n* tk
r$   ‚ Y n tk
r8   Y dS X dS dS )z�Same as os.path.exists() but does not swallow EACCES / EPERM
    exceptions. See:
    http://mail.python.org/pipermail/python-dev/2012-June/120787.html.
    FTN)r­   r®   r¯   r°   )r³   rV   rV   rW   r6   ª  s    c               	   C   sX   t jrtdkrdS z*t   tt j¡�} |  d¡ W 5 Q R X W dS  tk
rR   Y dS X dS )z2Return True if IPv6 is supported on this platform.NF)z::1r   T)ÚsocketÚhas_ipv6r   r   Úbindr°   )ÚsockrV   rV   rW   r8   ¹  s    c                 C   sv   i }d}t }|  d|¡}||kr"qr|  d||¡}||krh| ||… }| |d |… }|r`| ¡ }|||< |d }q|S )zCParse a C environ block of environment variables into a dictionary.r   ú rl   rR   )r   ÚfindÚupper)Údatar”   ÚposZWINDOWS_Znext_posZ	equal_posr›   rg   rV   rV   rW   r5   Å  s    
c                 C   s*   zt  | ¡W S  tk
r$   |  Y S X dS )z�Convert a numeric socket family value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)rµ   ÚAddressFamilyÚ
ValueError©ÚnumrV   rV   rW   r9   á  s    c                 C   s*   zt  | ¡W S  tk
r$   |  Y S X dS )zConvert a numeric socket type value to an IntEnum member.
    If it's not a known member, return the numeric value itself.
    N)rµ   Ú
SocketKindr¿   rÀ   rV   rV   rW   r:   ë  s    c           	   	   C   s¤   ddl m} |tjthkr6|r(|j|Ž }|r6|j|Ž }|tjkrZ|tthkrZ| |t¡}nt}t	|ƒ}t
|ƒ}|dkrŠ| | |||||¡S | | ||||||¡S dS )z2Convert a raw connection tuple to a proper ntuple.rR   )Ú_ntuplesN)ru   rÃ   rµ   r   r   Úaddrr   Úgetr   r9   r:   ÚpconnZsconn)	ÚfdZfamÚtype_ÚladdrÚraddrÚstatusZ
status_mapr_   ZntprV   rV   rW   rA   õ  s    

c                 C   sx   ddl }| jr| jsdS | jtjkrFt|j| j› d| j› �dd�jƒS | jtj	krtt|j
| j› d| j› �dd�jƒS dS )zbGiven the address ntuple returned by ``net_if_addrs()``
    calculates the broadcast address.
    r   Nú/F)Ústrict)Ú	ipaddressÚaddressÚnetmaskÚfamilyrµ   r   ÚstrÚIPv4NetworkÚbroadcast_addressr   ÚIPv6Network)rÄ   rÎ   rV   rV   rW   Úbroadcast_addr
  s"     ÿÿ ÿÿrÖ   c                    s   ‡ fdd„}|S )zƒA decorator which can be used to mark a method as deprecated
    'replcement' is the method name which will be called instead.
    c                    s>   | j › dˆ› d�‰ | jd kr"ˆ | _t | ¡‡ ‡fdd„ƒ}|S )Nz*() is deprecated and will be removed; use z
() insteadc                    s    t jˆ tdd� t| ˆƒ||ŽS )NrQ   )ÚcategoryÚ
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrb   )rc   r™   rš   )rt   ÚreplacementrV   rW   Úinner-  s    z/deprecated_method.<locals>.outer.<locals>.inner)rS   r�   r£   r¤   )rŸ   rÝ   ©rÜ   )rt   rW   Úouter%  s    ÿ
z deprecated_method.<locals>.outerrV   )rÜ   rß   rV   rÞ   rW   r2      s    c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	d
S )Ú_WrapNumberszNWatches numbers so that they don't overflow and wrap
    (reset to zero).
    c                 C   s    t  ¡ | _i | _i | _i | _d S r†   )Ú	threadingÚLockÚlockrž   Ú	remindersÚreminder_keysrˆ   rV   rV   rW   r„   <  s    
z_WrapNumbers.__init__c                 C   sX   || j kst‚|| jkst‚|| jks*t‚|| j |< t t¡| j|< t t¡| j|< d S r†   )rž   ÚAssertionErrorrä   rå   r`   ÚdefaultdictÚintÚset)rc   Ú
input_dictrf   rV   rV   rW   Ú	_add_dictB  s    
z_WrapNumbers._add_dictc                 C   s\   | j | }t| ¡ ƒt| ¡ ƒ }|D ]0}| j| | D ]}| j| |= q8| j| |= q&dS )z†In case the number of keys changed between calls (e.g. a
        disk disappears) this removes the entry from self.reminders.
        N)rž   ré   Úkeysrå   rä   )rc   rê   rf   Úold_dictZ	gone_keysZgone_keyÚremkeyrV   rV   rW   Ú_remove_dead_remindersJ  s    
z#_WrapNumbers._remove_dead_remindersc              	   C   s  || j kr|  ||¡ |S |  ||¡ | j | }i }|D ]¾}|| }z|| }W n  tk
rp   |||< Y q8Y nX g }tt|ƒƒD ]f}	||	 }
||	 }||	f}|
|k rÐ| j| |  |7  < | j| |  |¡ | 	|
| j| |  ¡ q‚t
|ƒ||< q8|| j |< |S )zlCache dict and sum numbers which overflow and wrap.
        Return an updated copy of `input_dict`.
        )rž   rë   rï   r—   ÚrangeÚlenrä   rå   ÚaddÚappendÚtuple)rc   rê   rf   rí   Znew_dictr›   Zinput_tupleZ	old_tupleÚbitsÚiZinput_valueÚ	old_valuerî   rV   rV   rW   ÚrunU  s2    



z_WrapNumbers.runNc              	   C   sh   | j �X |dkr0| j ¡  | j ¡  | j ¡  n*| j |d¡ | j |d¡ | j |d¡ W 5 Q R X dS )z>Clear the internal cache, optionally only for function 'name'.N)rã   rž   r¡   rä   rå   Úpop)rc   rf   rV   rV   rW   r¢   |  s    

z_WrapNumbers.cache_clearc              
   C   s.   | j � | j| j| jfW  5 Q R £ S Q R X dS )z5Return internal cache dicts as a tuple of 3 elements.N)rã   rž   rä   rå   rˆ   rV   rV   rW   Ú
cache_infoˆ  s    z_WrapNumbers.cache_info)N)
rS   rT   rU   r�   r„   rë   rï   rø   r¢   rú   rV   rV   rV   rW   rà   7  s   '
rà   c              
   C   s*   t j� t  | |¡W  5 Q R £ S Q R X dS )zÅGiven an `input_dict` and a function `name`, adjust the numbers
    which "wrap" (restart from zero) across different calls by adding
    "old value" to "new value" and return an updated dict.
    N)Ú_wnrã   rø   )rê   rf   rV   rV   rW   r;   Ž  s    i €  c                 C   s   t | dtd�S )NÚrb)Ú	buffering)ÚopenÚFILE_READ_BUFFER_SIZE)ÚfnamerV   rV   rW   r=   ©  s    c                 C   sP   t | tttd�}z
t|_W n0 tk
r.   Y n tk
rJ   | ¡  ‚ Y nX |S )zaOpen a file in text mode by using the proper FS encoding and
    en/decoding error handlers.
    )rý   ÚencodingÚerrors)rþ   rÿ   r/   r0   Ú_CHUNK_SIZEr¦   r˜   Úclose)r   ZfobjrV   rV   rW   r<   ­  s    ü
c              
   C   sv   |t kr.|| ƒ�}| ¡ W  5 Q R £ S Q R X nDz*|| ƒ�}| ¡ W  5 Q R £ W S Q R X W n tk
rp   | Y S X dS )zÛRead entire file content and return it as a string. File is
    opened in text mode. If specified, `fallback` is the value
    returned in case of error, either if the file does not exist or
    it can't be read().
    N)Ú_DEFAULTÚreadr°   )r   ÚfallbackÚ_openÚfrV   rV   rW   r>   Ç  s    

 c                 C   s   t | |td�S )z,Same as above but opens file in binary mode.)r  r  )r>   r=   )r   r  rV   rV   rW   r?   Ø  s    ú%(value).1f%(symbol)sc                 C   sŽ   d}i }t |dd… ƒD ]\}}d|d d > ||< qt|dd… ƒD ]2}t| ƒ|| krFt| ƒ||  }|tƒ    S qF|t|d | d� S )zÚUsed by various scripts. See: https://code.activestate.com/recipes/578019-bytes-to-human-human-to-bytes-converter/?in=user-4178764.

    >>> bytes2human(10000)
    '9.8K'
    >>> bytes2human(100001221)
    '95.4M'
    )	ÚBÚKÚMÚGÚTÚPÚEÚZÚYrR   Né
   r   )Úsymbolrg   )Ú	enumerateÚreversedÚabsr�   ÚlocalsÚdict)Únrv   ÚsymbolsÚprefixrö   Úsr  rg   rV   rV   rW   r@   Ý  s    c                   C   s   t jd jS )z+Return updated psutil.PROCFS_PATH constant.r^   )ÚsysÚmodulesZPROCFS_PATHrV   rV   rV   rW   Úget_procfs_pathð  s    r!  c                 C   s   | j ttd�S )N)r  r  )Údecoder/   r0   )r  rV   rV   rW   r"  õ  s    r"  c                 C   s>   t | dƒr|  ¡ sdS z|  ¡  W n tk
r8   Y dS X dS )NÚisattyFT)Úhasattrr#  Úfilenor˜   ©ÚfilerV   rV   rW   rD   þ  s    Fc                 C   s¤   t ƒ s
| S g }tddddddddd	d
�	}d|d< z|| }W n6 tk
rr   d|›dt| ¡ ƒ› �}t|ƒd‚Y nX | |¡ |rŒ| d¡ dd |¡› d| › d�S )z*Return an highlighted version of 'string'.Z34Z33Z30Z32Z37Z36Z91Z35Z93)	ZblueÚbrownZdarkgreyÚgreenZgreyZ	lightblueÚredZvioletÚyellowZ29Núinvalid color z; choose amongst Ú1z[ú;Úmz[0m)rD   r  r—   Úlistrì   r¿   ró   rw   )r  ÚcolorÚboldÚattrÚcolorsrt   rV   rV   rW   rC   	  s0    ÷

c              	   C   s  t ƒ st| |d� nôtr.tt| ||ƒ|d� nÚddl}d}|jjj}|jjj}t	ddddd�}||d< z|| }W n6 t
k
r¨   d	|›d
t| ¡ ƒ›�}	t|	ƒd‚Y nX |r¾|dkr¾|d7 }|tjkrÌdnd}
|j|_||
ƒ}|||ƒ zt| |d� W 5 |||ƒ X dS )z$Print a colorized version of string.r&  r   Né   rQ   é   é   )r)  r*  r(  r+  r,  z; choose between é   iôÿÿÿiõÿÿÿ)rD   Úprintr   rC   ÚctypesÚwindllÚKernel32ÚGetStdHandleÚSetConsoleTextAttributer  r—   r0  rì   r¿   r  ÚstderrÚc_ulongÚrestype)r  r1  r2  r'  r:  ZDEFAULT_COLORr=  r>  r4  rt   Z	handle_idÚhandlerV   rV   rW   rE   %  s4    
ÿÿ
c                 C   st   t rpddl}| | ¡ j¡\}}}}}t| tƒrPt| tƒrFd| › �} n
d| ›�} td|› d|› d| › �t	j
d� dS )z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.r   Nz	ignoring zpsutil-debug [ú:z]> r&  )r   ÚinspectÚgetframeinfoÚcurrentframeÚf_backÚ
isinstancer˜   r°   r9  r  r?  )rt   rD  r   ÚlinenoÚ_Ú_linesÚ_indexrV   rV   rW   rB   M  s    ÿ


 ÿ)N)N)r
  )NF)mr�   r`   Úenumr£   r­   rµ   r®   r  rá   rÙ   r   r   r   r   ÚImportErrorr   ÚboolÚgetenvr   Úobjectr  Ú__all__rf   r   r   ÚplatformÚ
startswithr
   r   r   r   r   r   r	   r   ZAIXr%   r&   r"   r'   r)   r-   r!   r+   r,   r#   r$   r*   r(   r.   r   r   r   r   r   r   r   r   r   r   r   r   ÚIntEnumrP   ÚglobalsÚupdateÚ__members__rX   Úgetfilesystemencodingr/   Úgetfilesystemencodeerrorsr0   r1   r˜   r]   r‚   r‹   rŒ   r�   r7   r4   r¬   r3   r6   r8   r5   r9   r:   rA   rÖ   r2   rà   r;   rû   r¢   rú   rÿ   r=   r<   r>   r?   r@   r!  r"  ÚstdoutrD   rC   rE   rB   rV   rV   rV   rW   Ú<module>   sn  

                                              è"

		

ø


þ!
-G


W	
	

  ÿ
(