JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrB =_jfN@s8dZddlmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddl mZddlmZddlmZddlmZydd lmZWnek rdZYnXydd lmZWnek rdZYnXe jd krddlZndZe jdd kZd ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZgNZejd[kZejd\kZe jd]Ze jd^Z e Z!e jd_Z"e jd`Z#e jdaZ$e"pe#pe$Z%e jdbZ&e jdcZ'ddZ(deZ)dfZ*dgZ+dhZ,diZ-djZ.dkZ/dlZ0dmZ1dnZ2doZ3dpZ4dqZ5drZ6dsZ7dtZ8duZ9dvZ:dwZ;dxZd{Z?d|Z@d}ZAedkrd~ZBdZCdZDn GdddejEZFeGHeFjIedkrdZJdZKn GdddejEZLeGHeLjIe MZNesdZOn2y e PZOWn$eQk rHer@dndZOYnXedHddddddgZRedDddddgZSedBddddddgZTedCddddddgZUedEddddddddgZVedIdddddgZWed@dddddddgZXedFdddddgZYedGddddgZZedAddddgZ[eddddgZ\edddddgZ]eddddgZ^edddgZ_ed8ddddgZ`ed=ddgZaed>dddgZbed?dddgZced:dddgZded;ddddgZeed>> @memoize ... def foo() ... return 1 ... >>> foo() 1 >>> foo.cache_clear() >>> csH|tt|f}y|Stk rB||}|<|SXdS)N) frozensetsorteditemsKeyError)rkwargskeyr)cachefunrrwrappers zmemoize..wrappercs dS)z Clear cache.N)clearr)rrr cache_clearszmemoize..cache_clear) functoolswrapsr )rrr r)rrrrLs  cs6tfdd}dd}dd}||_||_|S)aA 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() >>> csPy|j}Wn<tk r&|Stk rJ|}|j<YnX|S)N)_cacheAttributeErrorr)rr)rrrrsz'memoize_when_activated..wrappercSs i|_dS)zjActivate cache. Expects a Process instance. Cache will be stored as a "_cache" instance attribute.N)r )procrrrcache_activatesz.memoize_when_activated..cache_activatecSs"y|`Wntk rYnXdS)zDeactivate and clear cache.N)r r )rrrrcache_deactivatesz0memoize_when_activated..cache_deactivate)r r rr)rrrrr)rrmemoize_when_activateds rc CsVyt|}Wn6tk rD}z|jtjtjfkr4dSd}~XYnXt|jSdS)zSame as os.path.isfile() but does not swallow EACCES / EPERM exceptions, see: http://mail.python.org/pipermail/python-dev/2012-June/120787.html FN)osstatOSErrorerrnoEPERMEACCESS_ISREGst_mode)rsterrrrrrKsc CsNyt|Wn6tk rD}z|jtjtjfkr4dSd}~XYnXdSdS)zSame as os.path.exists() but does not swallow EACCES / EPERM exceptions, see: http://mail.python.org/pipermail/python-dev/2012-June/120787.html FNT)rrrrrr)rrrrrrNsc Cs`tjrtdkrdSy2tttj}t||dWdQRXdStjk rZdSXdS)z2Return True if IPv6 is supported on this platform.NF)z::1rT)sockethas_ipv6r r contextlibclosingbinderror)sockrrrrPs cCszi}d}t}xh|d|}||kr$P|d||}||krj|||}||d|}|rb|}|||<|d}qW|S)zCParse a C environ block of environment variables into a dictionary.r=rz)rfindupper)datarposWINDOWS_next_pos equal_posrrrrrrMs    cCs0tdkr |Sy t|Stk r*|SXdS)zConvert a numeric socket family value to an IntEnum member. If it's not a known member, return the numeric value itself. N)enumr AddressFamily ValueError)numrrrrQ"s  cCs0tdkr |Sy t|Stk r*|SXdS)zConvert a numeric socket type value to an IntEnum member. If it's not a known member, return the numeric value itself. N)r,r SocketKindr.)r/rrrrR/s  cCs|tjtfkr&|rt|}|r&t|}|tjkrJ|ttfkrJ||t}nt}t|}t|}|dkrxt ||||||St |||||||SdS)z2Convert a raw connection tuple to a proper ntuple.N) rrr rrgetrrQrRr6r?)rfamtype_rrr status_maprrrrrU<scsfdd}|S)zA decorator which can be used to mark a method as deprecated 'replcement' is the method name which will be called instead. cs:d|jf|jdkr|_t|fdd}|S)Nz8%s() is deprecated and will be removed; use %s() insteadcs tjtddt|||S)Nry)category stacklevel)warningswarnDeprecationWarninggetattr)rrr)r replacementrrinnerYsz/deprecated_method..outer..inner)r|rr r )rr<)r;)rrouterSs   z deprecated_method..outerr)r;r=r)r;rrJOs c@sBeZdZdZddZddZddZdd Zdd d Zd dZ d S) _WrapNumberszNWatches numbers so that they don't overflow and wrap (reset to zero). cCs t|_i|_i|_i|_dS)N) threadingLocklockr reminders reminder_keys)rrrrrfs z_WrapNumbers.__init__cCsT||jkst||jkst||jks*t||j|<tt|j|<tt|j|<dS)N)rAssertionErrorrBrCrintset)r input_dictrrrr _add_dictls  z_WrapNumbers._add_dictcCsd|j|}t|t|}x<|D]4}x"|j||D]}|j||=qYnXg}xvtt|D]f} || } || } || f} | | kr|j|| | 7<|j|| | | | |j|| qWt |||<q>W||j|<|S)zkCache dict and sum numbers which overflow and wrap. Return an updated copy of `input_dict` ) rrHrNrIrrangelenrBrCaddrtuple) rrGrrJnew_dictr input_tuple old_tuplebitsi input_value old_valuerMrrrruns2      z_WrapNumbers.runNc Csh|jX|dkr0|j|j|jn*|j|d|j|d|j|dWdQRXdS)z>Clear the internal cache, optionally only for function 'name'.N)rArrrBrCpop)rrrrrr s   z_WrapNumbers.cache_clearc Cs"|j|j|j|jfSQRXdS)z5Return internal cache dicts as a tuple of 3 elements.N)rArrBrC)rrrr cache_infosz_WrapNumbers.cache_info)N) r|r}r~rrrHrNrZr r\rrrrr>as ' r>c Cstjt||SQRXdS)zGiven 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)_wnrArZ)rGrrrrrSscKst|df|S)Nrb)open)fnamerrrr open_binarysracKs*tr|dt|dtt|df|S)zOn Python 3 opens a file in text mode by using fs encoding and a proper en/decoding errors handler. On Python 2 this is just an alias for open(name, 'rt'). encodingerrorsrt)PY3 setdefaultr4r5r_)r`rrrr open_texts  rg%(value).1f%(symbol)scCsd}i}x0t|ddD]\}}d|dd>||<qWx>t|ddD]*}|||krLt|||}|tSqLW|t|d|dS)zUsed by various scripts. See: http://goo.gl/zeJZl >>> bytes2human(10000) '9.8K' >>> bytes2human(100001221) '95.4M' ) BKMGTPEZYrzN r)symbolr) enumeratereversedrlocalsdict)nformatsymbolsprefixrWsrsrrrrrTs  cCs tjdjS)z+Return updated psutil.PROCFS_PATH constant.r)sysmodules PROCFS_PATHrrrrget_procfs_pathsrcCs|jttdS)N)rbrc)decoder4r5)r|rrrrsrcCs|S)Nr)r|rrrrscCs^tjdkrdSy2ddl}|s$t||ddks>tWntk rTdSXdSdS)Nr[TrcolorsF)rrcursesisattyrD setuptermtigetnumr)filerrrrrXs  Fc Csts |Sg}tddddddddd d }d |d <y ||}Wn(tk rdtd t|YnX|||r~|ddd||fS)z*Return an highlighted version of 'string'.329133933435363730) greenredbrownyellowblueviolet lightbluegreydarkgrey29Nz#invalid color %r; choose between %s1z [%sm%s;)rXrwrr.listrIrr)r|colorboldattrrrrrrW s    c Cstst||dntr.tt||||dnddl}d}|jjj}|jjj}t ddddd}||d<y ||}Wn,t k rt d |t | fYnX|r|dkr|d 7}|tjkrd nd } |j|_|| } || |zt||dWd|| |XdS) z$Print a colorized version of string.)rrNryr )rrrrz#invalid color %r; choose between %rii)rXprintrrWctypeswindllKernel32 GetStdHandleSetConsoleTextAttributerwrr.rrIr}stderrc_ulongrestype) r|rrrr DEFAULT_COLORrrr handle_idhandlerrrrY s0     Z PSUTIL_DEBUGcCs6ttj\}}}}}td|||ftjddS)z@If PSUTIL_DEBUG env var is set, print a debug message to stderr.zpsutil-debug [%s:%s]> %s)rN)inspect getframeinfo currentframef_backrr}r)rr`lineno func_namelinesindexrrrrVFscCsdS)Nr)rrrrrVMs)N)N)rh)NF)r __future__rrrrr rrrr}r?r7 collectionsrrrrrr ImportErrorr version_infor,re__all__rrrplatform startswithrrrr rrrrAIXr*r+r'r,r.r2r&r0r1r(r)r/r-r3rr!r rrr"rrrrrrr#r$r%IntEnumr{globalsupdate __members__rrrgetfilesystemencodingr4r5getfilesystemencodeerrorsr rGrCrArBrDrHr?rErFr@rrrrr7r<r=r>r9r:r;r8r6rrIrrrrrrrOrLrrKrNrPrMrQrRrUrJr>rSr]r r\rargrTrrstdoutrXrWrYboolgetenvrrVrrrrs|                                          9   W    "