HEX
Server: Apache
System: Linux vmi318001.contaboserver.net 6.8.0-117-generic #117-Ubuntu SMP PREEMPT_DYNAMIC Tue May 5 19:26:24 UTC 2026 x86_64
User: boxelikax (1004)
PHP: 8.2.33
Disabled: NONE
Upload Files
File: /home/boxelikax/public_html/demoltec.com/logging.zip
PK�]��,
����handlers.pynu�[���# Copyright 2001-2021 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Vinay Sajip
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
"""

import io, logging, socket, os, pickle, struct, time, re
from stat import ST_DEV, ST_INO, ST_MTIME
import queue
import threading
import copy

#
# Some constants...
#

DEFAULT_TCP_LOGGING_PORT    = 9020
DEFAULT_UDP_LOGGING_PORT    = 9021
DEFAULT_HTTP_LOGGING_PORT   = 9022
DEFAULT_SOAP_LOGGING_PORT   = 9023
SYSLOG_UDP_PORT             = 514
SYSLOG_TCP_PORT             = 514

_MIDNIGHT = 24 * 60 * 60  # number of seconds in a day

class BaseRotatingHandler(logging.FileHandler):
    """
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    """
    namer = None
    rotator = None

    def __init__(self, filename, mode, encoding=None, delay=False, errors=None):
        """
        Use the specified filename for streamed logging
        """
        logging.FileHandler.__init__(self, filename, mode=mode,
                                     encoding=encoding, delay=delay,
                                     errors=errors)
        self.mode = mode
        self.encoding = encoding
        self.errors = errors

    def emit(self, record):
        """
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        """
        try:
            if self.shouldRollover(record):
                self.doRollover()
            logging.FileHandler.emit(self, record)
        except Exception:
            self.handleError(record)

    def rotation_filename(self, default_name):
        """
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        """
        if not callable(self.namer):
            result = default_name
        else:
            result = self.namer(default_name)
        return result

    def rotate(self, source, dest):
        """
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        """
        if not callable(self.rotator):
            # Issue 18940: A file may not have been created if delay is True.
            if os.path.exists(source):
                os.rename(source, dest)
        else:
            self.rotator(source, dest)

class RotatingFileHandler(BaseRotatingHandler):
    """
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    """
    def __init__(self, filename, mode='a', maxBytes=0, backupCount=0,
                 encoding=None, delay=False, errors=None):
        """
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        """
        # If rotation/rollover is wanted, it doesn't make sense to use another
        # mode. If for example 'w' were specified, then if there were multiple
        # runs of the calling application, the logs from previous runs would be
        # lost if the 'w' is respected, because the log file would be truncated
        # on each run.
        if maxBytes > 0:
            mode = 'a'
        if "b" not in mode:
            encoding = io.text_encoding(encoding)
        BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding,
                                     delay=delay, errors=errors)
        self.maxBytes = maxBytes
        self.backupCount = backupCount

    def doRollover(self):
        """
        Do a rollover, as described in __init__().
        """
        if self.stream:
            self.stream.close()
            self.stream = None
        if self.backupCount > 0:
            for i in range(self.backupCount - 1, 0, -1):
                sfn = self.rotation_filename("%s.%d" % (self.baseFilename, i))
                dfn = self.rotation_filename("%s.%d" % (self.baseFilename,
                                                        i + 1))
                if os.path.exists(sfn):
                    if os.path.exists(dfn):
                        os.remove(dfn)
                    os.rename(sfn, dfn)
            dfn = self.rotation_filename(self.baseFilename + ".1")
            if os.path.exists(dfn):
                os.remove(dfn)
            self.rotate(self.baseFilename, dfn)
        if not self.delay:
            self.stream = self._open()

    def shouldRollover(self, record):
        """
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        """
        # See bpo-45401: Never rollover anything other than regular files
        if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename):
            return False
        if self.stream is None:                 # delay was set...
            self.stream = self._open()
        if self.maxBytes > 0:                   # are we rolling over?
            msg = "%s\n" % self.format(record)
            self.stream.seek(0, 2)  #due to non-posix-compliant Windows feature
            if self.stream.tell() + len(msg) >= self.maxBytes:
                return True
        return False

class TimedRotatingFileHandler(BaseRotatingHandler):
    """
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    """
    def __init__(self, filename, when='h', interval=1, backupCount=0,
                 encoding=None, delay=False, utc=False, atTime=None,
                 errors=None):
        encoding = io.text_encoding(encoding)
        BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding,
                                     delay=delay, errors=errors)
        self.when = when.upper()
        self.backupCount = backupCount
        self.utc = utc
        self.atTime = atTime
        # Calculate the real rollover interval, which is just the number of
        # seconds between rollovers.  Also set the filename suffix used when
        # a rollover occurs.  Current 'when' events supported:
        # S - Seconds
        # M - Minutes
        # H - Hours
        # D - Days
        # midnight - roll over at midnight
        # W{0-6} - roll over on a certain day; 0 - Monday
        #
        # Case of the 'when' specifier is not important; lower or upper case
        # will work.
        if self.when == 'S':
            self.interval = 1 # one second
            self.suffix = "%Y-%m-%d_%H-%M-%S"
            extMatch = r"(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(?!\d)"
        elif self.when == 'M':
            self.interval = 60 # one minute
            self.suffix = "%Y-%m-%d_%H-%M"
            extMatch = r"(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(?!\d)"
        elif self.when == 'H':
            self.interval = 60 * 60 # one hour
            self.suffix = "%Y-%m-%d_%H"
            extMatch = r"(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}(?!\d)"
        elif self.when == 'D' or self.when == 'MIDNIGHT':
            self.interval = 60 * 60 * 24 # one day
            self.suffix = "%Y-%m-%d"
            extMatch = r"(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)"
        elif self.when.startswith('W'):
            self.interval = 60 * 60 * 24 * 7 # one week
            if len(self.when) != 2:
                raise ValueError("You must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s" % self.when)
            if self.when[1] < '0' or self.when[1] > '6':
                raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
            self.dayOfWeek = int(self.when[1])
            self.suffix = "%Y-%m-%d"
            extMatch = r"(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)"
        else:
            raise ValueError("Invalid rollover interval specified: %s" % self.when)

        # extMatch is a pattern for matching a datetime suffix in a file name.
        # After custom naming, it is no longer guaranteed to be separated by
        # periods from other parts of the filename.  The lookup statements
        # (?<!\d) and (?!\d) ensure that the datetime suffix (which itself
        # starts and ends with digits) is not preceded or followed by digits.
        # This reduces the number of false matches and improves performance.
        self.extMatch = re.compile(extMatch, re.ASCII)
        self.interval = self.interval * interval # multiply by units requested
        # The following line added because the filename passed in could be a
        # path object (see Issue #27493), but self.baseFilename will be a string
        filename = self.baseFilename
        if os.path.exists(filename):
            t = os.stat(filename)[ST_MTIME]
        else:
            t = int(time.time())
        self.rolloverAt = self.computeRollover(t)

    def computeRollover(self, currentTime):
        """
        Work out the rollover time based on the specified time.
        """
        result = currentTime + self.interval
        # If we are rolling over at midnight or weekly, then the interval is already known.
        # What we need to figure out is WHEN the next interval is.  In other words,
        # if you are rolling over at midnight, then your base interval is 1 day,
        # but you want to start that one day clock at midnight, not now.  So, we
        # have to fudge the rolloverAt value in order to trigger the first rollover
        # at the right time.  After that, the regular interval will take care of
        # the rest.  Note that this code doesn't care about leap seconds. :)
        if self.when == 'MIDNIGHT' or self.when.startswith('W'):
            # This could be done with less code, but I wanted it to be clear
            if self.utc:
                t = time.gmtime(currentTime)
            else:
                t = time.localtime(currentTime)
            currentHour = t[3]
            currentMinute = t[4]
            currentSecond = t[5]
            currentDay = t[6]
            # r is the number of seconds left between now and the next rotation
            if self.atTime is None:
                rotate_ts = _MIDNIGHT
            else:
                rotate_ts = ((self.atTime.hour * 60 + self.atTime.minute)*60 +
                    self.atTime.second)

            r = rotate_ts - ((currentHour * 60 + currentMinute) * 60 +
                currentSecond)
            if r <= 0:
                # Rotate time is before the current time (for example when
                # self.rotateAt is 13:45 and it now 14:15), rotation is
                # tomorrow.
                r += _MIDNIGHT
                currentDay = (currentDay + 1) % 7
            result = currentTime + r
            # If we are rolling over on a certain day, add in the number of days until
            # the next rollover, but offset by 1 since we just calculated the time
            # until the next day starts.  There are three cases:
            # Case 1) The day to rollover is today; in this case, do nothing
            # Case 2) The day to rollover is further in the interval (i.e., today is
            #         day 2 (Wednesday) and rollover is on day 6 (Sunday).  Days to
            #         next rollover is simply 6 - 2 - 1, or 3.
            # Case 3) The day to rollover is behind us in the interval (i.e., today
            #         is day 5 (Saturday) and rollover is on day 3 (Thursday).
            #         Days to rollover is 6 - 5 + 3, or 4.  In this case, it's the
            #         number of days left in the current week (1) plus the number
            #         of days in the next week until the rollover day (3).
            # The calculations described in 2) and 3) above need to have a day added.
            # This is because the above time calculation takes us to midnight on this
            # day, i.e. the start of the next day.
            if self.when.startswith('W'):
                day = currentDay # 0 is Monday
                if day != self.dayOfWeek:
                    if day < self.dayOfWeek:
                        daysToWait = self.dayOfWeek - day
                    else:
                        daysToWait = 6 - day + self.dayOfWeek + 1
                    result += daysToWait * _MIDNIGHT
                result += self.interval - _MIDNIGHT * 7
            else:
                result += self.interval - _MIDNIGHT
            if not self.utc:
                dstNow = t[-1]
                dstAtRollover = time.localtime(result)[-1]
                if dstNow != dstAtRollover:
                    if not dstNow:  # DST kicks in before next rollover, so we need to deduct an hour
                        addend = -3600
                        if not time.localtime(result-3600)[-1]:
                            addend = 0
                    else:           # DST bows out before next rollover, so we need to add an hour
                        addend = 3600
                    result += addend
        return result

    def shouldRollover(self, record):
        """
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        """
        t = int(time.time())
        if t >= self.rolloverAt:
            # See #89564: Never rollover anything other than regular files
            if os.path.exists(self.baseFilename) and not os.path.isfile(self.baseFilename):
                # The file is not a regular file, so do not rollover, but do
                # set the next rollover time to avoid repeated checks.
                self.rolloverAt = self.computeRollover(t)
                return False

            return True
        return False

    def getFilesToDelete(self):
        """
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        """
        dirName, baseName = os.path.split(self.baseFilename)
        fileNames = os.listdir(dirName)
        result = []
        if self.namer is None:
            prefix = baseName + '.'
            plen = len(prefix)
            for fileName in fileNames:
                if fileName[:plen] == prefix:
                    suffix = fileName[plen:]
                    if self.extMatch.fullmatch(suffix):
                        result.append(os.path.join(dirName, fileName))
        else:
            for fileName in fileNames:
                # Our files could be just about anything after custom naming,
                # but they should contain the datetime suffix.
                # Try to find the datetime suffix in the file name and verify
                # that the file name can be generated by this handler.
                m = self.extMatch.search(fileName)
                while m:
                    dfn = self.namer(self.baseFilename + "." + m[0])
                    if os.path.basename(dfn) == fileName:
                        result.append(os.path.join(dirName, fileName))
                        break
                    m = self.extMatch.search(fileName, m.start() + 1)

        if len(result) < self.backupCount:
            result = []
        else:
            result.sort()
            result = result[:len(result) - self.backupCount]
        return result

    def doRollover(self):
        """
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        """
        # get the time that this sequence started at and make it a TimeTuple
        currentTime = int(time.time())
        t = self.rolloverAt - self.interval
        if self.utc:
            timeTuple = time.gmtime(t)
        else:
            timeTuple = time.localtime(t)
            dstNow = time.localtime(currentTime)[-1]
            dstThen = timeTuple[-1]
            if dstNow != dstThen:
                if dstNow:
                    addend = 3600
                else:
                    addend = -3600
                timeTuple = time.localtime(t + addend)
        dfn = self.rotation_filename(self.baseFilename + "." +
                                     time.strftime(self.suffix, timeTuple))
        if os.path.exists(dfn):
            # Already rolled over.
            return

        if self.stream:
            self.stream.close()
            self.stream = None
        self.rotate(self.baseFilename, dfn)
        if self.backupCount > 0:
            for s in self.getFilesToDelete():
                os.remove(s)
        if not self.delay:
            self.stream = self._open()
        self.rolloverAt = self.computeRollover(currentTime)

class WatchedFileHandler(logging.FileHandler):
    """
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    """
    def __init__(self, filename, mode='a', encoding=None, delay=False,
                 errors=None):
        if "b" not in mode:
            encoding = io.text_encoding(encoding)
        logging.FileHandler.__init__(self, filename, mode=mode,
                                     encoding=encoding, delay=delay,
                                     errors=errors)
        self.dev, self.ino = -1, -1
        self._statstream()

    def _statstream(self):
        if self.stream:
            sres = os.fstat(self.stream.fileno())
            self.dev, self.ino = sres[ST_DEV], sres[ST_INO]

    def reopenIfNeeded(self):
        """
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        """
        # Reduce the chance of race conditions by stat'ing by path only
        # once and then fstat'ing our new fd if we opened a new log stream.
        # See issue #14632: Thanks to John Mulligan for the problem report
        # and patch.
        try:
            # stat the file by path, checking for existence
            sres = os.stat(self.baseFilename)
        except FileNotFoundError:
            sres = None
        # compare file system stat with that of our stream file handle
        if not sres or sres[ST_DEV] != self.dev or sres[ST_INO] != self.ino:
            if self.stream is not None:
                # we have an open file handle, clean it up
                self.stream.flush()
                self.stream.close()
                self.stream = None  # See Issue #21742: _open () might fail.
                # open a new file handle and get new stat info from that fd
                self.stream = self._open()
                self._statstream()

    def emit(self, record):
        """
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        """
        self.reopenIfNeeded()
        logging.FileHandler.emit(self, record)


class SocketHandler(logging.Handler):
    """
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    """

    def __init__(self, host, port):
        """
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        """
        logging.Handler.__init__(self)
        self.host = host
        self.port = port
        if port is None:
            self.address = host
        else:
            self.address = (host, port)
        self.sock = None
        self.closeOnError = False
        self.retryTime = None
        #
        # Exponential backoff parameters.
        #
        self.retryStart = 1.0
        self.retryMax = 30.0
        self.retryFactor = 2.0

    def makeSocket(self, timeout=1):
        """
        A factory method which allows subclasses to define the precise
        type of socket they want.
        """
        if self.port is not None:
            result = socket.create_connection(self.address, timeout=timeout)
        else:
            result = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
            result.settimeout(timeout)
            try:
                result.connect(self.address)
            except OSError:
                result.close()  # Issue 19182
                raise
        return result

    def createSocket(self):
        """
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        """
        now = time.time()
        # Either retryTime is None, in which case this
        # is the first time back after a disconnect, or
        # we've waited long enough.
        if self.retryTime is None:
            attempt = True
        else:
            attempt = (now >= self.retryTime)
        if attempt:
            try:
                self.sock = self.makeSocket()
                self.retryTime = None # next time, no delay before trying
            except OSError:
                #Creation failed, so set the retry time and return.
                if self.retryTime is None:
                    self.retryPeriod = self.retryStart
                else:
                    self.retryPeriod = self.retryPeriod * self.retryFactor
                    if self.retryPeriod > self.retryMax:
                        self.retryPeriod = self.retryMax
                self.retryTime = now + self.retryPeriod

    def send(self, s):
        """
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        """
        if self.sock is None:
            self.createSocket()
        #self.sock can be None either because we haven't reached the retry
        #time yet, or because we have reached the retry time and retried,
        #but are still unable to connect.
        if self.sock:
            try:
                self.sock.sendall(s)
            except OSError: #pragma: no cover
                self.sock.close()
                self.sock = None  # so we can call createSocket next time

    def makePickle(self, record):
        """
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        """
        ei = record.exc_info
        if ei:
            # just to get traceback text into record.exc_text ...
            dummy = self.format(record)
        # See issue #14436: If msg or args are objects, they may not be
        # available on the receiving end. So we convert the msg % args
        # to a string, save it as msg and zap the args.
        d = dict(record.__dict__)
        d['msg'] = record.getMessage()
        d['args'] = None
        d['exc_info'] = None
        # Issue #25685: delete 'message' if present: redundant with 'msg'
        d.pop('message', None)
        s = pickle.dumps(d, 1)
        slen = struct.pack(">L", len(s))
        return slen + s

    def handleError(self, record):
        """
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        """
        if self.closeOnError and self.sock:
            self.sock.close()
            self.sock = None        #try to reconnect next time
        else:
            logging.Handler.handleError(self, record)

    def emit(self, record):
        """
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        """
        try:
            s = self.makePickle(record)
            self.send(s)
        except Exception:
            self.handleError(record)

    def close(self):
        """
        Closes the socket.
        """
        self.acquire()
        try:
            sock = self.sock
            if sock:
                self.sock = None
                sock.close()
            logging.Handler.close(self)
        finally:
            self.release()

class DatagramHandler(SocketHandler):
    """
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    """
    def __init__(self, host, port):
        """
        Initializes the handler with a specific host address and port.
        """
        SocketHandler.__init__(self, host, port)
        self.closeOnError = False

    def makeSocket(self):
        """
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        """
        if self.port is None:
            family = socket.AF_UNIX
        else:
            family = socket.AF_INET
        s = socket.socket(family, socket.SOCK_DGRAM)
        return s

    def send(self, s):
        """
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        """
        if self.sock is None:
            self.createSocket()
        self.sock.sendto(s, self.address)

class SysLogHandler(logging.Handler):
    """
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    """

    # from <linux/sys/syslog.h>:
    # ======================================================================
    # priorities/facilities are encoded into a single 32-bit quantity, where
    # the bottom 3 bits are the priority (0-7) and the top 28 bits are the
    # facility (0-big number). Both the priorities and the facilities map
    # roughly one-to-one to strings in the syslogd(8) source code.  This
    # mapping is included in this file.
    #
    # priorities (these are ordered)

    LOG_EMERG     = 0       #  system is unusable
    LOG_ALERT     = 1       #  action must be taken immediately
    LOG_CRIT      = 2       #  critical conditions
    LOG_ERR       = 3       #  error conditions
    LOG_WARNING   = 4       #  warning conditions
    LOG_NOTICE    = 5       #  normal but significant condition
    LOG_INFO      = 6       #  informational
    LOG_DEBUG     = 7       #  debug-level messages

    #  facility codes
    LOG_KERN      = 0       #  kernel messages
    LOG_USER      = 1       #  random user-level messages
    LOG_MAIL      = 2       #  mail system
    LOG_DAEMON    = 3       #  system daemons
    LOG_AUTH      = 4       #  security/authorization messages
    LOG_SYSLOG    = 5       #  messages generated internally by syslogd
    LOG_LPR       = 6       #  line printer subsystem
    LOG_NEWS      = 7       #  network news subsystem
    LOG_UUCP      = 8       #  UUCP subsystem
    LOG_CRON      = 9       #  clock daemon
    LOG_AUTHPRIV  = 10      #  security/authorization messages (private)
    LOG_FTP       = 11      #  FTP daemon
    LOG_NTP       = 12      #  NTP subsystem
    LOG_SECURITY  = 13      #  Log audit
    LOG_CONSOLE   = 14      #  Log alert
    LOG_SOLCRON   = 15      #  Scheduling daemon (Solaris)

    #  other codes through 15 reserved for system use
    LOG_LOCAL0    = 16      #  reserved for local use
    LOG_LOCAL1    = 17      #  reserved for local use
    LOG_LOCAL2    = 18      #  reserved for local use
    LOG_LOCAL3    = 19      #  reserved for local use
    LOG_LOCAL4    = 20      #  reserved for local use
    LOG_LOCAL5    = 21      #  reserved for local use
    LOG_LOCAL6    = 22      #  reserved for local use
    LOG_LOCAL7    = 23      #  reserved for local use

    priority_names = {
        "alert":    LOG_ALERT,
        "crit":     LOG_CRIT,
        "critical": LOG_CRIT,
        "debug":    LOG_DEBUG,
        "emerg":    LOG_EMERG,
        "err":      LOG_ERR,
        "error":    LOG_ERR,        #  DEPRECATED
        "info":     LOG_INFO,
        "notice":   LOG_NOTICE,
        "panic":    LOG_EMERG,      #  DEPRECATED
        "warn":     LOG_WARNING,    #  DEPRECATED
        "warning":  LOG_WARNING,
        }

    facility_names = {
        "auth":         LOG_AUTH,
        "authpriv":     LOG_AUTHPRIV,
        "console":      LOG_CONSOLE,
        "cron":         LOG_CRON,
        "daemon":       LOG_DAEMON,
        "ftp":          LOG_FTP,
        "kern":         LOG_KERN,
        "lpr":          LOG_LPR,
        "mail":         LOG_MAIL,
        "news":         LOG_NEWS,
        "ntp":          LOG_NTP,
        "security":     LOG_SECURITY,
        "solaris-cron": LOG_SOLCRON,
        "syslog":       LOG_SYSLOG,
        "user":         LOG_USER,
        "uucp":         LOG_UUCP,
        "local0":       LOG_LOCAL0,
        "local1":       LOG_LOCAL1,
        "local2":       LOG_LOCAL2,
        "local3":       LOG_LOCAL3,
        "local4":       LOG_LOCAL4,
        "local5":       LOG_LOCAL5,
        "local6":       LOG_LOCAL6,
        "local7":       LOG_LOCAL7,
        }

    # Originally added to work around GH-43683. Unnecessary since GH-50043 but kept
    # for backwards compatibility.
    priority_map = {
        "DEBUG" : "debug",
        "INFO" : "info",
        "WARNING" : "warning",
        "ERROR" : "error",
        "CRITICAL" : "critical"
    }

    def __init__(self, address=('localhost', SYSLOG_UDP_PORT),
                 facility=LOG_USER, socktype=None):
        """
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        """
        logging.Handler.__init__(self)

        self.address = address
        self.facility = facility
        self.socktype = socktype
        self.socket = None
        self.createSocket()

    def _connect_unixsocket(self, address):
        use_socktype = self.socktype
        if use_socktype is None:
            use_socktype = socket.SOCK_DGRAM
        self.socket = socket.socket(socket.AF_UNIX, use_socktype)
        try:
            self.socket.connect(address)
            # it worked, so set self.socktype to the used type
            self.socktype = use_socktype
        except OSError:
            self.socket.close()
            if self.socktype is not None:
                # user didn't specify falling back, so fail
                raise
            use_socktype = socket.SOCK_STREAM
            self.socket = socket.socket(socket.AF_UNIX, use_socktype)
            try:
                self.socket.connect(address)
                # it worked, so set self.socktype to the used type
                self.socktype = use_socktype
            except OSError:
                self.socket.close()
                raise

    def createSocket(self):
        """
        Try to create a socket and, if it's not a datagram socket, connect it
        to the other end. This method is called during handler initialization,
        but it's not regarded as an error if the other end isn't listening yet
        --- the method will be called again when emitting an event,
        if there is no socket at that point.
        """
        address = self.address
        socktype = self.socktype

        if isinstance(address, str):
            self.unixsocket = True
            # Syslog server may be unavailable during handler initialisation.
            # C's openlog() function also ignores connection errors.
            # Moreover, we ignore these errors while logging, so it's not worse
            # to ignore it also here.
            try:
                self._connect_unixsocket(address)
            except OSError:
                pass
        else:
            self.unixsocket = False
            if socktype is None:
                socktype = socket.SOCK_DGRAM
            host, port = address
            ress = socket.getaddrinfo(host, port, 0, socktype)
            if not ress:
                raise OSError("getaddrinfo returns an empty list")
            for res in ress:
                af, socktype, proto, _, sa = res
                err = sock = None
                try:
                    sock = socket.socket(af, socktype, proto)
                    if socktype == socket.SOCK_STREAM:
                        sock.connect(sa)
                    break
                except OSError as exc:
                    err = exc
                    if sock is not None:
                        sock.close()
            if err is not None:
                raise err
            self.socket = sock
            self.socktype = socktype

    def encodePriority(self, facility, priority):
        """
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        """
        if isinstance(facility, str):
            facility = self.facility_names[facility]
        if isinstance(priority, str):
            priority = self.priority_names[priority]
        return (facility << 3) | priority

    def close(self):
        """
        Closes the socket.
        """
        self.acquire()
        try:
            sock = self.socket
            if sock:
                self.socket = None
                sock.close()
            logging.Handler.close(self)
        finally:
            self.release()

    def mapPriority(self, levelName):
        """
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        """
        return self.priority_map.get(levelName, "warning")

    ident = ''          # prepended to all messages
    append_nul = True   # some old syslog daemons expect a NUL terminator

    def emit(self, record):
        """
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        """
        try:
            msg = self.format(record)
            if self.ident:
                msg = self.ident + msg
            if self.append_nul:
                msg += '\000'

            # We need to convert record level to lowercase, maybe this will
            # change in the future.
            prio = '<%d>' % self.encodePriority(self.facility,
                                                self.mapPriority(record.levelname))
            prio = prio.encode('utf-8')
            # Message is a string. Convert to bytes as required by RFC 5424
            msg = msg.encode('utf-8')
            msg = prio + msg

            if not self.socket:
                self.createSocket()

            if self.unixsocket:
                try:
                    self.socket.send(msg)
                except OSError:
                    self.socket.close()
                    self._connect_unixsocket(self.address)
                    self.socket.send(msg)
            elif self.socktype == socket.SOCK_DGRAM:
                self.socket.sendto(msg, self.address)
            else:
                self.socket.sendall(msg)
        except Exception:
            self.handleError(record)

class SMTPHandler(logging.Handler):
    """
    A handler class which sends an SMTP email for each logging event.
    """
    def __init__(self, mailhost, fromaddr, toaddrs, subject,
                 credentials=None, secure=None, timeout=5.0):
        """
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        """
        logging.Handler.__init__(self)
        if isinstance(mailhost, (list, tuple)):
            self.mailhost, self.mailport = mailhost
        else:
            self.mailhost, self.mailport = mailhost, None
        if isinstance(credentials, (list, tuple)):
            self.username, self.password = credentials
        else:
            self.username = None
        self.fromaddr = fromaddr
        if isinstance(toaddrs, str):
            toaddrs = [toaddrs]
        self.toaddrs = toaddrs
        self.subject = subject
        self.secure = secure
        self.timeout = timeout

    def getSubject(self, record):
        """
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        """
        return self.subject

    def emit(self, record):
        """
        Emit a record.

        Format the record and send it to the specified addressees.
        """
        try:
            import smtplib
            from email.message import EmailMessage
            import email.utils

            port = self.mailport
            if not port:
                port = smtplib.SMTP_PORT
            smtp = smtplib.SMTP(self.mailhost, port, timeout=self.timeout)
            msg = EmailMessage()
            msg['From'] = self.fromaddr
            msg['To'] = ','.join(self.toaddrs)
            msg['Subject'] = self.getSubject(record)
            msg['Date'] = email.utils.localtime()
            msg.set_content(self.format(record))
            if self.username:
                if self.secure is not None:
                    smtp.ehlo()
                    smtp.starttls(*self.secure)
                    smtp.ehlo()
                smtp.login(self.username, self.password)
            smtp.send_message(msg)
            smtp.quit()
        except Exception:
            self.handleError(record)

class NTEventLogHandler(logging.Handler):
    """
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    """
    def __init__(self, appname, dllname=None, logtype="Application"):
        logging.Handler.__init__(self)
        try:
            import win32evtlogutil, win32evtlog
            self.appname = appname
            self._welu = win32evtlogutil
            if not dllname:
                dllname = os.path.split(self._welu.__file__)
                dllname = os.path.split(dllname[0])
                dllname = os.path.join(dllname[0], r'win32service.pyd')
            self.dllname = dllname
            self.logtype = logtype
            # Administrative privileges are required to add a source to the registry.
            # This may not be available for a user that just wants to add to an
            # existing source - handle this specific case.
            try:
                self._welu.AddSourceToRegistry(appname, dllname, logtype)
            except Exception as e:
                # This will probably be a pywintypes.error. Only raise if it's not
                # an "access denied" error, else let it pass
                if getattr(e, 'winerror', None) != 5:  # not access denied
                    raise
            self.deftype = win32evtlog.EVENTLOG_ERROR_TYPE
            self.typemap = {
                logging.DEBUG   : win32evtlog.EVENTLOG_INFORMATION_TYPE,
                logging.INFO    : win32evtlog.EVENTLOG_INFORMATION_TYPE,
                logging.WARNING : win32evtlog.EVENTLOG_WARNING_TYPE,
                logging.ERROR   : win32evtlog.EVENTLOG_ERROR_TYPE,
                logging.CRITICAL: win32evtlog.EVENTLOG_ERROR_TYPE,
         }
        except ImportError:
            print("The Python Win32 extensions for NT (service, event "\
                        "logging) appear not to be available.")
            self._welu = None

    def getMessageID(self, record):
        """
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        """
        return 1

    def getEventCategory(self, record):
        """
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        """
        return 0

    def getEventType(self, record):
        """
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        """
        return self.typemap.get(record.levelno, self.deftype)

    def emit(self, record):
        """
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        """
        if self._welu:
            try:
                id = self.getMessageID(record)
                cat = self.getEventCategory(record)
                type = self.getEventType(record)
                msg = self.format(record)
                self._welu.ReportEvent(self.appname, id, cat, type, [msg])
            except Exception:
                self.handleError(record)

    def close(self):
        """
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        """
        #self._welu.RemoveSourceFromRegistry(self.appname, self.logtype)
        logging.Handler.close(self)

class HTTPHandler(logging.Handler):
    """
    A class which sends records to a web server, using either GET or
    POST semantics.
    """
    def __init__(self, host, url, method="GET", secure=False, credentials=None,
                 context=None):
        """
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        """
        logging.Handler.__init__(self)
        method = method.upper()
        if method not in ["GET", "POST"]:
            raise ValueError("method must be GET or POST")
        if not secure and context is not None:
            raise ValueError("context parameter only makes sense "
                             "with secure=True")
        self.host = host
        self.url = url
        self.method = method
        self.secure = secure
        self.credentials = credentials
        self.context = context

    def mapLogRecord(self, record):
        """
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        """
        return record.__dict__

    def getConnection(self, host, secure):
        """
        get a HTTP[S]Connection.

        Override when a custom connection is required, for example if
        there is a proxy.
        """
        import http.client
        if secure:
            connection = http.client.HTTPSConnection(host, context=self.context)
        else:
            connection = http.client.HTTPConnection(host)
        return connection

    def emit(self, record):
        """
        Emit a record.

        Send the record to the web server as a percent-encoded dictionary
        """
        try:
            import urllib.parse
            host = self.host
            h = self.getConnection(host, self.secure)
            url = self.url
            data = urllib.parse.urlencode(self.mapLogRecord(record))
            if self.method == "GET":
                if (url.find('?') >= 0):
                    sep = '&'
                else:
                    sep = '?'
                url = url + "%c%s" % (sep, data)
            h.putrequest(self.method, url)
            # support multiple hosts on one IP address...
            # need to strip optional :port from host, if present
            i = host.find(":")
            if i >= 0:
                host = host[:i]
            # See issue #30904: putrequest call above already adds this header
            # on Python 3.x.
            # h.putheader("Host", host)
            if self.method == "POST":
                h.putheader("Content-type",
                            "application/x-www-form-urlencoded")
                h.putheader("Content-length", str(len(data)))
            if self.credentials:
                import base64
                s = ('%s:%s' % self.credentials).encode('utf-8')
                s = 'Basic ' + base64.b64encode(s).strip().decode('ascii')
                h.putheader('Authorization', s)
            h.endheaders()
            if self.method == "POST":
                h.send(data.encode('utf-8'))
            h.getresponse()    #can't do anything with the result
        except Exception:
            self.handleError(record)

class BufferingHandler(logging.Handler):
    """
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    """
    def __init__(self, capacity):
        """
        Initialize the handler with the buffer size.
        """
        logging.Handler.__init__(self)
        self.capacity = capacity
        self.buffer = []

    def shouldFlush(self, record):
        """
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        """
        return (len(self.buffer) >= self.capacity)

    def emit(self, record):
        """
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        """
        self.buffer.append(record)
        if self.shouldFlush(record):
            self.flush()

    def flush(self):
        """
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        """
        self.acquire()
        try:
            self.buffer.clear()
        finally:
            self.release()

    def close(self):
        """
        Close the handler.

        This version just flushes and chains to the parent class' close().
        """
        try:
            self.flush()
        finally:
            logging.Handler.close(self)

class MemoryHandler(BufferingHandler):
    """
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    """
    def __init__(self, capacity, flushLevel=logging.ERROR, target=None,
                 flushOnClose=True):
        """
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        """
        BufferingHandler.__init__(self, capacity)
        self.flushLevel = flushLevel
        self.target = target
        # See Issue #26559 for why this has been added
        self.flushOnClose = flushOnClose

    def shouldFlush(self, record):
        """
        Check for buffer full or a record at the flushLevel or higher.
        """
        return (len(self.buffer) >= self.capacity) or \
                (record.levelno >= self.flushLevel)

    def setTarget(self, target):
        """
        Set the target handler for this handler.
        """
        self.acquire()
        try:
            self.target = target
        finally:
            self.release()

    def flush(self):
        """
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is only cleared if a target has been set.
        """
        self.acquire()
        try:
            if self.target:
                for record in self.buffer:
                    self.target.handle(record)
                self.buffer.clear()
        finally:
            self.release()

    def close(self):
        """
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        """
        try:
            if self.flushOnClose:
                self.flush()
        finally:
            self.acquire()
            try:
                self.target = None
                BufferingHandler.close(self)
            finally:
                self.release()


class QueueHandler(logging.Handler):
    """
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    """

    def __init__(self, queue):
        """
        Initialise an instance, using the passed queue.
        """
        logging.Handler.__init__(self)
        self.queue = queue

    def enqueue(self, record):
        """
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        """
        self.queue.put_nowait(record)

    def prepare(self, record):
        """
        Prepare a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message and
        arguments, and removes unpickleable items from the record in-place.
        Specifically, it overwrites the record's `msg` and
        `message` attributes with the merged message (obtained by
        calling the handler's `format` method), and sets the `args`,
        `exc_info` and `exc_text` attributes to None.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        """
        # The format operation gets traceback text into record.exc_text
        # (if there's exception data), and also returns the formatted
        # message. We can then use this to replace the original
        # msg + args, as these might be unpickleable. We also zap the
        # exc_info, exc_text and stack_info attributes, as they are no longer
        # needed and, if not None, will typically not be pickleable.
        msg = self.format(record)
        # bpo-35726: make copy of record to avoid affecting other handlers in the chain.
        record = copy.copy(record)
        record.message = msg
        record.msg = msg
        record.args = None
        record.exc_info = None
        record.exc_text = None
        record.stack_info = None
        return record

    def emit(self, record):
        """
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        """
        try:
            self.enqueue(self.prepare(record))
        except Exception:
            self.handleError(record)


class QueueListener(object):
    """
    This class implements an internal threaded listener which watches for
    LogRecords being added to a queue, removes them and passes them to a
    list of handlers for processing.
    """
    _sentinel = None

    def __init__(self, queue, *handlers, respect_handler_level=False):
        """
        Initialise an instance with the specified queue and
        handlers.
        """
        self.queue = queue
        self.handlers = handlers
        self._thread = None
        self.respect_handler_level = respect_handler_level

    def dequeue(self, block):
        """
        Dequeue a record and return it, optionally blocking.

        The base implementation uses get. You may want to override this method
        if you want to use timeouts or work with custom queue implementations.
        """
        return self.queue.get(block)

    def start(self):
        """
        Start the listener.

        This starts up a background thread to monitor the queue for
        LogRecords to process.
        """
        self._thread = t = threading.Thread(target=self._monitor)
        t.daemon = True
        t.start()

    def prepare(self, record):
        """
        Prepare a record for handling.

        This method just returns the passed-in record. You may want to
        override this method if you need to do any custom marshalling or
        manipulation of the record before passing it to the handlers.
        """
        return record

    def handle(self, record):
        """
        Handle a record.

        This just loops through the handlers offering them the record
        to handle.
        """
        record = self.prepare(record)
        for handler in self.handlers:
            if not self.respect_handler_level:
                process = True
            else:
                process = record.levelno >= handler.level
            if process:
                handler.handle(record)

    def _monitor(self):
        """
        Monitor the queue for records, and ask the handler
        to deal with them.

        This method runs on a separate, internal thread.
        The thread will terminate if it sees a sentinel object in the queue.
        """
        q = self.queue
        has_task_done = hasattr(q, 'task_done')
        while True:
            try:
                record = self.dequeue(True)
                if record is self._sentinel:
                    if has_task_done:
                        q.task_done()
                    break
                self.handle(record)
                if has_task_done:
                    q.task_done()
            except queue.Empty:
                break

    def enqueue_sentinel(self):
        """
        This is used to enqueue the sentinel record.

        The base implementation uses put_nowait. You may want to override this
        method if you want to use timeouts or work with custom queue
        implementations.
        """
        self.queue.put_nowait(self._sentinel)

    def stop(self):
        """
        Stop the listener.

        This asks the thread to terminate, and then waits for it to do so.
        Note that if you don't call this before your application exits, there
        may be some records still left on the queue, which won't be processed.
        """
        self.enqueue_sentinel()
        self._thread.join()
        self._thread = None
PK�]�C�H%;%;__init__.pynu�[���# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Vinay Sajip
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
"""

import sys, os, time, io, re, traceback, warnings, weakref, collections.abc

from types import GenericAlias
from string import Template
from string import Formatter as StrFormatter


__all__ = ['BASIC_FORMAT', 'BufferingFormatter', 'CRITICAL', 'DEBUG', 'ERROR',
           'FATAL', 'FileHandler', 'Filter', 'Formatter', 'Handler', 'INFO',
           'LogRecord', 'Logger', 'LoggerAdapter', 'NOTSET', 'NullHandler',
           'StreamHandler', 'WARN', 'WARNING', 'addLevelName', 'basicConfig',
           'captureWarnings', 'critical', 'debug', 'disable', 'error',
           'exception', 'fatal', 'getLevelName', 'getLogger', 'getLoggerClass',
           'info', 'log', 'makeLogRecord', 'setLoggerClass', 'shutdown',
           'warn', 'warning', 'getLogRecordFactory', 'setLogRecordFactory',
           'lastResort', 'raiseExceptions', 'getLevelNamesMapping']

import threading

__author__  = "Vinay Sajip <vinay_sajip@red-dove.com>"
__status__  = "production"
# The following module attributes are no longer updated.
__version__ = "0.5.1.2"
__date__    = "07 February 2010"

#---------------------------------------------------------------------------
#   Miscellaneous module data
#---------------------------------------------------------------------------

#
#_startTime is used as the base when calculating the relative time of events
#
_startTime = time.time()

#
#raiseExceptions is used to see if exceptions during handling should be
#propagated
#
raiseExceptions = True

#
# If you don't want threading information in the log, set this to zero
#
logThreads = True

#
# If you don't want multiprocessing information in the log, set this to zero
#
logMultiprocessing = True

#
# If you don't want process information in the log, set this to zero
#
logProcesses = True

#---------------------------------------------------------------------------
#   Level related stuff
#---------------------------------------------------------------------------
#
# Default levels and level names, these can be replaced with any positive set
# of values having corresponding names. There is a pseudo-level, NOTSET, which
# is only really there as a lower limit for user-defined levels. Handlers and
# loggers are initialized with NOTSET so that they will log all messages, even
# at user-defined levels.
#

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

_levelToName = {
    CRITICAL: 'CRITICAL',
    ERROR: 'ERROR',
    WARNING: 'WARNING',
    INFO: 'INFO',
    DEBUG: 'DEBUG',
    NOTSET: 'NOTSET',
}
_nameToLevel = {
    'CRITICAL': CRITICAL,
    'FATAL': FATAL,
    'ERROR': ERROR,
    'WARN': WARNING,
    'WARNING': WARNING,
    'INFO': INFO,
    'DEBUG': DEBUG,
    'NOTSET': NOTSET,
}

def getLevelNamesMapping():
    return _nameToLevel.copy()

def getLevelName(level):
    """
    Return the textual or numeric representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    If a string representation of the level is passed in, the corresponding
    numeric value is returned.

    If no matching numeric or string value is passed in, the string
    'Level %s' % level is returned.
    """
    # See Issues #22386, #27937 and #29220 for why it's this way
    result = _levelToName.get(level)
    if result is not None:
        return result
    result = _nameToLevel.get(level)
    if result is not None:
        return result
    return "Level %s" % level

def addLevelName(level, levelName):
    """
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    """
    _acquireLock()
    try:    #unlikely to cause an exception, but you never know...
        _levelToName[level] = levelName
        _nameToLevel[levelName] = level
    finally:
        _releaseLock()

if hasattr(sys, "_getframe"):
    currentframe = lambda: sys._getframe(1)
else: #pragma: no cover
    def currentframe():
        """Return the frame object for the caller's stack frame."""
        try:
            raise Exception
        except Exception:
            return sys.exc_info()[2].tb_frame.f_back

#
# _srcfile is used when walking the stack to check when we've got the first
# caller stack frame, by skipping frames whose filename is that of this
# module's source. It therefore should contain the filename of this module's
# source file.
#
# Ordinarily we would use __file__ for this, but frozen modules don't always
# have __file__ set, for some reason (see Issue #21736). Thus, we get the
# filename from a handy code object from a function defined in this module.
# (There's no particular reason for picking addLevelName.)
#

_srcfile = os.path.normcase(addLevelName.__code__.co_filename)

# _srcfile is only used in conjunction with sys._getframe().
# Setting _srcfile to None will prevent findCaller() from being called. This
# way, you can avoid the overhead of fetching caller information.

# The following is based on warnings._is_internal_frame. It makes sure that
# frames of the import mechanism are skipped when logging at module level and
# using a stacklevel value greater than one.
def _is_internal_frame(frame):
    """Signal whether the frame is a CPython or logging module internal."""
    filename = os.path.normcase(frame.f_code.co_filename)
    return filename == _srcfile or (
        "importlib" in filename and "_bootstrap" in filename
    )


def _checkLevel(level):
    if isinstance(level, int):
        rv = level
    elif str(level) == level:
        if level not in _nameToLevel:
            raise ValueError("Unknown level: %r" % level)
        rv = _nameToLevel[level]
    else:
        raise TypeError("Level not an integer or a valid string: %r"
                        % (level,))
    return rv

#---------------------------------------------------------------------------
#   Thread-related stuff
#---------------------------------------------------------------------------

#
#_lock is used to serialize access to shared data structures in this module.
#This needs to be an RLock because fileConfig() creates and configures
#Handlers, and so might arbitrary user threads. Since Handler code updates the
#shared dictionary _handlers, it needs to acquire the lock. But if configuring,
#the lock would already have been acquired - so we need an RLock.
#The same argument applies to Loggers and Manager.loggerDict.
#
_lock = threading.RLock()

def _acquireLock():
    """
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    """
    if _lock:
        _lock.acquire()

def _releaseLock():
    """
    Release the module-level lock acquired by calling _acquireLock().
    """
    if _lock:
        _lock.release()


# Prevent a held logging lock from blocking a child from logging.

if not hasattr(os, 'register_at_fork'):  # Windows and friends.
    def _register_at_fork_reinit_lock(instance):
        pass  # no-op when os.register_at_fork does not exist.
else:
    # A collection of instances with a _at_fork_reinit method (logging.Handler)
    # to be called in the child after forking.  The weakref avoids us keeping
    # discarded Handler instances alive.
    _at_fork_reinit_lock_weakset = weakref.WeakSet()

    def _register_at_fork_reinit_lock(instance):
        _acquireLock()
        try:
            _at_fork_reinit_lock_weakset.add(instance)
        finally:
            _releaseLock()

    def _after_at_fork_child_reinit_locks():
        for handler in _at_fork_reinit_lock_weakset:
            handler._at_fork_reinit()

        # _acquireLock() was called in the parent before forking.
        # The lock is reinitialized to unlocked state.
        _lock._at_fork_reinit()

    os.register_at_fork(before=_acquireLock,
                        after_in_child=_after_at_fork_child_reinit_locks,
                        after_in_parent=_releaseLock)


#---------------------------------------------------------------------------
#   The logging record
#---------------------------------------------------------------------------

class LogRecord(object):
    """
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    """
    def __init__(self, name, level, pathname, lineno,
                 msg, args, exc_info, func=None, sinfo=None, **kwargs):
        """
        Initialize a logging record with interesting information.
        """
        ct = time.time()
        self.name = name
        self.msg = msg
        #
        # The following statement allows passing of a dictionary as a sole
        # argument, so that you can do something like
        #  logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})
        # Suggested by Stefan Behnel.
        # Note that without the test for args[0], we get a problem because
        # during formatting, we test to see if the arg is present using
        # 'if self.args:'. If the event being logged is e.g. 'Value is %d'
        # and if the passed arg fails 'if self.args:' then no formatting
        # is done. For example, logger.warning('Value is %d', 0) would log
        # 'Value is %d' instead of 'Value is 0'.
        # For the use case of passing a dictionary, this should not be a
        # problem.
        # Issue #21172: a request was made to relax the isinstance check
        # to hasattr(args[0], '__getitem__'). However, the docs on string
        # formatting still seem to suggest a mapping object is required.
        # Thus, while not removing the isinstance check, it does now look
        # for collections.abc.Mapping rather than, as before, dict.
        if (args and len(args) == 1 and isinstance(args[0], collections.abc.Mapping)
            and args[0]):
            args = args[0]
        self.args = args
        self.levelname = getLevelName(level)
        self.levelno = level
        self.pathname = pathname
        try:
            self.filename = os.path.basename(pathname)
            self.module = os.path.splitext(self.filename)[0]
        except (TypeError, ValueError, AttributeError):
            self.filename = pathname
            self.module = "Unknown module"
        self.exc_info = exc_info
        self.exc_text = None      # used to cache the traceback text
        self.stack_info = sinfo
        self.lineno = lineno
        self.funcName = func
        self.created = ct
        self.msecs = int((ct - int(ct)) * 1000) + 0.0  # see gh-89047
        self.relativeCreated = (self.created - _startTime) * 1000
        if logThreads:
            self.thread = threading.get_ident()
            self.threadName = threading.current_thread().name
        else: # pragma: no cover
            self.thread = None
            self.threadName = None
        if not logMultiprocessing: # pragma: no cover
            self.processName = None
        else:
            self.processName = 'MainProcess'
            mp = sys.modules.get('multiprocessing')
            if mp is not None:
                # Errors may occur if multiprocessing has not finished loading
                # yet - e.g. if a custom import hook causes third-party code
                # to run when multiprocessing calls import. See issue 8200
                # for an example
                try:
                    self.processName = mp.current_process().name
                except Exception: #pragma: no cover
                    pass
        if logProcesses and hasattr(os, 'getpid'):
            self.process = os.getpid()
        else:
            self.process = None

    def __repr__(self):
        return '<LogRecord: %s, %s, %s, %s, "%s">'%(self.name, self.levelno,
            self.pathname, self.lineno, self.msg)

    def getMessage(self):
        """
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        """
        msg = str(self.msg)
        if self.args:
            msg = msg % self.args
        return msg

#
#   Determine which class to use when instantiating log records.
#
_logRecordFactory = LogRecord

def setLogRecordFactory(factory):
    """
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    """
    global _logRecordFactory
    _logRecordFactory = factory

def getLogRecordFactory():
    """
    Return the factory to be used when instantiating a log record.
    """

    return _logRecordFactory

def makeLogRecord(dict):
    """
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    """
    rv = _logRecordFactory(None, None, "", 0, "", (), None, None)
    rv.__dict__.update(dict)
    return rv


#---------------------------------------------------------------------------
#   Formatter classes and functions
#---------------------------------------------------------------------------
_str_formatter = StrFormatter()
del StrFormatter


class PercentStyle(object):

    default_format = '%(message)s'
    asctime_format = '%(asctime)s'
    asctime_search = '%(asctime)'
    validation_pattern = re.compile(r'%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]', re.I)

    def __init__(self, fmt, *, defaults=None):
        self._fmt = fmt or self.default_format
        self._defaults = defaults

    def usesTime(self):
        return self._fmt.find(self.asctime_search) >= 0

    def validate(self):
        """Validate the input format, ensure it matches the correct style"""
        if not self.validation_pattern.search(self._fmt):
            raise ValueError("Invalid format '%s' for '%s' style" % (self._fmt, self.default_format[0]))

    def _format(self, record):
        if defaults := self._defaults:
            values = defaults | record.__dict__
        else:
            values = record.__dict__
        return self._fmt % values

    def format(self, record):
        try:
            return self._format(record)
        except KeyError as e:
            raise ValueError('Formatting field not found in record: %s' % e)


class StrFormatStyle(PercentStyle):
    default_format = '{message}'
    asctime_format = '{asctime}'
    asctime_search = '{asctime'

    fmt_spec = re.compile(r'^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$', re.I)
    field_spec = re.compile(r'^(\d+|\w+)(\.\w+|\[[^]]+\])*$')

    def _format(self, record):
        if defaults := self._defaults:
            values = defaults | record.__dict__
        else:
            values = record.__dict__
        return self._fmt.format(**values)

    def validate(self):
        """Validate the input format, ensure it is the correct string formatting style"""
        fields = set()
        try:
            for _, fieldname, spec, conversion in _str_formatter.parse(self._fmt):
                if fieldname:
                    if not self.field_spec.match(fieldname):
                        raise ValueError('invalid field name/expression: %r' % fieldname)
                    fields.add(fieldname)
                if conversion and conversion not in 'rsa':
                    raise ValueError('invalid conversion: %r' % conversion)
                if spec and not self.fmt_spec.match(spec):
                    raise ValueError('bad specifier: %r' % spec)
        except ValueError as e:
            raise ValueError('invalid format: %s' % e)
        if not fields:
            raise ValueError('invalid format: no fields')


class StringTemplateStyle(PercentStyle):
    default_format = '${message}'
    asctime_format = '${asctime}'
    asctime_search = '${asctime}'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._tpl = Template(self._fmt)

    def usesTime(self):
        fmt = self._fmt
        return fmt.find('$asctime') >= 0 or fmt.find(self.asctime_search) >= 0

    def validate(self):
        pattern = Template.pattern
        fields = set()
        for m in pattern.finditer(self._fmt):
            d = m.groupdict()
            if d['named']:
                fields.add(d['named'])
            elif d['braced']:
                fields.add(d['braced'])
            elif m.group(0) == '$':
                raise ValueError('invalid format: bare \'$\' not allowed')
        if not fields:
            raise ValueError('invalid format: no fields')

    def _format(self, record):
        if defaults := self._defaults:
            values = defaults | record.__dict__
        else:
            values = record.__dict__
        return self._tpl.substitute(**values)


BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"

_STYLES = {
    '%': (PercentStyle, BASIC_FORMAT),
    '{': (StrFormatStyle, '{levelname}:{name}:{message}'),
    '$': (StringTemplateStyle, '${levelname}:${name}:${message}'),
}

class Formatter(object):
    """
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    """

    converter = time.localtime

    def __init__(self, fmt=None, datefmt=None, style='%', validate=True, *,
                 defaults=None):
        """
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        """
        if style not in _STYLES:
            raise ValueError('Style must be one of: %s' % ','.join(
                             _STYLES.keys()))
        self._style = _STYLES[style][0](fmt, defaults=defaults)
        if validate:
            self._style.validate()

        self._fmt = self._style._fmt
        self.datefmt = datefmt

    default_time_format = '%Y-%m-%d %H:%M:%S'
    default_msec_format = '%s,%03d'

    def formatTime(self, record, datefmt=None):
        """
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        """
        ct = self.converter(record.created)
        if datefmt:
            s = time.strftime(datefmt, ct)
        else:
            s = time.strftime(self.default_time_format, ct)
            if self.default_msec_format:
                s = self.default_msec_format % (s, record.msecs)
        return s

    def formatException(self, ei):
        """
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        """
        sio = io.StringIO()
        tb = ei[2]
        # See issues #9427, #1553375. Commented out for now.
        #if getattr(self, 'fullstack', False):
        #    traceback.print_stack(tb.tb_frame.f_back, file=sio)
        traceback.print_exception(ei[0], ei[1], tb, None, sio)
        s = sio.getvalue()
        sio.close()
        if s[-1:] == "\n":
            s = s[:-1]
        return s

    def usesTime(self):
        """
        Check if the format uses the creation time of the record.
        """
        return self._style.usesTime()

    def formatMessage(self, record):
        return self._style.format(record)

    def formatStack(self, stack_info):
        """
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        """
        return stack_info

    def format(self, record):
        """
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        """
        record.message = record.getMessage()
        if self.usesTime():
            record.asctime = self.formatTime(record, self.datefmt)
        s = self.formatMessage(record)
        if record.exc_info:
            # Cache the traceback text to avoid converting it multiple times
            # (it's constant anyway)
            if not record.exc_text:
                record.exc_text = self.formatException(record.exc_info)
        if record.exc_text:
            if s[-1:] != "\n":
                s = s + "\n"
            s = s + record.exc_text
        if record.stack_info:
            if s[-1:] != "\n":
                s = s + "\n"
            s = s + self.formatStack(record.stack_info)
        return s

#
#   The default formatter to use when no other is specified
#
_defaultFormatter = Formatter()

class BufferingFormatter(object):
    """
    A formatter suitable for formatting a number of records.
    """
    def __init__(self, linefmt=None):
        """
        Optionally specify a formatter which will be used to format each
        individual record.
        """
        if linefmt:
            self.linefmt = linefmt
        else:
            self.linefmt = _defaultFormatter

    def formatHeader(self, records):
        """
        Return the header string for the specified records.
        """
        return ""

    def formatFooter(self, records):
        """
        Return the footer string for the specified records.
        """
        return ""

    def format(self, records):
        """
        Format the specified records and return the result as a string.
        """
        rv = ""
        if len(records) > 0:
            rv = rv + self.formatHeader(records)
            for record in records:
                rv = rv + self.linefmt.format(record)
            rv = rv + self.formatFooter(records)
        return rv

#---------------------------------------------------------------------------
#   Filter classes and functions
#---------------------------------------------------------------------------

class Filter(object):
    """
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    """
    def __init__(self, name=''):
        """
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        """
        self.name = name
        self.nlen = len(name)

    def filter(self, record):
        """
        Determine if the specified record is to be logged.

        Returns True if the record should be logged, or False otherwise.
        If deemed appropriate, the record may be modified in-place.
        """
        if self.nlen == 0:
            return True
        elif self.name == record.name:
            return True
        elif record.name.find(self.name, 0, self.nlen) != 0:
            return False
        return (record.name[self.nlen] == ".")

class Filterer(object):
    """
    A base class for loggers and handlers which allows them to share
    common code.
    """
    def __init__(self):
        """
        Initialize the list of filters to be an empty list.
        """
        self.filters = []

    def addFilter(self, filter):
        """
        Add the specified filter to this handler.
        """
        if not (filter in self.filters):
            self.filters.append(filter)

    def removeFilter(self, filter):
        """
        Remove the specified filter from this handler.
        """
        if filter in self.filters:
            self.filters.remove(filter)

    def filter(self, record):
        """
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        """
        rv = True
        for f in self.filters:
            if hasattr(f, 'filter'):
                result = f.filter(record)
            else:
                result = f(record) # assume callable - will raise if not
            if not result:
                rv = False
                break
        return rv

#---------------------------------------------------------------------------
#   Handler classes and functions
#---------------------------------------------------------------------------

_handlers = weakref.WeakValueDictionary()  #map of handler names to handlers
_handlerList = [] # added to allow handlers to be removed in reverse of order initialized

def _removeHandlerRef(wr):
    """
    Remove a handler reference from the internal cleanup list.
    """
    # This function can be called during module teardown, when globals are
    # set to None. It can also be called from another thread. So we need to
    # pre-emptively grab the necessary globals and check if they're None,
    # to prevent race conditions and failures during interpreter shutdown.
    acquire, release, handlers = _acquireLock, _releaseLock, _handlerList
    if acquire and release and handlers:
        acquire()
        try:
            handlers.remove(wr)
        except ValueError:
            pass
        finally:
            release()

def _addHandlerRef(handler):
    """
    Add a handler to the internal cleanup list using a weak reference.
    """
    _acquireLock()
    try:
        _handlerList.append(weakref.ref(handler, _removeHandlerRef))
    finally:
        _releaseLock()

class Handler(Filterer):
    """
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    """
    def __init__(self, level=NOTSET):
        """
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        """
        Filterer.__init__(self)
        self._name = None
        self.level = _checkLevel(level)
        self.formatter = None
        self._closed = False
        # Add the handler to the global _handlerList (for cleanup on shutdown)
        _addHandlerRef(self)
        self.createLock()

    def get_name(self):
        return self._name

    def set_name(self, name):
        _acquireLock()
        try:
            if self._name in _handlers:
                del _handlers[self._name]
            self._name = name
            if name:
                _handlers[name] = self
        finally:
            _releaseLock()

    name = property(get_name, set_name)

    def createLock(self):
        """
        Acquire a thread lock for serializing access to the underlying I/O.
        """
        self.lock = threading.RLock()
        _register_at_fork_reinit_lock(self)

    def _at_fork_reinit(self):
        self.lock._at_fork_reinit()

    def acquire(self):
        """
        Acquire the I/O thread lock.
        """
        if self.lock:
            self.lock.acquire()

    def release(self):
        """
        Release the I/O thread lock.
        """
        if self.lock:
            self.lock.release()

    def setLevel(self, level):
        """
        Set the logging level of this handler.  level must be an int or a str.
        """
        self.level = _checkLevel(level)

    def format(self, record):
        """
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        """
        if self.formatter:
            fmt = self.formatter
        else:
            fmt = _defaultFormatter
        return fmt.format(record)

    def emit(self, record):
        """
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        """
        raise NotImplementedError('emit must be implemented '
                                  'by Handler subclasses')

    def handle(self, record):
        """
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        """
        rv = self.filter(record)
        if rv:
            self.acquire()
            try:
                self.emit(record)
            finally:
                self.release()
        return rv

    def setFormatter(self, fmt):
        """
        Set the formatter for this handler.
        """
        self.formatter = fmt

    def flush(self):
        """
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        """
        pass

    def close(self):
        """
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        """
        #get the module data lock, as we're updating a shared structure.
        _acquireLock()
        try:    #unlikely to raise an exception, but you never know...
            self._closed = True
            if self._name and self._name in _handlers:
                del _handlers[self._name]
        finally:
            _releaseLock()

    def handleError(self, record):
        """
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        """
        if raiseExceptions and sys.stderr:  # see issue 13807
            t, v, tb = sys.exc_info()
            try:
                sys.stderr.write('--- Logging error ---\n')
                traceback.print_exception(t, v, tb, None, sys.stderr)
                sys.stderr.write('Call stack:\n')
                # Walk the stack frame up until we're out of logging,
                # so as to print the calling context.
                frame = tb.tb_frame
                while (frame and os.path.dirname(frame.f_code.co_filename) ==
                       __path__[0]):
                    frame = frame.f_back
                if frame:
                    traceback.print_stack(frame, file=sys.stderr)
                else:
                    # couldn't find the right stack frame, for some reason
                    sys.stderr.write('Logged from file %s, line %s\n' % (
                                     record.filename, record.lineno))
                # Issue 18671: output logging message and arguments
                try:
                    sys.stderr.write('Message: %r\n'
                                     'Arguments: %s\n' % (record.msg,
                                                          record.args))
                except RecursionError:  # See issue 36272
                    raise
                except Exception:
                    sys.stderr.write('Unable to print the message and arguments'
                                     ' - possible formatting error.\nUse the'
                                     ' traceback above to help find the error.\n'
                                    )
            except OSError: #pragma: no cover
                pass    # see issue 5971
            finally:
                del t, v, tb

    def __repr__(self):
        level = getLevelName(self.level)
        return '<%s (%s)>' % (self.__class__.__name__, level)

class StreamHandler(Handler):
    """
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    """

    terminator = '\n'

    def __init__(self, stream=None):
        """
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        """
        Handler.__init__(self)
        if stream is None:
            stream = sys.stderr
        self.stream = stream

    def flush(self):
        """
        Flushes the stream.
        """
        self.acquire()
        try:
            if self.stream and hasattr(self.stream, "flush"):
                self.stream.flush()
        finally:
            self.release()

    def emit(self, record):
        """
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        """
        try:
            msg = self.format(record)
            stream = self.stream
            # issue 35046: merged two stream.writes into one.
            stream.write(msg + self.terminator)
            self.flush()
        except RecursionError:  # See issue 36272
            raise
        except Exception:
            self.handleError(record)

    def setStream(self, stream):
        """
        Sets the StreamHandler's stream to the specified value,
        if it is different.

        Returns the old stream, if the stream was changed, or None
        if it wasn't.
        """
        if stream is self.stream:
            result = None
        else:
            result = self.stream
            self.acquire()
            try:
                self.flush()
                self.stream = stream
            finally:
                self.release()
        return result

    def __repr__(self):
        level = getLevelName(self.level)
        name = getattr(self.stream, 'name', '')
        #  bpo-36015: name can be an int
        name = str(name)
        if name:
            name += ' '
        return '<%s %s(%s)>' % (self.__class__.__name__, name, level)

    __class_getitem__ = classmethod(GenericAlias)


class FileHandler(StreamHandler):
    """
    A handler class which writes formatted logging records to disk files.
    """
    def __init__(self, filename, mode='a', encoding=None, delay=False, errors=None):
        """
        Open the specified file and use it as the stream for logging.
        """
        # Issue #27493: add support for Path objects to be passed in
        filename = os.fspath(filename)
        #keep the absolute path, otherwise derived classes which use this
        #may come a cropper when the current directory changes
        self.baseFilename = os.path.abspath(filename)
        self.mode = mode
        self.encoding = encoding
        if "b" not in mode:
            self.encoding = io.text_encoding(encoding)
        self.errors = errors
        self.delay = delay
        # bpo-26789: FileHandler keeps a reference to the builtin open()
        # function to be able to open or reopen the file during Python
        # finalization.
        self._builtin_open = open
        if delay:
            #We don't open the stream, but we still need to call the
            #Handler constructor to set level, formatter, lock etc.
            Handler.__init__(self)
            self.stream = None
        else:
            StreamHandler.__init__(self, self._open())

    def close(self):
        """
        Closes the stream.
        """
        self.acquire()
        try:
            try:
                if self.stream:
                    try:
                        self.flush()
                    finally:
                        stream = self.stream
                        self.stream = None
                        if hasattr(stream, "close"):
                            stream.close()
            finally:
                # Issue #19523: call unconditionally to
                # prevent a handler leak when delay is set
                # Also see Issue #42378: we also rely on
                # self._closed being set to True there
                StreamHandler.close(self)
        finally:
            self.release()

    def _open(self):
        """
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        """
        open_func = self._builtin_open
        return open_func(self.baseFilename, self.mode,
                         encoding=self.encoding, errors=self.errors)

    def emit(self, record):
        """
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.

        If stream is not open, current mode is 'w' and `_closed=True`, record
        will not be emitted (see Issue #42378).
        """
        if self.stream is None:
            if self.mode != 'w' or not self._closed:
                self.stream = self._open()
        if self.stream:
            StreamHandler.emit(self, record)

    def __repr__(self):
        level = getLevelName(self.level)
        return '<%s %s (%s)>' % (self.__class__.__name__, self.baseFilename, level)


class _StderrHandler(StreamHandler):
    """
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    """
    def __init__(self, level=NOTSET):
        """
        Initialize the handler.
        """
        Handler.__init__(self, level)

    @property
    def stream(self):
        return sys.stderr


_defaultLastResort = _StderrHandler(WARNING)
lastResort = _defaultLastResort

#---------------------------------------------------------------------------
#   Manager classes and functions
#---------------------------------------------------------------------------

class PlaceHolder(object):
    """
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    """
    def __init__(self, alogger):
        """
        Initialize with the specified logger being a child of this placeholder.
        """
        self.loggerMap = { alogger : None }

    def append(self, alogger):
        """
        Add the specified logger as a child of this placeholder.
        """
        if alogger not in self.loggerMap:
            self.loggerMap[alogger] = None

#
#   Determine which class to use when instantiating loggers.
#

def setLoggerClass(klass):
    """
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    """
    if klass != Logger:
        if not issubclass(klass, Logger):
            raise TypeError("logger not derived from logging.Logger: "
                            + klass.__name__)
    global _loggerClass
    _loggerClass = klass

def getLoggerClass():
    """
    Return the class to be used when instantiating a logger.
    """
    return _loggerClass

class Manager(object):
    """
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    """
    def __init__(self, rootnode):
        """
        Initialize the manager with the root node of the logger hierarchy.
        """
        self.root = rootnode
        self.disable = 0
        self.emittedNoHandlerWarning = False
        self.loggerDict = {}
        self.loggerClass = None
        self.logRecordFactory = None

    @property
    def disable(self):
        return self._disable

    @disable.setter
    def disable(self, value):
        self._disable = _checkLevel(value)

    def getLogger(self, name):
        """
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        """
        rv = None
        if not isinstance(name, str):
            raise TypeError('A logger name must be a string')
        _acquireLock()
        try:
            if name in self.loggerDict:
                rv = self.loggerDict[name]
                if isinstance(rv, PlaceHolder):
                    ph = rv
                    rv = (self.loggerClass or _loggerClass)(name)
                    rv.manager = self
                    self.loggerDict[name] = rv
                    self._fixupChildren(ph, rv)
                    self._fixupParents(rv)
            else:
                rv = (self.loggerClass or _loggerClass)(name)
                rv.manager = self
                self.loggerDict[name] = rv
                self._fixupParents(rv)
        finally:
            _releaseLock()
        return rv

    def setLoggerClass(self, klass):
        """
        Set the class to be used when instantiating a logger with this Manager.
        """
        if klass != Logger:
            if not issubclass(klass, Logger):
                raise TypeError("logger not derived from logging.Logger: "
                                + klass.__name__)
        self.loggerClass = klass

    def setLogRecordFactory(self, factory):
        """
        Set the factory to be used when instantiating a log record with this
        Manager.
        """
        self.logRecordFactory = factory

    def _fixupParents(self, alogger):
        """
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        """
        name = alogger.name
        i = name.rfind(".")
        rv = None
        while (i > 0) and not rv:
            substr = name[:i]
            if substr not in self.loggerDict:
                self.loggerDict[substr] = PlaceHolder(alogger)
            else:
                obj = self.loggerDict[substr]
                if isinstance(obj, Logger):
                    rv = obj
                else:
                    assert isinstance(obj, PlaceHolder)
                    obj.append(alogger)
            i = name.rfind(".", 0, i - 1)
        if not rv:
            rv = self.root
        alogger.parent = rv

    def _fixupChildren(self, ph, alogger):
        """
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        """
        name = alogger.name
        namelen = len(name)
        for c in ph.loggerMap.keys():
            #The if means ... if not c.parent.name.startswith(nm)
            if c.parent.name[:namelen] != name:
                alogger.parent = c.parent
                c.parent = alogger

    def _clear_cache(self):
        """
        Clear the cache for all loggers in loggerDict
        Called when level changes are made
        """

        _acquireLock()
        for logger in self.loggerDict.values():
            if isinstance(logger, Logger):
                logger._cache.clear()
        self.root._cache.clear()
        _releaseLock()

#---------------------------------------------------------------------------
#   Logger classes and functions
#---------------------------------------------------------------------------

class Logger(Filterer):
    """
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    """
    def __init__(self, name, level=NOTSET):
        """
        Initialize the logger with a name and an optional level.
        """
        Filterer.__init__(self)
        self.name = name
        self.level = _checkLevel(level)
        self.parent = None
        self.propagate = True
        self.handlers = []
        self.disabled = False
        self._cache = {}

    def setLevel(self, level):
        """
        Set the logging level of this logger.  level must be an int or a str.
        """
        self.level = _checkLevel(level)
        self.manager._clear_cache()

    def debug(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=True)
        """
        if self.isEnabledFor(DEBUG):
            self._log(DEBUG, msg, args, **kwargs)

    def info(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=True)
        """
        if self.isEnabledFor(INFO):
            self._log(INFO, msg, args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=True)
        """
        if self.isEnabledFor(WARNING):
            self._log(WARNING, msg, args, **kwargs)

    def warn(self, msg, *args, **kwargs):
        warnings.warn("The 'warn' method is deprecated, "
            "use 'warning' instead", DeprecationWarning, 2)
        self.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=True)
        """
        if self.isEnabledFor(ERROR):
            self._log(ERROR, msg, args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        """
        Convenience method for logging an ERROR with exception information.
        """
        self.error(msg, *args, exc_info=exc_info, **kwargs)

    def critical(self, msg, *args, **kwargs):
        """
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=True)
        """
        if self.isEnabledFor(CRITICAL):
            self._log(CRITICAL, msg, args, **kwargs)

    def fatal(self, msg, *args, **kwargs):
        """
        Don't use this method, use critical() instead.
        """
        self.critical(msg, *args, **kwargs)

    def log(self, level, msg, *args, **kwargs):
        """
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=True)
        """
        if not isinstance(level, int):
            if raiseExceptions:
                raise TypeError("level must be an integer")
            else:
                return
        if self.isEnabledFor(level):
            self._log(level, msg, args, **kwargs)

    def findCaller(self, stack_info=False, stacklevel=1):
        """
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        """
        f = currentframe()
        #On some versions of IronPython, currentframe() returns None if
        #IronPython isn't run with -X:Frames.
        if f is None:
            return "(unknown file)", 0, "(unknown function)", None
        while stacklevel > 0:
            next_f = f.f_back
            if next_f is None:
                ## We've got options here.
                ## If we want to use the last (deepest) frame:
                break
                ## If we want to mimic the warnings module:
                #return ("sys", 1, "(unknown function)", None)
                ## If we want to be pedantic:
                #raise ValueError("call stack is not deep enough")
            f = next_f
            if not _is_internal_frame(f):
                stacklevel -= 1
        co = f.f_code
        sinfo = None
        if stack_info:
            with io.StringIO() as sio:
                sio.write("Stack (most recent call last):\n")
                traceback.print_stack(f, file=sio)
                sinfo = sio.getvalue()
                if sinfo[-1] == '\n':
                    sinfo = sinfo[:-1]
        return co.co_filename, f.f_lineno, co.co_name, sinfo

    def makeRecord(self, name, level, fn, lno, msg, args, exc_info,
                   func=None, extra=None, sinfo=None):
        """
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        """
        rv = _logRecordFactory(name, level, fn, lno, msg, args, exc_info, func,
                             sinfo)
        if extra is not None:
            for key in extra:
                if (key in ["message", "asctime"]) or (key in rv.__dict__):
                    raise KeyError("Attempt to overwrite %r in LogRecord" % key)
                rv.__dict__[key] = extra[key]
        return rv

    def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False,
             stacklevel=1):
        """
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        """
        sinfo = None
        if _srcfile:
            #IronPython doesn't track Python frames, so findCaller raises an
            #exception on some versions of IronPython. We trap it here so that
            #IronPython can use logging.
            try:
                fn, lno, func, sinfo = self.findCaller(stack_info, stacklevel)
            except ValueError: # pragma: no cover
                fn, lno, func = "(unknown file)", 0, "(unknown function)"
        else: # pragma: no cover
            fn, lno, func = "(unknown file)", 0, "(unknown function)"
        if exc_info:
            if isinstance(exc_info, BaseException):
                exc_info = (type(exc_info), exc_info, exc_info.__traceback__)
            elif not isinstance(exc_info, tuple):
                exc_info = sys.exc_info()
        record = self.makeRecord(self.name, level, fn, lno, msg, args,
                                 exc_info, func, extra, sinfo)
        self.handle(record)

    def handle(self, record):
        """
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        """
        if (not self.disabled) and self.filter(record):
            self.callHandlers(record)

    def addHandler(self, hdlr):
        """
        Add the specified handler to this logger.
        """
        _acquireLock()
        try:
            if not (hdlr in self.handlers):
                self.handlers.append(hdlr)
        finally:
            _releaseLock()

    def removeHandler(self, hdlr):
        """
        Remove the specified handler from this logger.
        """
        _acquireLock()
        try:
            if hdlr in self.handlers:
                self.handlers.remove(hdlr)
        finally:
            _releaseLock()

    def hasHandlers(self):
        """
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        """
        c = self
        rv = False
        while c:
            if c.handlers:
                rv = True
                break
            if not c.propagate:
                break
            else:
                c = c.parent
        return rv

    def callHandlers(self, record):
        """
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        """
        c = self
        found = 0
        while c:
            for hdlr in c.handlers:
                found = found + 1
                if record.levelno >= hdlr.level:
                    hdlr.handle(record)
            if not c.propagate:
                c = None    #break out
            else:
                c = c.parent
        if (found == 0):
            if lastResort:
                if record.levelno >= lastResort.level:
                    lastResort.handle(record)
            elif raiseExceptions and not self.manager.emittedNoHandlerWarning:
                sys.stderr.write("No handlers could be found for logger"
                                 " \"%s\"\n" % self.name)
                self.manager.emittedNoHandlerWarning = True

    def getEffectiveLevel(self):
        """
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        """
        logger = self
        while logger:
            if logger.level:
                return logger.level
            logger = logger.parent
        return NOTSET

    def isEnabledFor(self, level):
        """
        Is this logger enabled for level 'level'?
        """
        if self.disabled:
            return False

        try:
            return self._cache[level]
        except KeyError:
            _acquireLock()
            try:
                if self.manager.disable >= level:
                    is_enabled = self._cache[level] = False
                else:
                    is_enabled = self._cache[level] = (
                        level >= self.getEffectiveLevel()
                    )
            finally:
                _releaseLock()
            return is_enabled

    def getChild(self, suffix):
        """
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        """
        if self.root is not self:
            suffix = '.'.join((self.name, suffix))
        return self.manager.getLogger(suffix)

    def __repr__(self):
        level = getLevelName(self.getEffectiveLevel())
        return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level)

    def __reduce__(self):
        if getLogger(self.name) is not self:
            import pickle
            raise pickle.PicklingError('logger cannot be pickled')
        return getLogger, (self.name,)


class RootLogger(Logger):
    """
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    """
    def __init__(self, level):
        """
        Initialize the logger with the name "root".
        """
        Logger.__init__(self, "root", level)

    def __reduce__(self):
        return getLogger, ()

_loggerClass = Logger

class LoggerAdapter(object):
    """
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    """

    def __init__(self, logger, extra=None):
        """
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        """
        self.logger = logger
        self.extra = extra

    def process(self, msg, kwargs):
        """
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        """
        kwargs["extra"] = self.extra
        return msg, kwargs

    #
    # Boilerplate convenience methods
    #
    def debug(self, msg, *args, **kwargs):
        """
        Delegate a debug call to the underlying logger.
        """
        self.log(DEBUG, msg, *args, **kwargs)

    def info(self, msg, *args, **kwargs):
        """
        Delegate an info call to the underlying logger.
        """
        self.log(INFO, msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        """
        Delegate a warning call to the underlying logger.
        """
        self.log(WARNING, msg, *args, **kwargs)

    def warn(self, msg, *args, **kwargs):
        warnings.warn("The 'warn' method is deprecated, "
            "use 'warning' instead", DeprecationWarning, 2)
        self.warning(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        """
        Delegate an error call to the underlying logger.
        """
        self.log(ERROR, msg, *args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        """
        Delegate an exception call to the underlying logger.
        """
        self.log(ERROR, msg, *args, exc_info=exc_info, **kwargs)

    def critical(self, msg, *args, **kwargs):
        """
        Delegate a critical call to the underlying logger.
        """
        self.log(CRITICAL, msg, *args, **kwargs)

    def log(self, level, msg, *args, **kwargs):
        """
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        """
        if self.isEnabledFor(level):
            msg, kwargs = self.process(msg, kwargs)
            self.logger.log(level, msg, *args, **kwargs)

    def isEnabledFor(self, level):
        """
        Is this logger enabled for level 'level'?
        """
        return self.logger.isEnabledFor(level)

    def setLevel(self, level):
        """
        Set the specified level on the underlying logger.
        """
        self.logger.setLevel(level)

    def getEffectiveLevel(self):
        """
        Get the effective level for the underlying logger.
        """
        return self.logger.getEffectiveLevel()

    def hasHandlers(self):
        """
        See if the underlying logger has any handlers.
        """
        return self.logger.hasHandlers()

    def _log(self, level, msg, args, **kwargs):
        """
        Low-level log implementation, proxied to allow nested logger adapters.
        """
        return self.logger._log(level, msg, args, **kwargs)

    @property
    def manager(self):
        return self.logger.manager

    @manager.setter
    def manager(self, value):
        self.logger.manager = value

    @property
    def name(self):
        return self.logger.name

    def __repr__(self):
        logger = self.logger
        level = getLevelName(logger.getEffectiveLevel())
        return '<%s %s (%s)>' % (self.__class__.__name__, logger.name, level)

    __class_getitem__ = classmethod(GenericAlias)

root = RootLogger(WARNING)
Logger.root = root
Logger.manager = Manager(Logger.root)

#---------------------------------------------------------------------------
# Configuration classes and functions
#---------------------------------------------------------------------------

def basicConfig(**kwargs):
    """
    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root logger. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    encoding  If specified together with a filename, this encoding is passed to
              the created FileHandler, causing it to be used when the file is
              opened.
    errors    If specified together with a filename, this value is passed to the
              created FileHandler, causing it to be used when the file is
              opened in text mode. If not specified, the default value is
              `backslashreplace`.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.9
       Added the ``encoding`` and ``errors`` parameters.
    """
    # Add thread safety in case someone mistakenly calls
    # basicConfig() from multiple threads
    _acquireLock()
    try:
        force = kwargs.pop('force', False)
        encoding = kwargs.pop('encoding', None)
        errors = kwargs.pop('errors', 'backslashreplace')
        if force:
            for h in root.handlers[:]:
                root.removeHandler(h)
                h.close()
        if len(root.handlers) == 0:
            handlers = kwargs.pop("handlers", None)
            if handlers is None:
                if "stream" in kwargs and "filename" in kwargs:
                    raise ValueError("'stream' and 'filename' should not be "
                                     "specified together")
            else:
                if "stream" in kwargs or "filename" in kwargs:
                    raise ValueError("'stream' or 'filename' should not be "
                                     "specified together with 'handlers'")
            if handlers is None:
                filename = kwargs.pop("filename", None)
                mode = kwargs.pop("filemode", 'a')
                if filename:
                    if 'b' in mode:
                        errors = None
                    else:
                        encoding = io.text_encoding(encoding)
                    h = FileHandler(filename, mode,
                                    encoding=encoding, errors=errors)
                else:
                    stream = kwargs.pop("stream", None)
                    h = StreamHandler(stream)
                handlers = [h]
            dfs = kwargs.pop("datefmt", None)
            style = kwargs.pop("style", '%')
            if style not in _STYLES:
                raise ValueError('Style must be one of: %s' % ','.join(
                                 _STYLES.keys()))
            fs = kwargs.pop("format", _STYLES[style][1])
            fmt = Formatter(fs, dfs, style)
            for h in handlers:
                if h.formatter is None:
                    h.setFormatter(fmt)
                root.addHandler(h)
            level = kwargs.pop("level", None)
            if level is not None:
                root.setLevel(level)
            if kwargs:
                keys = ', '.join(kwargs.keys())
                raise ValueError('Unrecognised argument(s): %s' % keys)
    finally:
        _releaseLock()

#---------------------------------------------------------------------------
# Utility functions at module level.
# Basically delegate everything to the root logger.
#---------------------------------------------------------------------------

def getLogger(name=None):
    """
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    """
    if not name or isinstance(name, str) and name == root.name:
        return root
    return Logger.manager.getLogger(name)

def critical(msg, *args, **kwargs):
    """
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.critical(msg, *args, **kwargs)

def fatal(msg, *args, **kwargs):
    """
    Don't use this function, use critical() instead.
    """
    critical(msg, *args, **kwargs)

def error(msg, *args, **kwargs):
    """
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.error(msg, *args, **kwargs)

def exception(msg, *args, exc_info=True, **kwargs):
    """
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    """
    error(msg, *args, exc_info=exc_info, **kwargs)

def warning(msg, *args, **kwargs):
    """
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.warning(msg, *args, **kwargs)

def warn(msg, *args, **kwargs):
    warnings.warn("The 'warn' function is deprecated, "
        "use 'warning' instead", DeprecationWarning, 2)
    warning(msg, *args, **kwargs)

def info(msg, *args, **kwargs):
    """
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.info(msg, *args, **kwargs)

def debug(msg, *args, **kwargs):
    """
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.debug(msg, *args, **kwargs)

def log(level, msg, *args, **kwargs):
    """
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    """
    if len(root.handlers) == 0:
        basicConfig()
    root.log(level, msg, *args, **kwargs)

def disable(level=CRITICAL):
    """
    Disable all logging calls of severity 'level' and below.
    """
    root.manager.disable = level
    root.manager._clear_cache()

def shutdown(handlerList=_handlerList):
    """
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    """
    for wr in reversed(handlerList[:]):
        #errors might occur, for example, if files are locked
        #we just ignore them if raiseExceptions is not set
        try:
            h = wr()
            if h:
                try:
                    h.acquire()
                    h.flush()
                    h.close()
                except (OSError, ValueError):
                    # Ignore errors which might be caused
                    # because handlers have been closed but
                    # references to them are still around at
                    # application exit.
                    pass
                finally:
                    h.release()
        except: # ignore everything, as we're shutting down
            if raiseExceptions:
                raise
            #else, swallow

#Let's try and shutdown automatically on application exit...
import atexit
atexit.register(shutdown)

# Null handler

class NullHandler(Handler):
    """
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    """
    def handle(self, record):
        """Stub."""

    def emit(self, record):
        """Stub."""

    def createLock(self):
        self.lock = None

    def _at_fork_reinit(self):
        pass

# Warnings integration

_warnings_showwarning = None

def _showwarning(message, category, filename, lineno, file=None, line=None):
    """
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    """
    if file is not None:
        if _warnings_showwarning is not None:
            _warnings_showwarning(message, category, filename, lineno, file, line)
    else:
        s = warnings.formatwarning(message, category, filename, lineno, line)
        logger = getLogger("py.warnings")
        if not logger.handlers:
            logger.addHandler(NullHandler())
        # bpo-46557: Log str(s) as msg instead of logger.warning("%s", s)
        # since some log aggregation tools group logs by the msg arg
        logger.warning(str(s))

def captureWarnings(capture):
    """
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    """
    global _warnings_showwarning
    if capture:
        if _warnings_showwarning is None:
            _warnings_showwarning = warnings.showwarning
            warnings.showwarning = _showwarning
    else:
        if _warnings_showwarning is not None:
            warnings.showwarning = _warnings_showwarning
            _warnings_showwarning = None
PK�]��ú����	config.pynu�[���# Copyright 2001-2023 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the name of Vinay Sajip
# not be used in advertising or publicity pertaining to distribution
# of the software without specific, written prior permission.
# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

"""
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2023 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
"""

import errno
import io
import logging
import logging.handlers
import os
import queue
import re
import struct
import threading
import traceback

from socketserver import ThreadingTCPServer, StreamRequestHandler


DEFAULT_LOGGING_CONFIG_PORT = 9030

RESET_ERROR = errno.ECONNRESET

#
#   The following code implements a socket listener for on-the-fly
#   reconfiguration of logging.
#
#   _listener holds the server object doing the listening
_listener = None

def fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=None):
    """
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    """
    import configparser

    if isinstance(fname, str):
        if not os.path.exists(fname):
            raise FileNotFoundError(f"{fname} doesn't exist")
        elif not os.path.getsize(fname):
            raise RuntimeError(f'{fname} is an empty file')

    if isinstance(fname, configparser.RawConfigParser):
        cp = fname
    else:
        try:
            cp = configparser.ConfigParser(defaults)
            if hasattr(fname, 'readline'):
                cp.read_file(fname)
            else:
                encoding = io.text_encoding(encoding)
                cp.read(fname, encoding=encoding)
        except configparser.ParsingError as e:
            raise RuntimeError(f'{fname} is invalid: {e}')

    formatters = _create_formatters(cp)

    # critical section
    logging._acquireLock()
    try:
        _clearExistingHandlers()

        # Handlers add themselves to logging._handlers
        handlers = _install_handlers(cp, formatters)
        _install_loggers(cp, handlers, disable_existing_loggers)
    finally:
        logging._releaseLock()


def _resolve(name):
    """Resolve a dotted name to a global object."""
    name = name.split('.')
    used = name.pop(0)
    found = __import__(used)
    for n in name:
        used = used + '.' + n
        try:
            found = getattr(found, n)
        except AttributeError:
            __import__(used)
            found = getattr(found, n)
    return found

def _strip_spaces(alist):
    return map(str.strip, alist)

def _create_formatters(cp):
    """Create and return formatters"""
    flist = cp["formatters"]["keys"]
    if not len(flist):
        return {}
    flist = flist.split(",")
    flist = _strip_spaces(flist)
    formatters = {}
    for form in flist:
        sectname = "formatter_%s" % form
        fs = cp.get(sectname, "format", raw=True, fallback=None)
        dfs = cp.get(sectname, "datefmt", raw=True, fallback=None)
        stl = cp.get(sectname, "style", raw=True, fallback='%')
        c = logging.Formatter
        class_name = cp[sectname].get("class")
        if class_name:
            c = _resolve(class_name)
        f = c(fs, dfs, stl)
        formatters[form] = f
    return formatters


def _install_handlers(cp, formatters):
    """Install and return handlers"""
    hlist = cp["handlers"]["keys"]
    if not len(hlist):
        return {}
    hlist = hlist.split(",")
    hlist = _strip_spaces(hlist)
    handlers = {}
    fixups = [] #for inter-handler references
    for hand in hlist:
        section = cp["handler_%s" % hand]
        klass = section["class"]
        fmt = section.get("formatter", "")
        try:
            klass = eval(klass, vars(logging))
        except (AttributeError, NameError):
            klass = _resolve(klass)
        args = section.get("args", '()')
        args = eval(args, vars(logging))
        kwargs = section.get("kwargs", '{}')
        kwargs = eval(kwargs, vars(logging))
        h = klass(*args, **kwargs)
        h.name = hand
        if "level" in section:
            level = section["level"]
            h.setLevel(level)
        if len(fmt):
            h.setFormatter(formatters[fmt])
        if issubclass(klass, logging.handlers.MemoryHandler):
            target = section.get("target", "")
            if len(target): #the target handler may not be loaded yet, so keep for later...
                fixups.append((h, target))
        handlers[hand] = h
    #now all handlers are loaded, fixup inter-handler references...
    for h, t in fixups:
        h.setTarget(handlers[t])
    return handlers

def _handle_existing_loggers(existing, child_loggers, disable_existing):
    """
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    """
    root = logging.root
    for log in existing:
        logger = root.manager.loggerDict[log]
        if log in child_loggers:
            if not isinstance(logger, logging.PlaceHolder):
                logger.setLevel(logging.NOTSET)
                logger.handlers = []
                logger.propagate = True
        else:
            logger.disabled = disable_existing

def _install_loggers(cp, handlers, disable_existing):
    """Create and install loggers"""

    # configure the root first
    llist = cp["loggers"]["keys"]
    llist = llist.split(",")
    llist = list(_strip_spaces(llist))
    llist.remove("root")
    section = cp["logger_root"]
    root = logging.root
    log = root
    if "level" in section:
        level = section["level"]
        log.setLevel(level)
    for h in root.handlers[:]:
        root.removeHandler(h)
    hlist = section["handlers"]
    if len(hlist):
        hlist = hlist.split(",")
        hlist = _strip_spaces(hlist)
        for hand in hlist:
            log.addHandler(handlers[hand])

    #and now the others...
    #we don't want to lose the existing loggers,
    #since other threads may have pointers to them.
    #existing is set to contain all existing loggers,
    #and as we go through the new configuration we
    #remove any which are configured. At the end,
    #what's left in existing is the set of loggers
    #which were in the previous configuration but
    #which are not in the new configuration.
    existing = list(root.manager.loggerDict.keys())
    #The list needs to be sorted so that we can
    #avoid disabling child loggers of explicitly
    #named loggers. With a sorted list it is easier
    #to find the child loggers.
    existing.sort()
    #We'll keep the list of existing loggers
    #which are children of named loggers here...
    child_loggers = []
    #now set up the new ones...
    for log in llist:
        section = cp["logger_%s" % log]
        qn = section["qualname"]
        propagate = section.getint("propagate", fallback=1)
        logger = logging.getLogger(qn)
        if qn in existing:
            i = existing.index(qn) + 1 # start with the entry after qn
            prefixed = qn + "."
            pflen = len(prefixed)
            num_existing = len(existing)
            while i < num_existing:
                if existing[i][:pflen] == prefixed:
                    child_loggers.append(existing[i])
                i += 1
            existing.remove(qn)
        if "level" in section:
            level = section["level"]
            logger.setLevel(level)
        for h in logger.handlers[:]:
            logger.removeHandler(h)
        logger.propagate = propagate
        logger.disabled = 0
        hlist = section["handlers"]
        if len(hlist):
            hlist = hlist.split(",")
            hlist = _strip_spaces(hlist)
            for hand in hlist:
                logger.addHandler(handlers[hand])

    #Disable any old loggers. There's no point deleting
    #them as other threads may continue to hold references
    #and by disabling them, you stop them doing any logging.
    #However, don't disable children of named loggers, as that's
    #probably not what was intended by the user.
    #for log in existing:
    #    logger = root.manager.loggerDict[log]
    #    if log in child_loggers:
    #        logger.level = logging.NOTSET
    #        logger.handlers = []
    #        logger.propagate = 1
    #    elif disable_existing_loggers:
    #        logger.disabled = 1
    _handle_existing_loggers(existing, child_loggers, disable_existing)


def _clearExistingHandlers():
    """Clear and close existing handlers"""
    logging._handlers.clear()
    logging.shutdown(logging._handlerList[:])
    del logging._handlerList[:]


IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I)


def valid_ident(s):
    m = IDENTIFIER.match(s)
    if not m:
        raise ValueError('Not a valid Python identifier: %r' % s)
    return True


class ConvertingMixin(object):
    """For ConvertingXXX's, this mixin class provides common functions"""

    def convert_with_key(self, key, value, replace=True):
        result = self.configurator.convert(value)
        #If the converted value is different, save for next time
        if value is not result:
            if replace:
                self[key] = result
            if type(result) in (ConvertingDict, ConvertingList,
                               ConvertingTuple):
                result.parent = self
                result.key = key
        return result

    def convert(self, value):
        result = self.configurator.convert(value)
        if value is not result:
            if type(result) in (ConvertingDict, ConvertingList,
                               ConvertingTuple):
                result.parent = self
        return result


# The ConvertingXXX classes are wrappers around standard Python containers,
# and they serve to convert any suitable values in the container. The
# conversion converts base dicts, lists and tuples to their wrapped
# equivalents, whereas strings which match a conversion format are converted
# appropriately.
#
# Each wrapper should have a configurator attribute holding the actual
# configurator to use for conversion.

class ConvertingDict(dict, ConvertingMixin):
    """A converting dictionary wrapper."""

    def __getitem__(self, key):
        value = dict.__getitem__(self, key)
        return self.convert_with_key(key, value)

    def get(self, key, default=None):
        value = dict.get(self, key, default)
        return self.convert_with_key(key, value)

    def pop(self, key, default=None):
        value = dict.pop(self, key, default)
        return self.convert_with_key(key, value, replace=False)

class ConvertingList(list, ConvertingMixin):
    """A converting list wrapper."""
    def __getitem__(self, key):
        value = list.__getitem__(self, key)
        return self.convert_with_key(key, value)

    def pop(self, idx=-1):
        value = list.pop(self, idx)
        return self.convert(value)

class ConvertingTuple(tuple, ConvertingMixin):
    """A converting tuple wrapper."""
    def __getitem__(self, key):
        value = tuple.__getitem__(self, key)
        # Can't replace a tuple entry.
        return self.convert_with_key(key, value, replace=False)

class BaseConfigurator(object):
    """
    The configurator base class which defines some useful defaults.
    """

    CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$')

    WORD_PATTERN = re.compile(r'^\s*(\w+)\s*')
    DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*')
    INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*')
    DIGIT_PATTERN = re.compile(r'^\d+$')

    value_converters = {
        'ext' : 'ext_convert',
        'cfg' : 'cfg_convert',
    }

    # We might want to use a different one, e.g. importlib
    importer = staticmethod(__import__)

    def __init__(self, config):
        self.config = ConvertingDict(config)
        self.config.configurator = self

    def resolve(self, s):
        """
        Resolve strings to objects using standard import and attribute
        syntax.
        """
        name = s.split('.')
        used = name.pop(0)
        try:
            found = self.importer(used)
            for frag in name:
                used += '.' + frag
                try:
                    found = getattr(found, frag)
                except AttributeError:
                    self.importer(used)
                    found = getattr(found, frag)
            return found
        except ImportError as e:
            v = ValueError('Cannot resolve %r: %s' % (s, e))
            raise v from e

    def ext_convert(self, value):
        """Default converter for the ext:// protocol."""
        return self.resolve(value)

    def cfg_convert(self, value):
        """Default converter for the cfg:// protocol."""
        rest = value
        m = self.WORD_PATTERN.match(rest)
        if m is None:
            raise ValueError("Unable to convert %r" % value)
        else:
            rest = rest[m.end():]
            d = self.config[m.groups()[0]]
            #print d, rest
            while rest:
                m = self.DOT_PATTERN.match(rest)
                if m:
                    d = d[m.groups()[0]]
                else:
                    m = self.INDEX_PATTERN.match(rest)
                    if m:
                        idx = m.groups()[0]
                        if not self.DIGIT_PATTERN.match(idx):
                            d = d[idx]
                        else:
                            try:
                                n = int(idx) # try as number first (most likely)
                                d = d[n]
                            except TypeError:
                                d = d[idx]
                if m:
                    rest = rest[m.end():]
                else:
                    raise ValueError('Unable to convert '
                                     '%r at %r' % (value, rest))
        #rest should be empty
        return d

    def convert(self, value):
        """
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        """
        if not isinstance(value, ConvertingDict) and isinstance(value, dict):
            value = ConvertingDict(value)
            value.configurator = self
        elif not isinstance(value, ConvertingList) and isinstance(value, list):
            value = ConvertingList(value)
            value.configurator = self
        elif not isinstance(value, ConvertingTuple) and\
                 isinstance(value, tuple) and not hasattr(value, '_fields'):
            value = ConvertingTuple(value)
            value.configurator = self
        elif isinstance(value, str): # str for py3k
            m = self.CONVERT_PATTERN.match(value)
            if m:
                d = m.groupdict()
                prefix = d['prefix']
                converter = self.value_converters.get(prefix, None)
                if converter:
                    suffix = d['suffix']
                    converter = getattr(self, converter)
                    value = converter(suffix)
        return value

    def configure_custom(self, config):
        """Configure an object with a user-supplied factory."""
        c = config.pop('()')
        if not callable(c):
            c = self.resolve(c)
        # Check for valid identifiers
        kwargs = {k: config[k] for k in config if (k != '.' and valid_ident(k))}
        result = c(**kwargs)
        props = config.pop('.', None)
        if props:
            for name, value in props.items():
                setattr(result, name, value)
        return result

    def as_tuple(self, value):
        """Utility function which converts lists to tuples."""
        if isinstance(value, list):
            value = tuple(value)
        return value

class DictConfigurator(BaseConfigurator):
    """
    Configure logging using a dictionary-like object to describe the
    configuration.
    """

    def configure(self):
        """Do the configuration."""

        config = self.config
        if 'version' not in config:
            raise ValueError("dictionary doesn't specify a version")
        if config['version'] != 1:
            raise ValueError("Unsupported version: %s" % config['version'])
        incremental = config.pop('incremental', False)
        EMPTY_DICT = {}
        logging._acquireLock()
        try:
            if incremental:
                handlers = config.get('handlers', EMPTY_DICT)
                for name in handlers:
                    if name not in logging._handlers:
                        raise ValueError('No handler found with '
                                         'name %r'  % name)
                    else:
                        try:
                            handler = logging._handlers[name]
                            handler_config = handlers[name]
                            level = handler_config.get('level', None)
                            if level:
                                handler.setLevel(logging._checkLevel(level))
                        except Exception as e:
                            raise ValueError('Unable to configure handler '
                                             '%r' % name) from e
                loggers = config.get('loggers', EMPTY_DICT)
                for name in loggers:
                    try:
                        self.configure_logger(name, loggers[name], True)
                    except Exception as e:
                        raise ValueError('Unable to configure logger '
                                         '%r' % name) from e
                root = config.get('root', None)
                if root:
                    try:
                        self.configure_root(root, True)
                    except Exception as e:
                        raise ValueError('Unable to configure root '
                                         'logger') from e
            else:
                disable_existing = config.pop('disable_existing_loggers', True)

                _clearExistingHandlers()

                # Do formatters first - they don't refer to anything else
                formatters = config.get('formatters', EMPTY_DICT)
                for name in formatters:
                    try:
                        formatters[name] = self.configure_formatter(
                                                            formatters[name])
                    except Exception as e:
                        raise ValueError('Unable to configure '
                                         'formatter %r' % name) from e
                # Next, do filters - they don't refer to anything else, either
                filters = config.get('filters', EMPTY_DICT)
                for name in filters:
                    try:
                        filters[name] = self.configure_filter(filters[name])
                    except Exception as e:
                        raise ValueError('Unable to configure '
                                         'filter %r' % name) from e

                # Next, do handlers - they refer to formatters and filters
                # As handlers can refer to other handlers, sort the keys
                # to allow a deterministic order of configuration
                handlers = config.get('handlers', EMPTY_DICT)
                deferred = []
                for name in sorted(handlers):
                    try:
                        handler = self.configure_handler(handlers[name])
                        handler.name = name
                        handlers[name] = handler
                    except Exception as e:
                        if 'target not configured yet' in str(e.__cause__):
                            deferred.append(name)
                        else:
                            raise ValueError('Unable to configure handler '
                                             '%r' % name) from e

                # Now do any that were deferred
                for name in deferred:
                    try:
                        handler = self.configure_handler(handlers[name])
                        handler.name = name
                        handlers[name] = handler
                    except Exception as e:
                        raise ValueError('Unable to configure handler '
                                         '%r' % name) from e

                # Next, do loggers - they refer to handlers and filters

                #we don't want to lose the existing loggers,
                #since other threads may have pointers to them.
                #existing is set to contain all existing loggers,
                #and as we go through the new configuration we
                #remove any which are configured. At the end,
                #what's left in existing is the set of loggers
                #which were in the previous configuration but
                #which are not in the new configuration.
                root = logging.root
                existing = list(root.manager.loggerDict.keys())
                #The list needs to be sorted so that we can
                #avoid disabling child loggers of explicitly
                #named loggers. With a sorted list it is easier
                #to find the child loggers.
                existing.sort()
                #We'll keep the list of existing loggers
                #which are children of named loggers here...
                child_loggers = []
                #now set up the new ones...
                loggers = config.get('loggers', EMPTY_DICT)
                for name in loggers:
                    if name in existing:
                        i = existing.index(name) + 1 # look after name
                        prefixed = name + "."
                        pflen = len(prefixed)
                        num_existing = len(existing)
                        while i < num_existing:
                            if existing[i][:pflen] == prefixed:
                                child_loggers.append(existing[i])
                            i += 1
                        existing.remove(name)
                    try:
                        self.configure_logger(name, loggers[name])
                    except Exception as e:
                        raise ValueError('Unable to configure logger '
                                         '%r' % name) from e

                #Disable any old loggers. There's no point deleting
                #them as other threads may continue to hold references
                #and by disabling them, you stop them doing any logging.
                #However, don't disable children of named loggers, as that's
                #probably not what was intended by the user.
                #for log in existing:
                #    logger = root.manager.loggerDict[log]
                #    if log in child_loggers:
                #        logger.level = logging.NOTSET
                #        logger.handlers = []
                #        logger.propagate = True
                #    elif disable_existing:
                #        logger.disabled = True
                _handle_existing_loggers(existing, child_loggers,
                                         disable_existing)

                # And finally, do the root logger
                root = config.get('root', None)
                if root:
                    try:
                        self.configure_root(root)
                    except Exception as e:
                        raise ValueError('Unable to configure root '
                                         'logger') from e
        finally:
            logging._releaseLock()

    def configure_formatter(self, config):
        """Configure a formatter from a dictionary."""
        if '()' in config:
            factory = config['()'] # for use in exception handler
            try:
                result = self.configure_custom(config)
            except TypeError as te:
                if "'format'" not in str(te):
                    raise
                #Name of parameter changed from fmt to format.
                #Retry with old name.
                #This is so that code can be used with older Python versions
                #(e.g. by Django)
                config['fmt'] = config.pop('format')
                config['()'] = factory
                result = self.configure_custom(config)
        else:
            fmt = config.get('format', None)
            dfmt = config.get('datefmt', None)
            style = config.get('style', '%')
            cname = config.get('class', None)

            if not cname:
                c = logging.Formatter
            else:
                c = _resolve(cname)

            # A TypeError would be raised if "validate" key is passed in with a formatter callable
            # that does not accept "validate" as a parameter
            if 'validate' in config:  # if user hasn't mentioned it, the default will be fine
                result = c(fmt, dfmt, style, config['validate'])
            else:
                result = c(fmt, dfmt, style)

        return result

    def configure_filter(self, config):
        """Configure a filter from a dictionary."""
        if '()' in config:
            result = self.configure_custom(config)
        else:
            name = config.get('name', '')
            result = logging.Filter(name)
        return result

    def add_filters(self, filterer, filters):
        """Add filters to a filterer from a list of names."""
        for f in filters:
            try:
                if callable(f) or callable(getattr(f, 'filter', None)):
                    filter_ = f
                else:
                    filter_ = self.config['filters'][f]
                filterer.addFilter(filter_)
            except Exception as e:
                raise ValueError('Unable to add filter %r' % f) from e

    def configure_handler(self, config):
        """Configure a handler from a dictionary."""
        config_copy = dict(config)  # for restoring in case of error
        formatter = config.pop('formatter', None)
        if formatter:
            try:
                formatter = self.config['formatters'][formatter]
            except Exception as e:
                raise ValueError('Unable to set formatter '
                                 '%r' % formatter) from e
        level = config.pop('level', None)
        filters = config.pop('filters', None)
        if '()' in config:
            c = config.pop('()')
            if not callable(c):
                c = self.resolve(c)
            factory = c
        else:
            cname = config.pop('class')
            klass = self.resolve(cname)
            #Special case for handler which refers to another handler
            if issubclass(klass, logging.handlers.MemoryHandler) and\
                'target' in config:
                try:
                    th = self.config['handlers'][config['target']]
                    if not isinstance(th, logging.Handler):
                        config.update(config_copy)  # restore for deferred cfg
                        raise TypeError('target not configured yet')
                    config['target'] = th
                except Exception as e:
                    raise ValueError('Unable to set target handler '
                                     '%r' % config['target']) from e
            elif issubclass(klass, logging.handlers.SMTPHandler) and\
                'mailhost' in config:
                config['mailhost'] = self.as_tuple(config['mailhost'])
            elif issubclass(klass, logging.handlers.SysLogHandler) and\
                'address' in config:
                config['address'] = self.as_tuple(config['address'])
            factory = klass
        kwargs = {k: config[k] for k in config if (k != '.' and valid_ident(k))}
        try:
            result = factory(**kwargs)
        except TypeError as te:
            if "'stream'" not in str(te):
                raise
            #The argument name changed from strm to stream
            #Retry with old name.
            #This is so that code can be used with older Python versions
            #(e.g. by Django)
            kwargs['strm'] = kwargs.pop('stream')
            result = factory(**kwargs)
        if formatter:
            result.setFormatter(formatter)
        if level is not None:
            result.setLevel(logging._checkLevel(level))
        if filters:
            self.add_filters(result, filters)
        props = config.pop('.', None)
        if props:
            for name, value in props.items():
                setattr(result, name, value)
        return result

    def add_handlers(self, logger, handlers):
        """Add handlers to a logger from a list of names."""
        for h in handlers:
            try:
                logger.addHandler(self.config['handlers'][h])
            except Exception as e:
                raise ValueError('Unable to add handler %r' % h) from e

    def common_logger_config(self, logger, config, incremental=False):
        """
        Perform configuration which is common to root and non-root loggers.
        """
        level = config.get('level', None)
        if level is not None:
            logger.setLevel(logging._checkLevel(level))
        if not incremental:
            #Remove any existing handlers
            for h in logger.handlers[:]:
                logger.removeHandler(h)
            handlers = config.get('handlers', None)
            if handlers:
                self.add_handlers(logger, handlers)
            filters = config.get('filters', None)
            if filters:
                self.add_filters(logger, filters)

    def configure_logger(self, name, config, incremental=False):
        """Configure a non-root logger from a dictionary."""
        logger = logging.getLogger(name)
        self.common_logger_config(logger, config, incremental)
        logger.disabled = False
        propagate = config.get('propagate', None)
        if propagate is not None:
            logger.propagate = propagate

    def configure_root(self, config, incremental=False):
        """Configure a root logger from a dictionary."""
        root = logging.getLogger()
        self.common_logger_config(root, config, incremental)

dictConfigClass = DictConfigurator

def dictConfig(config):
    """Configure logging using a dictionary."""
    dictConfigClass(config).configure()


def listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None):
    """
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    """

    class ConfigStreamHandler(StreamRequestHandler):
        """
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        """
        def handle(self):
            """
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            """
            try:
                conn = self.connection
                chunk = conn.recv(4)
                if len(chunk) == 4:
                    slen = struct.unpack(">L", chunk)[0]
                    chunk = self.connection.recv(slen)
                    while len(chunk) < slen:
                        chunk = chunk + conn.recv(slen - len(chunk))
                    if self.server.verify is not None:
                        chunk = self.server.verify(chunk)
                    if chunk is not None:   # verified, can process
                        chunk = chunk.decode("utf-8")
                        try:
                            import json
                            d =json.loads(chunk)
                            assert isinstance(d, dict)
                            dictConfig(d)
                        except Exception:
                            #Apply new configuration.

                            file = io.StringIO(chunk)
                            try:
                                fileConfig(file)
                            except Exception:
                                traceback.print_exc()
                    if self.server.ready:
                        self.server.ready.set()
            except OSError as e:
                if e.errno != RESET_ERROR:
                    raise

    class ConfigSocketReceiver(ThreadingTCPServer):
        """
        A simple TCP socket-based logging config receiver.
        """

        allow_reuse_address = 1

        def __init__(self, host='localhost', port=DEFAULT_LOGGING_CONFIG_PORT,
                     handler=None, ready=None, verify=None):
            ThreadingTCPServer.__init__(self, (host, port), handler)
            logging._acquireLock()
            self.abort = 0
            logging._releaseLock()
            self.timeout = 1
            self.ready = ready
            self.verify = verify

        def serve_until_stopped(self):
            import select
            abort = 0
            while not abort:
                rd, wr, ex = select.select([self.socket.fileno()],
                                           [], [],
                                           self.timeout)
                if rd:
                    self.handle_request()
                logging._acquireLock()
                abort = self.abort
                logging._releaseLock()
            self.server_close()

    class Server(threading.Thread):

        def __init__(self, rcvr, hdlr, port, verify):
            super(Server, self).__init__()
            self.rcvr = rcvr
            self.hdlr = hdlr
            self.port = port
            self.verify = verify
            self.ready = threading.Event()

        def run(self):
            server = self.rcvr(port=self.port, handler=self.hdlr,
                               ready=self.ready,
                               verify=self.verify)
            if self.port == 0:
                self.port = server.server_address[1]
            self.ready.set()
            global _listener
            logging._acquireLock()
            _listener = server
            logging._releaseLock()
            server.serve_until_stopped()

    return Server(ConfigSocketReceiver, ConfigStreamHandler, port, verify)

def stopListening():
    """
    Stop the listening server which was created with a call to listen().
    """
    global _listener
    logging._acquireLock()
    try:
        if _listener:
            _listener.abort = 1
            _listener = None
    finally:
        logging._releaseLock()
PK�]6B�;����$__pycache__/__init__.cpython-311.pycnu�[����

Ħ�=�v�����dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ddlmZddl
mZddl
mZgd�ZddlZdZdZd	Zd
Zej��ZdZdZdZdZdZeZd
ZdZeZ dZ!dZ"dZ#ededede!de"de#diZ$eeeeee!e"e#d�Z%d�Z&d�Z'd�Z(e)ed��rd�Z*nd�Z*ej+�,e(j-j.��Z/d�Z0d�Z1ej2��Z3d �Z4d!�Z5e)ed"��sd#�Z6n(ej7��Z8d$�Z6d%�Z9ej:e4e9e5�&��Gd'�d(e;��Z<e<a=d)�Z>d*�Z?d+�Z@e��ZA[Gd,�d-e;��ZBGd.�d/eB��ZCGd0�d1eB��ZDd2ZEeBeEfeCd3feDd4fd5�ZFGd6�d7e;��Ze��ZGGd8�d9e;��ZHGd:�d;e;��ZIGd<�d=e;��ZJejK��ZLgZMd>�ZNd?�ZOGd@�dAeJ��ZPGdB�dCeP��ZQGdD�dEeQ��ZRGdF�dGeQ��ZSeSe��ZTeTZUGdH�dIe;��ZVdJ�ZWdK�ZXGdL�dMe;��ZYGdN�dOeJ��ZZGdP�dQeZ��Z[eZa\GdR�dSe;��Z]e[e��Z^e^eZ_^eYeZj^��eZ__dT�Z`dfdU�ZadV�ZbdW�ZcdX�ZdddY�dZ�Zed[�Zfd\�Zgd]�Zhd^�Zid_�Zjefd`�ZkeMfda�ZlddlmZmemjnel��Gdb�dceP��Zodapdgdd�Zqde�ZrdS)hz�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�GenericAlias)�Template)�	Formatter)+�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filterr�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptions�getLevelNamesMappingz&Vinay Sajip <vinay_sajip@red-dove.com>�
productionz0.5.1.2z07 February 2010T�2�(���
rr
rrr	r)rrr
rrrr	rc�4�t���S�N)�_nameToLevel�copy���;/opt/alt/python-internal/lib/python3.11/logging/__init__.pyr/r/xs�������r;c��t�|��}|�|St�|��}|�|Sd|zS)a�
    Return the textual or numeric representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    If a string representation of the level is passed in, the corresponding
    numeric value is returned.

    If no matching numeric or string value is passed in, the string
    'Level %s' % level is returned.
    NzLevel %s)�_levelToName�getr8)�level�results  r<r!r!{sK��&�
�
�e�
$�
$�F�
���
�
�
�
�e�
$�
$�F�
���
����r;c��t��	|t|<|t|<t��dS#t��wxYw)zy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N)�_acquireLockr>r8�_releaseLock)r@�	levelNames  r<rr�sA���N�N�N��'��U��"'��Y����������������s	�4�A�	_getframec�*�tjd��S)N�)�sysrFr:r;r<�<lambda>rJ�s��3�=��+�+�r;c�x�	t�#t$r&tj��djjcYSwxYw)z5Return the frame object for the caller's stack frame.�)�	ExceptionrI�exc_info�tb_frame�f_backr:r;r<�currentframerQ�sD��	5��O���	5�	5�	5��<�>�>�!�$�-�4�4�4�4�	5���s�	�-9�9c�z�tj�|jj��}|t
kpd|vod|vS)zASignal whether the frame is a CPython or logging module internal.�	importlib�
_bootstrap)�os�path�normcase�f_code�co_filename�_srcfile)�frame�filenames  r<�_is_internal_framer]�s@���w����� 8�9�9�H��x����x��<�L�H�$<�r;c���t|t��r|}nNt|��|kr)|tvrt	d|z���t|}ntd|�����|S)NzUnknown level: %rz(Level not an integer or a valid string: )�
isinstance�int�strr8�
ValueError�	TypeError)r@�rvs  r<�_checkLevelre�sz���%����$�
���	�U���u�	�	���$�$��0�5�8�9�9�9�
�%�
 ����i� �5�#�$�$�	$�
�Ir;c�J�trt���dSdS)z�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N)�_lock�acquirer:r;r<rCrC�s'��
��
�
�
�������r;c�J�trt���dSdS)zK
    Release the module-level lock acquired by calling _acquireLock().
    N)rg�releaser:r;r<rDrD�s'��
��
�
�
�������r;�register_at_forkc��dSr7r:��instances r<�_register_at_fork_reinit_lockro�����r;c��t��	t�|��t��dS#t��wxYwr7)rC�_at_fork_reinit_lock_weakset�addrDrms r<roros?������	�(�,�,�X�6�6�6��N�N�N�N�N��L�N�N�N�N���s	�:�A
c�t�tD]}|����t���dSr7)rr�_at_fork_reinitrg��handlers r<�!_after_at_fork_child_reinit_locksrxs@��3�	&�	&�G��#�#�%�%�%�%�	�������r;)�before�after_in_child�after_in_parentc�(�eZdZdZ	dd�Zd�Zd�ZdS)ra
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    Nc
���tj��}||_||_|rHt|��dkr5t	|dt
jj��r|dr|d}||_t|��|_
||_||_	tj�|��|_tj�|j��d|_n+#t&t(t*f$r||_d|_YnwxYw||_d|_|	|_||_||_||_t9|t9|��z
dz��dz|_|jt<z
dz|_t@r6tCj"��|_#tCj$��j|_%nd|_#d|_%tLsd|_'nXd|_'tPj)�*d��}|�0	|�+��j|_'n#tX$rYnwxYwtZr/t]td	��rtj/��|_0dSd|_0dS)
zK
        Initialize a logging record with interesting information.
        rHrzUnknown moduleNi�g�MainProcess�multiprocessing�getpid)1�time�name�msg�lenr_�collections�abc�Mapping�argsr!�	levelname�levelno�pathnamerUrV�basenamer\�splitext�modulercrb�AttributeErrorrN�exc_text�
stack_info�lineno�funcName�createdr`�msecs�
_startTime�relativeCreated�
logThreads�	threading�	get_ident�thread�current_thread�
threadName�logMultiprocessing�processNamerI�modulesr?�current_processrM�logProcesses�hasattrr��process)
�selfr�r@r�r�r�r�rN�func�sinfo�kwargs�ct�mps
             r<�__init__zLogRecord.__init__$s;��
�Y�[�[����	����&
�	�S��Y�Y�!�^�^�
�4��7�K�O�<S�(T�(T�^��Q��$���7�D���	�%�e�,�,������ ��
�	+��G�,�,�X�6�6�D�M��'�*�*�4�=�9�9�!�<�D�K�K���:�~�6�	+�	+�	+�$�D�M�*�D�K�K�K�	+����!��
���
���������
�����"�s�2�w�w�,�$�.�/�/�#�5��
� $��z� 9�T�A����	#�#�-�/�/�D�K�'�6�8�8�=�D�O�O��D�K�"�D�O�!�
	�#�D���,�D������!2�3�3�B��~�
�')�'9�'9�';�';�'@�D�$�$�� �����D������	 �G�B��1�1�	 ��9�;�;�D�L�L�L��D�L�L�Ls%�AC*�*%D�D�H"�"
H/�.H/c�X�d|j�d|j�d|j�d|j�d|j�d�S)Nz<LogRecord: �, z, "z">)r�r�r�r�r��r�s r<�__repr__zLogRecord.__repr__ls8���48�I�I�I�t�|�|�|��M�M�M�4�;�;�;�����2�	2r;c�P�t|j��}|jr
||jz}|S)z�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        )rar�r�)r�r�s  r<�
getMessagezLogRecord.getMessageps+���$�(�m�m���9�	"���	�/�C��
r;�NN)�__name__�
__module__�__qualname__�__doc__r�r�r�r:r;r<rrsZ������
�
�8<�F �F �F �F �P2�2�2�
�
�
�
�
r;rc�
�|adS)z�
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    N��_logRecordFactory)�factorys r<r,r,�s�� ���r;c��tS)zH
    Return the factory to be used when instantiating a log record.
    r�r:r;r<r+r+�s
��
�r;c
�f�tdddddddd��}|j�|��|S)z�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    N�rr:)r��__dict__�update)�dictrds  r<r&r&�s:��
�4��r�1�b�"�d�D�	A�	A�B��K���t����
�Ir;c�j�eZdZdZdZdZejdej��Z	dd�d�Z
d�Zd	�Zd
�Z
d�ZdS)�PercentStylez%(message)sz%(asctime)sz
%(asctime)z5%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]N��defaultsc�0�|p|j|_||_dSr7)�default_format�_fmt�	_defaults)r��fmtr�s   r<r�zPercentStyle.__init__�s���.�4�.��	�!����r;c�H�|j�|j��dkS)Nr�r��find�asctime_searchr�s r<�usesTimezPercentStyle.usesTime�s���y�~�~�d�1�2�2�a�7�7r;c��|j�|j��s&td|j�d|jd�d����dS)z>Validate the input format, ensure it matches the correct stylezInvalid format 'z' for 'rz' styleN)�validation_pattern�searchr�rbr�r�s r<�validatezPercentStyle.validate�sU���&�-�-�d�i�8�8�	i��*�T�Y�Y�Y�PT�Pc�de�Pf�Pf�Pf�g�h�h�h�	i�	ir;c�L�|jx}r||jz}n|j}|j|zSr7)r�r�r��r��recordr��valuess    r<�_formatzPercentStyle._format�s3���~�%�8�	%����/�F�F��_�F��y�6�!�!r;c�v�	|�|��S#t$r}td|z���d}~wwxYw)Nz(Formatting field not found in record: %s)r��KeyErrorrb)r�r��es   r<�formatzPercentStyle.format�sQ��	M��<�<��'�'�'���	M�	M�	M��G�!�K�L�L�L�����	M���s��
8�3�8)r�r�r�r��asctime_formatr��re�compile�Ir�r�r�r�r�r�r:r;r<r�r��s�������"�N�"�N�!�N�#���$\�^`�^b�c�c��(,�"�"�"�"�"�8�8�8�i�i�i�
"�"�"�M�M�M�M�Mr;r�c�r�eZdZdZdZdZejdej��Z	ejd��Z
d�Zd�ZdS)	�StrFormatStylez	{message}z	{asctime}z{asctimezF^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$z^(\d+|\w+)(\.\w+|\[[^]]+\])*$c�\�|jx}r||jz}n|j}|jjdi|��S�Nr:)r�r�r�r�r�s    r<r�zStrFormatStyle._format�sA���~�%�8�	%����/�F�F��_�F��t�y��)�)�&�)�)�)r;c���t��}	t�|j��D]�\}}}}|rA|j�|��st
d|z���|�|��|r|dvrt
d|z���|r,|j�|��st
d|z�����n$#t$r}t
d|z���d}~wwxYw|st
d���dS)zKValidate the input format, ensure it is the correct string formatting stylez!invalid field name/expression: %r�rsazinvalid conversion: %rzbad specifier: %rzinvalid format: %sN�invalid format: no fields)	�set�_str_formatter�parser��
field_spec�matchrbrs�fmt_spec)r��fields�_�	fieldname�spec�
conversionr�s       r<r�zStrFormatStyle.validate�s:������	7�2@�2F�2F�t�y�2Q�2Q�
A�
A�.��9�d�J��*��?�0�0��;�;�Z�(�)L�y�)X�Y�Y�Y��J�J�y�)�)�)��L�*�E�"9�"9�$�%=�
�%J�K�K�K��A��
� 3� 3�D� 9� 9�A�$�%8�4�%?�@�@�@��
A���	7�	7�	7��1�A�5�6�6�6�����	7�����	:��8�9�9�9�	:�	:s�B0C�
C"�C�C"N)
r�r�r�r�r�r�r�r�r�r�r�r�r�r:r;r<r�r��sk������ �N� �N��N��r�z�c�eg�ei�j�j�H����<�=�=�J�*�*�*�:�:�:�:�:r;r�c�<��eZdZdZdZdZ�fd�Zd�Zd�Zd�Z	�xZ
S)�StringTemplateStylez
${message}z
${asctime}c�l��t��j|i|��t|j��|_dSr7)�superr�rr��_tpl)r�r�r��	__class__s   �r<r�zStringTemplateStyle.__init__�s4��������$�)�&�)�)�)��T�Y�'�'��	�	�	r;c�~�|j}|�d��dkp|�|j��dkS)Nz$asctimerr��r�r�s  r<r�zStringTemplateStyle.usesTime�s9���i���x�x�
�#�#�q�(�N�C�H�H�T�5H�,I�,I�Q�,N�Nr;c��tj}t��}|�|j��D]�}|���}|dr|�|d���:|dr|�|d���^|�d��dkrtd�����|std���dS)N�named�bracedr�$z$invalid format: bare '$' not allowedr�)	r�patternr��finditerr��	groupdictrs�grouprb)r�r�r��m�ds     r<r�zStringTemplateStyle.validate�s����"�������!�!�$�)�,�,�	K�	K�A����
�
�A���z�
K��
�
�1�W�:�&�&�&�&��8��
K��
�
�1�X�;�'�'�'�'�������s�"�"� �!I�J�J�J�#��	:��8�9�9�9�	:�	:r;c�\�|jx}r||jz}n|j}|jjdi|��Sr�)r�r�r��
substituter�s    r<r�zStringTemplateStyle._formatsA���~�%�8�	%����/�F�F��_�F�#�t�y�#�-�-�f�-�-�-r;)r�r�r�r�r�r�r�r�r�r��
__classcell__)r�s@r<r�r��sw�������!�N�!�N�!�N�(�(�(�(�(�O�O�O�:�:�:�.�.�.�.�.�.�.r;r�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{r�c�\�eZdZdZejZddd�d�ZdZdZ	dd	�Z
d
�Zd�Zd�Z
d
�Zd�ZdS)ra�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    NrTr�c�:�|tvr<tdd�t�����z���t|d||���|_|r|j���|jj|_||_dS)a�
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        �Style must be one of: %s�,rr�N)�_STYLESrb�join�keys�_styler�r��datefmt)r�r�r�styler�r�s      r<r�zFormatter.__init__@s���"�����7�#�(�(�$�\�\�^�^�;-�;-�-�.�.�
.��e�n�Q�'��h�?�?�?����	#��K� � �"�"�"��K�$��	�����r;z%Y-%m-%d %H:%M:%Sz%s,%03dc���|�|j��}|rtj||��}n2tj|j|��}|jr|j||jfz}|S)a%
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        )�	converterr�r��strftime�default_time_format�default_msec_formatr�)r�r�rr��ss     r<�
formatTimezFormatter.formatTime^sl��$�^�^�F�N�
+�
+���	A��
�g�r�*�*�A�A��
�d�6��;�;�A��'�
A��,��6�<�/@�@���r;c��tj��}|d}tj|d|d|d|��|���}|���|dd�dkr
|dd�}|S)z�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        rLrrHN����
)�io�StringIO�	traceback�print_exception�getvalue�close)r��ei�sio�tbrs     r<�formatExceptionzFormatter.formatExceptionysx���k�m�m��
��U��	�!�"�Q�%��A���D�#�>�>�>��L�L�N�N���	�	�����R�S�S�6�T�>�>��#�2�#��A��r;c�4�|j���S)zK
        Check if the format uses the creation time of the record.
        )rr�r�s r<r�zFormatter.usesTime�s���{�#�#�%�%�%r;c�6�|j�|��Sr7)rr��r�r�s  r<�
formatMessagezFormatter.formatMessage�s���{�!�!�&�)�)�)r;c��|S)aU
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        r:)r�r�s  r<�formatStackzFormatter.formatStack�s
���r;c���|���|_|���r |�||j��|_|�|��}|jr&|js|�	|j��|_|jr|dd�dkr|dz}||jz}|j
r0|dd�dkr|dz}||�|j
��z}|S)az
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        rNr)r��messager�rr�asctimer*rNr�r&r�r,)r�r�rs   r<r�zFormatter.format�s��� �*�*�,�,����=�=�?�?�	C�!�_�_�V�T�\�B�B�F�N����v�&�&���?�	H��?�
H�"&�"6�"6�v��"G�"G����?�	$�����v��~�~���H���F�O�#�A���	8�����v��~�~���H���D�$�$�V�%6�7�7�7�A��r;)NNrTr7)r�r�r�r�r��	localtimerr�rrrr&r�r*r,r�r:r;r<rrs�������(�(�T��I��������6.��#������6���&&�&�&�*�*�*��������r;rc�,�eZdZdZdd�Zd�Zd�Zd�ZdS)rzB
    A formatter suitable for formatting a number of records.
    Nc�4�|r	||_dSt|_dS)zm
        Optionally specify a formatter which will be used to format each
        individual record.
        N)�linefmt�_defaultFormatter)r�r3s  r<r�zBufferingFormatter.__init__�s"��
�	-�"�D�L�L�L�,�D�L�L�Lr;c��dS)zE
        Return the header string for the specified records.
        r�r:�r��recordss  r<�formatHeaderzBufferingFormatter.formatHeader��	���rr;c��dS)zE
        Return the footer string for the specified records.
        r�r:r6s  r<�formatFooterzBufferingFormatter.formatFooter�r9r;c���d}t|��dkrR||�|��z}|D]}||j�|��z}� ||�|��z}|S)zQ
        Format the specified records and return the result as a string.
        r�r)r�r8r3r�r;)r�r7rdr�s    r<r�zBufferingFormatter.format�sz�����w�<�<�!����d�'�'��0�0�0�B�!�
6�
6���$�,�-�-�f�5�5�5����d�'�'��0�0�0�B��	r;r7)r�r�r�r�r�r8r;r�r:r;r<rr�s_��������-�-�-�-�������
�
�
�
�
r;rc� �eZdZdZdd�Zd�ZdS)r
a�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    r�c�<�||_t|��|_dS)z�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N)r�r��nlen�r�r�s  r<r�zFilter.__init__�s����	���I�I��	�	�	r;c���|jdkrdS|j|jkrdS|j�|jd|j��dkrdS|j|jdkS)z�
        Determine if the specified record is to be logged.

        Returns True if the record should be logged, or False otherwise.
        If deemed appropriate, the record may be modified in-place.
        rTF�.)r?r�r�r)s  r<�filterz
Filter.filtersd���9��>�>��4�
�Y�&�+�
%�
%��4�
�[�
�
�d�i��D�I�
6�
6�!�
;�
;��5���D�I�&�#�-�.r;N)r�)r�r�r�r�r�rCr:r;r<r
r
�sA������	�	�	�	�	�	�
/�
/�
/�
/�
/r;r
c�*�eZdZdZd�Zd�Zd�Zd�ZdS)�Filtererz[
    A base class for loggers and handlers which allows them to share
    common code.
    c��g|_dS)zE
        Initialize the list of filters to be an empty list.
        N)�filtersr�s r<r�zFilterer.__init__s������r;c�P�||jvr|j�|��dSdS)z;
        Add the specified filter to this handler.
        N)rG�append�r�rCs  r<�	addFilterzFilterer.addFilter!s5���$�,�&�&��L����'�'�'�'�'�'�&r;c�P�||jvr|j�|��dSdS)z@
        Remove the specified filter from this handler.
        N)rG�removerJs  r<�removeFilterzFilterer.removeFilter(s5���T�\�!�!��L����'�'�'�'�'�"�!r;c��d}|jD]9}t|d��r|�|��}n||��}|sd}n�:|S)ah
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        TrCF)rGr�rC)r�r�rd�frAs     r<rCzFilterer.filter/sj������	�	�A��q�(�#�#�
#����&�)�)�����6�����
�����
��	r;N)r�r�r�r�r�rKrNrCr:r;r<rErEsZ�����������(�(�(�(�(�(�����r;rEc���ttt}}}|rP|rP|rP|��	|�|��n#t$rYnwxYw|��dS#|��wxYwdSdSdS)zD
    Remove a handler reference from the internal cleanup list.
    N)rCrD�_handlerListrMrb)�wrrhrj�handlerss    r<�_removeHandlerRefrUMs���".�|�\�h�W�G���7��x����	�	�	�	��O�O�B�������	�	�	��D�	����
�G�I�I�I�I�I��G�G�I�I�I�I���������s&�=�A�
A
�A�	A
�
A�A%c���t��	t�tj|t
����t
��dS#t
��wxYw)zL
    Add a handler to the internal cleanup list using a weak reference.
    N)rCrRrI�weakref�refrUrDrvs r<�_addHandlerRefrY_sN���N�N�N�����G�K��1B�C�C�D�D�D���������������s�2A�A"c��eZdZdZefd�Zd�Zd�Zeee��Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�ZdS)raq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    c���t�|��d|_t|��|_d|_d|_t|��|���dS)zz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        NF)	rEr��_namerer@�	formatter�_closedrY�
createLock�r�r@s  r<r�zHandler.__init__rs`��
	���$������
� ��'�'��
��������t�����������r;c��|jSr7)r\r�s r<�get_namezHandler.get_name�s
���z�r;c���t��	|jtvr
t|j=||_|r
|t|<t��dS#t��wxYwr7)rCr\�	_handlersrDr@s  r<�set_namezHandler.set_name�sZ������	��z�Y�&�&��d�j�)��D�J��
'�"&�	�$���N�N�N�N�N��L�N�N�N�N���s�.A�Ac�T�tj��|_t|��dS)zU
        Acquire a thread lock for serializing access to the underlying I/O.
        N)r��RLock�lockror�s r<r_zHandler.createLock�s'���O�%�%��	�%�d�+�+�+�+�+r;c�8�|j���dSr7)rhrur�s r<ruzHandler._at_fork_reinit�s���	�!�!�#�#�#�#�#r;c�J�|jr|j���dSdS)z.
        Acquire the I/O thread lock.
        N)rhrhr�s r<rhzHandler.acquire��2���9�	 ��I��������	 �	 r;c�J�|jr|j���dSdS)z.
        Release the I/O thread lock.
        N)rhrjr�s r<rjzHandler.release�rkr;c�.�t|��|_dS)zX
        Set the logging level of this handler.  level must be an int or a str.
        N)rer@r`s  r<�setLevelzHandler.setLevel�s��!��'�'��
�
�
r;c�X�|jr|j}nt}|�|��S)z�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        )r]r4r�)r�r�r�s   r<r�zHandler.format�s.���>�	$��.�C�C�#�C��z�z�&�!�!�!r;c� �td���)z�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        z.emit must be implemented by Handler subclasses)�NotImplementedErrorr)s  r<�emitzHandler.emit�s��"�#:�;�;�	;r;c���|�|��}|rX|���	|�|��|���n#|���wxYw|S)a<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        )rCrhrrrj)r�r�rds   r<�handlezHandler.handle�sg���[�[��
 �
 ��
�	��L�L�N�N�N�
��	�	�&�!�!�!��������������������	s�A�A-c��||_dS)z5
        Set the formatter for this handler.
        N)r]r�s  r<�setFormatterzHandler.setFormatter�s������r;c��dS)z�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        Nr:r�s r<�flushz
Handler.flush�s	��	
�r;c��t��	d|_|jr|jtvr
t|j=t	��dS#t	��wxYw)a%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        TN)rCr^r\rdrDr�s r<r"z
Handler.close�sT��	����	��D�L��z�
*�d�j�I�5�5��d�j�)��N�N�N�N�N��L�N�N�N�N���s�)A	�	Ac���t�r�tj�r�tj��\}}}	tj�d��tj|||dtj��tj�d��|j}|rytj	�
|jj��tdkrA|j}|r8tj	�
|jj��tdk�A|r!tj|tj���n0tj�d|j�d|j�d���	tj�d	|j�d
|j�d���n9#t($r�t*$r"tj�d��YnwxYwn#t,$rYnwxYw~~~dS#~~~wxYwdSdS)aD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        z--- Logging error ---
NzCall stack:
r��filezLogged from file z, line rz	Message: z
Arguments: zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r.rI�stderrrN�writerr rOrUrV�dirnamerXrY�__path__rP�print_stackr\r�r�r��RecursionErrorrM�OSError)r�r��t�vr%r[s      r<�handleErrorzHandler.handleError�s3���!	�s�z�!	��|�~�~�H�A�q�"�
��
� � �!:�;�;�;��)�!�Q��D�#�*�E�E�E��
� � ��1�1�1�����)�������1I�!J�!J���{�"#�"#�!�L�E��)�������1I�!J�!J���{�"#�"#��F��)�%�c�j�A�A�A�A�A��J�$�$�$�%+�_�_�_�f�m�m�m�&E�F�F�F�
&��J�$�$�$�:@�*�*�*�:@�+�+�+�&G�H�H�H�H��&����� �&�&�&��J�$�$�&R�&�&�&�&�&�&������
�
�
�
���
�����q�"�"�"��A�q�"�����C!	�!	�!	�!	sN�D5G�$0F�G�3G�G�
G�G�G$�
G�G$�G�G$�$G)c�P�t|j��}d|jj�d|�d�S)N�<� (�)>)r!r@r�r�r`s  r<r�zHandler.__repr__'s-���T�Z�(�(���"�n�5�5�5�u�u�u�=�=r;N)r�r�r�r�rr�rbre�propertyr�r_rurhrjrnr�rrrtrvrxr"r�r�r:r;r<rris,��������$��������	�	�	��8�H�h�'�'�D�,�,�,�$�$�$� � � � � � �(�(�(�"�"�"�;�;�;����$���
�
�
����$-�-�-�^>�>�>�>�>r;rc�L�eZdZdZdZd	d�Zd�Zd�Zd�Zd�Z	e
e��ZdS)
rz�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    rNc�d�t�|��|�tj}||_dS)zb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N)rr�rIr}�stream�r�r�s  r<r�zStreamHandler.__init__4s/��	��������>��Z�F�����r;c���|���	|jr.t|jd��r|j���|���dS#|���wxYw)z%
        Flushes the stream.
        rxN)rhr�r�rxrjr�s r<rxzStreamHandler.flush?sj��	
������	��{�
$�w�t�{�G�<�<�
$���!�!�#�#�#��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�5A!�!A7c��	|�|��}|j}|�||jz��|���dS#t
$r�t$r|�|��YdSwxYw)a�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        N)r�r�r~�
terminatorrxr�rMr�)r�r�r�r�s    r<rrzStreamHandler.emitJs���		%��+�+�f�%�%�C��[�F��L�L��t��.�/�/�/��J�J�L�L�L�L�L���	�	�	���	%�	%�	%����V�$�$�$�$�$�$�	%���s�A
A�)A>�=A>c���||jurd}ne|j}|���	|���||_|���n#|���wxYw|S)z�
        Sets the StreamHandler's stream to the specified value,
        if it is different.

        Returns the old stream, if the stream was changed, or None
        if it wasn't.
        N)r�rhrxrj)r�r�rAs   r<�	setStreamzStreamHandler.setStream`sk���T�[� � ��F�F��[�F��L�L�N�N�N�
��
�
����$����������������������
s�A�A/c��t|j��}t|jdd��}t	|��}|r|dz
}d|jj�d|�d|�d�S)Nr�r�� r��(r�)r!r@�getattrr�rar�r�)r�r@r�s   r<r�zStreamHandler.__repr__tsa���T�Z�(�(���t�{�F�B�/�/���4�y�y���	��C�K�D�� $�� 7� 7� 7����u�u�u�E�Er;r7)
r�r�r�r�r�r�rxrrr�r��classmethodr�__class_getitem__r:r;r<rr+s����������J�	�	�	�	�	�	�	�%�%�%�,���(F�F�F�$��L�1�1���r;rc�2�eZdZdZd
d�Zd�Zd�Zd�Zd	�ZdS)rzO
    A handler class which writes formatted logging records to disk files.
    �aNFc��tj|��}tj�|��|_||_||_d|vrtj|��|_||_	||_
t|_|r#t�|��d|_dSt �||�����dS)zO
        Open the specified file and use it as the stream for logging.
        �bN)rU�fspathrV�abspath�baseFilename�mode�encodingr�
text_encoding�errors�delay�open�
_builtin_openrr�r�r�_open)r�r\r�r�r�r�s      r<r�zFileHandler.__init__�s���
�9�X�&�&���G�O�O�H�5�5�����	� ��
��d�?�?��,�X�6�6�D�M������
�"����	7�
���T�"�"�"��D�K�K�K��"�"�4������6�6�6�6�6r;c��|���		|jr�	|���|j}d|_t|d��r|���n8#|j}d|_t|d��r|���wwxYwt
�|��n#t
�|��wxYw	|���dS#|���wxYw)z$
        Closes the stream.
        Nr")rhr�rxr�r"rrjr�s  r<r"zFileHandler.close�s���	
������	�
*��;�+�+��
�
����!%���&*���"�6�7�3�3�+�"�L�L�N�N�N���"&���&*���"�6�7�3�3�+�"�L�L�N�N�N�N�+�����#�#�D�)�)�)�)��
�#�#�D�)�)�)�)����)��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s3�B9�A&�3B9�&5B�B9�C/�9C�C/�/Dc�V�|j}||j|j|j|j���S)zx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        �r�r�)r�r�r�r�r�)r��	open_funcs  r<r�zFileHandler._open�s;��
�&�	��y��*�D�I�"&�-���E�E�E�	Er;c��|j�+|jdks|js|���|_|jrt�||��dSdS)a-
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.

        If stream is not open, current mode is 'w' and `_closed=True`, record
        will not be emitted (see Issue #42378).
        N�w)r�r�r^r�rrrr)s  r<rrzFileHandler.emit�s_���;���y�C���t�|��"�j�j�l�l����;�	-����t�V�,�,�,�,�,�	-�	-r;c�`�t|j��}d|jj�d|j�d|�d�S�Nr�r�r�r�)r!r@r�r�r�r`s  r<r�zFileHandler.__repr__�s8���T�Z�(�(���!%��!8�!8�!8�$�:K�:K�:K�U�U�U�S�Sr;)r�NFN)	r�r�r�r�r�r"r�rrr�r:r;r<rr�sv��������7�7�7�7�6���0E�E�E�-�-�-� T�T�T�T�Tr;rc�2�eZdZdZefd�Zed���ZdS)�_StderrHandlerz�
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    c�<�t�||��dS)z)
        Initialize the handler.
        N)rr�r`s  r<r�z_StderrHandler.__init__�s ��	����u�%�%�%�%�%r;c��tjSr7)rIr}r�s r<r�z_StderrHandler.stream�s
���z�r;N)r�r�r�r�rr�r�r�r:r;r<r�r��sR��������
$�&�&�&�&�����X���r;r�c��eZdZdZd�Zd�ZdS)�PlaceHolderz�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    c��|di|_dS)zY
        Initialize with the specified logger being a child of this placeholder.
        N��	loggerMap�r��aloggers  r<r�zPlaceHolder.__init__�s��#�T�+����r;c�0�||jvrd|j|<dSdS)zJ
        Add the specified logger as a child of this placeholder.
        Nr�r�s  r<rIzPlaceHolder.append�s+���$�.�(�(�&*�D�N�7�#�#�#�)�(r;N)r�r�r�r�r�rIr:r;r<r�r��s<��������
,�,�,�+�+�+�+�+r;r�c�x�|tkr,t|t��std|jz���|adS)z�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    �(logger not derived from logging.Logger: N)r�
issubclassrcr��_loggerClass)�klasss r<r'r'sI��
�����%��(�(�	.��F�#�n�-�.�.�
.��L�L�Lr;c��tS)zB
    Return the class to be used when instantiating a logger.
    )r�r:r;r<r#r#s
���r;c�r�eZdZdZd�Zed���Zejd���Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
dS)�Managerzt
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    c�Z�||_d|_d|_i|_d|_d|_dS)zT
        Initialize the manager with the root node of the logger hierarchy.
        rFN)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)r��rootnodes  r<r�zManager.__init__s7����	����',��$������� $����r;c��|jSr7)�_disabler�s r<rzManager.disable's
���}�r;c�.�t|��|_dSr7)rer��r��values  r<rzManager.disable+s��#�E�*�*��
�
�
r;c�0�d}t|t��std���t��	||jvrx|j|}t|t
��rU|}|jpt|��}||_||j|<|�	||��|�
|��n=|jpt|��}||_||j|<|�
|��t��n#t��wxYw|S)a�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        NzA logger name must be a string)r_rarcrCr�r�r�r��manager�_fixupChildren�
_fixupParentsrD)r�r�rd�phs    r<r"zManager.getLogger/s�����$��$�$�	>��<�=�=�=�����	��t��&�&��_�T�*���b�+�.�.�+��B�:�$�*�:�l�D�A�A�B�!%�B�J�,.�D�O�D�)��'�'��B�/�/�/��&�&�r�*�*�*��6�d�&�6�,��=�=��!��
�(*����%��"�"�2�&�&�&��N�N�N�N��L�N�N�N�N�����	s�B>D�Dc��|tkr,t|t��std|jz���||_dS)zY
        Set the class to be used when instantiating a logger with this Manager.
        r�N)rr�rcr�r�)r�r�s  r<r'zManager.setLoggerClassQsL���F�?�?��e�V�,�,�
2�� J�"'�.�!1�2�2�2� ����r;c��||_dS)zg
        Set the factory to be used when instantiating a log record with this
        Manager.
        N)r�)r�r�s  r<r,zManager.setLogRecordFactory[s��
!(����r;c��|j}|�d��}d}|dkr�|s�|d|�}||jvrt|��|j|<nQ|j|}t	|t
��r|}n,t	|t��sJ�|�|��|�dd|dz
��}|dkr|��|s|j}||_dS)z�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        rBNrrH)	r��rfindr�r�r_rrIr��parent)r�r�r��ird�substr�objs       r<r�zManager._fixupParentsbs���
�|���J�J�s�O�O��
���1�u�u�b�u��"�1�"�X�F��T�_�,�,�*5�g�*>�*>����'�'��o�f�-���c�6�*�*�(��B�B�%�c�;�7�7�7�7�7��J�J�w�'�'�'��
�
�3��1�q�5�)�)�A��1�u�u�b�u��	���B�����r;c��|j}t|��}|j���D]-}|jjd|�|kr|j|_||_�.dS)zk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N)r�r�r�rr�)r�r�r�r��namelen�cs      r<r�zManager._fixupChildrenzsf��
�|���d�)�)����"�"�$�$�	#�	#�A��x�}�X�g�X�&�$�.�.�!"����"����		#�	#r;c��t��|j���D]0}t|t��r|j����1|jj���t��dS)zj
        Clear the cache for all loggers in loggerDict
        Called when level changes are made
        N)	rCr�r�r_r�_cache�clearr�rD�r��loggers  r<�_clear_cachezManager._clear_cache�su��	�����o�,�,�.�.�	&�	&�F��&�&�)�)�
&��
�#�#�%�%�%���	���� � � ������r;N)r�r�r�r�r�r�r�setterr"r'r,r�r�r�r:r;r<r�r�s���������	%�	%�	%�����X��
�^�+�+��^�+� � � �D!�!�!�(�(�(����0#�#�#�����r;r�c��eZdZdZefd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	d
�d�Zd�Z
d
�Zd�Zdd�Z	d d�Z		d!d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZdS)"rar
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    c��t�|��||_t|��|_d|_d|_g|_d|_i|_	dS)zJ
        Initialize the logger with a name and an optional level.
        NTF)
rEr�r�rer@r��	propagaterT�disabledr�)r�r�r@s   r<r�zLogger.__init__�sU��	���$������	� ��'�'��
���������
���
�����r;c�`�t|��|_|j���dS)zW
        Set the logging level of this logger.  level must be an int or a str.
        N)rer@r�r�r`s  r<rnzLogger.setLevel�s-��!��'�'��
���!�!�#�#�#�#�#r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=True)
        N)�isEnabledForr	�_log�r�r�r�r�s    r<rzLogger.debug��H�����U�#�#�	2��D�I�e�S�$�1�1�&�1�1�1�1�1�	2�	2r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=True)
        N)r�rr�r�s    r<r$zLogger.info�sH�����T�"�"�	1��D�I�d�C��0�0��0�0�0�0�0�	1�	1r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=True)
        N)r�rr�r�s    r<r*zLogger.warning�sH�����W�%�%�	4��D�I�g�s�D�3�3�F�3�3�3�3�3�	4�	4r;c�^�tjdtd��|j|g|�Ri|��dS�Nz6The 'warn' method is deprecated, use 'warning' insteadrL��warningsr)�DeprecationWarningr*r�s    r<r)zLogger.warn��H���
�$�%7��	<�	<�	<����S�*�4�*�*�*�6�*�*�*�*�*r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=True)
        N)r�r
r�r�s    r<rzLogger.error�r�r;T�rNc�,�|j|g|�Rd|i|��dS)zU
        Convenience method for logging an ERROR with exception information.
        rNN�r�r�r�rNr�r�s     r<rzLogger.exception�s1��	��
�3�;��;�;�;��;�F�;�;�;�;�;r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=True)
        N)r�rr�r�s    r<rzLogger.critical�sH�����X�&�&�	5��D�I�h��T�4�4�V�4�4�4�4�4�	5�	5r;c�(�|j|g|�Ri|��dS)z@
        Don't use this method, use critical() instead.
        N�rr�s    r<r zLogger.fatals,��	��
�c�+�D�+�+�+�F�+�+�+�+�+r;c��t|t��strtd���dS|�|��r|j|||fi|��dSdS)z�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=True)
        zlevel must be an integerN)r_r`r.rcr�r��r�r@r�r�r�s     r<r%z
Logger.logsv���%��%�%�	��
�� :�;�;�;������U�#�#�	2��D�I�e�S�$�1�1�&�1�1�1�1�1�	2�	2r;FrHc��t��}|�dS|dkr&|j}|�n|}t|��s|dz}|dk�&|j}d}|r�t	j��5}|�d��tj||���|�	��}|ddkr
|dd�}ddd��n#1swxYwY|j
|j|j|fS)	z�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        N)�(unknown file)r�(unknown function)NrrHzStack (most recent call last):
r{rr)
rQrPr]rXrrr~rr�r!rY�f_lineno�co_name)r�r��
stacklevelrP�next_f�cor�r$s        r<�
findCallerzLogger.findCallers<��

�N�N��
�9�B�B��1�n�n��X�F��~��
�A�%�a�(�(�
 ��a��
��1�n�n��X�����	'�����
'�#��	�	�<�=�=�=��%�a�c�2�2�2�2���������9��$�$�!�#�2�#�J�E�
'�
'�
'�
'�
'�
'�
'�
'�
'�
'�
'����
'�
'�
'�
'��~�q�z�2�:�u�<�<s�AB?�?C�CNc��t|||||||||
�	�	}|	�4|	D]1}|dvs	||jvrtd|z���|	||j|<�2|S)zr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        N)r.r/z$Attempt to overwrite %r in LogRecord)r�r�r�)
r�r�r@�fn�lnor�r�rNr��extrar�rd�keys
             r<�
makeRecordzLogger.makeRecord;s���t�U�B��S�$��$�"�$�$�����
.�
.���1�1�1�s�b�k�7I�7I�"�#I�C�#O�P�P�P�#(��:���C� � ��	r;c��d}tr3	|�||��\}	}
}}n#t$r	d\}	}
}Yn
wxYwd\}	}
}|rUt|t��rt|��||jf}n(t|t��stj	��}|�
|j||	|
||||||�
�
}|�|��dS)z�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        N)rrr)
rZr
rbr_�
BaseException�type�
__traceback__�tuplerIrNrr�rt)
r�r@r�r�rNrr�r
r�rrr�r�s
             r<r�zLogger._logJs�����		F�
J�'+���z�:�'N�'N�$��C��u�u���
J�
J�
J� I�
��C����
J����F�M�B��T��	*��(�M�2�2�
*� ��N�N�H�h�6L�M�����%�0�0�
*��<�>�>�������E�2�s�C��!)�4���?�?�����F�����s�'�:�:c�p�|js,|�|��r|�|��dSdSdS)z�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N)r�rC�callHandlersr)s  r<rtz
Logger.handledsO���
�	&�4�;�;�v�#6�#6�	&����f�%�%�%�%�%�	&�	&�	&�	&r;c��t��	||jvr|j�|��t��dS#t��wxYw)z;
        Add the specified handler to this logger.
        N)rCrTrIrD�r��hdlrs  r<�
addHandlerzLogger.addHandlernsP��	����	��D�M�)�)��
�$�$�T�*�*�*��N�N�N�N�N��L�N�N�N�N�����#A�Ac��t��	||jvr|j�|��t��dS#t��wxYw)z@
        Remove the specified handler from this logger.
        N)rCrTrMrDrs  r<�
removeHandlerzLogger.removeHandlerysP��	����	��t�}�$�$��
�$�$�T�*�*�*��N�N�N�N�N��L�N�N�N�N���rc�H�|}d}|r|jrd}n|jsn	|j}|�|S)a�
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        FT)rTr�r�)r�r�rds   r<�hasHandlerszLogger.hasHandlers�sM��
��
���	��z�
�����;�
���H���	��	r;c��|}d}|rG|jD],}|dz}|j|jkr|�|���-|jsd}n|j}|�G|dkr�tr3|jtjkrt�|��dSdStrC|jj	s9tj�d|j
z��d|j_	dSdSdSdS)a�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        rrHNz+No handlers could be found for logger "%s"
T)rTr�r@rtr�r�r-r.r�r�rIr}r~r�)r�r�r��foundrs     r<rzLogger.callHandlers�s!��
�����	��
�
(�
(����	���>�T�Z�/�/��K�K��'�'�'���;�
�����H���	�
�Q�J�J��
<��>�Z�%5�5�5��%�%�f�-�-�-�-�-�6�5� �
<���)M�
<��
� � �"-�/3�y�"9�:�:�:�7;���4�4�4�
�J�
<�
<�
<�
<r;c�F�|}|r|jr|jS|j}|�tS)z�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        )r@r�rr�s  r<�getEffectiveLevelzLogger.getEffectiveLevel�s;�����	#��|�
$��|�#��]�F��	#��
r;c�4�|jrdS	|j|S#t$rut��	|jj|kr
dx}|j|<n"||���kx}|j|<t��n#t��wxYw|cYSwxYw)�;
        Is this logger enabled for level 'level'?
        F)r�r�r�rCr�rr'rD)r�r@�
is_enableds   r<r�zLogger.isEnabledFor�s����=�	��5�
	��;�u�%�%���	�	�	��N�N�N�
��<�'�5�0�0�6;�;�J���U�!3�!3���!7�!7�!9�!9�9��J���U�!3�������������������	���s&��B�?A?�0B�?B�B�Bc��|j|urd�|j|f��}|j�|��S)ab
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        rB)r�rr�r�r")r��suffixs  r<�getChildzLogger.getChild�s?���9�D� � ��X�X�t�y�&�1�2�2�F��|�%�%�f�-�-�-r;c�z�t|�����}d|jj�d|j�d|�d�Sr�)r!r'r�r�r�r`s  r<r�zLogger.__repr__�s?���T�3�3�5�5�6�6���!%��!8�!8�!8�$�)�)�)�U�U�U�K�Kr;c�~�t|j��|urddl}|�d���t|jffS)Nrzlogger cannot be pickled)r"r��pickle�
PicklingError)r�r0s  r<�
__reduce__zLogger.__reduce__�sD���T�Y���t�+�+��M�M�M��&�&�'A�B�B�B��4�9�,�&�&r;)FrH)NNN)NNFrH)r�r�r�r�rr�rnrr$r*r)rrrr r%r
rr�rtrr!r#rr'r�r-r�r2r:r;r<rr�s�������
�
�$*�����$�$�$�
2�
2�
2�
1�
1�
1�
4�
4�
4�+�+�+�

2�
2�
2�.2�<�<�<�<�<�
5�
5�
5�,�,�,�2�2�2�" =� =� =� =�F15�
�
�
�
�LQ������4&�&�&�	�	�	�	�	�	����,<�<�<�<������,.�.�.�&L�L�L�'�'�'�'�'r;rc��eZdZdZd�Zd�ZdS)�
RootLoggerz�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    c�>�t�|d|��dS)z=
        Initialize the logger with the name "root".
        r�N)rr�r`s  r<r�zRootLogger.__init__s ��	����f�e�,�,�,�,�,r;c��tdfSr�)r"r�s r<r2zRootLogger.__reduce__s���"�}�r;N)r�r�r�r�r�r2r:r;r<r4r4�s<��������
-�-�-�����r;r4c���eZdZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
d�d�Zd
�Zd�Z
d�Zd�Zd�Zd�Zd�Zed���Zejd���Zed���Zd�Zee��ZdS)rzo
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    Nc�"�||_||_dS)ax
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N)r�r)r�r�rs   r<r�zLoggerAdapter.__init__s�������
�
�
r;c��|j|d<||fS)a�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        r)r)r�r�r�s   r<r�zLoggerAdapter.processs���*��w���F�{�r;c�4�|jt|g|�Ri|��dS)zA
        Delegate a debug call to the underlying logger.
        N)r%r	r�s    r<rzLoggerAdapter.debug/�.��	�����-�d�-�-�-�f�-�-�-�-�-r;c�4�|jt|g|�Ri|��dS)zA
        Delegate an info call to the underlying logger.
        N)r%rr�s    r<r$zLoggerAdapter.info5s.��	����s�,�T�,�,�,�V�,�,�,�,�,r;c�4�|jt|g|�Ri|��dS)zC
        Delegate a warning call to the underlying logger.
        N)r%rr�s    r<r*zLoggerAdapter.warning;s.��	����#�/��/�/�/��/�/�/�/�/r;c�^�tjdtd��|j|g|�Ri|��dSr�r�r�s    r<r)zLoggerAdapter.warnAr�r;c�4�|jt|g|�Ri|��dS)zB
        Delegate an error call to the underlying logger.
        N�r%r
r�s    r<rzLoggerAdapter.errorFr;r;Tr�c�8�|jt|g|�Rd|i|��dS)zF
        Delegate an exception call to the underlying logger.
        rNNr@r�s     r<rzLoggerAdapter.exceptionLs3��	�����@�d�@�@�@�X�@��@�@�@�@�@r;c�4�|jt|g|�Ri|��dS)zD
        Delegate a critical call to the underlying logger.
        N)r%rr�s    r<rzLoggerAdapter.criticalRs.��	����3�0��0�0�0��0�0�0�0�0r;c��|�|��r2|�||��\}}|jj||g|�Ri|��dSdS)z�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N)r�r�r�r%rs     r<r%zLoggerAdapter.logXsg��
���U�#�#�	9��,�,�s�F�3�3�K�C���D�K�O�E�3�8��8�8�8��8�8�8�8�8�	9�	9r;c�6�|j�|��S)r))r�r�r`s  r<r�zLoggerAdapter.isEnabledForas���{�'�'��.�.�.r;c�:�|j�|��dS)zC
        Set the specified level on the underlying logger.
        N)r�rnr`s  r<rnzLoggerAdapter.setLevelgs ��	
����U�#�#�#�#�#r;c�4�|j���S)zD
        Get the effective level for the underlying logger.
        )r�r'r�s r<r'zLoggerAdapter.getEffectiveLevelms���{�,�,�.�.�.r;c�4�|j���S)z@
        See if the underlying logger has any handlers.
        )r�r#r�s r<r#zLoggerAdapter.hasHandlersss���{�&�&�(�(�(r;c�,�|jj|||fi|��S)zX
        Low-level log implementation, proxied to allow nested logger adapters.
        )r�r�rs     r<r�zLoggerAdapter._logys%�� �t�{���s�D�;�;�F�;�;�;r;c��|jjSr7�r�r�r�s r<r�zLoggerAdapter.managers
���{�"�"r;c��||j_dSr7rJr�s  r<r�zLoggerAdapter.manager�s��#�����r;c��|jjSr7)r�r�r�s r<r�zLoggerAdapter.name�s
���{��r;c��|j}t|�����}d|jj�d|j�d|�d�Sr�)r�r!r'r�r�r�)r�r�r@s   r<r�zLoggerAdapter.__repr__�sF������V�5�5�7�7�8�8���!%��!8�!8�!8�&�+�+�+�u�u�u�M�Mr;r7)r�r�r�r�r�r�rr$r*r)rrrr%r�rnr'r#r�r�r�r�r�r�r�rr�r:r;r<rrs���������
������� .�.�.�-�-�-�0�0�0�+�+�+�
.�.�.�.2�A�A�A�A�A�1�1�1�9�9�9�/�/�/�$�$�$�/�/�/�)�)�)�<�<�<��#�#��X�#�
�^�$�$��^�$�� � ��X� �N�N�N�
$��L�1�1���r;rc���t��	|�dd��}|�dd��}|�dd��}|rEtjdd�D]0}t�|��|����1t
tj��dk�r|�dd��}|�d	|vrd
|vrtd���nd	|vsd
|vrtd���|��|�d
d��}|�d
d��}|r/d|vrd}ntj	|��}t||||���}n%|�d	d��}t|��}|g}|�dd��}	|�dd��}
|
tvr<tdd�
t�����z���|�dt|
d��}t||	|
��}|D]8}|j�|�|��t�|���9|�dd��}
|
�t�|
��|r9d�
|�����}td|z���t)��dS#t)��wxYw)a8

    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root logger. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    encoding  If specified together with a filename, this encoding is passed to
              the created FileHandler, causing it to be used when the file is
              opened.
    errors    If specified together with a filename, this value is passed to the
              created FileHandler, causing it to be used when the file is
              opened in text mode. If not specified, the default value is
              `backslashreplace`.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.9
       Added the ``encoding`` and ``errors`` parameters.
    �forceFr�Nr��backslashreplacerrTr�r\z8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoder�r�r�rrrrrr�rHr@r�zUnrecognised argument(s): %s)rC�popr�rTr!r"r�rbrr�rrr
rrrr]rvrrnrD)r�rOr�r��hrTr\r�r��dfsr�fsr�r@rs               r<rr�s��L�N�N�N�2��
�
�7�E�*�*���:�:�j�$�/�/�����H�&8�9�9���	��]�1�1�1�%�
�
���"�"�1�%�%�%����	�	�	�	��t�}����"�"��z�z�*�d�3�3�H����v�%�%�*��*>�*>�$�&:�;�;�;���v�%�%��v�)=�)=�$�&J�K�K�K���!�:�:�j�$�7�7���z�z�*�c�2�2���	.��d�{�{�!%���#%�#3�H�#=�#=��#�H�d�-5�f�F�F�F�A�A�$�Z�Z��$�7�7�F�%�f�-�-�A��3���*�*�Y��-�-�C��J�J�w��,�,�E��G�#�#� �!;�c�h�h�!(�����?1�?1�"1�2�2�2����H�g�e�n�Q�&7�8�8�B��B��U�+�+�C��
#�
#���;�&��N�N�3�'�'�'�����"�"�"�"��J�J�w��-�-�E�� ��
�
�e�$�$�$��
H��y�y������/�/�� �!?�$�!F�G�G�G���������������s�KK&�&K6c��|r%t|t��r|tjkrtStj�|��S)z�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    )r_rar�r�rr�r")r�s r<r"r"sD����:�d�C�(�(��T�T�Y�->�->����>�#�#�D�)�)�)r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    rN)r�r�rTrr�r�r�r�s   r<rr$sH���4�=���Q����
�
�
��M�#�'��'�'�'��'�'�'�'�'r;c�&�t|g|�Ri|��dS)z:
    Don't use this function, use critical() instead.
    NrrXs   r<r r .s(��
�S�"�4�"�"�"�6�"�"�"�"�"r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrrrXs   r<rr4�H���4�=���Q����
�
�
��J�s�$�T�$�$�$�V�$�$�$�$�$r;r�c�*�t|g|�Rd|i|��dS)z�
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    rNNr�)r�rNr�r�s    r<rr>s-��
�#�2��2�2�2�x�2�6�2�2�2�2�2r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrr*rXs   r<r*r*FsH���4�=���Q����
�
�
��L��&�t�&�&�&�v�&�&�&�&�&r;c�\�tjdtd��t|g|�Ri|��dS)Nz8The 'warn' function is deprecated, use 'warning' insteadrLr�rXs   r<r)r)PsD���M� �!3�Q�8�8�8��C�!�$�!�!�!�&�!�!�!�!�!r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrr$rXs   r<r$r$UsH���4�=���Q����
�
�
��I�c�#�D�#�#�#�F�#�#�#�#�#r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrrrXs   r<rr_r[r;c��ttj��dkrt��tj||g|�Ri|��dS)z�
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    rN)r�r�rTrr%)r@r�r�r�s    r<r%r%isJ���4�=���Q����
�
�
��H�U�C�)�$�)�)�)�&�)�)�)�)�)r;c�d�|tj_tj���dS)zB
    Disable all logging calls of severity 'level' and below.
    N)r�r�rr�)r@s r<rrss(��!�D�L���L�������r;c�x�t|dd���D]�}	|��}|r�	|���|���|���n#tt
f$rYnwxYw|���n#|���wxYw��#tr�Y��xYwdS)z�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N)�reversedrhrxr"r�rbrjr.)�handlerListrSrSs   r<r(r(zs����{�1�1�1�~�&�&����	�����A��
 � ��I�I�K�K�K��G�G�I�I�I��G�G�I�I�I�I����,����
�D������I�I�K�K�K�K��A�I�I�K�K�K�K������	��
��
�
����'�s@�B+�<A%�$B�%A9�6B�8A9�9B�<B+�B'�'B+�+
B7c�*�eZdZdZd�Zd�Zd�Zd�ZdS)ra�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    c��dS�zStub.Nr:r)s  r<rtzNullHandler.handle�����r;c��dSrhr:r)s  r<rrzNullHandler.emit�rir;c��d|_dSr7)rhr�s r<r_zNullHandler.createLock�s
����	�	�	r;c��dSr7r:r�s r<ruzNullHandler._at_fork_reinit�rpr;N)r�r�r�r�rtrrr_rur:r;r<rr�sZ�����������������
�
�
�
�
r;rc�*�|�t�t||||||��dSdStj|||||��}td��}|js!|�t
����|�t|����dS)a�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    Nzpy.warnings)	�_warnings_showwarningr��
formatwarningr"rTrrr*ra)r.�categoryr\r�r|�linerr�s        r<�_showwarningrr�s����� �,�!�'�8�X�v�t�T�R�R�R�R�R�-�,�
�"�7�H�h���M�M���=�)�)����	-����k�m�m�,�,�,�	���s�1�v�v�����r;c��|r(t�tjatt_dSdSt�tt_dadSdS)z�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N)rnr��showwarningrr)�captures r<rr�sU���)� �(�$,�$8�!�#/�H� � � �)�(�!�,�#8�H� �$(�!�!�!�-�,r;r7r�)sr�rIrUr�rr�rr�rW�collections.abcr��typesr�stringrr�StrFormatter�__all__r��
__author__�
__status__�__version__�__date__r�r.r�r�r�rrr
rrrr	rr>r8r/r!rr�rQrVrW�__code__rYrZr]rergrgrCrDro�WeakSetrrrxrk�objectrr�r,r+r&r�r�r�r�rr
r4rr
rE�WeakValueDictionaryrdrRrUrYrrrr��_defaultLastResortr-r�r'r#r�rr4r�rr�r�rr"rr rrr*r)r$rr%rr(�atexit�registerrrnrrrr:r;r<�<module>r�s���"��L�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�������������,�,�,�,�,�,�D�D�D������6�
��
��� ���T�Y�[�[�
���
�
�
��
������
��
����	��
��	
��
�j�	�7��Y��&�	�7�
�H�
���
�
����
��	�	��������6����7�3����5�+�+�L�L�5�5�5�&�7���L�1�=�>�>�����
�
�
�0	�	������������w�r�%�&�&�6�
�
�
�
�$3�7�?�#4�#4� ���� � � ��B��|�'H�(4�6�6�6�6�b�b�b�b�b��b�b�b�N�� � � ����	�	�	�������M�M�M�M�M�6�M�M�M�B:�:�:�:�:�\�:�:�:�D .� .� .� .� .�,� .� .� .�F4����	%�
�8�	9�
�@�	A����m�m�m�m�m��m�m�m�d�I�K�K��$�$�$�$�$��$�$�$�T#/�#/�#/�#/�#/�V�#/�#/�#/�J.�.�.�.�.�v�.�.�.�h
(�G�'�)�)�	������$���@>�@>�@>�@>�@>�h�@>�@>�@>�DR2�R2�R2�R2�R2�G�R2�R2�R2�jRT�RT�RT�RT�RT�-�RT�RT�RT�j�����]����"$�^�G�,�,��
�
�+�+�+�+�+�&�+�+�+�.������{�{�{�{�{�f�{�{�{�B_'�_'�_'�_'�_'�X�_'�_'�_'�D
�
�
�
�
��
�
�
���E2�E2�E2�E2�E2�F�E2�E2�E2�N�z�'�����������%�%���y�y�y�@*�*�*�*�(�(�(�#�#�#�%�%�%�$(�3�3�3�3�3�'�'�'�"�"�"�
$�$�$�%�%�%�*�*�*�� � � � �&�����>�
�
�
��������
�
�
�
�
�'�
�
�
�0������()�)�)�)�)r;PK�]a�6⻟��(__pycache__/config.cpython-311.opt-2.pycnu�[����

��"�-�����	ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZdZ
ejZdadd�Zd�Zd�Zd�Zd	�Zd
�Zd�Zd�Zejd
ej��Zd�ZGd�de��ZGd�dee��Z Gd�de!e��Z"Gd�de#e��Z$Gd�de��Z%Gd�de%��Z&e&Z'd�Z(e
dfd�Z)d�Z*dS)�N)�ThreadingTCPServer�StreamRequestHandleriF#Tc�D�	ddl}t|t��rbtj�|��st
|�d����tj�|��st|�d����t||j	��r|}n�	|�
|��}t|d��r|�|��n+tj|��}|�||���n&#|j$r}t|�d|�����d}~wwxYwt#|��}t%j��	t)��t+||��}t-|||��t%j��dS#t%j��wxYw)Nrz doesn't existz is an empty file�readline)�encodingz
 is invalid: )�configparser�
isinstance�str�os�path�exists�FileNotFoundError�getsize�RuntimeError�RawConfigParser�ConfigParser�hasattr�	read_file�io�
text_encoding�read�ParsingError�_create_formatters�logging�_acquireLock�_clearExistingHandlers�_install_handlers�_install_loggers�_releaseLock)	�fname�defaults�disable_existing_loggersrr�cp�e�
formatters�handlerss	         �9/opt/alt/python-internal/lib/python3.11/logging/config.py�
fileConfigr(4s���������%����<��w�~�~�e�$�$�	<�#�u�$<�$<�$<�=�=�=������'�'�	<��%�:�:�:�;�;�;��%��5�6�6�;�
���	;��*�*�8�4�4�B��u�j�)�)�
2����U�#�#�#�#��+�H�5�5��������1�1�1����(�	;�	;�	;��%�9�9�a�9�9�:�:�:�����	;����$�B�'�'�J�������� � � �%�R��4�4����X�'?�@�@�@�����������������s%�A&C=�=
D �D�D �/F
�
Fc��	|�d��}|�d��}t|��}|D]J}|dz|z}	t||��}�#t$r"t|��t||��}Y�GwxYw|S)N�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�ns    r'�_resolver4`s���3��:�:�c�?�?�D��8�8�A�;�;�D��t���E�
�&�&���c�z�A�~��	&��E�1�%�%�E�E���	&�	&�	&��t�����E�1�%�%�E�E�E�	&�����Ls�A�)B�Bc�6�ttj|��S�N)�mapr
�strip)�alists r'�
_strip_spacesr:ns���s�y�%� � � �c���	|dd}t|��siS|�d��}t|��}i}|D]�}d|z}|�|ddd���}|�|ddd���}|�|d	dd
���}tj}||�d��}	|	rt
|	��}||||��}
|
||<��|S)Nr%�keys�,zformatter_%s�formatT)�raw�fallback�datefmt�style�%�class)�lenr+r:�getr�	Formatterr4)r#�flistr%�form�sectname�fs�dfs�stl�c�
class_name�fs           r'rrqs��&��|��V�$�E��u�:�:���	��K�K����E��%� � �E��J��
�
��!�D�(��
�V�V�H�h�D�4�V�
@�
@���f�f�X�y�d�T�f�B�B���f�f�X�w�D�3�f�?�?�������\�%�%�g�.�.�
��	%���$�$�A�
�A�b�#�s�O�O���
�4����r;c�$�	|dd}t|��siS|�d��}t|��}i}g}|D�]�}|d|z}|d}|�dd��}	t	|tt����}n&#ttf$rt|��}YnwxYw|�dd	��}	t	|	tt����}	|�d
d��}
t	|
tt����}
||	i|
��}||_
d|vr|d}|�|��t|��r|�||��t|tjj��r<|�d
d��}
t|
��r|�||
f��|||<���|D] \}}|�||���!|S)Nr&r=r>z
handler_%srE�	formatter��args�()�kwargsz{}�level�target)rFr+r:rG�eval�varsrr/�	NameErrorr4r0�setLevel�setFormatter�
issubclassr&�
MemoryHandler�append�	setTarget)r#r%�hlistr&�fixups�hand�section�klass�fmtrUrW�hrXrY�ts               r'rr�s��%��z�N�6�"�E��u�:�:���	��K�K����E��%� � �E��H�
�F������\�D�(�)���� ���k�k�+�r�*�*��	$����W�
�
�.�.�E�E���	�*�	$�	$�	$��U�O�O�E�E�E�	$�����{�{�6�4�(�(���D�$�w�-�-�(�(�����X�t�,�,���f�d�7�m�m�,�,���E�4�"�6�"�"������g����G�$�E�
�J�J�u�����s�8�8�	,�
�N�N�:�c�?�+�+�+��e�W�-�;�<�<�	+��[�[��2�.�.�F��6�{�{�
+��
�
�q�&�k�*�*�*�������!�!���1�	���H�Q�K� � � � ��Os�8"B� B>�=B>c���	tj}|D]g}|jj|}||vrHt	|tj��s-|�tj��g|_d|_	�`||_
�hdS)NT)r�root�manager�
loggerDictr	�PlaceHolderr]�NOTSETr&�	propagate�disabled)�existing�
child_loggers�disable_existingrl�log�loggers      r'�_handle_existing_loggersrx�s���	��<�D��/�/����(��-���-����f�g�&9�:�:�
(������/�/�/�"$���#'�� ��.�F�O�O�/�/r;c���	|dd}|�d��}tt|����}|�d��|d}tj}|}d|vr|d}|�|��|jdd�D]}|�|���|d}	t|	��rD|	�d��}	t|	��}	|	D]}
|�
||
���t|jj�
����}|���g}|D�]�}|d|z}|d	}
|�d
d���}t	j|
��}|
|vr�|�|
��dz}|
d
z}t|��}t|��}||kr:||d|�|kr|�||��|dz
}||k�:|�|
��d|vr|d}|�|��|jdd�D]}|�|���||_d|_|d}	t|	��rD|	�d��}	t|	��}	|	D]}
|�
||
������t+|||��dS)N�loggersr=r>rl�logger_rootrXr&z	logger_%s�qualnamerq�)rAr*r)r+�listr:�removerrlr]r&�
removeHandlerrF�
addHandlerrmrnr=�sort�getint�	getLogger�indexrarqrrrx)r#r&ru�llistrfrlrvrXrircrersrt�qnrqrw�i�prefixed�pflen�num_existings                    r'rr�s"��$�
�y�M�&�!�E��K�K����E���u�%�%�&�&�E�	�L�L��������G��<�D�
�C��'����� �����U����
�]�1�1�1�
�������1������J��E�
�5�z�z�+����C� � ���e�$�$���	+�	+�D��N�N�8�D�>�*�*�*�*��D�L�+�0�0�2�2�3�3�H�

�M�M�O�O�O��M��2�2���[�3�&�'��
�Z�
 ���N�N�;��N�;�;�	��"�2�&�&��
��>�>����r�"�"�Q�&�A��C�x�H���M�M�E��x�=�=�L��l�"�"��A�;�v��v�&�(�2�2�!�(�(��!��5�5�5��Q����l�"�"�
�O�O�B�����g����G�$�E��O�O�E�"�"�"������#�	$�	$�A�� � ��#�#�#�#�$�������
�#���u�:�:�	2��K�K��$�$�E�!�%�(�(�E��
2�
2���!�!�(�4�.�1�1�1�1���X�}�6F�G�G�G�G�Gr;c��	tj���tjtjdd���tjdd�=dSr6)r�	_handlers�clear�shutdown�_handlerList�r;r'rrsL��+����������W�)�!�!�!�,�-�-�-���Q�Q�Q���r;z^[a-z_][a-z0-9_]*$c�b�t�|��}|std|z���dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�ms  r'�valid_identr�$s7��������A��B��<�q�@�A�A�A��4r;c��eZdZ	dd�Zd�ZdS)�ConvertingMixinTc��|j�|��}||ur8|r|||<t|��ttt
fvr||_||_|Sr6)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfr��value�replace�results     r'�convert_with_keyz ConvertingMixin.convert_with_key.sf���"�*�*�5�1�1�������
#�"��S�	��F�|�|���.� 0�0�0� $��
� ��
��
r;c��|j�|��}||ur*t|��ttt
fvr||_|Sr6)r�r�r�r�r�r�r�)r�r�r�s   r'r�zConvertingMixin.convert:sN���"�*�*�5�1�1�������F�|�|���.� 0�0�0� $��
��
r;N)T)�__name__�
__module__�__qualname__r�r�r�r;r'r�r�+s:������I�
�
�
�
�����r;r�c�&�eZdZ	d�Zdd�Zdd�ZdS)r�c�d�t�||��}|�||��Sr6)�dict�__getitem__r��r�r�r�s   r'r�zConvertingDict.__getitem__O�-��� � ��s�+�+���$�$�S�%�0�0�0r;Nc�f�t�|||��}|�||��Sr6)r�rGr��r�r��defaultr�s    r'rGzConvertingDict.getSs-������s�G�,�,���$�$�S�%�0�0�0r;c�j�t�|||��}|�||d���S�NF)r�)r�r,r�r�s    r'r,zConvertingDict.popWs2������s�G�,�,���$�$�S�%��$�?�?�?r;r6)r�r�r�r�rGr,r�r;r'r�r�LsT������*�1�1�1�1�1�1�1�@�@�@�@�@�@r;r�c��eZdZ	d�Zdd�ZdS)r�c�d�t�||��}|�||��Sr6)r~r�r�r�s   r'r�zConvertingList.__getitem__]r�r;���c�b�t�||��}|�|��Sr6)r~r,r�)r��idxr�s   r'r,zConvertingList.popas'������s�#�#���|�|�E�"�"�"r;N)r�)r�r�r�r�r,r�r;r'r�r�[s:������$�1�1�1�#�#�#�#�#�#r;r�c��eZdZ	d�ZdS)r�c�h�t�||��}|�||d���Sr�)�tupler�r�r�s   r'r�zConvertingTuple.__getitem__gs2���!�!�$��,�,���$�$�S�%��$�?�?�?r;N)r�r�r�r�r�r;r'r�r�es+������%�@�@�@�@�@r;r�c��eZdZ	ejd��Zejd��Zejd��Zejd��Zejd��Z	ddd�Z
ee��Z
d	�Zd
�Zd�Zd�Zd
�Zd�Zd�ZdS)�BaseConfiguratorz%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)�ext�cfgc�F�t|��|_||j_dSr6)r��configr�)r�r�s  r'�__init__zBaseConfigurator.__init__�s!��$�V�,�,���#'��� � � r;c��	|�d��}|�d��}	|�|��}|D]P}|d|zz
}	t||��}�#t$r(|�|��t||��}Y�MwxYw|S#t
$r}t
d|�d|����}||�d}~wwxYw)Nr*rzCannot resolve z: )r+r,�importerr.r/�ImportErrorr�)r�r�r0r1r2�fragr$�vs        r'�resolvezBaseConfigurator.resolve�s���	��w�w�s�|�|���x�x��{�{��	��M�M�$�'�'�E��
1�
1����d�
�"��1�#�E�4�0�0�E�E��%�1�1�1��M�M�$�'�'�'�#�E�4�0�0�E�E�E�1�����L���	�	�	��
�a�a�a���;�<�<�A���N�����	���s;�!B�A �B� /B�B�B�B�
B>�!B9�9B>c�.�	|�|��Sr6)r��r�r�s  r'r�zBaseConfigurator.ext_convert�s��8��|�|�E�"�"�"r;c���	|}|j�|��}|�td|z���||���d�}|j|���d}|r�|j�|��}|r!||���d}n�|j�|��}|rn|���d}|j�|��s	||}n1	t|��}||}n#t$r||}YnwxYw|r||���d�}ntd|�d|�����|��|S)NzUnable to convert %rrzUnable to convert z at )�WORD_PATTERNr�r��endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)r�r��restr��dr�r3s       r'r�zBaseConfigurator.cfg_convert�s���8�����#�#�D�)�)���9��3�e�;�<�<�<���������>�D���A�H�H�J�J�q�M�*�A��
A��$�*�*�4�0�0���
+��!�(�(�*�*�Q�-�(�A�A��*�0�0��6�6�A��	+��h�h�j�j��m��#�1�7�7��<�<�+� !�#��A�A�+�$'��H�H��$%�a�D����#,�+�+�+�$%�c�F����+�����A���������>�D�D�$�*�38�5�5�$�$�&@�A�A�A�'�
A�,�s�D$�$D9�8D9c���	t|t��s-t|t��rt|��}||_�nt|t��s,t|t
��rt	|��}||_n�t|t��s<t|t��r't|d��st
|��}||_n�t|t��rx|j
�|��}|r\|���}|d}|j
�|d��}|r#|d}t||��}||��}|S)N�_fields�prefix�suffix)r	r�r�r�r�r~r�r�rr
�CONVERT_PATTERNr��	groupdict�value_convertersrGr.)r�r�r�r�r��	converterr�s       r'r�zBaseConfigurator.convert�s_��	�
�%��0�0�	.�Z��t�5L�5L�	.�"�5�)�)�E�!%�E����E�>�2�2�	.�z�%��7N�7N�	.�"�5�)�)�E�!%�E����E�?�3�3�
	.��E�5�)�)�
	.�29�%��2K�2K�
	.�#�E�*�*�E�!%�E���
��s�
#�
#�		.��$�*�*�5�1�1�A��
.��K�K�M�M���8��� �1�5�5�f�d�C�C�	��.��x�[�F� '��i� 8� 8�I�%�I�f�-�-�E��r;c�.��	��d��}t|��s|�|��}�fd��D��}|di|��}��dd��}|r+|���D]\}}t	|||���|S)NrVc�L��i|] }|dk�t|���|�|��!S�r*�r���.0�kr�s  �r'�
<dictcomp>z5BaseConfigurator.configure_custom.<locals>.<dictcomp>��.���P�P�P�1�1��8�8��A���8�!�V�A�Y�8�8�8r;r*r�)r,�callabler��items�setattr)r�r�rOrWr��propsr0r�s `      r'�configure_customz!BaseConfigurator.configure_custom�s����?��J�J�t������{�{�	 ����Q���A�P�P�P�P��P�P�P������V�����
�
�3��%�%���	-�$�{�{�}�}�
-�
-���e����e�,�,�,�,��
r;c�P�	t|t��rt|��}|Sr6)r	r~r�r�s  r'�as_tuplezBaseConfigurator.as_tuple�s'��>��e�T�"�"�	!��%�L�L�E��r;N)r�r�r��re�compiler�r�r�r�r�r��staticmethodr-r�r�r�r�r�r�r�r�r�r;r'r�r�ls�������!�b�j�!I�J�J�O��2�:�o�.�.�L��"�*�.�/�/�K��B�J�5�6�6�M��B�J�x�(�(�M�������|�J�'�'�H�(�(�(����*#�#�#� � � �D���8�������r;r�c�L�eZdZ	d�Zd�Zd�Zd�Zd�Zd�Zdd�Z	dd	�Z
dd
�ZdS)
�DictConfiguratorc�
�	|j}d|vrtd���|ddkrtd|dz���|�dd��}i}tj��	|�rm|�d|��}|D]�}|tjvrtd|z���	tj|}||}|�d	d��}|r'|�tj|�����}#t$r}	td
|z��|	�d}	~	wwxYw|�d|��}
|
D]E}	|�
||
|d���!#t$r}	td
|z��|	�d}	~	wwxYw|�dd��}|r;	|�|d���n�#t$r}	td��|	�d}	~	wwxYw�n||�dd��}t��|�d|��}
|
D]F}	|�
|
|��|
|<�"#t$r}	td|z��|	�d}	~	wwxYw|�d|��}|D]F}	|�||��||<�"#t$r}	td|z��|	�d}	~	wwxYw|�d|��}g}t|��D]�}	|�||��}||_|||<�+#t$rI}	dt%|	j��vr|�|��ntd
|z��|	�Yd}	~	�yd}	~	wwxYw|D]O}	|�||��}||_|||<�+#t$r}	td
|z��|	�d}	~	wwxYwtj}t-|jj�����}|���g}|�d|��}
|
D]�}||vr�|�|��dz}|dz}t9|��}t9|��}||kr:||d|�|kr|�||��|dz
}||k�:|�|��	|�
||
|����#t$r}	td
|z��|	�d}	~	wwxYwt=|||��|�dd��}|r9	|�|��n"#t$r}	td��|	�d}	~	wwxYwtj��dS#tj��wxYw)N�versionz$dictionary doesn't specify a versionr}zUnsupported version: %s�incrementalFr&zNo handler found with name %rrXzUnable to configure handler %rrzTzUnable to configure logger %rrlzUnable to configure root loggerr"r%z Unable to configure formatter %r�filterszUnable to configure filter %r�target not configured yetr*) r�r�r,rrrGr�r]�_checkLevel�	Exception�configure_logger�configure_rootr�configure_formatter�configure_filter�sorted�configure_handlerr0r
�	__cause__rarlr~rmrnr=r�r�rFrrxr)r�r�r��
EMPTY_DICTr&r0�handler�handler_configrXr$rzrlrur%r��deferredrsrtr�r�r�r�s                      r'�	configurezDictConfigurator.configure�sH��#�����F�"�"��C�D�D�D��)���!�!��6��	�9J�J�K�K�K��j�j���6�6���
������Q	#��N
:�!�:�:�j�*�=�=��$�
A�
A�D��7�#4�4�4�(�*3�6:�*;�<�<�<�A�&-�&7��&=�G�-5�d�^�N�$2�$6�$6�w��$E�$E�E�$�M� '� 0� 0��1D�U�1K�1K� L� L� L���(�A�A�A�",�.2�48�.9�#:�#:�?@�A�����A����!�*�*�Y�
�;�;��#�=�=�D�=��-�-�d�G�D�M�4�H�H�H�H��$�=�=�=�(�*.�04�*5�6�6�;<�=�����=�����z�z�&�$�/�/���:�:��+�+�D�$�7�7�7�7��$�:�:�:�(�*2�3�3�89�:�����:����:�$*�:�:�.H�$�#O�#O� �&�(�(�(�$�Z�Z��j�A�A�
�&�G�G�D�G�+/�+C�+C�<F�t�<L�,N�,N�
�4�(�(��$�G�G�G�(�*8�:>�*?�@�@�EF�G�����G����!�*�*�Y�
�;�;��#�D�D�D�D�(,�(=�(=�g�d�m�(L�(L���
�
��$�D�D�D�(�*5�7;�*<�=�=�BC�D�����D����"�:�:�j�*�=�=����"�8�,�,�
A�
A�D�	A�"&�"8�"8��$��"H�"H��'+���)0������$�A�A�A�6�#�a�k�:J�:J�J�J�$�O�O�D�1�1�1�1�",�.2�48�.9�#:�#:�?@�A�2�1�1�1�1�����A����%�=�=�D�=�"&�"8�"8��$��"H�"H��'+���)0������$�=�=�=�(�*.�04�*5�6�6�;<�=�����=�����|����� 7� <� <� >� >�?�?��
�
�
����!#�
� �*�*�Y�
�;�;��#�=�=�D��x�'�'�$�N�N�4�0�0�1�4��#'�#�:�� #�H�
�
��'*�8�}�}���,�.�.�'��{�6�E�6�2�h�>�>� -� 4� 4�X�a�[� A� A� A���F�A� �,�.�.�!����-�-�-�=��-�-�d�G�D�M�B�B�B�B��$�=�=�=�(�*.�04�*5�6�6�;<�=�����=����")��=�)9�;�;�;��z�z�&�$�/�/���:�:��+�+�D�1�1�1�1��$�:�:�:�(�*2�3�3�89�:�����:����
� �"�"�"�"�"��G� �"�"�"�"���sY�,=U-�*AD�U-�
D&�D!�!D&�&U-�E"�!U-�"
F�,E?�?F�U-� F8�6U-�8
G�G�G�AU-�H:�9U-�:
I�I�I�U-�:J�U-�
J;�#J6�6J;�;,U-�('L�U-�
M#�?M�U-�M#�#U-�+'N�U-�
N5�N0�0N5�5C>U-�4S�U-�
S3�S.�.S3�3,U-� T6�5U-�6
U�U�U�U-�-Vc�<�	d|vrz|d}	|�|��}n�#t$rN}dt|��vr�|�d��|d<||d<|�|��}Yd}~n�d}~wwxYw|�dd��}|�dd��}|�dd��}|�dd��}|s
t
j}	nt|��}	d	|vr|	||||d	��}n
|	|||��}|S)
NrVz'format'r?rhrBrCrDrE�validate)r�r�r
r,rGrrHr4)
r�r��factoryr��terh�dfmtrC�cnamerOs
          r'rz$DictConfigurator.configure_formatter�sM��6��6�>�>��T�l�G�
7��.�.�v�6�6�����	
7�	
7�	
7��S��W�W�,�,��
!'�
�
�8� 4� 4��u�
�&��t���.�.�v�6�6�����������	
7�����*�*�X�t�,�,�C��:�:�i��.�.�D��J�J�w��,�,�E��J�J�w��-�-�E��
$��%����U�O�O���V�#�#���3��e�V�J�-?�@�@�����3��e�,�,���
s�%�
A=�AA8�8A=c��	d|vr|�|��}n*|�dd��}tj|��}|S)NrVr0rT)r�rGr�Filter)r�r�r�r0s    r'rz!DictConfigurator.configure_filter�sJ��3��6�>�>��*�*�6�2�2�F�F��:�:�f�b�)�)�D��^�D�)�)�F��
r;c��	|D]�}	t|��stt|dd����r|}n|jd|}|�|���\#t$r}td|z��|�d}~wwxYwdS)N�filterr�zUnable to add filter %r)r�r.r��	addFilterr�r�)r��filtererr�rQ�filter_r$s      r'�add_filterszDictConfigurator.add_filters�s���=��	G�	G�A�
G��A�;�;�8�(�7�1�h��+E�+E�"F�"F�8��G�G�"�k�)�4�Q�7�G��"�"�7�+�+�+�+���
G�
G�
G� �!:�Q�!>�?�?�Q�F�����
G����	G�	Gs�AA � 
B�*A=�=Bc�T��	t���}��dd��}|r:	|jd|}n%#t$r}t	d|z��|�d}~wwxYw��dd��}��dd��}d�vr=��d��}t|��s|�|��}|}�n[��d��}	|�|	��}
t|
tj	j
��r�d�vr�	|jd	�d}t|tj��s$��
|��td
���|�d<n�#t$r}t	d�dz��|�d}~wwxYwt|
tj	j��r#d�vr|��d���d<nAt|
tj	j��r"d
�vr|��d
���d
<|
}�fd��D��}	|di|��}
nI#t$r<}dt%|��vr�|�d��|d<|di|��}
Yd}~nd}~wwxYw|r|
�|��|�'|
�tj|����|r|�|
|����dd��}|r+|���D]\}}t1|
||���|
S)NrSr%zUnable to set formatter %rrXr�rVrErYr&r�zUnable to set target handler %r�mailhost�addressc�L��i|] }|dk�t|���|�|��!Sr�r�r�s  �r'r�z6DictConfigurator.configure_handler.<locals>.<dictcomp>�r�r;z'stream'�stream�strmr*r�)r�r,r�r�r�r�r�r_rr&r`r	�Handler�updater��SMTPHandlerr��
SysLogHandlerr
r^r]r�rr�r�)r�r��config_copyrSr$rXr�rOrrrg�thrWr�rr�r0r�s `                r'rz"DictConfigurator.configure_handler�s����4��6�l�l���J�J�{�D�1�1�	��	:�
:� �K��5�i�@�	�	���
:�
:�
:� �"&�(1�"2�3�3�89�:�����
:�����
�
�7�D�)�)���*�*�Y��-�-���6�>�>��
�
�4� � �A��A�;�;�
$��L�L��O�O���G�G��J�J�w�'�'�E��L�L��'�'�E��%��!1�!?�@�@�
E��F�"�"�E���Z�0���1A�B�B�%�b�'�/�:�:�E��
�
�k�2�2�2�'�(C�D�D�D�')�F�8�$�$�� �E�E�E�$�&*�,2�8�,<�&=�>�>�CD�E�����E�����E�7�#3�#?�@�@�
E��f�$�$�%)�]�]�6�*�3E�%F�%F��z�"�"��E�7�#3�#A�B�B�
E��V�#�#�$(�M�M�&��2C�$D�$D��y�!��G�P�P�P�P��P�P�P��
	'��W�&�&�v�&�&�F�F���	'�	'�	'���R���(�(��
$�Z�Z��1�1�F�6�N��W�&�&�v�&�&�F�F�F�F�F�F�����	'�����	+����	�*�*�*����O�O�G�/��6�6�7�7�7��	.����V�W�-�-�-��
�
�3��%�%���	-�$�{�{�}�}�
-�
-���e����e�,�,�,�,��
sF�?�
A!�	A�A!�AE<�<
F$�F�F$�;I�
J
�2J�J
c��	|D]N}	|�|jd|���*#t$r}td|z��|�d}~wwxYwdS)Nr&zUnable to add handler %r)r�r�r�r�)r�rwr&rir$s     r'�add_handlerszDictConfigurator.add_handlerss���<��	H�	H�A�
H��!�!�$�+�j�"9�!�"<�=�=�=�=���
H�
H�
H� �!;�a�!?�@�@�a�G�����
H����	H�	Hs�&.�
A�A�AFc��	|�dd��}|�'|�tj|����|s�|jdd�D]}|�|���|�dd��}|r|�||��|�dd��}|r|�||��dSdSdS)NrXr&r�)rGr]rr�r&r�r'r)r�rwr�r�rXrir&r�s        r'�common_logger_configz%DictConfigurator.common_logger_configs���	��
�
�7�D�)�)�����O�O�G�/��6�6�7�7�7��		2��_�Q�Q�Q�'�
(�
(���$�$�Q�'�'�'�'��z�z�*�d�3�3�H��
4��!�!�&�(�3�3�3��j�j��D�1�1�G��
2�� � ���1�1�1�1�1�		2�		2�
2�
2r;c��	tj|��}|�|||��d|_|�dd��}|�	||_dSdS)NFrq)rr�r)rrrGrq)r�r0r�r�rwrqs      r'rz!DictConfigurator.configure_logger%sc��<��"�4�(�(���!�!�&�&�+�>�>�>�����J�J�{�D�1�1�	�� �(�F����!� r;c�\�	tj��}|�|||��dSr6)rr�r))r�r�r�rls    r'rzDictConfigurator.configure_root.s1��8�� �"�"���!�!�$���<�<�<�<�<r;N)F)r�r�r�rrrrrr'r)rrr�r;r'r�r��s��������
\#�\#�\#�|"�"�"�H���
G�
G�
G�=�=�=�~H�H�H�2�2�2�2�$)�)�)�)�=�=�=�=�=�=r;r�c�J�	t|�����dSr6)�dictConfigClassr)r�s r'�
dictConfigr.5s%��/��F���%�%�'�'�'�'�'r;c���	Gd�dt��}Gd�dt��}G�fd�dtj����||||��S)Nc��eZdZ	d�ZdS)�#listen.<locals>.ConfigStreamHandlerc��		|j}|�d��}t|��dk�rntjd|��d}|j�|��}t|��|kr;||�|t|��z
��z}t|��|k�;|jj�|j�|��}|��|�d��}	ddl}|�	|��}t|��nX#t$rKtj
|��}	t|��n##t$rtj��YnwxYwYnwxYw|jjr"|jj���dSdSdS#t&$r}|jt*kr�Yd}~dSd}~wwxYw)N�z>Lrzutf-8)�
connection�recvrF�struct�unpack�server�verify�decode�json�loadsr.r�r�StringIOr(�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)r��conn�chunk�slenr;r��filer$s        r'�handlez*listen.<locals>.ConfigStreamHandler.handleUs���
�
�����	�	�!�����u�:�:��?�?�!�=��u�5�5�a�8�D� �O�0�0��6�6�E��e�*�*�t�+�+� %��	�	�$��U���2C�(D�(D� D���e�*�*�t�+�+��{�)�5� $�� 2� 2�5� 9� 9���(� %���W� 5� 5��6�'�K�K�K�#�z�z�%�0�0�A�&�q�M�M�M�M��(�6�6�6�$&�;�u�#5�#5�D�6� *�4� 0� 0� 0� 0��#,�6�6�6� )� 3� 5� 5� 5� 5� 5�6������
6�����{�(�0���)�-�-�/�/�/�/�/�/#�?�,0�0���
�
�
��7�k�)�)��*�)�)�)�)�)�����
���s`�C0F%�4(D�F%�E2�<E�E2�E,�)E2�+E,�,E2�/F%�1E2�2-F%�%
G�/G�GN)r�r�r�rIr�r;r'�ConfigStreamHandlerr1Ns(������	�%	�%	�%	�%	�%	r;rJc�,�eZdZ	dZdedddfd�Zd�ZdS)�$listen.<locals>.ConfigSocketReceiverr}�	localhostNc��tj|||f|��tj��d|_tj��d|_||_||_dS)Nrr})	rr�rr�abortr�timeoutr@r9)r��host�portrr@r9s      r'r�z-listen.<locals>.ConfigSocketReceiver.__init__�sY���'��t�T�l�G�D�D�D�� �"�"�"��D�J�� �"�"�"��D�L��D�J� �D�K�K�Kr;c�:�ddl}d}|s~|�|j���ggg|j��\}}}|r|���tj��|j}tj��|�~|�	��dS)Nr)
�select�socket�filenorP�handle_requestrrrOr�server_close)r�rTrO�rd�wr�exs      r'�serve_until_stoppedz8listen.<locals>.ConfigSocketReceiver.serve_until_stopped�s����M�M�M��E��
'�#�]�]�D�K�,>�,>�,@�,@�+A�+-�r�+/�<�9�9�
��B���*��'�'�)�)�)��$�&�&�&��
���$�&�&�&��
'�
�������r;)r�r�r��allow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r\r�r;r'�ConfigSocketReceiverrL|sQ������	� �� +�2M�!��d�	!�	!�	!�	!�	 �	 �	 �	 �	 r;r_c�(���eZdZ��fd�Zd�Z�xZS)�listen.<locals>.Serverc���t�|�����||_||_||_||_t
j��|_dSr6)	�superr��rcvr�hdlrrRr9�	threading�Eventr@)r�rdrerRr9�Server�	__class__s     ��r'r�zlisten.<locals>.Server.__init__�sN����&�$���(�(�*�*�*��D�I��D�I��D�I� �D�K�"��*�*�D�J�J�Jr;c�D�|�|j|j|j|j���}|jdkr|jd|_|j���tj��|a	tj
��|���dS)N)rRrr@r9rr})rdrRrer@r9�server_addressrArr�	_listenerrr\)r�r8s  r'�runzlisten.<locals>.Server.run�s����Y�Y�D�I�t�y�%)�Z�&*�k��3�3�F��y�A�~�~�"�1�!�4��	��J�N�N����� �"�"�"��I�� �"�"�"��&�&�(�(�(�(�(r;)r�r�r�r�rm�
__classcell__)rirhs@�r'rhra�sM��������	+�	+�	+�	+�	+�	+�	)�	)�	)�	)�	)�	)�	)r;rh)rrrf�Thread)rRr9rJr_rhs    @r'�listenrp:s�����&,�,�,�,�,�2�,�,�,�\ � � � � �1� � � �>)�)�)�)�)�)�)��!�)�)�)�.�6�&�(;�T�6�J�J�Jr;c��	tj��	trdt_datj��dS#tj��wxYw)Nr})rrrlrOrr�r;r'�
stopListeningrr�s[����������	��I�O��I�����������������s�A�A)NTN)+rCrr�logging.handlersr�queuer�r6rfr>�socketserverrrr^�
ECONNRESETrDrlr(r4r:rrrxrrr��Ir�r��objectr�r�r�r~r�r�r�r�r�r-r.rprrr�r;r'�<module>rys���"�
����	�	�	�	���������	�	�	�	�����	�	�	�	�
�
�
�
���������A�A�A�A�A�A�A�A�#�����
�	�)�)�)�)�X���!�!�!����,$�$�$�L/�/�/�,TH�TH�TH�n � � ��R�Z�,�b�d�
3�
3�
���������f����B
@�
@�
@�
@�
@�T�?�
@�
@�
@�#�#�#�#�#�T�?�#�#�#�@�@�@�@�@�e�_�@�@�@�A�A�A�A�A�v�A�A�A�FB=�B=�B=�B=�B=�'�B=�B=�B=�H
#��(�(�(�
,�D�xK�xK�xK�xK�t����r;PK�]DL&RR*__pycache__/__init__.cpython-311.opt-2.pycnu�[����

Ħ�=�v�����	ddlZddlZddlZddlZddlZddlZddlZddlZddlZ	ddl
mZddlm
Z
ddlmZgd�ZddlZdZdZdZd	Zej��Zd
Zd
Zd
Zd
ZdZeZdZd
ZeZdZ dZ!dZ"ededede de!de"diZ#eeeeee e!e"d�Z$d�Z%d�Z&d�Z'e(ed��rd�Z)nd�Z)ej*�+e'j,j-��Z.d�Z/d�Z0ej1��Z2d�Z3d �Z4e(ed!��sd"�Z5n(ej6��Z7d#�Z5d$�Z8ej9e3e8e4�%��Gd&�d'e:��Z;e;a<d(�Z=d)�Z>d*�Z?e��Z@[Gd+�d,e:��ZAGd-�d.eA��ZBGd/�d0eA��ZCd1ZDeAeDfeBd2feCd3fd4�ZEGd5�d6e:��Ze��ZFGd7�d8e:��ZGGd9�d:e:��ZHGd;�d<e:��ZIejJ��ZKgZLd=�ZMd>�ZNGd?�d@eI��ZOGdA�dBeO��ZPGdC�dDeP��ZQGdE�dFeP��ZReRe��ZSeSZTGdG�dHe:��ZUdI�ZVdJ�ZWGdK�dLe:��ZXGdM�dNeI��ZYGdO�dPeY��ZZeYa[GdQ�dRe:��Z\eZe��Z]e]eY_]eXeYj]��eY_^dS�Z_dedT�Z`dU�ZadV�ZbdW�Zcd
dX�dY�ZddZ�Zed[�Zfd\�Zgd]�Zhd^�Ziefd_�ZjeLfd`�ZkddllZleljmek��Gda�dbeO��Zndaodfdc�Zpdd�ZqdS)g�N)�GenericAlias)�Template)�	Formatter)+�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filterr�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptions�getLevelNamesMappingz&Vinay Sajip <vinay_sajip@red-dove.com>�
productionz0.5.1.2z07 February 2010T�2�(���
rr
rrr	r)rrr
rrrr	rc�4�t���S�N)�_nameToLevel�copy���;/opt/alt/python-internal/lib/python3.11/logging/__init__.pyr/r/xs�������r;c��	t�|��}|�|St�|��}|�|Sd|zS)NzLevel %s)�_levelToName�getr8)�level�results  r<r!r!{sP���$�
�
�e�
$�
$�F�
���
�
�
�
�e�
$�
$�F�
���
����r;c��	t��	|t|<|t|<t��dS#t��wxYwr7)�_acquireLockr>r8�_releaseLock)r@�	levelNames  r<rr�sF���
�N�N�N��'��U��"'��Y����������������s	�5�A�	_getframec�*�tjd��S)N�)�sysrFr:r;r<�<lambda>rJ�s��3�=��+�+�r;c�z�		t�#t$r&tj��djjcYSwxYw)N�)�	ExceptionrI�exc_info�tb_frame�f_backr:r;r<�currentframerQ�sG��C�	5��O���	5�	5�	5��<�>�>�!�$�-�4�4�4�4�	5���s�
�-:�:c�|�	tj�|jj��}|t
kpd|vod|vS)N�	importlib�
_bootstrap)�os�path�normcase�f_code�co_filename�_srcfile)�frame�filenames  r<�_is_internal_framer]�sC��K��w����� 8�9�9�H��x����x��<�L�H�$<�r;c���t|t��r|}nNt|��|kr)|tvrt	d|z���t|}ntd|�����|S)NzUnknown level: %rz(Level not an integer or a valid string: )�
isinstance�int�strr8�
ValueError�	TypeError)r@�rvs  r<�_checkLevelre�sz���%����$�
���	�U���u�	�	���$�$��0�5�8�9�9�9�
�%�
 ����i� �5�#�$�$�	$�
�Ir;c�L�	trt���dSdSr7)�_lock�acquirer:r;r<rCrC�s,���

��
�
�
�������r;c�L�	trt���dSdSr7)rg�releaser:r;r<rDrD�s,���
��
�
�
�������r;�register_at_forkc��dSr7r:��instances r<�_register_at_fork_reinit_lockro�����r;c��t��	t�|��t��dS#t��wxYwr7)rC�_at_fork_reinit_lock_weakset�addrDrms r<roros?������	�(�,�,�X�6�6�6��N�N�N�N�N��L�N�N�N�N���s	�:�A
c�t�tD]}|����t���dSr7)rr�_at_fork_reinitrg��handlers r<�!_after_at_fork_child_reinit_locksrxs@��3�	&�	&�G��#�#�%�%�%�%�	�������r;)�before�after_in_child�after_in_parentc�&�eZdZ		dd�Zd�Zd�ZdS)rNc
���	tj��}||_||_|rHt|��dkr5t	|dt
jj��r|dr|d}||_t|��|_
||_||_	tj�|��|_tj�|j��d|_n+#t&t(t*f$r||_d|_YnwxYw||_d|_|	|_||_||_||_t9|t9|��z
dz��dz|_|jt<z
dz|_t@r6tCj"��|_#tCj$��j|_%nd|_#d|_%tLsd|_'nXd|_'tPj)�*d��}|�0	|�+��j|_'n#tX$rYnwxYwtZr/t]td��rtj/��|_0dSd|_0dS)	NrHrzUnknown modulei�g�MainProcess�multiprocessing�getpid)1�time�name�msg�lenr_�collections�abc�Mapping�argsr!�	levelname�levelno�pathnamerUrV�basenamer\�splitext�modulercrb�AttributeErrorrN�exc_text�
stack_info�lineno�funcName�createdr`�msecs�
_startTime�relativeCreated�
logThreads�	threading�	get_ident�thread�current_thread�
threadName�logMultiprocessing�processNamerI�modulesr?�current_processrM�logProcesses�hasattrr��process)
�selfr�r@r�r�r�r�rN�func�sinfo�kwargs�ct�mps
             r<�__init__zLogRecord.__init__$s@��	��Y�[�[����	����&
�	�S��Y�Y�!�^�^�
�4��7�K�O�<S�(T�(T�^��Q��$���7�D���	�%�e�,�,������ ��
�	+��G�,�,�X�6�6�D�M��'�*�*�4�=�9�9�!�<�D�K�K���:�~�6�	+�	+�	+�$�D�M�*�D�K�K�K�	+����!��
���
���������
�����"�s�2�w�w�,�$�.�/�/�#�5��
� $��z� 9�T�A����	#�#�-�/�/�D�K�'�6�8�8�=�D�O�O��D�K�"�D�O�!�
	�#�D���,�D������!2�3�3�B��~�
�')�'9�'9�';�';�'@�D�$�$�� �����D������	 �G�B��1�1�	 ��9�;�;�D�L�L�L��D�L�L�Ls%�AC+�+%D�D�H#�#
H0�/H0c�X�d|j�d|j�d|j�d|j�d|j�d�S)Nz<LogRecord: �, z, "z">)r�r�r�r�r��r�s r<�__repr__zLogRecord.__repr__ls8���48�I�I�I�t�|�|�|��M�M�M�4�;�;�;�����2�	2r;c�R�	t|j��}|jr
||jz}|Sr7)rar�r�)r�r�s  r<�
getMessagezLogRecord.getMessageps0��	��$�(�m�m���9�	"���	�/�C��
r;�NN)�__name__�
__module__�__qualname__r�r�r�r:r;r<rrsU������
�8<�F �F �F �F �P2�2�2�
�
�
�
�
r;rc��	|adSr7��_logRecordFactory)�factorys r<r,r,�s��� ���r;c��	tSr7r�r:r;r<r+r+�s����r;c
�h�	tdddddddd��}|j�|��|S)N�rr:)r��__dict__�update)�dictrds  r<r&r&�s?���
�4��r�1�b�"�d�D�	A�	A�B��K���t����
�Ir;c�j�eZdZdZdZdZejdej��Z	dd�d�Z
d�Zd	�Zd
�Z
d�ZdS)�PercentStylez%(message)sz%(asctime)sz
%(asctime)z5%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]N��defaultsc�0�|p|j|_||_dSr7)�default_format�_fmt�	_defaults)r��fmtr�s   r<r�zPercentStyle.__init__�s���.�4�.��	�!����r;c�H�|j�|j��dkS�Nr�r��find�asctime_searchr�s r<�usesTimezPercentStyle.usesTime�s���y�~�~�d�1�2�2�a�7�7r;c��	|j�|j��s&td|j�d|jd�d����dS)NzInvalid format 'z' for 'rz' style)�validation_pattern�searchr�rbr�r�s r<�validatezPercentStyle.validate�sX��L��&�-�-�d�i�8�8�	i��*�T�Y�Y�Y�PT�Pc�de�Pf�Pf�Pf�g�h�h�h�	i�	ir;c�L�|jx}r||jz}n|j}|j|zSr7)r�r�r��r��recordr��valuess    r<�_formatzPercentStyle._format�s3���~�%�8�	%����/�F�F��_�F��y�6�!�!r;c�v�	|�|��S#t$r}td|z���d}~wwxYw)Nz(Formatting field not found in record: %s)r��KeyErrorrb)r�r��es   r<�formatzPercentStyle.format�sQ��	M��<�<��'�'�'���	M�	M�	M��G�!�K�L�L�L�����	M���s��
8�3�8)r�r�r�r��asctime_formatr��re�compile�Ir�r�r�r�r�r�r:r;r<r�r��s�������"�N�"�N�!�N�#���$\�^`�^b�c�c��(,�"�"�"�"�"�8�8�8�i�i�i�
"�"�"�M�M�M�M�Mr;r�c�r�eZdZdZdZdZejdej��Z	ejd��Z
d�Zd�ZdS)	�StrFormatStylez	{message}z	{asctime}z{asctimezF^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$z^(\d+|\w+)(\.\w+|\[[^]]+\])*$c�\�|jx}r||jz}n|j}|jjdi|��S�Nr:)r�r�r�r�r�s    r<r�zStrFormatStyle._format�sA���~�%�8�	%����/�F�F��_�F��t�y��)�)�&�)�)�)r;c���	t��}	t�|j��D]�\}}}}|rA|j�|��st
d|z���|�|��|r|dvrt
d|z���|r,|j�|��st
d|z�����n$#t$r}t
d|z���d}~wwxYw|st
d���dS)Nz!invalid field name/expression: %r�rsazinvalid conversion: %rzbad specifier: %rzinvalid format: %s�invalid format: no fields)	�set�_str_formatter�parser��
field_spec�matchrbrs�fmt_spec)r��fields�_�	fieldname�spec�
conversionr�s       r<r�zStrFormatStyle.validate�s=��Y�����	7�2@�2F�2F�t�y�2Q�2Q�
A�
A�.��9�d�J��*��?�0�0��;�;�Z�(�)L�y�)X�Y�Y�Y��J�J�y�)�)�)��L�*�E�"9�"9�$�%=�
�%J�K�K�K��A��
� 3� 3�D� 9� 9�A�$�%8�4�%?�@�@�@��
A���	7�	7�	7��1�A�5�6�6�6�����	7�����	:��8�9�9�9�	:�	:s�B0C�
C#�C�C#N)
r�r�r�r�r�r�r�r�r�r�r�r�r�r:r;r<r�r��sk������ �N� �N��N��r�z�c�eg�ei�j�j�H����<�=�=�J�*�*�*�:�:�:�:�:r;r�c�<��eZdZdZdZdZ�fd�Zd�Zd�Zd�Z	�xZ
S)�StringTemplateStylez
${message}z
${asctime}c�l��t��j|i|��t|j��|_dSr7)�superr�rr��_tpl)r�r�r��	__class__s   �r<r�zStringTemplateStyle.__init__�s4��������$�)�&�)�)�)��T�Y�'�'��	�	�	r;c�~�|j}|�d��dkp|�|j��dkS)Nz$asctimerr��r�r�s  r<r�zStringTemplateStyle.usesTime�s9���i���x�x�
�#�#�q�(�N�C�H�H�T�5H�,I�,I�Q�,N�Nr;c��tj}t��}|�|j��D]�}|���}|dr|�|d���:|dr|�|d���^|�d��dkrtd�����|std���dS)N�named�bracedr�$z$invalid format: bare '$' not allowedr�)	r�patternr��finditerr��	groupdictrs�grouprb)r�r�r��m�ds     r<r�zStringTemplateStyle.validate�s����"�������!�!�$�)�,�,�	K�	K�A����
�
�A���z�
K��
�
�1�W�:�&�&�&�&��8��
K��
�
�1�X�;�'�'�'�'�������s�"�"� �!I�J�J�J�#��	:��8�9�9�9�	:�	:r;c�\�|jx}r||jz}n|j}|jjdi|��Sr�)r�r�r��
substituter�s    r<r�zStringTemplateStyle._formatsA���~�%�8�	%����/�F�F��_�F�#�t�y�#�-�-�f�-�-�-r;)r�r�r�r�r�r�r�r�r�r��
__classcell__)r�s@r<r�r��sw�������!�N�!�N�!�N�(�(�(�(�(�O�O�O�:�:�:�.�.�.�.�.�.�.r;r�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{r�c�Z�eZdZ	ejZddd�d�ZdZdZdd�Z	d	�Z
d
�Zd�Zd�Z
d
�ZdS)rNrTr�c�<�	|tvr<tdd�t�����z���t|d||���|_|r|j���|jj|_||_dS)N�Style must be one of: %s�,rr�)�_STYLESrb�join�keys�_styler�r��datefmt)r�r�r�styler�r�s      r<r�zFormatter.__init__@s���	������7�#�(�(�$�\�\�^�^�;-�;-�-�.�.�
.��e�n�Q�'��h�?�?�?����	#��K� � �"�"�"��K�$��	�����r;z%Y-%m-%d %H:%M:%Sz%s,%03dc���	|�|j��}|rtj||��}n2tj|j|��}|jr|j||jfz}|Sr7)�	converterr�r��strftime�default_time_format�default_msec_formatr�)r�r�rr��ss     r<�
formatTimezFormatter.formatTime^sq��	�"�^�^�F�N�
+�
+���	A��
�g�r�*�*�A�A��
�d�6��;�;�A��'�
A��,��6�<�/@�@���r;c��	tj��}|d}tj|d|d|d|��|���}|���|dd�dkr
|dd�}|S)NrLrrH����
)�io�StringIO�	traceback�print_exception�getvalue�close)r��ei�sio�tbrs     r<�formatExceptionzFormatter.formatExceptionys}��	��k�m�m��
��U��	�!�"�Q�%��A���D�#�>�>�>��L�L�N�N���	�	�����R�S�S�6�T�>�>��#�2�#��A��r;c�6�	|j���Sr7)rr�r�s r<r�zFormatter.usesTime�s��	��{�#�#�%�%�%r;c�6�|j�|��Sr7)rr��r�r�s  r<�
formatMessagezFormatter.formatMessage�s���{�!�!�&�)�)�)r;c��	|Sr7r:)r�r�s  r<�formatStackzFormatter.formatStack�s��		��r;c���	|���|_|���r |�||j��|_|�|��}|jr&|js|�	|j��|_|jr|dd�dkr|dz}||jz}|j
r0|dd�dkr|dz}||�|j
��z}|S)Nrr)r��messager�rr�asctimer*rNr�r&r�r,)r�r�rs   r<r�zFormatter.format�s���	� �*�*�,�,����=�=�?�?�	C�!�_�_�V�T�\�B�B�F�N����v�&�&���?�	H��?�
H�"&�"6�"6�v��"G�"G����?�	$�����v��~�~���H���F�O�#�A���	8�����v��~�~���H���D�$�$�V�%6�7�7�7�A��r;)NNrTr7)r�r�r�r��	localtimerr�rrrr&r�r*r,r�r:r;r<rrs�������(�T��I��������6.��#������6���&&�&�&�*�*�*��������r;rc�*�eZdZ	dd�Zd�Zd�Zd�ZdS)rNc�6�	|r	||_dSt|_dSr7)�linefmt�_defaultFormatter)r�r3s  r<r�zBufferingFormatter.__init__�s'��	��	-�"�D�L�L�L�,�D�L�L�Lr;c��	dS�Nr�r:�r��recordss  r<�formatHeaderzBufferingFormatter.formatHeader����	��rr;c��	dSr6r:r7s  r<�formatFooterzBufferingFormatter.formatFooter�r:r;c���	d}t|��dkrR||�|��z}|D]}||j�|��z}� ||�|��z}|S)Nr�r)r�r9r3r�r<)r�r8rdr�s    r<r�zBufferingFormatter.format�s��	����w�<�<�!����d�'�'��0�0�0�B�!�
6�
6���$�,�-�-�f�5�5�5����d�'�'��0�0�0�B��	r;r7)r�r�r�r�r9r<r�r:r;r<rr�sZ�������-�-�-�-�������
�
�
�
�
r;rc��eZdZ	dd�Zd�ZdS)r
r�c�>�	||_t|��|_dSr7)r�r��nlen�r�r�s  r<r�zFilter.__init__�s!��	���	���I�I��	�	�	r;c���	|jdkrdS|j|jkrdS|j�|jd|j��dkrdS|j|jdkS)NrTF�.)r@r�r�r)s  r<�filterz
Filter.filtersi��	��9��>�>��4�
�Y�&�+�
%�
%��4�
�[�
�
�d�i��D�I�
6�
6�!�
;�
;��5���D�I�&�#�-�.r;N)r�)r�r�r�r�rDr:r;r<r
r
�s<������	�	�	�	�	�
/�
/�
/�
/�
/r;r
c�(�eZdZ	d�Zd�Zd�Zd�ZdS)�Filtererc��	g|_dSr7)�filtersr�s r<r�zFilterer.__init__s��	�����r;c�R�	||jvr|j�|��dSdSr7)rH�append�r�rDs  r<�	addFilterzFilterer.addFilter!s:��	��$�,�&�&��L����'�'�'�'�'�'�&r;c�R�	||jvr|j�|��dSdSr7)rH�removerKs  r<�removeFilterzFilterer.removeFilter(s:��	��T�\�!�!��L����'�'�'�'�'�"�!r;c��	d}|jD]9}t|d��r|�|��}n||��}|sd}n�:|S)NTrDF)rHr�rD)r�r�rd�frAs     r<rDzFilterer.filter/so��
	�����	�	�A��q�(�#�#�
#����&�)�)�����6�����
�����
��	r;N)r�r�r�r�rLrOrDr:r;r<rFrFsU����������(�(�(�(�(�(�����r;rFc���	ttt}}}|rP|rP|rP|��	|�|��n#t$rYnwxYw|��dS#|��wxYwdSdSdSr7)rCrD�_handlerListrNrb)�wrrhrj�handlerss    r<�_removeHandlerRefrVMs����".�|�\�h�W�G���7��x����	�	�	�	��O�O�B�������	�	�	��D�	����
�G�I�I�I�I�I��G�G�I�I�I�I���������s&�>�A�
A�A�
A�A�A&c���	t��	t�tj|t
����t
��dS#t
��wxYwr7)rCrSrJ�weakref�refrVrDrvs r<�_addHandlerRefrZ_sS����N�N�N�����G�K��1B�C�C�D�D�D���������������s�2A�A#c��eZdZ	efd�Zd�Zd�Zeee��Zd�Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�ZdS)rc���	t�|��d|_t|��|_d|_d|_t|��|���dS�NF)	rFr��_namerer@�	formatter�_closedrZ�
createLock�r�r@s  r<r�zHandler.__init__rse��	�	���$������
� ��'�'��
��������t�����������r;c��|jSr7)r^r�s r<�get_namezHandler.get_name�s
���z�r;c���t��	|jtvr
t|j=||_|r
|t|<t��dS#t��wxYwr7)rCr^�	_handlersrDrAs  r<�set_namezHandler.set_name�sZ������	��z�Y�&�&��d�j�)��D�J��
'�"&�	�$���N�N�N�N�N��L�N�N�N�N���s�.A�Ac�V�	tj��|_t|��dSr7)r��RLock�lockror�s r<razHandler.createLock�s,��	��O�%�%��	�%�d�+�+�+�+�+r;c�8�|j���dSr7)rjrur�s r<ruzHandler._at_fork_reinit�s���	�!�!�#�#�#�#�#r;c�L�	|jr|j���dSdSr7)rjrhr�s r<rhzHandler.acquire��7��	��9�	 ��I��������	 �	 r;c�L�	|jr|j���dSdSr7)rjrjr�s r<rjzHandler.release�rmr;c�0�	t|��|_dSr7)rer@rbs  r<�setLevelzHandler.setLevel�s��	�!��'�'��
�
�
r;c�Z�	|jr|j}nt}|�|��Sr7)r_r4r�)r�r�r�s   r<r�zHandler.format�s3��	��>�	$��.�C�C�#�C��z�z�&�!�!�!r;c�"�	td���)Nz.emit must be implemented by Handler subclasses)�NotImplementedErrorr)s  r<�emitzHandler.emit�s ��	�"�#:�;�;�	;r;c���	|�|��}|rX|���	|�|��|���n#|���wxYw|Sr7)rDrhrtrj)r�r�rds   r<�handlezHandler.handle�sl��	��[�[��
 �
 ��
�	��L�L�N�N�N�
��	�	�&�!�!�!��������������������	s�A�A.c��	||_dSr7)r_r�s  r<�setFormatterzHandler.setFormatter�s��	�����r;c��	dSr7r:r�s r<�flushz
Handler.flush�s��	�	
�r;c��	t��	d|_|jr|jtvr
t|j=t	��dS#t	��wxYw)NT)rCr`r^rfrDr�s r<r"z
Handler.close�sY��	�	����	��D�L��z�
*�d�j�I�5�5��d�j�)��N�N�N�N�N��L�N�N�N�N���s�)A
�
Ac���	t�r�tj�r�tj��\}}}	tj�d��tj|||dtj��tj�d��|j}|rytj	�
|jj��tdkrA|j}|r8tj	�
|jj��tdk�A|r!tj|tj���n0tj�d|j�d|j�d���	tj�d|j�d	|j�d���n9#t($r�t*$r"tj�d
��YnwxYwn#t,$rYnwxYw~~~dS#~~~wxYwdSdS)Nz--- Logging error ---
zCall stack:
r��filezLogged from file z, line rz	Message: z
Arguments: zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r.rI�stderrrN�writerr rOrUrV�dirnamerXrY�__path__rP�print_stackr\r�r�r��RecursionErrorrM�OSError)r�r��t�vr%r[s      r<�handleErrorzHandler.handleError�s8��
	��!	�s�z�!	��|�~�~�H�A�q�"�
��
� � �!:�;�;�;��)�!�Q��D�#�*�E�E�E��
� � ��1�1�1�����)�������1I�!J�!J���{�"#�"#�!�L�E��)�������1I�!J�!J���{�"#�"#��F��)�%�c�j�A�A�A�A�A��J�$�$�$�%+�_�_�_�f�m�m�m�&E�F�F�F�
&��J�$�$�$�:@�*�*�*�:@�+�+�+�&G�H�H�H�H��&����� �&�&�&��J�$�$�&R�&�&�&�&�&�&������
�
�
�
���
�����q�"�"�"��A�q�"�����C!	�!	�!	�!	sN�D5G�%0F�G�3G�	G�G�G�G%�
G�G%�G�G%�%G*c�P�t|j��}d|jj�d|�d�S)N�<� (�)>)r!r@r�r�rbs  r<r�zHandler.__repr__'s-���T�Z�(�(���"�n�5�5�5�u�u�u�=�=r;N)r�r�r�rr�rdrg�propertyr�rarurhrjrpr�rtrvrxrzr"r�r�r:r;r<rris'�������$��������	�	�	��8�H�h�'�'�D�,�,�,�$�$�$� � � � � � �(�(�(�"�"�"�;�;�;����$���
�
�
����$-�-�-�^>�>�>�>�>r;rc�J�eZdZ	dZdd�Zd�Zd�Zd�Zd�Ze	e
��ZdS)	rrNc�f�	t�|��|�tj}||_dSr7)rr�rIr�stream�r�r�s  r<r�zStreamHandler.__init__4s4��	�
	��������>��Z�F�����r;c��	|���	|jr.t|jd��r|j���|���dS#|���wxYw)Nrz)rhr�r�rzrjr�s r<rzzStreamHandler.flush?so��	�	
������	��{�
$�w�t�{�G�<�<�
$���!�!�#�#�#��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�5A"�"A8c��		|�|��}|j}|�||jz��|���dS#t
$r�t$r|�|��YdSwxYwr7)r�r�r��
terminatorrzr�rMr�)r�r�r�r�s    r<rtzStreamHandler.emitJs���		�		%��+�+�f�%�%�C��[�F��L�L��t��.�/�/�/��J�J�L�L�L�L�L���	�	�	���	%�	%�	%����V�$�$�$�$�$�$�	%���s�A
A�)A?�>A?c���	||jurd}ne|j}|���	|���||_|���n#|���wxYw|Sr7)r�rhrzrj)r�r�rAs   r<�	setStreamzStreamHandler.setStream`sp��	��T�[� � ��F�F��[�F��L�L�N�N�N�
��
�
����$����������������������
s�A�A0c��t|j��}t|jdd��}t	|��}|r|dz
}d|jj�d|�d|�d�S)Nr�r�� r��(r�)r!r@�getattrr�rar�r�)r�r@r�s   r<r�zStreamHandler.__repr__tsa���T�Z�(�(���t�{�F�B�/�/���4�y�y���	��C�K�D�� $�� 7� 7� 7����u�u�u�E�Er;r7)r�r�r�r�r�rzrtr�r��classmethodr�__class_getitem__r:r;r<rr+s���������J�	�	�	�	�	�	�	�%�%�%�,���(F�F�F�$��L�1�1���r;rc�0�eZdZ	d	d�Zd�Zd�Zd�Zd�ZdS)
r�aNFc��	tj|��}tj�|��|_||_||_d|vrtj|��|_||_	||_
t|_|r#t�|��d|_dSt �||�����dS)N�b)rU�fspathrV�abspath�baseFilename�mode�encodingr�
text_encoding�errors�delay�open�
_builtin_openrr�r�r�_open)r�r\r�r�r�r�s      r<r�zFileHandler.__init__�s���	��9�X�&�&���G�O�O�H�5�5�����	� ��
��d�?�?��,�X�6�6�D�M������
�"����	7�
���T�"�"�"��D�K�K�K��"�"�4������6�6�6�6�6r;c��	|���		|jr�	|���|j}d|_t|d��r|���n8#|j}d|_t|d��r|���wwxYwt
�|��n#t
�|��wxYw	|���dS#|���wxYw)Nr")rhr�rzr�r"rrjr�s  r<r"zFileHandler.close�s���	�	
������	�
*��;�+�+��
�
����!%���&*���"�6�7�3�3�+�"�L�L�N�N�N���"&���&*���"�6�7�3�3�+�"�L�L�N�N�N�N�+�����#�#�D�)�)�)�)��
�#�#�D�)�)�)�)����)��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s3�B:�A'�3B:�'5B�B:�C0�:C�C0�0Dc�X�	|j}||j|j|j|j���S)N�r�r�)r�r�r�r�r�)r��	open_funcs  r<r�zFileHandler._open�s@��	��&�	��y��*�D�I�"&�-���E�E�E�	Er;c��	|j�+|jdks|js|���|_|jrt�||��dSdS)N�w)r�r�r`r�rrtr)s  r<rtzFileHandler.emit�sd��	��;���y�C���t�|��"�j�j�l�l����;�	-����t�V�,�,�,�,�,�	-�	-r;c�`�t|j��}d|jj�d|j�d|�d�S�Nr�r�r�r�)r!r@r�r�r�rbs  r<r�zFileHandler.__repr__�s8���T�Z�(�(���!%��!8�!8�!8�$�:K�:K�:K�U�U�U�S�Sr;)r�NFN)r�r�r�r�r"r�rtr�r:r;r<rr�sq�������7�7�7�7�6���0E�E�E�-�-�-� T�T�T�T�Tr;rc�0�eZdZ	efd�Zed���ZdS)�_StderrHandlerc�>�	t�||��dSr7)rr�rbs  r<r�z_StderrHandler.__init__�s%��	�	����u�%�%�%�%�%r;c��tjSr7)rIrr�s r<r�z_StderrHandler.stream�s
���z�r;N)r�r�r�rr�r�r�r:r;r<r�r��sM�������
$�&�&�&�&�����X���r;r�c��eZdZ	d�Zd�ZdS)�PlaceHolderc��	|di|_dSr7��	loggerMap�r��aloggers  r<r�zPlaceHolder.__init__�s��	�#�T�+����r;c�2�	||jvrd|j|<dSdSr7r�r�s  r<rJzPlaceHolder.append�s0��	��$�.�(�(�&*�D�N�7�#�#�#�)�(r;N)r�r�r�r�rJr:r;r<r�r��s7�������
,�,�,�+�+�+�+�+r;r�c�z�	|tkr,t|t��std|jz���|adS�Nz(logger not derived from logging.Logger: )r�
issubclassrcr��_loggerClass)�klasss r<r'r'sN���

�����%��(�(�	.��F�#�n�-�.�.�
.��L�L�Lr;c��	tSr7)r�r:r;r<r#r#s����r;c�p�eZdZ	d�Zed���Zejd���Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
S)�Managerc�\�	||_d|_d|_i|_d|_d|_dS)NrF)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)r��rootnodes  r<r�zManager.__init__s<��	���	����',��$������� $����r;c��|jSr7)�_disabler�s r<rzManager.disable's
���}�r;c�.�t|��|_dSr7)rer��r��values  r<rzManager.disable+s��#�E�*�*��
�
�
r;c�2�	d}t|t��std���t��	||jvrx|j|}t|t
��rU|}|jpt|��}||_||j|<|�	||��|�
|��n=|jpt|��}||_||j|<|�
|��t��n#t��wxYw|S)NzA logger name must be a string)r_rarcrCr�r�r�r��manager�_fixupChildren�
_fixupParentsrD)r�r�rd�phs    r<r"zManager.getLogger/s��		����$��$�$�	>��<�=�=�=�����	��t��&�&��_�T�*���b�+�.�.�+��B�:�$�*�:�l�D�A�A�B�!%�B�J�,.�D�O�D�)��'�'��B�/�/�/��&�&�r�*�*�*��6�d�&�6�,��=�=��!��
�(*����%��"�"�2�&�&�&��N�N�N�N��L�N�N�N�N�����	s�B>D�Dc��	|tkr,t|t��std|jz���||_dSr�)rr�rcr�r�)r�r�s  r<r'zManager.setLoggerClassQsQ��	��F�?�?��e�V�,�,�
2�� J�"'�.�!1�2�2�2� ����r;c��	||_dSr7)r�)r�r�s  r<r,zManager.setLogRecordFactory[s��	�!(����r;c��	|j}|�d��}d}|dkr�|s�|d|�}||jvrt|��|j|<n:|j|}t	|t
��r|}n|�|��|�dd|dz
��}|dkr|��|s|j}||_dS)NrCrrH)	r��rfindr�r�r_rrJr��parent)r�r�r��ird�substr�objs       r<r�zManager._fixupParentsbs���	��|���J�J�s�O�O��
���1�u�u�b�u��"�1�"�X�F��T�_�,�,�*5�g�*>�*>����'�'��o�f�-���c�6�*�*�(��B�B��J�J�w�'�'�'��
�
�3��1�q�5�)�)�A��1�u�u�b�u��	���B�����r;c���	|j}t|��}|j���D]-}|jjd|�|kr|j|_||_�.dSr7)r�r�r�rr�)r�r�r�r��namelen�cs      r<r�zManager._fixupChildrenzsk��	��|���d�)�)����"�"�$�$�	#�	#�A��x�}�X�g�X�&�$�.�.�!"����"����		#�	#r;c��	t��|j���D]0}t|t��r|j����1|jj���t��dSr7)	rCr�r�r_r�_cache�clearr�rD�r��loggers  r<�_clear_cachezManager._clear_cache�sz��	�
	�����o�,�,�.�.�	&�	&�F��&�&�)�)�
&��
�#�#�%�%�%���	���� � � ������r;N)
r�r�r�r�r�r�setterr"r'r,r�r�r�r:r;r<r�r�s��������	%�	%�	%�����X��
�^�+�+��^�+� � � �D!�!�!�(�(�(����0#�#�#�����r;r�c��eZdZ	efd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
dd	�d
�Zd�Zd�Z
d
�Zdd�Z	dd�Z		d d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZdS)!rc��	t�|��||_t|��|_d|_d|_g|_d|_i|_	dS)NTF)
rFr�r�rer@r��	propagaterU�disabledr�)r�r�r@s   r<r�zLogger.__init__�sZ��	�	���$������	� ��'�'��
���������
���
�����r;c�b�	t|��|_|j���dSr7)rer@r�r�rbs  r<rpzLogger.setLevel�s2��	�!��'�'��
���!�!�#�#�#�#�#r;c�j�	|�t��r|jt||fi|��dSdSr7)�isEnabledForr	�_log�r�r�r�r�s    r<rzLogger.debug��M��	����U�#�#�	2��D�I�e�S�$�1�1�&�1�1�1�1�1�	2�	2r;c�j�	|�t��r|jt||fi|��dSdSr7)r�rr�r�s    r<r$zLogger.info�sM��	����T�"�"�	1��D�I�d�C��0�0��0�0�0�0�0�	1�	1r;c�j�	|�t��r|jt||fi|��dSdSr7)r�rr�r�s    r<r*zLogger.warning�sM��	����W�%�%�	4��D�I�g�s�D�3�3�F�3�3�3�3�3�	4�	4r;c�^�tjdtd��|j|g|�Ri|��dS�Nz6The 'warn' method is deprecated, use 'warning' insteadrL��warningsr)�DeprecationWarningr*r�s    r<r)zLogger.warn��H���
�$�%7��	<�	<�	<����S�*�4�*�*�*�6�*�*�*�*�*r;c�j�	|�t��r|jt||fi|��dSdSr7)r�r
r�r�s    r<rzLogger.error�r�r;T�rNc�.�	|j|g|�Rd|i|��dS�NrN�r�r�r�rNr�r�s     r<rzLogger.exception�s6��	�	��
�3�;��;�;�;��;�F�;�;�;�;�;r;c�j�	|�t��r|jt||fi|��dSdSr7)r�rr�r�s    r<rzLogger.critical�sM��	����X�&�&�	5��D�I�h��T�4�4�V�4�4�4�4�4�	5�	5r;c�*�	|j|g|�Ri|��dSr7�rr�s    r<r zLogger.fatals1��	�	��
�c�+�D�+�+�+�F�+�+�+�+�+r;c��	t|t��strtd���dS|�|��r|j|||fi|��dSdS)Nzlevel must be an integer)r_r`r.rcr�r��r�r@r�r�r�s     r<r%z
Logger.logs{��	��%��%�%�	��
�� :�;�;�;������U�#�#�	2��D�I�e�S�$�1�1�&�1�1�1�1�1�	2�	2r;FrHc��	t��}|�dS|dkr&|j}|�n|}t|��s|dz}|dk�&|j}d}|r�t	j��5}|�d��tj||���|�	��}|ddkr
|dd�}ddd��n#1swxYwY|j
|j|j|fS)N)�(unknown file)r�(unknown function)NrrHzStack (most recent call last):
r}rr)
rQrPr]rXrrr�rr�r!rY�f_lineno�co_name)r�r��
stacklevelrQ�next_f�cor�r$s        r<�
findCallerzLogger.findCallersA��	�
�N�N��
�9�B�B��1�n�n��X�F��~��
�A�%�a�(�(�
 ��a��
��1�n�n��X�����	'�����
'�#��	�	�<�=�=�=��%�a�c�2�2�2�2���������9��$�$�!�#�2�#�J�E�
'�
'�
'�
'�
'�
'�
'�
'�
'�
'�
'����
'�
'�
'�
'��~�q�z�2�:�u�<�<s�AC�C�CNc��	t|||||||||
�	�	}|	�4|	D]1}|dvs	||jvrtd|z���|	||j|<�2|S)N)r.r/z$Attempt to overwrite %r in LogRecord)r�r�r�)
r�r�r@�fn�lnor�r�rNr��extrar�rd�keys
             r<�
makeRecordzLogger.makeRecord;s���	��t�U�B��S�$��$�"�$�$�����
.�
.���1�1�1�s�b�k�7I�7I�"�#I�C�#O�P�P�P�#(��:���C� � ��	r;c��	d}tr3	|�||��\}	}
}}n#t$r	d\}	}
}Yn
wxYwd\}	}
}|rUt|t��rt|��||jf}n(t|t��stj	��}|�
|j||	|
||||||�
�
}|�|��dS)N)r	rr
)
rZrrbr_�
BaseException�type�
__traceback__�tuplerIrNrr�rv)
r�r@r�r�rNrr�r
r�rrr�r�s
             r<r�zLogger._logJs��	����		F�
J�'+���z�:�'N�'N�$��C��u�u���
J�
J�
J� I�
��C����
J����F�M�B��T��	*��(�M�2�2�
*� ��N�N�H�h�6L�M�����%�0�0�
*��<�>�>�������E�2�s�C��!)�4���?�?�����F�����s�(�;�;c�r�	|js,|�|��r|�|��dSdSdSr7)r�rD�callHandlersr)s  r<rvz
Logger.handledsT��	��
�	&�4�;�;�v�#6�#6�	&����f�%�%�%�%�%�	&�	&�	&�	&r;c��	t��	||jvr|j�|��t��dS#t��wxYwr7)rCrUrJrD�r��hdlrs  r<�
addHandlerzLogger.addHandlernsU��	�	����	��D�M�)�)��
�$�$�T�*�*�*��N�N�N�N�N��L�N�N�N�N�����#A�Ac��	t��	||jvr|j�|��t��dS#t��wxYwr7)rCrUrNrDrs  r<�
removeHandlerzLogger.removeHandlerysU��	�	����	��t�}�$�$��
�$�$�T�*�*�*��N�N�N�N�N��L�N�N�N�N���r"c�J�	|}d}|r|jrd}n|jsn	|j}|�|S)NFT)rUr�r�)r�r�rds   r<�hasHandlerszLogger.hasHandlers�sR��	�
��
���	��z�
�����;�
���H���	��	r;c��	|}d}|rG|jD],}|dz}|j|jkr|�|���-|jsd}n|j}|�G|dkr�tr3|jtjkrt�|��dSdStrC|jj	s9tj�d|j
z��d|j_	dSdSdSdS)NrrHz+No handlers could be found for logger "%s"
T)rUr�r@rvr�r�r-r.r�r�rIrr�r�)r�r�r��foundr s     r<rzLogger.callHandlers�s&��	�
�����	��
�
(�
(����	���>�T�Z�/�/��K�K��'�'�'���;�
�����H���	�
�Q�J�J��
<��>�Z�%5�5�5��%�%�f�-�-�-�-�-�6�5� �
<���)M�
<��
� � �"-�/3�y�"9�:�:�:�7;���4�4�4�
�J�
<�
<�
<�
<r;c�H�	|}|r|jr|jS|j}|�tSr7)r@r�rr�s  r<�getEffectiveLevelzLogger.getEffectiveLevel�s@��	����	#��|�
$��|�#��]�F��	#��
r;c�6�	|jrdS	|j|S#t$rut��	|jj|kr
dx}|j|<n"||���kx}|j|<t��n#t��wxYw|cYSwxYwr])r�r�r�rCr�rr*rD)r�r@�
is_enableds   r<r�zLogger.isEnabledFor�s���	��=�	��5�
	��;�u�%�%���	�	�	��N�N�N�
��<�'�5�0�0�6;�;�J���U�!3�!3���!7�!7�!9�!9�9��J���U�!3�������������������	���s&��B�?B�1B�B�B�Bc��	|j|urd�|j|f��}|j�|��S)NrC)r�rr�r�r")r��suffixs  r<�getChildzLogger.getChild�sD��
	��9�D� � ��X�X�t�y�&�1�2�2�F��|�%�%�f�-�-�-r;c�z�t|�����}d|jj�d|j�d|�d�Sr�)r!r*r�r�r�rbs  r<r�zLogger.__repr__�s?���T�3�3�5�5�6�6���!%��!8�!8�!8�$�)�)�)�U�U�U�K�Kr;c�~�t|j��|urddl}|�d���t|jffS)Nrzlogger cannot be pickled)r"r��pickle�
PicklingError)r�r2s  r<�
__reduce__zLogger.__reduce__�sD���T�Y���t�+�+��M�M�M��&�&�'A�B�B�B��4�9�,�&�&r;)FrH)NNN)NNFrH)r�r�r�rr�rprr$r*r)rrrr r%rrr�rvr!r$r&rr*r�r/r�r4r:r;r<rr�s�������
�$*�����$�$�$�
2�
2�
2�
1�
1�
1�
4�
4�
4�+�+�+�

2�
2�
2�.2�<�<�<�<�<�
5�
5�
5�,�,�,�2�2�2�" =� =� =� =�F15�
�
�
�
�LQ������4&�&�&�	�	�	�	�	�	����,<�<�<�<������,.�.�.�&L�L�L�'�'�'�'�'r;rc��eZdZ	d�Zd�ZdS)�
RootLoggerc�@�	t�|d|��dS)Nr�)rr�rbs  r<r�zRootLogger.__init__s%��	�	����f�e�,�,�,�,�,r;c��tdfSr�)r"r�s r<r4zRootLogger.__reduce__s���"�}�r;N)r�r�r�r�r4r:r;r<r6r6�s7�������
-�-�-�����r;r6c���eZdZ	dd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	d
�d�Z
d�Zd
�Zd�Z
d�Zd�Zd�Zd�Zed���Zejd���Zed���Zd�Zee��ZdS)rNc�$�	||_||_dSr7)r�r)r�r�rs   r<r�zLoggerAdapter.__init__s��		������
�
�
r;c� �	|j|d<||fS)Nr)r)r�r�r�s   r<r�zLoggerAdapter.processs��	��*��w���F�{�r;c�6�	|jt|g|�Ri|��dSr7)r%r	r�s    r<rzLoggerAdapter.debug/�3��	�	�����-�d�-�-�-�f�-�-�-�-�-r;c�6�	|jt|g|�Ri|��dSr7)r%rr�s    r<r$zLoggerAdapter.info5s3��	�	����s�,�T�,�,�,�V�,�,�,�,�,r;c�6�	|jt|g|�Ri|��dSr7)r%rr�s    r<r*zLoggerAdapter.warning;s3��	�	����#�/��/�/�/��/�/�/�/�/r;c�^�tjdtd��|j|g|�Ri|��dSr�r�r�s    r<r)zLoggerAdapter.warnAr�r;c�6�	|jt|g|�Ri|��dSr7�r%r
r�s    r<rzLoggerAdapter.errorFr=r;Tr�c�:�	|jt|g|�Rd|i|��dSrrBrs     r<rzLoggerAdapter.exceptionLs8��	�	�����@�d�@�@�@�X�@��@�@�@�@�@r;c�6�	|jt|g|�Ri|��dSr7)r%rr�s    r<rzLoggerAdapter.criticalRs3��	�	����3�0��0�0�0��0�0�0�0�0r;c��	|�|��r2|�||��\}}|jj||g|�Ri|��dSdSr7)r�r�r�r%rs     r<r%zLoggerAdapter.logXsl��	����U�#�#�	9��,�,�s�F�3�3�K�C���D�K�O�E�3�8��8�8�8��8�8�8�8�8�	9�	9r;c�8�	|j�|��Sr7)r�r�rbs  r<r�zLoggerAdapter.isEnabledForas��	��{�'�'��.�.�.r;c�<�	|j�|��dSr7)r�rprbs  r<rpzLoggerAdapter.setLevelgs%��	�	
����U�#�#�#�#�#r;c�6�	|j���Sr7)r�r*r�s r<r*zLoggerAdapter.getEffectiveLevelms��	��{�,�,�.�.�.r;c�6�	|j���Sr7)r�r&r�s r<r&zLoggerAdapter.hasHandlersss��	��{�&�&�(�(�(r;c�.�	|jj|||fi|��Sr7)r�r�rs     r<r�zLoggerAdapter._logys*��	� �t�{���s�D�;�;�F�;�;�;r;c��|jjSr7�r�r�r�s r<r�zLoggerAdapter.managers
���{�"�"r;c��||j_dSr7rLr�s  r<r�zLoggerAdapter.manager�s��#�����r;c��|jjSr7)r�r�r�s r<r�zLoggerAdapter.name�s
���{��r;c��|j}t|�����}d|jj�d|j�d|�d�Sr�)r�r!r*r�r�r�)r�r�r@s   r<r�zLoggerAdapter.__repr__�sF������V�5�5�7�7�8�8���!%��!8�!8�!8�&�+�+�+�u�u�u�M�Mr;r7)r�r�r�r�r�rr$r*r)rrrr%r�rpr*r&r�r�r�r�r�r�r�rr�r:r;r<rrs��������
������� .�.�.�-�-�-�0�0�0�+�+�+�
.�.�.�.2�A�A�A�A�A�1�1�1�9�9�9�/�/�/�$�$�$�/�/�/�)�)�)�<�<�<��#�#��X�#�
�^�$�$��^�$�� � ��X� �N�N�N�
$��L�1�1���r;rc���	t��	|�dd��}|�dd��}|�dd��}|rEtjdd�D]0}t�|��|����1t
tj��dk�r|�dd��}|�d|vrd	|vrtd
���nd|vsd	|vrtd���|��|�d	d��}|�dd
��}|r/d|vrd}ntj	|��}t||||���}n%|�dd��}t|��}|g}|�dd��}	|�dd��}
|
tvr<tdd�
t�����z���|�dt|
d��}t||	|
��}|D]8}|j�|�|��t�|���9|�dd��}
|
�t�|
��|r9d�
|�����}td|z���t)��dS#t)��wxYw)N�forceFr�r��backslashreplacerrUr�r\z8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoder�r�r�rrrrrr�rHr@r�zUnrecognised argument(s): %s)rC�popr�rUr$r"r�rbrr�rrr
rrrr_rxr!rprD)r�rQr�r��hrUr\r�r��dfsr�fsr�r@rs               r<rr�s��B�J�N�N�N�2��
�
�7�E�*�*���:�:�j�$�/�/�����H�&8�9�9���	��]�1�1�1�%�
�
���"�"�1�%�%�%����	�	�	�	��t�}����"�"��z�z�*�d�3�3�H����v�%�%�*��*>�*>�$�&:�;�;�;���v�%�%��v�)=�)=�$�&J�K�K�K���!�:�:�j�$�7�7���z�z�*�c�2�2���	.��d�{�{�!%���#%�#3�H�#=�#=��#�H�d�-5�f�F�F�F�A�A�$�Z�Z��$�7�7�F�%�f�-�-�A��3���*�*�Y��-�-�C��J�J�w��,�,�E��G�#�#� �!;�c�h�h�!(�����?1�?1�"1�2�2�2����H�g�e�n�Q�&7�8�8�B��B��U�+�+�C��
#�
#���;�&��N�N�3�'�'�'�����"�"�"�"��J�J�w��-�-�E�� ��
�
�e�$�$�$��
H��y�y������/�/�� �!?�$�!F�G�G�G���������������s�KK'�'K7c��	|r%t|t��r|tjkrtStj�|��Sr7)r_rar�r�rr�r")r�s r<r"r"sI���
��:�d�C�(�(��T�T�Y�->�->����>�#�#�D�)�)�)r;c��	ttj��dkrt��tj|g|�Ri|��dSr�)r�r�rUrr�r�r�r�s   r<rr$sM���
�4�=���Q����
�
�
��M�#�'��'�'�'��'�'�'�'�'r;c�(�	t|g|�Ri|��dSr7rrZs   r<r r .s-���
�S�"�4�"�"�"�6�"�"�"�"�"r;c��	ttj��dkrt��tj|g|�Ri|��dSr�)r�r�rUrrrZs   r<rr4�M���
�4�=���Q����
�
�
��J�s�$�T�$�$�$�V�$�$�$�$�$r;r�c�,�	t|g|�Rd|i|��dSrr)r�rNr�r�s    r<rr>s2���

�#�2��2�2�2�x�2�6�2�2�2�2�2r;c��	ttj��dkrt��tj|g|�Ri|��dSr�)r�r�rUrr*rZs   r<r*r*FsM���
�4�=���Q����
�
�
��L��&�t�&�&�&�v�&�&�&�&�&r;c�\�tjdtd��t|g|�Ri|��dS)Nz8The 'warn' function is deprecated, use 'warning' insteadrLr�rZs   r<r)r)PsD���M� �!3�Q�8�8�8��C�!�$�!�!�!�&�!�!�!�!�!r;c��	ttj��dkrt��tj|g|�Ri|��dSr�)r�r�rUrr$rZs   r<r$r$UsM���
�4�=���Q����
�
�
��I�c�#�D�#�#�#�F�#�#�#�#�#r;c��	ttj��dkrt��tj|g|�Ri|��dSr�)r�r�rUrrrZs   r<rr_r]r;c��	ttj��dkrt��tj||g|�Ri|��dSr�)r�r�rUrr%)r@r�r�r�s    r<r%r%isO���
�4�=���Q����
�
�
��H�U�C�)�$�)�)�)�&�)�)�)�)�)r;c�f�	|tj_tj���dSr7)r�r�rr�)r@s r<rrss-���!�D�L���L�������r;c�z�	t|dd���D]�}	|��}|r�	|���|���|���n#tt
f$rYnwxYw|���n#|���wxYw��#tr�Y��xYwdSr7)�reversedrhrzr"r�rbrjr.)�handlerListrTrUs   r<r(r(zs�����{�1�1�1�~�&�&����	�����A��
 � ��I�I�K�K�K��G�G�I�I�I��G�G�I�I�I�I����,����
�D������I�I�K�K�K�K��A�I�I�K�K�K�K������	��
��
�
����'�s@�B,�<A&�%B�&A:�7B�9A:�:B�=B,�B(�(B,�,
B8c�(�eZdZ	d�Zd�Zd�Zd�ZdS)rc��dSr7r:r)s  r<rvzNullHandler.handle�����r;c��dSr7r:r)s  r<rtzNullHandler.emit�rjr;c��d|_dSr7)rjr�s r<razNullHandler.createLock�s
����	�	�	r;c��dSr7r:r�s r<ruzNullHandler._at_fork_reinit�rpr;N)r�r�r�rvrtrarur:r;r<rr�sU����������������
�
�
�
�
r;rc�,�	|�t�t||||||��dSdStj|||||��}td��}|js!|�t
����|�t|����dS)Nzpy.warnings)	�_warnings_showwarningr��
formatwarningr"rUr!rr*ra)r.�categoryr\r�r~�linerr�s        r<�_showwarningrs�s������ �,�!�'�8�X�v�t�T�R�R�R�R�R�-�,�
�"�7�H�h���M�M���=�)�)����	-����k�m�m�,�,�,�	���s�1�v�v�����r;c��	|r(t�tjatt_dSdSt�tt_dadSdSr7)ror��showwarningrs)�captures r<rr�sZ����)� �(�$,�$8�!�#/�H� � � �)�(�!�,�#8�H� �$(�!�!�!�-�,r;r7r�)rrIrUr�rr�rr�rX�collections.abcr��typesr�stringrr�StrFormatter�__all__r��
__author__�
__status__�__version__�__date__r�r.r�r�r�rrr
rrrr	rr>r8r/r!rr�rQrVrW�__code__rYrZr]rerirgrCrDro�WeakSetrrrxrk�objectrr�r,r+r&r�r�r�r�rr
r4rr
rF�WeakValueDictionaryrfrSrVrZrrrr��_defaultLastResortr-r�r'r#r�rr6r�rr�r�rr"rr rrr*r)r$rr%rr(�atexit�registerrrorsrr:r;r<�<module>r�s���"�L�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�������������,�,�,�,�,�,�D�D�D������6�
��
��� ���T�Y�[�[�
���
�
�
��
������
��
����	��
��	
��
�j�	�7��Y��&�	�7�
�H�
���
�
����
��	�	��������6����7�3����5�+�+�L�L�5�5�5�&�7���L�1�=�>�>�����
�
�
�0	�	������������w�r�%�&�&�6�
�
�
�
�$3�7�?�#4�#4� ���� � � ��B��|�'H�(4�6�6�6�6�b�b�b�b�b��b�b�b�N�� � � ����	�	�	�������M�M�M�M�M�6�M�M�M�B:�:�:�:�:�\�:�:�:�D .� .� .� .� .�,� .� .� .�F4����	%�
�8�	9�
�@�	A����m�m�m�m�m��m�m�m�d�I�K�K��$�$�$�$�$��$�$�$�T#/�#/�#/�#/�#/�V�#/�#/�#/�J.�.�.�.�.�v�.�.�.�h
(�G�'�)�)�	������$���@>�@>�@>�@>�@>�h�@>�@>�@>�DR2�R2�R2�R2�R2�G�R2�R2�R2�jRT�RT�RT�RT�RT�-�RT�RT�RT�j�����]����"$�^�G�,�,��
�
�+�+�+�+�+�&�+�+�+�.������{�{�{�{�{�f�{�{�{�B_'�_'�_'�_'�_'�X�_'�_'�_'�D
�
�
�
�
��
�
�
���E2�E2�E2�E2�E2�F�E2�E2�E2�N�z�'�����������%�%���y�y�y�@*�*�*�*�(�(�(�#�#�#�%�%�%�$(�3�3�3�3�3�'�'�'�"�"�"�
$�$�$�%�%�%�*�*�*�� � � � �&�����>�
�
�
��������
�
�
�
�
�'�
�
�
�0������()�)�)�)�)r;PK�]:�+�����*__pycache__/handlers.cpython-311.opt-2.pycnu�[����

���Yb�_���r�	ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlZddl
Z
ddlZdZdZdZdZdZdZdZGd	�d
ej��ZGd�de��ZGd
�de��ZGd�dej��ZGd�dej��ZGd�de��ZGd�dej��ZGd�dej��ZGd�dej��Z Gd�dej��Z!Gd�dej��Z"Gd�d e"��Z#Gd!�d"ej��Z$Gd#�d$e%��Z&dS)%�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i�Qc�2�eZdZ	dZdZdd�Zd�Zd�Zd�ZdS)�BaseRotatingHandlerNFc�|�	tj�||||||���||_||_||_dS)N��mode�encoding�delay�errors)�logging�FileHandler�__init__rrr��self�filenamerrr
rs      �;/opt/alt/python-internal/lib/python3.11/logging/handlers.pyrzBaseRotatingHandler.__init__6sR��	�	��$�$�T�8�$�.6�e�,2�	%�	4�	4�	4���	� ��
������c���		|�|��r|���tj�||��dS#t
$r|�|��YdSwxYw�N)�shouldRollover�
doRolloverrr�emit�	Exception�handleError�r�records  rrzBaseRotatingHandler.emitAs���	�	%��"�"�6�*�*�
"����!�!�!���$�$�T�6�2�2�2�2�2���	%�	%�	%����V�$�$�$�$�$�$�	%���s�A	A�A1�0A1c�`�	t|j��s|}n|�|��}|Sr)�callable�namer)r�default_name�results   r�rotation_filenamez%BaseRotatingHandler.rotation_filenameOs8��	���
�#�#�	.�!�F�F��Z�Z��-�-�F��
rc���	t|j��s8tj�|��rtj||��dSdS|�||��dSr)r!�rotator�os�path�exists�rename)r�source�dests   r�rotatezBaseRotatingHandler.rotatebso��	����%�%�	'��w�~�~�f�%�%�
(��	�&�$�'�'�'�'�'�
(�
(�
�L�L���&�&�&�&�&r)NFN)	�__name__�
__module__�__qualname__r"r'rrr%r.�rrrr-sf�������

�E��G�	�	�	�	�%�%�%����&'�'�'�'�'rrc�(�eZdZ			dd�Zd�Zd�ZdS)	�RotatingFileHandler�arNFc��	|dkrd}d|vrtj|��}t�||||||���||_||_dS)Nrr5�b�rr
r)�io�
text_encodingrr�maxBytes�backupCount)rrrr;r<rr
rs        rrzRotatingFileHandler.__init__|sr��	�2�a�<�<��D��d�?�?��'��1�1�H��$�$�T�8�T�H�+0��	%�	A�	A�	A� ��
�&����rc��	|jr |j���d|_|jdk�r/t|jdz
dd��D]�}|�d|j|fz��}|�d|j|dzfz��}tj�|��rHtj�|��rt
j	|��t
j
||����|�|jdz��}tj�|��rt
j	|��|�|j|��|js|�
��|_dSdS)Nr����z%s.%dz.1)�stream�closer<�ranger%�baseFilenamer(r)r*�remover+r.r
�_open)r�i�sfn�dfns    rrzRotatingFileHandler.doRollover�sv��	��;�	��K�������D�K���a����4�+�a�/��B�7�7�
(�
(���,�,�W��8I�1�7M�-M�N�N���,�,�W��8I�89�A��8?�.?�@�@���7�>�>�#�&�&�(��w�~�~�c�*�*�'��	�#�����I�c�3�'�'�'���(�(��):�T�)A�B�B�C��w�~�~�c�"�"�
��	�#�����K�K��)�3�/�/�/��z�	'��*�*�,�,�D�K�K�K�	'�	'rc��	tj�|j��r&tj�|j��sdS|j�|���|_|jdkrgd|�|��z}|j�	dd��|j�
��t|��z|jkrdSdS)NFrz%s
�T)r(r)r*rC�isfiler@rEr;�format�seek�tell�len�rr�msgs   rrz"RotatingFileHandler.shouldRollover�s���	��7�>�>�$�+�,�,�	�R�W�^�^�D�DU�5V�5V�	��5��;���*�*�,�,�D�K��=�1����4�;�;�v�.�.�.�C��K���Q��"�"�"��{���!�!�C��H�H�,��
�=�=��t��ur)r5rrNFN)r/r0r1rrrr2rrr4r4wsV�������DE�48�"'�"'�"'�"'�H'�'�'�.����rr4c�6�eZdZ				dd�Zd�Zd�Zd	�Zd
�ZdS)�TimedRotatingFileHandler�hr>rNFc
��tj|��}t�||d|||	���|���|_||_||_||_|jdkrd|_	d|_
d}
�n)|jdkrd|_	d	|_
d
}
�n|jdkrd|_	d
|_
d}
n�|jdks|jdkrd|_	d|_
d}
n�|j�d��r�d|_	t|j��dkrtd|jz���|jddks|jddkrtd|jz���t|jd��|_d|_
d}
ntd|jz���t!j|
t j��|_|j	|z|_	|j}t*j�|��r t+j|��t2}n tt5j����}|�|��|_dS)Nr5r8�Sr>z%Y-%m-%d_%H-%M-%Sz0(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(?!\d)�M�<z%Y-%m-%d_%H-%Mz*(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(?!\d)�H�z%Y-%m-%d_%Hz$(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}(?!\d)�D�MIDNIGHTrz%Y-%m-%dz(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)�Wi�:	rJzHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %s)r9r:rr�upper�whenr<�utc�atTime�interval�suffix�
startswithrO�
ValueError�int�	dayOfWeek�re�compile�ASCII�extMatchrCr(r)r*�statr�time�computeRollover�
rolloverAt)rrrardr<rr
rbrcrrm�ts            rrz!TimedRotatingFileHandler.__init__�s@���#�H�-�-���$�$�T�8�S�8�+0��	%�	A�	A�	A��J�J�L�L��	�&����������9�����D�M�-�D�K�J�H�H�
�Y�#�
�
��D�M�*�D�K�D�H�H�
�Y�#�
�
�#�D�M�'�D�K�>�H�H�
�Y�#�
�
���j�!8�!8�(�D�M�$�D�K�8�H�H�
�Y�
!�
!�#�
&�
&�
	T�,�D�M��4�9�~�~��"�"� �!k�nr�nw�!w�x�x�x��y��|�c�!�!�T�Y�q�\�C�%7�%7� �!P�SW�S\�!\�]�]�]� ���1��.�.�D�N�$�D�K�8�H�H��F���R�S�S�S��
�8�R�X�6�6��
��
��0��
��$��
�7�>�>�(�#�#�	!����!�!�(�+�A�A��D�I�K�K� � �A��.�.�q�1�1����rc��	||jz}|jdks|j�d���r�|jrt	j|��}nt	j|��}|d}|d}|d}|d}|j�t}n,|jj	dz|jj
zdz|jjz}||dz|zdz|zz
}	|	dkr|	tz
}	|d	zd
z}||	z}|j�d��rV|}
|
|jkr3|
|jkr|j|
z
}nd|
z
|jzd	z}||tzz
}||jtd
zz
z
}n||jtz
z
}|jsS|d}t	j|��d}
||
kr+|s"d}t	j|d
z
��dsd}nd
}||z
}|S)Nr\r]����rXrr>�r?���rZ)
rdrarfrbro�gmtime�	localtimerc�	_MIDNIGHT�hour�minute�secondri)r�currentTimer$rr�currentHour�
currentMinute�
currentSecond�
currentDay�	rotate_ts�r�day�
daysToWait�dstNow�
dstAtRollover�addends               rrpz(TimedRotatingFileHandler.computeRollovers��	��t�}�,���9�
�"�"�d�i�&:�&:�3�&?�&?�"��x�
0��K��,�,����N�;�/�/���A�$�K��a�D�M��a�D�M��1��J��{�"�%�	�	�"�k�.��3�d�k�6H�H�"�L��K�&�'�	��k�B�.��>�"�D����A��A�v�v��Y���(�1�n��1�
� �1�_�F� �y�#�#�C�(�(�

4� ���$�.�(�(��T�^�+�+�%)�^�c�%9�
�
�%&��W�t�~�%=��%A�
��j�9�4�4�F��$�-�)�a�-�7�7����$�-�)�3�3���8�

%��2��� $��v� 6� 6�r� :�
��]�*�*�!�&�!&��#�~�f�T�k�:�:�2�>�'�%&�F��!%���f�$�F��
rc�*�	ttj����}||jkrftj�|j��r@tj�|j��s|�|��|_dSdSdS)NFT)	rhrorqr(r)r*rCrKrp)rrrrs   rrz'TimedRotatingFileHandler.shouldRolloverbs���	�
��	������������w�~�~�d�/�0�0�
������HY�9Z�9Z�
�#'�"6�"6�q�"9�"9����u��4��urc���	tj�|j��\}}tj|��}g}|j�|dz}t
|��}|D]g}|d|�|krW||d�}|j�|��r3|�	tj�
||�����hn�|D]�}|j�|��}	|	r�|�|jdz|	dz��}
tj�|
��|kr4|�	tj�
||����n2|j�||	�
��dz��}	|	����t
|��|jkrg}n3|���|dt
|��|jz
�}|S)N�.rr>)r(r)�splitrC�listdirr"rOrm�	fullmatch�append�join�search�basename�startr<�sort)r�dirName�baseName�	fileNamesr$�prefix�plen�fileNamere�mrHs           r�getFilesToDeletez)TimedRotatingFileHandler.getFilesToDeleteus���	�
�G�M�M�$�*;�<�<�����J�w�'�'�	����:����^�F��v�;�;�D�%�
G�
G���E�T�E�?�f�,�,�%�d�e�e�_�F��}�.�.�v�6�6�G��
�
�b�g�l�l�7�H�&E�&E�F�F�F��	
G�&�
F�
F��
�M�(�(��2�2���F��*�*�T�%6��%<�q��t�%C�D�D�C��w�'�'��,�,��8�8��
�
�b�g�l�l�7�H�&E�&E�F�F�F���
�,�,�X�q�w�w�y�y�1�}�E�E�A��F���v�;�;��)�)�)��F�F��K�K�M�M�M��;�S��[�[�4�+;�;�;�<�F��
rc�h�	ttj����}|j|jz
}|jrtj|��}nZtj|��}tj|��d}|d}||kr|rd}nd}tj||z��}|�|jdztj	|j
|��z��}tj�
|��rdS|jr |j���d|_|�|j|��|jdkr+|���D]}tj|���|js|���|_|�|��|_dS)Nr?rZryr�r)rhrorqrdrbrzr{r%rC�strftimerer(r)r*r@rAr.r<r�rDr
rErp)	rr�rr�	timeTupler��dstThenr�rH�ss	         rrz#TimedRotatingFileHandler.doRollover�s���	��$�)�+�+�&�&���O�d�m�+���8�	7���A���I�I���q�)�)�I��^�K�0�0��4�F���m�G��� � ��#�!�F�F�"�F� �N�1�v�:�6�6�	��$�$�T�%6��%<�%)�]�4�;�	�%J�%J�&K�L�L��
�7�>�>�#���	��F��;�	��K�������D�K����D�%�s�+�+�+���a����*�*�,�,�
�
���	�!������z�	'��*�*�,�,�D�K��.�.�{�;�;����r)rTr>rNFFNN)r/r0r1rrprr�rr2rrrSrS�s��������DE�?C��A2�A2�A2�A2�FK�K�K�Z���&$�$�$�L&<�&<�&<�&<�&<rrSc�.�eZdZ			dd�Zd�Zd�Zd�ZdS)	�WatchedFileHandlerr5NFc���d|vrtj|��}tj�||||||���d\|_|_|���dS)Nr7r
)r?r?)r9r:rrr�dev�ino�_statstreamrs      rrzWatchedFileHandler.__init__�sq���d�?�?��'��1�1�H���$�$�T�8�$�.6�e�,2�	%�	4�	4�	4�$����$�(��������rc��|jrRtj|j�����}|t|t
c|_|_dSdSr)r@r(�fstat�filenorrr�r��r�sress  rr�zWatchedFileHandler._statstream�sO���;�	<��8�D�K�.�.�0�0�1�1�D�!%�f��t�F�|��D�H�d�h�h�h�	<�	<rc��		tj|j��}n#t$rd}YnwxYw|r,|t|jks|t|jkrq|j�h|j�	��|j�
��d|_|���|_|���dSdSdSr)
r(rnrC�FileNotFoundErrorrr�rr�r@�flushrArEr�r�s  r�reopenIfNeededz!WatchedFileHandler.reopenIfNeeded�s���	�	��7�4�,�-�-�D�D�� �	�	�	��D�D�D�	�����	#�t�F�|�t�x�/�/�4��<�4�8�3K�3K��{�&���!�!�#�#�#���!�!�#�#�#�"���"�j�j�l�l���� � �"�"�"�"�"�'�&�4L�3Ks��,�,c�p�	|���tj�||��dSr)r�rrrrs  rrzWatchedFileHandler.emits:��	�	
�������� � ��v�.�.�.�.�.r)r5NFN)r/r0r1rr�r�rr2rrr�r��sd�������&AF������<�<�<�
#�#�#�8/�/�/�/�/rr�c�B�eZdZ	d�Zdd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
S)�
SocketHandlerc���	tj�|��||_||_|�||_n	||f|_d|_d|_d|_d|_	d|_
d|_dS)NFg�?g>@g@)r�Handlerr�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor�rr�r�s   rrzSocketHandler.__init__sz��	�	�� � ��&�&�&���	���	��<��D�L�L� �$�<�D�L���	�!�����������
�����rr>c�H�	|j�tj|j|���}n}tjtjtj��}|�|��	|�|j��n##t$r|�	���wxYw|S)N��timeout)
r��socket�create_connectionr��AF_UNIX�SOCK_STREAM�
settimeout�connect�OSErrorrA)rr�r$s   r�
makeSocketzSocketHandler.makeSocket3s���	��9� ��-�d�l�G�L�L�L�F�F��]�6�>�6�3E�F�F�F����g�&�&�&�
����t�|�,�,�,�,���
�
�
��������
�����
s�$A?�? Bc�j�	tj��}|j�d}n||jk}|r�	|���|_d|_dS#t$rW|j�
|j|_n0|j|jz|_|j|jkr|j|_||jz|_YdSwxYwdS�NT)	ror�r�r�r�r��retryPeriodr�r�)r�now�attempts   r�createSocketzSocketHandler.createSocketDs���	�
�i�k�k���>�!��G�G��d�n�,�G��	8�
8� �O�O�-�-��	�!%�������
8�
8�
8��>�)�'+��D�$�$�'+�'7�$�:J�'J�D�$��'�$�-�7�7�+/�=��(�!$�t�'7�!7������
8����		8�	8s� A�AB0�/B0c���	|j�|���|jrN	|j�|��dS#t$r$|j���d|_YdSwxYwdSr)r�r��sendallr�rA�rr�s  r�sendzSocketHandler.send`s���	��9���������9�	!�
!��	�!�!�!�$�$�$�$�$���
!�
!�
!��	���!�!�!� ��	�	�	�	�
!����	!�	!s�A�*A/�.A/c�N�	|j}|r|�|��}t|j��}|���|d<d|d<d|d<|�dd��t
j|d��}tj	dt|����}||zS)NrQ�args�exc_info�messager>z>L)r�rL�dict�__dict__�
getMessage�pop�pickle�dumps�struct�packrO)rr�ei�dummy�dr��slens       r�
makePicklezSocketHandler.makePickless���	��_��
�	(��K�K��'�'�E�
���!�!���$�$�&�&��%����&�	���*�
�	���i������L��A�����{�4��Q���(�(���a�x�rc��	|jr)|jr"|j���d|_dStj�||��dSr)r�r�rArr�rrs  rrzSocketHandler.handleError�sX��	���	6���	6��I�O�O�����D�I�I�I��O�'�'��f�5�5�5�5�5rc��		|�|��}|�|��dS#t$r|�|��YdSwxYwr)r�r�rr)rrr�s   rrzSocketHandler.emit�sh��	�	%�����'�'�A��I�I�a�L�L�L�L�L���	%�	%�	%����V�$�$�$�$�$�$�	%���s�*/�A�Ac��	|���	|j}|rd|_|���tj�|��|���dS#|���wxYwr)�acquirer�rArr��release�rr�s  rrAzSocketHandler.close�sw��	�	
������	��9�D��
� ��	��
�
�����O�!�!�$�'�'�'��L�L�N�N�N�N�N��D�L�L�N�N�N�N�����AA0�0BN)r>)r/r0r1rr�r�r�r�rrrAr2rrr�r�
s�������
����2����"8�8�8�8!�!�!�&���,6�6�6�
%�
%�
%�����rr�c�"�eZdZ	d�Zd�Zd�ZdS)�DatagramHandlerc�N�	t�|||��d|_dS)NF)r�rr�r�s   rrzDatagramHandler.__init__�s/��	�	���t�T�4�0�0�0�!����rc��	|j�
tj}ntj}tj|tj��}|Sr)r�r�r��AF_INET�
SOCK_DGRAM)r�familyr�s   rr�zDatagramHandler.makeSocket�s:��	��9���^�F�F��^�F��M�&�&�"3�4�4���rc�~�	|j�|���|j�||j��dSr)r�r��sendtor�r�s  rr�zDatagramHandler.send�sC��	��9���������	����D�L�)�)�)�)�)rN)r/r0r1rr�r�r2rrr�r��sF������	�"�"�"�
�
�
�
*�
*�
*�
*�
*rr�c
�z�eZdZ	dZdZdZdZdZdZdZ	dZ
dZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZdZ dZ!dZ"eeee
eeee	eeeed�Z#ide�de�de�de�de�de�d e�d!e�d"e
�d#e�d$e�d%e�d&e�d'e�d(e�d)e�d*e�eeeee e!e"d+��Z$d,d-d.d/d0d1�Z%d2e&fed3fd4�Z'd5�Z(d6�Z)d7�Z*d8�Z+d9�Z,d:Z-d;Z.d<�Z/d3S)=�
SysLogHandlerrr>rJrtrurvrwrx��	�
���
����������)�alert�crit�critical�debug�emerg�err�error�info�notice�panic�warn�warning�auth�authpriv�console�cron�daemon�ftp�kern�lpr�mail�news�ntp�securityzsolaris-cron�syslog�user�uucp�local0)�local1�local2�local3�local4�local5�local6�local7rrrrr
)�DEBUG�INFO�WARNING�ERROR�CRITICAL�	localhostNc��	tj�|��||_||_||_d|_|���dSr)rr�rr��facility�socktyper�r�)rr�r5r6s    rrzSysLogHandler.__init__JsS��
	�	�� � ��&�&�&���� ��
� ��
�����������rc��|j}|�tj}tjtj|��|_	|j�|��||_dS#t
$r�|j���|j��tj}tjtj|��|_	|j�|��||_YdS#t
$r|j����wxYwwxYwr)r6r�r�r�r�r�rAr�)rr��use_socktypes   r�_connect_unixsocketz!SysLogHandler._connect_unixsocket_s���}����!�,�L��m�F�N�L�A�A���	��K����(�(�(�(�D�M�M�M���
	�
	�
	��K�������}�(��!�-�L� �-����E�E�D�K�
���#�#�G�,�,�,� ,��
�
�
�
���
�
�
���!�!�#�#�#��
����
	���s�!A�AD�:!C�%D�Dc�P�	|j}|j}t|t��r0d|_	|�|��dS#t$rYdSwxYwd|_|�tj}|\}}tj	||d|��}|st
d���|D]z}|\}}}}	}
dx}}	tj|||��}|tj
kr|�|
��n/#t$r"}
|
}|�|���Yd}
~
�sd}
~
wwxYw|�|�||_||_dS)NTFrz!getaddrinfo returns an empty list)
r�r6�
isinstance�str�
unixsocketr9r�r�r��getaddrinfor�r�rA)rr�r6r�r��ress�res�af�proto�_�sarr��excs              rr�zSysLogHandler.createSocketws��	��,���=���g�s�#�#�!	%�"�D�O�

��(�(��1�1�1�1�1���
�
�
����
����$�D�O���!�,�� �J�D�$��%�d�D�!�X�>�>�D��
C��A�B�B�B��
%�
%��-0�*��H�e�Q��!�!��d�%�!�=��X�u�=�=�D��6�#5�5�5����R�(�(�(��E���%�%�%��C��'��
�
�������������%�������	��D�K�$�D�M�M�Ms)�A�
A�A�(;C%�%
D�/D�Dc��	t|t��r
|j|}t|t��r
|j|}|dz|zS)Nrt)r;r<�facility_names�priority_names)rr5�prioritys   r�encodePriorityzSysLogHandler.encodePriority�sV��	��h��$�$�	5��*�8�4�H��h��$�$�	5��*�8�4�H��A�
��)�)rc��	|���	|j}|rd|_|���tj�|��|���dS#|���wxYwr)r�r�rArr�r�r�s  rrAzSysLogHandler.close�sw��	�	
������	��;�D��
�"����
�
�����O�!�!�$�'�'�'��L�L�N�N�N�N�N��D�L�L�N�N�N�N���r�c�:�	|j�|d��S)Nr)�priority_map�get)r�	levelNames  r�mapPriorityzSysLogHandler.mapPriority�s"��	�� �$�$�Y�	�:�:�:r�Tc�`�		|�|��}|jr
|j|z}|jr|dz
}d|�|j|�|j����z}|�d��}|�d��}||z}|js|�	��|j
r{	|j�|��dS#t$rQ|j�
��|�|j��|j�|��YdSwxYw|jtjkr"|j�||j��dS|j�|��dS#t($r|�|��YdSwxYw)N�z<%d>�utf-8)rL�ident�
append_nulrJr5rP�	levelname�encoder�r�r=r�r�rAr9r�r6r�r�r�rr)rrrQ�prios    rrzSysLogHandler.emit�s���	�	%��+�+�f�%�%�C��z�
'��j�3�&����
��v�
���D�/�/��
�04�0@�0@��AQ�0R�0R�T�T�T�D��;�;�w�'�'�D��*�*�W�%�%�C���*�C��;�
$��!�!�#�#�#���

)�*��K�$�$�S�)�)�)�)�)���*�*�*��K�%�%�'�'�'��,�,�T�\�:�:�:��K�$�$�S�)�)�)�)�)�)�*������&�"3�3�3���"�"�3���5�5�5�5�5���#�#�C�(�(�(�(�(���	%�	%�	%����V�$�$�$�$�$�$�	%���s7�B9F
�=C�AD4�0F
�3D4�48F
�.F
�
F-�,F-)0r/r0r1�	LOG_EMERG�	LOG_ALERT�LOG_CRIT�LOG_ERR�LOG_WARNING�
LOG_NOTICE�LOG_INFO�	LOG_DEBUG�LOG_KERN�LOG_USER�LOG_MAIL�
LOG_DAEMON�LOG_AUTH�
LOG_SYSLOG�LOG_LPR�LOG_NEWS�LOG_UUCP�LOG_CRON�LOG_AUTHPRIV�LOG_FTP�LOG_NTP�LOG_SECURITY�LOG_CONSOLE�LOG_SOLCRON�
LOG_LOCAL0�
LOG_LOCAL1�
LOG_LOCAL2�
LOG_LOCAL3�
LOG_LOCAL4�
LOG_LOCAL5�
LOG_LOCAL6�
LOG_LOCAL7rHrGrM�SYSLOG_UDP_PORTrr9r�rJrArPrUrVrr2rrr�r��s��������$�I��I��H��G��K��J��H��I��H��H��H��J��H��J��G��H��H��H��L��G��G��L��K��K��J��J��J��J��J��J��J��J�������������

�

�N�
���
���
�	��
�	��	
�
	�
�
�	��

�	��
�	��
�	��
�	��
�	��
�	��
�	��
�	�
�
�	��
� 	��!
�"	�
�#
�$#�"�"�"�"�"�"�1
�
�
�N�<�������L�!,�_�=�"�T�����*���0,%�,%�,%�\*�*�*����;�;�;�
�E��J�&%�&%�&%�&%�&%rr�c�&�eZdZ		dd�Zd�Zd�ZdS)�SMTPHandlerN�@c��	tj�|��t|tt
f��r|\|_|_n|dc|_|_t|tt
f��r|\|_|_	nd|_||_
t|t��r|g}||_||_
||_||_dSr)rr�rr;�list�tuple�mailhost�mailport�username�password�fromaddrr<�toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�s        rrzSMTPHandler.__init__�s���	� 	�� � ��&�&�&��h��u�
�.�.�	:�+3�(�D�M�4�=�=�+3�T�(�D�M�4�=��k�D�%�=�1�1�	!�+6�(�D�M�4�=�=� �D�M� ��
��g�s�#�#�	 ��i�G��������������rc��	|jSr)r�rs  r�
getSubjectzSMTPHandler.getSubjects��	��|�rc��		ddl}ddlm}ddl}|j}|s|j}|�|j||j���}|��}|j	|d<d�
|j��|d<|�|��|d<|j
���|d<|�|�|����|jr^|j�7|���|j|j�|���|�|j|j��|�|��|���dS#t2$r|�|��YdSwxYw)	Nr)�EmailMessager��From�,�To�Subject�Date)�smtplib�
email.messager��email.utilsr��	SMTP_PORT�SMTPr�r�r�r�r�r��utilsr{�set_contentrLr�r��ehlo�starttls�loginr��send_message�quitrr)rrr�r��emailr��smtprQs        rrzSMTPHandler.emit%s���	�
	%��N�N�N�2�2�2�2�2�2������=�D��
)��(���<�<��
�t�T�\�<�J�J�D��,�.�.�C��-�C��K������.�.�C��I�!�_�_�V�4�4�C�	�N��+�/�/�1�1�C��K��O�O�D�K�K��/�/�0�0�0��}�
9��;�*��I�I�K�K�K�!�D�M�4�;�/�/��I�I�K�K�K��
�
�4�=�$�-�8�8�8����c�"�"�"��I�I�K�K�K�K�K���	%�	%�	%����V�$�$�$�$�$�$�	%���s�EE � F�F)NNr})r/r0r1rr�rr2rrr|r|�sQ�������9<�!�!�!�!�F���%�%�%�%�%rr|c�6�eZdZ	d	d�Zd�Zd�Zd�Zd�Zd�ZdS)
�NTEventLogHandlerN�Applicationc
�.�tj�|��	ddl}ddl}||_||_|sttj�	|jj
��}tj�	|d��}tj�|dd��}||_||_
	|j�|||��n-#t$r }t!|dd��dkr�Yd}~nd}~wwxYw|j|_tj|jtj|jtj|jtj|jtj|ji|_dS#t6$rt9d��d|_YdSwxYw)Nrzwin32service.pyd�winerrorrvzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr�r�win32evtlogutil�win32evtlog�appname�_welur(r)r��__file__r��dllname�logtype�AddSourceToRegistryr�getattr�EVENTLOG_ERROR_TYPE�deftyper.�EVENTLOG_INFORMATION_TYPEr/r0�EVENTLOG_WARNING_TYPEr1r2�typemap�ImportError�print)rr�r�r�r�r��es       rrzNTEventLogHandler.__init__Os����� � ��&�&�&�	�/�/�/�/�/�/�/�/�"�D�L�(�D�J��
H��'�-�-��
�(;�<�<���'�-�-���
�3�3���'�,�,�w�q�z�3F�G�G��"�D�L�"�D�L�
��
�.�.�w���I�I�I�I���
�
�
��1�j�$�/�/�1�4�4��5�4�4�4�4�����
����
'�:�D�L��
�+�"G���+�"G���+�"C��
�+�"A�� �+�"A��D�L�L�L���	�	�	��?�
@�
@�
@��D�J�J�J�J�	���s=�BE0�<C�E0�
D�#C>�9E0�>D�A+E0�0 F�Fc��	dS)Nr>r2rs  r�getMessageIDzNTEventLogHandler.getMessageIDrs��	��qrc��	dS)Nrr2rs  r�getEventCategoryz"NTEventLogHandler.getEventCategory|s��	��qrc�N�	|j�|j|j��Sr)r�rN�levelnor�rs  r�getEventTypezNTEventLogHandler.getEventType�s%��		��|�������=�=�=rc�X�	|jr�	|�|��}|�|��}|�|��}|�|��}|j�|j||||g��dS#t$r|�|��YdSwxYwdSr)	r�r�r�r�rL�ReportEventr�rr)rr�id�cat�typerQs      rrzNTEventLogHandler.emit�s���	��:�	)�
)��&�&�v�.�.���+�+�F�3�3���(�(��0�0���k�k�&�)�)���
�&�&�t�|�R��d�S�E�J�J�J�J�J���
)�
)�
)�� � ��(�(�(�(�(�(�
)����	)�	)s�A8B�B'�&B'c�F�	tj�|��dSr)rr�rA�rs rrAzNTEventLogHandler.close�s%��	�	����d�#�#�#�#�#r)Nr�)	r/r0r1rr�r�r�rrAr2rrr�r�Esy�������!�!�!�!�F������>�>�>�)�)�)�"$�$�$�$�$rr�c�.�eZdZ			dd�Zd�Zd�Zd�ZdS)	�HTTPHandler�GETFNc��	tj�|��|���}|dvrt	d���|s|�t	d���||_||_||_||_||_	||_
dS)N)r��POSTzmethod must be GET or POSTz3context parameter only makes sense with secure=True)rr�rr`rgr��url�methodr�r��context)rr�r�r�r�r�r�s       rrzHTTPHandler.__init__�s���	�	�� � ��&�&�&���������(�(��9�:�:�:��	1�'�-��0�1�1�
1���	����������&�������rc��	|jSr)r�rs  r�mapLogRecordzHTTPHandler.mapLogRecord�s��	�
��rc��	ddl}|r"|j�||j���}n|j�|��}|S)Nr)r�)�http.client�client�HTTPSConnectionr��HTTPConnection)rr�r��http�
connections     r�
getConnectionzHTTPHandler.getConnection�sV��	�	�����	:���4�4�T�4�<�4�P�P�J�J���3�3�D�9�9�J��rc�>�		ddl}|j}|�||j��}|j}|j�|�|����}|jdkr(|�	d��dkrd}nd}|d||fzz}|�
|j|��|�	d��}|dkr
|d|�}|jdkrF|�dd	��|�d
tt|������|jrtddl}	d|jz�d��}
d
|	�|
������d��z}
|�d|
��|���|jdkr(|�|�d����|���dS#t.$r|�|��YdSwxYw)Nrr��?�&z%c%s�:r�zContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%srTzBasic �ascii�
Authorization)�urllib.parser�r�r�r��parse�	urlencoder�r��find�
putrequest�	putheaderr<rOr��base64rX�	b64encode�strip�decode�
endheadersr��getresponserr)rr�urllibr�rTr��data�seprFr�r�s           rrzHTTPHandler.emit�s"��	�
#	%������9�D��"�"�4���5�5�A��(�C��<�)�)�$�*;�*;�F�*C�*C�D�D�D��{�e�#�#��H�H�S�M�M�Q�&�&��C�C��C��F�c�4�[�0�0��
�L�L���c�*�*�*��	�	�#���A��A�v�v��B�Q�B�x���{�f�$�$����N�?�A�A�A����,�c�#�d�)�)�n�n�=�=�=���
0��
�
�
��t�/�/�7�7��@�@���v�/�/��2�2�8�8�:�:�A�A�'�J�J�J�����O�Q�/�/�/�
�L�L�N�N�N��{�f�$�$����t�{�{�7�+�+�,�,�,�
�M�M�O�O�O�O�O���	%�	%�	%����V�$�$�$�$�$�$�	%���s�G4G9�9H�H)r�FNN)r/r0r1rr�r�rr2rrr�r��sd�������KO������(������)%�)%�)%�)%�)%rr�c�.�eZdZ	d�Zd�Zd�Zd�Zd�ZdS)�BufferingHandlerc�b�	tj�|��||_g|_dSr)rr�r�capacity�buffer)rr�s  rrzBufferingHandler.__init__s1��	�	�� � ��&�&�&� ��
�����rc�>�	t|j��|jkSr)rOr�r�rs  r�shouldFlushzBufferingHandler.shouldFlushs ��	��D�K� � �D�M�1�2rc��	|j�|��|�|��r|���dSdSr)r�r�r�r�rs  rrzBufferingHandler.emit!sP��	�	
����6�"�"�"����F�#�#�	��J�J�L�L�L�L�L�	�	rc��	|���	|j���|���dS#|���wxYwr)r�r��clearr�r�s rr�zBufferingHandler.flush,sR��	�
	
������	��K�������L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�A�Ac��		|���tj�|��dS#tj�|��wxYwr)r�rr�rAr�s rrAzBufferingHandler.close8sQ��	�
	(��J�J�L�L�L��O�!�!�$�'�'�'�'�'��G�O�!�!�$�'�'�'�'���s	�8�!AN)r/r0r1rr�rr�rAr2rrr�r�
sd�������
���3�3�3�	�	�	�
�
�
�	(�	(�	(�	(�	(rr�c�@�eZdZ	ejddfd�Zd�Zd�Zd�Zd�Z	dS)�
MemoryHandlerNTc�h�	t�||��||_||_||_dSr)r�r�
flushLevel�target�flushOnClose)rr�r�r�r�s     rrzMemoryHandler.__init__Is;��	�	�!�!�$��1�1�1�$������(����rc�^�	t|j��|jkp|j|jkSr)rOr�r�r�r�rs  rr�zMemoryHandler.shouldFlush]s3��	��D�K� � �D�M�1�4���4�?�2�	4rc��	|���	||_|���dS#|���wxYwr)r�r�r�)rr�s  r�	setTargetzMemoryHandler.setTargetdsE��	�	
������	� �D�K��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s	�4�A
c��	|���	|jr=|jD]}|j�|���|j���|���dS#|���wxYwr)r�r�r��handler�r�rs  rr�zMemoryHandler.flushns���	�	
������	��{�
$�"�k�/�/�F��K�&�&�v�.�.�.�.���!�!�#�#�#��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�AA1�1Bc���		|jr|���|���	d|_t�|��|���dS#|���wxYw#|���	d|_t�|��|���w#|���wxYwxYwr)r�r�r�r�r�rAr�r�s rrAzMemoryHandler.closes���	�		�� �
��
�
�����L�L�N�N�N�
�"��� �&�&�t�,�,�,���������������������
�L�L�N�N�N�
�"��� �&�&�t�,�,�,���������������������s.�B�!A*�*B�C(�!C�:C(�C%�%C()
r/r0r1rr1rr�r�r�rAr2rrr�r�Csu�������
-4�M�$�"�)�)�)�)�(4�4�4�������"����rr�c�(�eZdZ	d�Zd�Zd�Zd�ZdS)�QueueHandlerc�T�	tj�|��||_dSr)rr�r�queue)rrs  rrzQueueHandler.__init__�s*��	�	�� � ��&�&�&���
�
�
rc�<�	|j�|��dSr)r�
put_nowaitrs  r�enqueuezQueueHandler.enqueue�s%��	�	
�
���f�%�%�%�%�%rc��	|�|��}tj|��}||_||_d|_d|_d|_d|_|Sr)rL�copyr�rQr�r��exc_text�
stack_inforPs   r�preparezQueueHandler.prepare�sY��	�*�k�k�&�!�!����6�"�"�������
���������� ����
rc��		|�|�|����dS#t$r|�|��YdSwxYwr)r	rrrrs  rrzQueueHandler.emit�sh��	�
	%��L�L����f�-�-�.�.�.�.�.���	%�	%�	%����V�$�$�$�$�$�$�	%���s�(-�A�AN)r/r0r1rr	rrr2rrrr�sV����������&�&�&����B	%�	%�	%�	%�	%rrc�J�eZdZ	dZdd�d�Zd�Zd�Zd�Zd�Zd	�Z	d
�Z
d�ZdS)�
QueueListenerNF)�respect_handler_levelc�@�	||_||_d|_||_dSr)r�handlers�_threadr)rrrrs    rrzQueueListener.__init__�s,��	���
� ��
����%:��"�"�"rc�8�	|j�|��Sr)rrN)r�blocks  r�dequeuezQueueListener.dequeue�s��	��z�~�~�e�$�$�$rc��	tj|j���x|_}d|_|���dS)N)r�T)�	threading�Thread�_monitorrrr�)rrrs  rr�zQueueListener.start�s=��	�%�+�4�=�A�A�A�A���q����	���	�	�	�	�	rc��	|Srr2rs  rrzQueueListener.prepare�s��	��
rc��	|�|��}|jD]3}|jsd}n|j|jk}|r|�|���4dSr�)rrrr��levelr)rr�handler�processs    rrzQueueListener.handle	sp��	����f�%�%���}�	'�	'�G��-�
:���� �.�G�M�9���
'����v�&�&�&��
	'�	'rc�(�	|j}t|d��}		|�d��}||jur|r|���dS|�|��|r|���n#tj$rYdSwxYw�z)N�	task_doneT)r�hasattrr�	_sentinelr#r�Empty)r�q�
has_task_doners    rrzQueueListener._monitors���	�
�J����;�/�/�
�	�

����d�+�+���T�^�+�+�$�&����
�
�
��E����F�#�#�#� �"��K�K�M�M�M����;�
�
�
����
����	s�4A=�+A=�=B�Bc�F�	|j�|j��dSr)rrr%r�s r�enqueue_sentinelzQueueListener.enqueue_sentinel0s'��	�	
�
���d�n�-�-�-�-�-rc�p�	|���|j���d|_dSr)r*rr�r�s r�stopzQueueListener.stop:s:��	�	
�����������������r)r/r0r1r%rrr�rrrr*r,r2rrrr�s��������
�I�?D�;�;�;�;�;�%�%�%�	�	�	����'�'�'� ���..�.�.�
�
�
�
�
rr)'r9rr�r(r�r�rorjrnrrrrrr�DEFAULT_TCP_LOGGING_PORT�DEFAULT_UDP_LOGGING_PORT�DEFAULT_HTTP_LOGGING_PORT�DEFAULT_SOAP_LOGGING_PORTrz�SYSLOG_TCP_PORTr|rrr4rSr�r�r�r�r�r|r�r�r�r�r�objectrr2rr�<module>r3s���"�9�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�)�)�)�)�)�)�)�)�)�)�������������#��"��"��"��!��!���	�H'�H'�H'�H'�H'�'�-�H'�H'�H'�TQ�Q�Q�Q�Q�-�Q�Q�Q�fw<�w<�w<�w<�w<�2�w<�w<�w<�rG/�G/�G/�G/�G/��,�G/�G/�G/�Te�e�e�e�e�G�O�e�e�e�N(*�(*�(*�(*�(*�m�(*�(*�(*�TU%�U%�U%�U%�U%�G�O�U%�U%�U%�nN%�N%�N%�N%�N%�'�/�N%�N%�N%�`i$�i$�i$�i$�i$���i$�i$�i$�VX%�X%�X%�X%�X%�'�/�X%�X%�X%�t7(�7(�7(�7(�7(�w��7(�7(�7(�rJ�J�J�J�J�$�J�J�J�ZF%�F%�F%�F%�F%�7�?�F%�F%�F%�Rk�k�k�k�k�F�k�k�k�k�krPK�]/4U����"__pycache__/config.cpython-311.pycnu�[����

��"�-�����dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZm
Z
dZejZdadd�Zd�Zd�Zd	�Zd
�Zd�Zd�Zd
�Zejdej��Zd�ZGd�de��ZGd�de e��Z!Gd�de"e��Z#Gd�de$e��Z%Gd�de��Z&Gd�de&��Z'e'Z(d�Z)edfd�Z*d�Z+dS) a
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2023 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�ThreadingTCPServer�StreamRequestHandleriF#Tc�B�ddl}t|t��rbtj�|��st
|�d����tj�|��st|�d����t||j	��r|}n�	|�
|��}t|d��r|�|��n+tj|��}|�||���n&#|j$r}t|�d|�����d}~wwxYwt#|��}t%j��	t)��t+||��}t-|||��t%j��dS#t%j��wxYw)aD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    rNz doesn't existz is an empty file�readline)�encodingz
 is invalid: )�configparser�
isinstance�str�os�path�exists�FileNotFoundError�getsize�RuntimeError�RawConfigParser�ConfigParser�hasattr�	read_file�io�
text_encoding�read�ParsingError�_create_formatters�logging�_acquireLock�_clearExistingHandlers�_install_handlers�_install_loggers�_releaseLock)	�fname�defaults�disable_existing_loggersrr�cp�e�
formatters�handlerss	         �9/opt/alt/python-internal/lib/python3.11/logging/config.py�
fileConfigr(4s��������%����<��w�~�~�e�$�$�	<�#�u�$<�$<�$<�=�=�=������'�'�	<��%�:�:�:�;�;�;��%��5�6�6�;�
���	;��*�*�8�4�4�B��u�j�)�)�
2����U�#�#�#�#��+�H�5�5��������1�1�1����(�	;�	;�	;��%�9�9�a�9�9�:�:�:�����	;����$�B�'�'�J�������� � � �%�R��4�4����X�'?�@�@�@�����������������s%�A&C<�<
D�D�D�/F	�	Fc��|�d��}|�d��}t|��}|D]J}|dz|z}	t||��}�#t$r"t|��t||��}Y�GwxYw|S)z)Resolve a dotted name to a global object.�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�ns    r'�_resolver4`s����:�:�c�?�?�D��8�8�A�;�;�D��t���E�
�&�&���c�z�A�~��	&��E�1�%�%�E�E���	&�	&�	&��t�����E�1�%�%�E�E�E�	&�����Ls�A�)B�Bc�6�ttj|��S�N)�mapr
�strip)�alists r'�
_strip_spacesr:ns���s�y�%� � � �c���|dd}t|��siS|�d��}t|��}i}|D]�}d|z}|�|ddd���}|�|d	dd���}|�|d
dd���}tj}||�d��}	|	rt
|	��}||||��}
|
||<��|S)
zCreate and return formattersr%�keys�,zformatter_%s�formatTN)�raw�fallback�datefmt�style�%�class)�lenr+r:�getr�	Formatterr4)r#�flistr%�form�sectname�fs�dfs�stl�c�
class_name�fs           r'rrqs���|��V�$�E��u�:�:���	��K�K����E��%� � �E��J��
�
��!�D�(��
�V�V�H�h�D�4�V�
@�
@���f�f�X�y�d�T�f�B�B���f�f�X�w�D�3�f�?�?�������\�%�%�g�.�.�
��	%���$�$�A�
�A�b�#�s�O�O���
�4����r;c�"�|dd}t|��siS|�d��}t|��}i}g}|D�]�}|d|z}|d}|�dd��}	t	|tt����}n&#ttf$rt|��}YnwxYw|�dd	��}	t	|	tt����}	|�d
d��}
t	|
tt����}
||	i|
��}||_
d|vr|d}|�|��t|��r|�||��t|tjj��r<|�d
d��}
t|
��r|�||
f��|||<���|D] \}}|�||���!|S)zInstall and return handlersr&r=r>z
handler_%srE�	formatter��args�()�kwargsz{}�level�target)rFr+r:rG�eval�varsrr/�	NameErrorr4r0�setLevel�setFormatter�
issubclassr&�
MemoryHandler�append�	setTarget)r#r%�hlistr&�fixups�hand�section�klass�fmtrUrW�hrXrY�ts               r'rr�s���z�N�6�"�E��u�:�:���	��K�K����E��%� � �E��H�
�F������\�D�(�)���� ���k�k�+�r�*�*��	$����W�
�
�.�.�E�E���	�*�	$�	$�	$��U�O�O�E�E�E�	$�����{�{�6�4�(�(���D�$�w�-�-�(�(�����X�t�,�,���f�d�7�m�m�,�,���E�4�"�6�"�"������g����G�$�E�
�J�J�u�����s�8�8�	,�
�N�N�:�c�?�+�+�+��e�W�-�;�<�<�	+��[�[��2�.�.�F��6�{�{�
+��
�
�q�&�k�*�*�*�������!�!���1�	���H�Q�K� � � � ��Os�7"B� B=�<B=c���tj}|D]g}|jj|}||vrHt	|tj��s-|�tj��g|_d|_	�`||_
�hdS)a�
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    TN)r�root�manager�
loggerDictr	�PlaceHolderr]�NOTSETr&�	propagate�disabled)�existing�
child_loggers�disable_existingrl�log�loggers      r'�_handle_existing_loggersrx�s����<�D��/�/����(��-���-����f�g�&9�:�:�
(������/�/�/�"$���#'�� ��.�F�O�O�/�/r;c���|dd}|�d��}tt|����}|�d��|d}tj}|}d|vr|d}|�|��|jdd�D]}|�|���|d}	t|	��rD|	�d��}	t|	��}	|	D]}
|�
||
���t|jj�
����}|���g}|D�]�}|d	|z}|d
}
|�dd�
��}t	j|
��}|
|vr�|�|
��dz}|
dz}t|��}t|��}||kr:||d|�|kr|�||��|dz
}||k�:|�|
��d|vr|d}|�|��|jdd�D]}|�|���||_d|_|d}	t|	��rD|	�d��}	t|	��}	|	D]}
|�
||
������t+|||��dS)zCreate and install loggers�loggersr=r>rl�logger_rootrXNr&z	logger_%s�qualnamerq�)rAr*r)r+�listr:�removerrlr]r&�
removeHandlerrF�
addHandlerrmrnr=�sort�getint�	getLogger�indexrarqrrrx)r#r&ru�llistrfrlrvrXrircrersrt�qnrqrw�i�prefixed�pflen�num_existings                    r'rr�s��
�y�M�&�!�E��K�K����E���u�%�%�&�&�E�	�L�L��������G��<�D�
�C��'����� �����U����
�]�1�1�1�
�������1������J��E�
�5�z�z�+����C� � ���e�$�$���	+�	+�D��N�N�8�D�>�*�*�*�*��D�L�+�0�0�2�2�3�3�H�

�M�M�O�O�O��M��2�2���[�3�&�'��
�Z�
 ���N�N�;��N�;�;�	��"�2�&�&��
��>�>����r�"�"�Q�&�A��C�x�H���M�M�E��x�=�=�L��l�"�"��A�;�v��v�&�(�2�2�!�(�(��!��5�5�5��Q����l�"�"�
�O�O�B�����g����G�$�E��O�O�E�"�"�"������#�	$�	$�A�� � ��#�#�#�#�$�������
�#���u�:�:�	2��K�K��$�$�E�!�%�(�(�E��
2�
2���!�!�(�4�.�1�1�1�1���X�}�6F�G�G�G�G�Gr;c��tj���tjtjdd���tjdd�=dS)z!Clear and close existing handlersN)r�	_handlers�clear�shutdown�_handlerList�r;r'rrsI�����������W�)�!�!�!�,�-�-�-���Q�Q�Q���r;z^[a-z_][a-z0-9_]*$c�b�t�|��}|std|z���dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�ms  r'�valid_identr�$s7��������A��B��<�q�@�A�A�A��4r;c� �eZdZdZdd�Zd�ZdS)�ConvertingMixinz?For ConvertingXXX's, this mixin class provides common functionsTc��|j�|��}||ur8|r|||<t|��ttt
fvr||_||_|Sr6)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfr��value�replace�results     r'�convert_with_keyz ConvertingMixin.convert_with_key.sf���"�*�*�5�1�1�������
#�"��S�	��F�|�|���.� 0�0�0� $��
� ��
��
r;c��|j�|��}||ur*t|��ttt
fvr||_|Sr6)r�r�r�r�r�r�r�)r�r�r�s   r'r�zConvertingMixin.convert:sN���"�*�*�5�1�1�������F�|�|���.� 0�0�0� $��
��
r;N)T)�__name__�
__module__�__qualname__�__doc__r�r�r�r;r'r�r�+s=������I�I�
�
�
�
�����r;r�c�(�eZdZdZd�Zdd�Zdd�ZdS)r�z A converting dictionary wrapper.c�d�t�||��}|�||��Sr6)�dict�__getitem__r��r�r�r�s   r'r�zConvertingDict.__getitem__O�-��� � ��s�+�+���$�$�S�%�0�0�0r;Nc�f�t�|||��}|�||��Sr6)r�rGr��r�r��defaultr�s    r'rGzConvertingDict.getSs-������s�G�,�,���$�$�S�%�0�0�0r;c�j�t�|||��}|�||d���S�NF)r�)r�r,r�r�s    r'r,zConvertingDict.popWs2������s�G�,�,���$�$�S�%��$�?�?�?r;r6)r�r�r�r�r�rGr,r�r;r'r�r�LsW������*�*�1�1�1�1�1�1�1�@�@�@�@�@�@r;r�c� �eZdZdZd�Zdd�ZdS)r�zA converting list wrapper.c�d�t�||��}|�||��Sr6)r~r�r�r�s   r'r�zConvertingList.__getitem__]r�r;���c�b�t�||��}|�|��Sr6)r~r,r�)r��idxr�s   r'r,zConvertingList.popas'������s�#�#���|�|�E�"�"�"r;N)r�)r�r�r�r�r�r,r�r;r'r�r�[s=������$�$�1�1�1�#�#�#�#�#�#r;r�c��eZdZdZd�ZdS)r�zA converting tuple wrapper.c�h�t�||��}|�||d���Sr�)�tupler�r�r�s   r'r�zConvertingTuple.__getitem__gs2���!�!�$��,�,���$�$�S�%��$�?�?�?r;N)r�r�r�r�r�r�r;r'r�r�es.������%�%�@�@�@�@�@r;r�c��eZdZdZejd��Zejd��Zejd��Zejd��Z	ejd��Z
ddd	�Zee
��Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�ZdS)�BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)�ext�cfgc�F�t|��|_||j_dSr6)r��configr�)r�r�s  r'�__init__zBaseConfigurator.__init__�s!��$�V�,�,���#'��� � � r;c��|�d��}|�d��}	|�|��}|D]P}|d|zz
}	t||��}�#t$r(|�|��t||��}Y�MwxYw|S#t
$r}t
d|�d|����}||�d}~wwxYw)z`
        Resolve strings to objects using standard import and attribute
        syntax.
        r*rzCannot resolve z: N)r+r,�importerr.r/�ImportErrorr�)r�r�r0r1r2�fragr$�vs        r'�resolvezBaseConfigurator.resolve�s���
�w�w�s�|�|���x�x��{�{��	��M�M�$�'�'�E��
1�
1����d�
�"��1�#�E�4�0�0�E�E��%�1�1�1��M�M�$�'�'�'�#�E�4�0�0�E�E�E�1�����L���	�	�	��
�a�a�a���;�<�<�A���N�����	���s;�!B�A�B�/B�B�B�B�
B=� B8�8B=c�,�|�|��S)z*Default converter for the ext:// protocol.)r��r�r�s  r'r�zBaseConfigurator.ext_convert�s���|�|�E�"�"�"r;c���|}|j�|��}|�td|z���||���d�}|j|���d}|r�|j�|��}|r!||���d}n�|j�|��}|rn|���d}|j�|��s	||}n1	t|��}||}n#t$r||}YnwxYw|r||���d�}ntd|�d|�����|��|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert z at )�WORD_PATTERNr�r��endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)r�r��restr��dr�r3s       r'r�zBaseConfigurator.cfg_convert�s�������#�#�D�)�)���9��3�e�;�<�<�<���������>�D���A�H�H�J�J�q�M�*�A��
A��$�*�*�4�0�0���
+��!�(�(�*�*�Q�-�(�A�A��*�0�0��6�6�A��	+��h�h�j�j��m��#�1�7�7��<�<�+� !�#��A�A�+�$'��H�H��$%�a�D����#,�+�+�+�$%�c�F����+�����A���������>�D�D�$�*�38�5�5�$�$�&@�A�A�A�'�
A�,�s�D#�#D8�7D8c���t|t��s-t|t��rt|��}||_�nt|t��s,t|t
��rt	|��}||_n�t|t��s<t|t��r't|d��st
|��}||_n�t|t��rx|j
�|��}|r\|���}|d}|j
�|d��}|r#|d}t||��}||��}|S)z�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        �_fields�prefixN�suffix)r	r�r�r�r�r~r�r�rr
�CONVERT_PATTERNr��	groupdict�value_convertersrGr.)r�r�r�r�r��	converterr�s       r'r�zBaseConfigurator.convert�sZ���%��0�0�	.�Z��t�5L�5L�	.�"�5�)�)�E�!%�E����E�>�2�2�	.�z�%��7N�7N�	.�"�5�)�)�E�!%�E����E�?�3�3�
	.��E�5�)�)�
	.�29�%��2K�2K�
	.�#�E�*�*�E�!%�E���
��s�
#�
#�		.��$�*�*�5�1�1�A��
.��K�K�M�M���8��� �1�5�5�f�d�C�C�	��.��x�[�F� '��i� 8� 8�I�%�I�f�-�-�E��r;c�,����d��}t|��s|�|��}�fd��D��}|di|��}��dd��}|r+|���D]\}}t	|||���|S)z1Configure an object with a user-supplied factory.rVc�L��i|] }|dk�t|���|�|��!S�r*�r���.0�kr�s  �r'�
<dictcomp>z5BaseConfigurator.configure_custom.<locals>.<dictcomp>��.���P�P�P�1�1��8�8��A���8�!�V�A�Y�8�8�8r;r*Nr�)r,�callabler��items�setattr)r�r�rOrWr��propsr0r�s `      r'�configure_customz!BaseConfigurator.configure_custom�s�����J�J�t������{�{�	 ����Q���A�P�P�P�P��P�P�P������V�����
�
�3��%�%���	-�$�{�{�}�}�
-�
-���e����e�,�,�,�,��
r;c�N�t|t��rt|��}|S)z0Utility function which converts lists to tuples.)r	r~r�r�s  r'�as_tuplezBaseConfigurator.as_tuple�s$���e�T�"�"�	!��%�L�L�E��r;N)r�r�r�r��re�compiler�r�r�r�r�r��staticmethodr-r�r�r�r�r�r�r�r�r�r;r'r�r�ls��������!�b�j�!I�J�J�O��2�:�o�.�.�L��"�*�.�/�/�K��B�J�5�6�6�M��B�J�x�(�(�M�������|�J�'�'�H�(�(�(����*#�#�#� � � �D���8�������r;r�c�N�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	d
d	�Z
d
d
�Zd
d�ZdS)�DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    c��|j}d|vrtd���|ddkrtd|dz���|�dd��}i}tj��	|�rm|�d|��}|D]�}|tjvrtd|z���	tj|}||}|�d	d
��}|r'|�tj|�����}#t$r}	td|z��|	�d
}	~	wwxYw|�d|��}
|
D]E}	|�
||
|d
���!#t$r}	td|z��|	�d
}	~	wwxYw|�dd
��}|r;	|�|d
���n�#t$r}	td��|	�d
}	~	wwxYw�n||�dd
��}t��|�d|��}
|
D]F}	|�
|
|��|
|<�"#t$r}	td|z��|	�d
}	~	wwxYw|�d|��}|D]F}	|�||��||<�"#t$r}	td|z��|	�d
}	~	wwxYw|�d|��}g}t|��D]�}	|�||��}||_|||<�+#t$rI}	dt%|	j��vr|�|��ntd|z��|	�Yd
}	~	�yd
}	~	wwxYw|D]O}	|�||��}||_|||<�+#t$r}	td|z��|	�d
}	~	wwxYwtj}t-|jj�����}|���g}|�d|��}
|
D]�}||vr�|�|��dz}|dz}t9|��}t9|��}||kr:||d
|�|kr|�||��|dz
}||k�:|�|��	|�
||
|����#t$r}	td|z��|	�d
}	~	wwxYwt=|||��|�dd
��}|r9	|�|��n"#t$r}	td��|	�d
}	~	wwxYwtj��d
S#tj��wxYw)zDo the configuration.�versionz$dictionary doesn't specify a versionr}zUnsupported version: %s�incrementalFr&zNo handler found with name %rrXNzUnable to configure handler %rrzTzUnable to configure logger %rrlzUnable to configure root loggerr"r%z Unable to configure formatter %r�filterszUnable to configure filter %r�target not configured yetr*) r�r�r,rrrGr�r]�_checkLevel�	Exception�configure_logger�configure_rootr�configure_formatter�configure_filter�sorted�configure_handlerr0r
�	__cause__rarlr~rmrnr=r�r�rFrrxr)r�r�r��
EMPTY_DICTr&r0�handler�handler_configrXr$rzrlrur%r��deferredrsrtr�r�r�r�s                      r'�	configurezDictConfigurator.configure�sG������F�"�"��C�D�D�D��)���!�!��6��	�9J�J�K�K�K��j�j���6�6���
������Q	#��N
:�!�:�:�j�*�=�=��$�
A�
A�D��7�#4�4�4�(�*3�6:�*;�<�<�<�A�&-�&7��&=�G�-5�d�^�N�$2�$6�$6�w��$E�$E�E�$�M� '� 0� 0��1D�U�1K�1K� L� L� L���(�A�A�A�",�.2�48�.9�#:�#:�?@�A�����A����!�*�*�Y�
�;�;��#�=�=�D�=��-�-�d�G�D�M�4�H�H�H�H��$�=�=�=�(�*.�04�*5�6�6�;<�=�����=�����z�z�&�$�/�/���:�:��+�+�D�$�7�7�7�7��$�:�:�:�(�*2�3�3�89�:�����:����:�$*�:�:�.H�$�#O�#O� �&�(�(�(�$�Z�Z��j�A�A�
�&�G�G�D�G�+/�+C�+C�<F�t�<L�,N�,N�
�4�(�(��$�G�G�G�(�*8�:>�*?�@�@�EF�G�����G����!�*�*�Y�
�;�;��#�D�D�D�D�(,�(=�(=�g�d�m�(L�(L���
�
��$�D�D�D�(�*5�7;�*<�=�=�BC�D�����D����"�:�:�j�*�=�=����"�8�,�,�
A�
A�D�	A�"&�"8�"8��$��"H�"H��'+���)0������$�A�A�A�6�#�a�k�:J�:J�J�J�$�O�O�D�1�1�1�1�",�.2�48�.9�#:�#:�?@�A�2�1�1�1�1�����A����%�=�=�D�=�"&�"8�"8��$��"H�"H��'+���)0������$�=�=�=�(�*.�04�*5�6�6�;<�=�����=�����|����� 7� <� <� >� >�?�?��
�
�
����!#�
� �*�*�Y�
�;�;��#�=�=�D��x�'�'�$�N�N�4�0�0�1�4��#'�#�:�� #�H�
�
��'*�8�}�}���,�.�.�'��{�6�E�6�2�h�>�>� -� 4� 4�X�a�[� A� A� A���F�A� �,�.�.�!����-�-�-�=��-�-�d�G�D�M�B�B�B�B��$�=�=�=�(�*.�04�*5�6�6�;<�=�����=����")��=�)9�;�;�;��z�z�&�$�/�/���:�:��+�+�D�1�1�1�1��$�:�:�:�(�*2�3�3�89�:�����:����
� �"�"�"�"�"��G� �"�"�"�"���sY�+=U,�)AD�U,�
D%�
D � D%�%U,�E!� U,�!
F�+E>�>F�U,�F7�5U,�7
G�G�G�AU,�H9�8U,�9
I�I�I�U,�9J�U,�
J:�"J5�5J:�:,U,�''L�U,�
M"�?M�U,�M"�"U,�*'N�U,�
N4�N/�/N4�4C>U,�3S�U,�
S2�S-�-S2�2,U,�T5�4U,�5
U�?U�U�U,�,Vc�:�d|vrz|d}	|�|��}n�#t$rN}dt|��vr�|�d��|d<||d<|�|��}Yd}~n�d}~wwxYw|�dd��}|�dd��}|�dd��}|�d	d��}|s
t
j}	nt|��}	d
|vr|	||||d
��}n
|	|||��}|S)z(Configure a formatter from a dictionary.rVz'format'r?rhNrBrCrDrE�validate)r�r�r
r,rGrrHr4)
r�r��factoryr��terh�dfmtrC�cnamerOs
          r'rz$DictConfigurator.configure_formatter�sJ���6�>�>��T�l�G�
7��.�.�v�6�6�����	
7�	
7�	
7��S��W�W�,�,��
!'�
�
�8� 4� 4��u�
�&��t���.�.�v�6�6�����������	
7�����*�*�X�t�,�,�C��:�:�i��.�.�D��J�J�w��,�,�E��J�J�w��-�-�E��
$��%����U�O�O���V�#�#���3��e�V�J�-?�@�@�����3��e�,�,���
s�$�
A<�AA7�7A<c��d|vr|�|��}n*|�dd��}tj|��}|S)z%Configure a filter from a dictionary.rVr0rT)r�rGr�Filter)r�r�r�r0s    r'rz!DictConfigurator.configure_filter�sG���6�>�>��*�*�6�2�2�F�F��:�:�f�b�)�)�D��^�D�)�)�F��
r;c��|D]�}	t|��stt|dd����r|}n|jd|}|�|���\#t$r}td|z��|�d}~wwxYwdS)z/Add filters to a filterer from a list of names.�filterNr�zUnable to add filter %r)r�r.r��	addFilterrr�)r��filtererr�rQ�filter_r$s      r'�add_filterszDictConfigurator.add_filters�s����	G�	G�A�
G��A�;�;�8�(�7�1�h��+E�+E�"F�"F�8��G�G�"�k�)�4�Q�7�G��"�"�7�+�+�+�+���
G�
G�
G� �!:�Q�!>�?�?�Q�F�����
G����	G�	Gs�AA�
B�)A<�<Bc�R��t���}��dd��}|r:	|jd|}n%#t$r}t	d|z��|�d}~wwxYw��dd��}��dd��}d�vr=��d��}t|��s|�|��}|}�n[��d��}	|�|	��}
t|
tj	j
��r�d	�vr�	|jd
�d	}t|tj��s$��
|��td���|�d	<n�#t$r}t	d�d	z��|�d}~wwxYwt|
tj	j��r#d
�vr|��d
���d
<nAt|
tj	j��r"d�vr|��d���d<|
}�fd��D��}	|di|��}
nI#t$r<}dt%|��vr�|�d��|d<|di|��}
Yd}~nd}~wwxYw|r|
�|��|�'|
�tj|����|r|�|
|����dd��}|r+|���D]\}}t1|
||���|
S)z&Configure a handler from a dictionary.rSNr%zUnable to set formatter %rrXr�rVrErYr&r�zUnable to set target handler %r�mailhost�addressc�L��i|] }|dk�t|���|�|��!Sr�r�r�s  �r'r�z6DictConfigurator.configure_handler.<locals>.<dictcomp>�r�r;z'stream'�stream�strmr*r�)r�r,r�rr�r�r�r_rr&r`r	�Handler�updater��SMTPHandlerr��
SysLogHandlerr
r^r]r�rr�r�)r�r��config_copyrSr$rXr�rOrrrg�thrWr�rr�r0r�s `                r'rz"DictConfigurator.configure_handler�s�����6�l�l���J�J�{�D�1�1�	��	:�
:� �K��5�i�@�	�	���
:�
:�
:� �"&�(1�"2�3�3�89�:�����
:�����
�
�7�D�)�)���*�*�Y��-�-���6�>�>��
�
�4� � �A��A�;�;�
$��L�L��O�O���G�G��J�J�w�'�'�E��L�L��'�'�E��%��!1�!?�@�@�
E��F�"�"�E���Z�0���1A�B�B�%�b�'�/�:�:�E��
�
�k�2�2�2�'�(C�D�D�D�')�F�8�$�$�� �E�E�E�$�&*�,2�8�,<�&=�>�>�CD�E�����E�����E�7�#3�#?�@�@�
E��f�$�$�%)�]�]�6�*�3E�%F�%F��z�"�"��E�7�#3�#A�B�B�
E��V�#�#�$(�M�M�&��2C�$D�$D��y�!��G�P�P�P�P��P�P�P��
	'��W�&�&�v�&�&�F�F���	'�	'�	'���R���(�(��
$�Z�Z��1�1�F�6�N��W�&�&�v�&�&�F�F�F�F�F�F�����	'�����	+����	�*�*�*����O�O�G�/��6�6�7�7�7��	.����V�W�-�-�-��
�
�3��%�%���	-�$�{�{�}�}�
-�
-���e����e�,�,�,�,��
sF�>�
A �A�A �AE;�;
F#�F�F#�:I�
J	�
2J�J	c��|D]N}	|�|jd|���*#t$r}td|z��|�d}~wwxYwdS)z.Add handlers to a logger from a list of names.r&zUnable to add handler %rN)r�r�rr�)r�rwr&rir$s     r'�add_handlerszDictConfigurator.add_handlerss����	H�	H�A�
H��!�!�$�+�j�"9�!�"<�=�=�=�=���
H�
H�
H� �!;�a�!?�@�@�a�G�����
H����	H�	Hs�&-�
A�A
�
AFc��|�dd��}|�'|�tj|����|s�|jdd�D]}|�|���|�dd��}|r|�||��|�dd��}|r|�||��dSdSdS)zU
        Perform configuration which is common to root and non-root loggers.
        rXNr&r�)rGr]rr�r&r�r(r)r�rwr�r�rXrir&r�s        r'�common_logger_configz%DictConfigurator.common_logger_configs����
�
�7�D�)�)�����O�O�G�/��6�6�7�7�7��		2��_�Q�Q�Q�'�
(�
(���$�$�Q�'�'�'�'��z�z�*�d�3�3�H��
4��!�!�&�(�3�3�3��j�j��D�1�1�G��
2�� � ���1�1�1�1�1�		2�		2�
2�
2r;c��tj|��}|�|||��d|_|�dd��}|�	||_dSdS)z.Configure a non-root logger from a dictionary.FrqN)rr�r*rrrGrq)r�r0r�r�rwrqs      r'rz!DictConfigurator.configure_logger%s`���"�4�(�(���!�!�&�&�+�>�>�>�����J�J�{�D�1�1�	�� �(�F����!� r;c�Z�tj��}|�|||��dS)z*Configure a root logger from a dictionary.N)rr�r*)r�r�r�rls    r'rzDictConfigurator.configure_root.s.��� �"�"���!�!�$���<�<�<�<�<r;N)F)
r�r�r�r�rrrrrr(r*rrr�r;r'r�r��s���������
\#�\#�\#�|"�"�"�H���
G�
G�
G�=�=�=�~H�H�H�2�2�2�2�$)�)�)�)�=�=�=�=�=�=r;r�c�H�t|�����dS)z%Configure logging using a dictionary.N)�dictConfigClassr)r�s r'�
dictConfigr/5s"���F���%�%�'�'�'�'�'r;c���Gd�dt��}Gd�dt��}G�fd�dtj����||||��S)au
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    c��eZdZdZd�ZdS)�#listen.<locals>.ConfigStreamHandlerz�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        c���	|j}|�d��}t|��dk�r�tjd|��d}|j�|��}t|��|kr;||�|t|��z
��z}t|��|k�;|jj�|j�|��}|��|�d��}	ddl}|�	|��}t|t��sJ�t|��nX#t$rKtj|��}	t!|��n##t$rt#j��YnwxYwYnwxYw|jjr"|jj���dSdSdS#t*$r}|jt.kr�Yd}~dSd}~wwxYw)z�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            �z>LrNzutf-8)�
connection�recvrF�struct�unpack�server�verify�decode�json�loadsr	r�r/rr�StringIOr(�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)r��conn�chunk�slenr<r��filer$s        r'�handlez*listen.<locals>.ConfigStreamHandler.handleUs	��
�����	�	�!�����u�:�:��?�?�!�=��u�5�5�a�8�D� �O�0�0��6�6�E��e�*�*�t�+�+� %��	�	�$��U���2C�(D�(D� D���e�*�*�t�+�+��{�)�5� $�� 2� 2�5� 9� 9���(� %���W� 5� 5��6�'�K�K�K�#�z�z�%�0�0�A�#-�a��#6�#6�6�6�#6�&�q�M�M�M�M��(�6�6�6�$&�;�u�#5�#5�D�6� *�4� 0� 0� 0� 0��#,�6�6�6� )� 3� 5� 5� 5� 5� 5�6������
6�����{�(�0���)�-�-�/�/�/�/�/�/#�?�,0�0���
�
�
��7�k�)�)��*�)�)�)�)�)�����
���s`�C0F;�3?D3�2F;�3F�E"�!F�"F�?F�F�F�F;�F�-F;�;
G!�G�G!N)r�r�r�r�rJr�r;r'�ConfigStreamHandlerr2Ns-������	�	�%	�%	�%	�%	�%	r;rKc�.�eZdZdZdZdedddfd�Zd�ZdS)�$listen.<locals>.ConfigSocketReceiverzD
        A simple TCP socket-based logging config receiver.
        r}�	localhostNc��tj|||f|��tj��d|_tj��d|_||_||_dS)Nrr})	rr�rr�abortr�timeoutrAr:)r��host�portr	rAr:s      r'r�z-listen.<locals>.ConfigSocketReceiver.__init__�sY���'��t�T�l�G�D�D�D�� �"�"�"��D�J�� �"�"�"��D�L��D�J� �D�K�K�Kr;c�:�ddl}d}|s~|�|j���ggg|j��\}}}|r|���tj��|j}tj��|�~|�	��dS)Nr)
�select�socket�filenorQ�handle_requestrrrPr�server_close)r�rUrP�rd�wr�exs      r'�serve_until_stoppedz8listen.<locals>.ConfigSocketReceiver.serve_until_stopped�s����M�M�M��E��
'�#�]�]�D�K�,>�,>�,@�,@�+A�+-�r�+/�<�9�9�
��B���*��'�'�)�)�)��$�&�&�&��
���$�&�&�&��
'�
�������r;)r�r�r�r��allow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r]r�r;r'�ConfigSocketReceiverrM|sV������	�	� �� +�2M�!��d�	!�	!�	!�	!�	 �	 �	 �	 �	 r;r`c�(���eZdZ��fd�Zd�Z�xZS)�listen.<locals>.Serverc���t�|�����||_||_||_||_t
j��|_dSr6)	�superr��rcvr�hdlrrSr:�	threading�EventrA)r�rerfrSr:�Server�	__class__s     ��r'r�zlisten.<locals>.Server.__init__�sN����&�$���(�(�*�*�*��D�I��D�I��D�I� �D�K�"��*�*�D�J�J�Jr;c�D�|�|j|j|j|j���}|jdkr|jd|_|j���tj��|a	tj
��|���dS)N)rSr	rAr:rr})rerSrfrAr:�server_addressrBrr�	_listenerrr])r�r9s  r'�runzlisten.<locals>.Server.run�s����Y�Y�D�I�t�y�%)�Z�&*�k��3�3�F��y�A�~�~�"�1�!�4��	��J�N�N����� �"�"�"��I�� �"�"�"��&�&�(�(�(�(�(r;)r�r�r�r�rn�
__classcell__)rjris@�r'rirb�sM��������	+�	+�	+�	+�	+�	+�	)�	)�	)�	)�	)�	)�	)r;ri)rrrg�Thread)rSr:rKr`ris    @r'�listenrq:s����(,�,�,�,�,�2�,�,�,�\ � � � � �1� � � �>)�)�)�)�)�)�)��!�)�)�)�.�6�&�(;�T�6�J�J�Jr;c��tj��	trdt_datj��dS#tj��wxYw)zN
    Stop the listening server which was created with a call to listen().
    r}N)rrrmrPrr�r;r'�
stopListeningrs�sV��
�������	��I�O��I�����������������s	�?�A)NTN),r�rDrr�logging.handlersr�queuer�r7rgr?�socketserverrrr_�
ECONNRESETrErmr(r4r:rrrxrrr��Ir�r��objectr�r�r�r~r�r�r�r�r�r.r/rqrsr�r;r'�<module>rzs���"��
����	�	�	�	���������	�	�	�	�����	�	�	�	�
�
�
�
���������A�A�A�A�A�A�A�A�#�����
�	�)�)�)�)�X���!�!�!����,$�$�$�L/�/�/�,TH�TH�TH�n � � ��R�Z�,�b�d�
3�
3�
���������f����B
@�
@�
@�
@�
@�T�?�
@�
@�
@�#�#�#�#�#�T�?�#�#�#�@�@�@�@�@�e�_�@�@�@�A�A�A�A�A�v�A�A�A�FB=�B=�B=�B=�B=�'�B=�B=�B=�H
#��(�(�(�
,�D�xK�xK�xK�xK�t����r;PK�]-�8�8�(__pycache__/config.cpython-311.opt-1.pycnu�[����

��"�-�����dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZm
Z
dZejZdadd�Zd�Zd�Zd	�Zd
�Zd�Zd�Zd
�Zejdej��Zd�ZGd�de��ZGd�de e��Z!Gd�de"e��Z#Gd�de$e��Z%Gd�de��Z&Gd�de&��Z'e'Z(d�Z)edfd�Z*d�Z+dS) a
Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.

Copyright (C) 2001-2023 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�ThreadingTCPServer�StreamRequestHandleriF#Tc�B�ddl}t|t��rbtj�|��st
|�d����tj�|��st|�d����t||j	��r|}n�	|�
|��}t|d��r|�|��n+tj|��}|�||���n&#|j$r}t|�d|�����d}~wwxYwt#|��}t%j��	t)��t+||��}t-|||��t%j��dS#t%j��wxYw)aD
    Read the logging configuration from a ConfigParser-format file.

    This can be called several times from an application, allowing an end user
    the ability to select from various pre-canned configurations (if the
    developer provides a mechanism to present the choices and load the chosen
    configuration).
    rNz doesn't existz is an empty file�readline)�encodingz
 is invalid: )�configparser�
isinstance�str�os�path�exists�FileNotFoundError�getsize�RuntimeError�RawConfigParser�ConfigParser�hasattr�	read_file�io�
text_encoding�read�ParsingError�_create_formatters�logging�_acquireLock�_clearExistingHandlers�_install_handlers�_install_loggers�_releaseLock)	�fname�defaults�disable_existing_loggersrr�cp�e�
formatters�handlerss	         �9/opt/alt/python-internal/lib/python3.11/logging/config.py�
fileConfigr(4s��������%����<��w�~�~�e�$�$�	<�#�u�$<�$<�$<�=�=�=������'�'�	<��%�:�:�:�;�;�;��%��5�6�6�;�
���	;��*�*�8�4�4�B��u�j�)�)�
2����U�#�#�#�#��+�H�5�5��������1�1�1����(�	;�	;�	;��%�9�9�a�9�9�:�:�:�����	;����$�B�'�'�J�������� � � �%�R��4�4����X�'?�@�@�@�����������������s%�A&C<�<
D�D�D�/F	�	Fc��|�d��}|�d��}t|��}|D]J}|dz|z}	t||��}�#t$r"t|��t||��}Y�GwxYw|S)z)Resolve a dotted name to a global object.�.r)�split�pop�
__import__�getattr�AttributeError)�name�used�found�ns    r'�_resolver4`s����:�:�c�?�?�D��8�8�A�;�;�D��t���E�
�&�&���c�z�A�~��	&��E�1�%�%�E�E���	&�	&�	&��t�����E�1�%�%�E�E�E�	&�����Ls�A�)B�Bc�6�ttj|��S�N)�mapr
�strip)�alists r'�
_strip_spacesr:ns���s�y�%� � � �c���|dd}t|��siS|�d��}t|��}i}|D]�}d|z}|�|ddd���}|�|d	dd���}|�|d
dd���}tj}||�d��}	|	rt
|	��}||||��}
|
||<��|S)
zCreate and return formattersr%�keys�,zformatter_%s�formatTN)�raw�fallback�datefmt�style�%�class)�lenr+r:�getr�	Formatterr4)r#�flistr%�form�sectname�fs�dfs�stl�c�
class_name�fs           r'rrqs���|��V�$�E��u�:�:���	��K�K����E��%� � �E��J��
�
��!�D�(��
�V�V�H�h�D�4�V�
@�
@���f�f�X�y�d�T�f�B�B���f�f�X�w�D�3�f�?�?�������\�%�%�g�.�.�
��	%���$�$�A�
�A�b�#�s�O�O���
�4����r;c�"�|dd}t|��siS|�d��}t|��}i}g}|D�]�}|d|z}|d}|�dd��}	t	|tt����}n&#ttf$rt|��}YnwxYw|�dd	��}	t	|	tt����}	|�d
d��}
t	|
tt����}
||	i|
��}||_
d|vr|d}|�|��t|��r|�||��t|tjj��r<|�d
d��}
t|
��r|�||
f��|||<���|D] \}}|�||���!|S)zInstall and return handlersr&r=r>z
handler_%srE�	formatter��args�()�kwargsz{}�level�target)rFr+r:rG�eval�varsrr/�	NameErrorr4r0�setLevel�setFormatter�
issubclassr&�
MemoryHandler�append�	setTarget)r#r%�hlistr&�fixups�hand�section�klass�fmtrUrW�hrXrY�ts               r'rr�s���z�N�6�"�E��u�:�:���	��K�K����E��%� � �E��H�
�F������\�D�(�)���� ���k�k�+�r�*�*��	$����W�
�
�.�.�E�E���	�*�	$�	$�	$��U�O�O�E�E�E�	$�����{�{�6�4�(�(���D�$�w�-�-�(�(�����X�t�,�,���f�d�7�m�m�,�,���E�4�"�6�"�"������g����G�$�E�
�J�J�u�����s�8�8�	,�
�N�N�:�c�?�+�+�+��e�W�-�;�<�<�	+��[�[��2�.�.�F��6�{�{�
+��
�
�q�&�k�*�*�*�������!�!���1�	���H�Q�K� � � � ��Os�7"B� B=�<B=c���tj}|D]g}|jj|}||vrHt	|tj��s-|�tj��g|_d|_	�`||_
�hdS)a�
    When (re)configuring logging, handle loggers which were in the previous
    configuration but are not in the new configuration. There's no point
    deleting them as other threads may continue to hold references to them;
    and by disabling them, you stop them doing any logging.

    However, don't disable children of named loggers, as that's probably not
    what was intended by the user. Also, allow existing loggers to NOT be
    disabled if disable_existing is false.
    TN)r�root�manager�
loggerDictr	�PlaceHolderr]�NOTSETr&�	propagate�disabled)�existing�
child_loggers�disable_existingrl�log�loggers      r'�_handle_existing_loggersrx�s����<�D��/�/����(��-���-����f�g�&9�:�:�
(������/�/�/�"$���#'�� ��.�F�O�O�/�/r;c���|dd}|�d��}tt|����}|�d��|d}tj}|}d|vr|d}|�|��|jdd�D]}|�|���|d}	t|	��rD|	�d��}	t|	��}	|	D]}
|�
||
���t|jj�
����}|���g}|D�]�}|d	|z}|d
}
|�dd�
��}t	j|
��}|
|vr�|�|
��dz}|
dz}t|��}t|��}||kr:||d|�|kr|�||��|dz
}||k�:|�|
��d|vr|d}|�|��|jdd�D]}|�|���||_d|_|d}	t|	��rD|	�d��}	t|	��}	|	D]}
|�
||
������t+|||��dS)zCreate and install loggers�loggersr=r>rl�logger_rootrXNr&z	logger_%s�qualnamerq�)rAr*r)r+�listr:�removerrlr]r&�
removeHandlerrF�
addHandlerrmrnr=�sort�getint�	getLogger�indexrarqrrrx)r#r&ru�llistrfrlrvrXrircrersrt�qnrqrw�i�prefixed�pflen�num_existings                    r'rr�s��
�y�M�&�!�E��K�K����E���u�%�%�&�&�E�	�L�L��������G��<�D�
�C��'����� �����U����
�]�1�1�1�
�������1������J��E�
�5�z�z�+����C� � ���e�$�$���	+�	+�D��N�N�8�D�>�*�*�*�*��D�L�+�0�0�2�2�3�3�H�

�M�M�O�O�O��M��2�2���[�3�&�'��
�Z�
 ���N�N�;��N�;�;�	��"�2�&�&��
��>�>����r�"�"�Q�&�A��C�x�H���M�M�E��x�=�=�L��l�"�"��A�;�v��v�&�(�2�2�!�(�(��!��5�5�5��Q����l�"�"�
�O�O�B�����g����G�$�E��O�O�E�"�"�"������#�	$�	$�A�� � ��#�#�#�#�$�������
�#���u�:�:�	2��K�K��$�$�E�!�%�(�(�E��
2�
2���!�!�(�4�.�1�1�1�1���X�}�6F�G�G�G�G�Gr;c��tj���tjtjdd���tjdd�=dS)z!Clear and close existing handlersN)r�	_handlers�clear�shutdown�_handlerList�r;r'rrsI�����������W�)�!�!�!�,�-�-�-���Q�Q�Q���r;z^[a-z_][a-z0-9_]*$c�b�t�|��}|std|z���dS)Nz!Not a valid Python identifier: %rT)�
IDENTIFIER�match�
ValueError)�s�ms  r'�valid_identr�$s7��������A��B��<�q�@�A�A�A��4r;c� �eZdZdZdd�Zd�ZdS)�ConvertingMixinz?For ConvertingXXX's, this mixin class provides common functionsTc��|j�|��}||ur8|r|||<t|��ttt
fvr||_||_|Sr6)�configurator�convert�type�ConvertingDict�ConvertingList�ConvertingTuple�parent�key)�selfr��value�replace�results     r'�convert_with_keyz ConvertingMixin.convert_with_key.sf���"�*�*�5�1�1�������
#�"��S�	��F�|�|���.� 0�0�0� $��
� ��
��
r;c��|j�|��}||ur*t|��ttt
fvr||_|Sr6)r�r�r�r�r�r�r�)r�r�r�s   r'r�zConvertingMixin.convert:sN���"�*�*�5�1�1�������F�|�|���.� 0�0�0� $��
��
r;N)T)�__name__�
__module__�__qualname__�__doc__r�r�r�r;r'r�r�+s=������I�I�
�
�
�
�����r;r�c�(�eZdZdZd�Zdd�Zdd�ZdS)r�z A converting dictionary wrapper.c�d�t�||��}|�||��Sr6)�dict�__getitem__r��r�r�r�s   r'r�zConvertingDict.__getitem__O�-��� � ��s�+�+���$�$�S�%�0�0�0r;Nc�f�t�|||��}|�||��Sr6)r�rGr��r�r��defaultr�s    r'rGzConvertingDict.getSs-������s�G�,�,���$�$�S�%�0�0�0r;c�j�t�|||��}|�||d���S�NF)r�)r�r,r�r�s    r'r,zConvertingDict.popWs2������s�G�,�,���$�$�S�%��$�?�?�?r;r6)r�r�r�r�r�rGr,r�r;r'r�r�LsW������*�*�1�1�1�1�1�1�1�@�@�@�@�@�@r;r�c� �eZdZdZd�Zdd�ZdS)r�zA converting list wrapper.c�d�t�||��}|�||��Sr6)r~r�r�r�s   r'r�zConvertingList.__getitem__]r�r;���c�b�t�||��}|�|��Sr6)r~r,r�)r��idxr�s   r'r,zConvertingList.popas'������s�#�#���|�|�E�"�"�"r;N)r�)r�r�r�r�r�r,r�r;r'r�r�[s=������$�$�1�1�1�#�#�#�#�#�#r;r�c��eZdZdZd�ZdS)r�zA converting tuple wrapper.c�h�t�||��}|�||d���Sr�)�tupler�r�r�s   r'r�zConvertingTuple.__getitem__gs2���!�!�$��,�,���$�$�S�%��$�?�?�?r;N)r�r�r�r�r�r�r;r'r�r�es.������%�%�@�@�@�@�@r;r�c��eZdZdZejd��Zejd��Zejd��Zejd��Z	ejd��Z
ddd	�Zee
��Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�ZdS)�BaseConfiguratorzI
    The configurator base class which defines some useful defaults.
    z%^(?P<prefix>[a-z]+)://(?P<suffix>.*)$z^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$�ext_convert�cfg_convert)�ext�cfgc�F�t|��|_||j_dSr6)r��configr�)r�r�s  r'�__init__zBaseConfigurator.__init__�s!��$�V�,�,���#'��� � � r;c��|�d��}|�d��}	|�|��}|D]P}|d|zz
}	t||��}�#t$r(|�|��t||��}Y�MwxYw|S#t
$r}t
d|�d|����}||�d}~wwxYw)z`
        Resolve strings to objects using standard import and attribute
        syntax.
        r*rzCannot resolve z: N)r+r,�importerr.r/�ImportErrorr�)r�r�r0r1r2�fragr$�vs        r'�resolvezBaseConfigurator.resolve�s���
�w�w�s�|�|���x�x��{�{��	��M�M�$�'�'�E��
1�
1����d�
�"��1�#�E�4�0�0�E�E��%�1�1�1��M�M�$�'�'�'�#�E�4�0�0�E�E�E�1�����L���	�	�	��
�a�a�a���;�<�<�A���N�����	���s;�!B�A�B�/B�B�B�B�
B=� B8�8B=c�,�|�|��S)z*Default converter for the ext:// protocol.)r��r�r�s  r'r�zBaseConfigurator.ext_convert�s���|�|�E�"�"�"r;c���|}|j�|��}|�td|z���||���d�}|j|���d}|r�|j�|��}|r!||���d}n�|j�|��}|rn|���d}|j�|��s	||}n1	t|��}||}n#t$r||}YnwxYw|r||���d�}ntd|�d|�����|��|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert z at )�WORD_PATTERNr�r��endr��groups�DOT_PATTERN�
INDEX_PATTERN�
DIGIT_PATTERN�int�	TypeError)r�r��restr��dr�r3s       r'r�zBaseConfigurator.cfg_convert�s�������#�#�D�)�)���9��3�e�;�<�<�<���������>�D���A�H�H�J�J�q�M�*�A��
A��$�*�*�4�0�0���
+��!�(�(�*�*�Q�-�(�A�A��*�0�0��6�6�A��	+��h�h�j�j��m��#�1�7�7��<�<�+� !�#��A�A�+�$'��H�H��$%�a�D����#,�+�+�+�$%�c�F����+�����A���������>�D�D�$�*�38�5�5�$�$�&@�A�A�A�'�
A�,�s�D#�#D8�7D8c���t|t��s-t|t��rt|��}||_�nt|t��s,t|t
��rt	|��}||_n�t|t��s<t|t��r't|d��st
|��}||_n�t|t��rx|j
�|��}|r\|���}|d}|j
�|d��}|r#|d}t||��}||��}|S)z�
        Convert values to an appropriate type. dicts, lists and tuples are
        replaced by their converting alternatives. Strings are checked to
        see if they have a conversion format and are converted if they do.
        �_fields�prefixN�suffix)r	r�r�r�r�r~r�r�rr
�CONVERT_PATTERNr��	groupdict�value_convertersrGr.)r�r�r�r�r��	converterr�s       r'r�zBaseConfigurator.convert�sZ���%��0�0�	.�Z��t�5L�5L�	.�"�5�)�)�E�!%�E����E�>�2�2�	.�z�%��7N�7N�	.�"�5�)�)�E�!%�E����E�?�3�3�
	.��E�5�)�)�
	.�29�%��2K�2K�
	.�#�E�*�*�E�!%�E���
��s�
#�
#�		.��$�*�*�5�1�1�A��
.��K�K�M�M���8��� �1�5�5�f�d�C�C�	��.��x�[�F� '��i� 8� 8�I�%�I�f�-�-�E��r;c�,����d��}t|��s|�|��}�fd��D��}|di|��}��dd��}|r+|���D]\}}t	|||���|S)z1Configure an object with a user-supplied factory.rVc�L��i|] }|dk�t|���|�|��!S�r*�r���.0�kr�s  �r'�
<dictcomp>z5BaseConfigurator.configure_custom.<locals>.<dictcomp>��.���P�P�P�1�1��8�8��A���8�!�V�A�Y�8�8�8r;r*Nr�)r,�callabler��items�setattr)r�r�rOrWr��propsr0r�s `      r'�configure_customz!BaseConfigurator.configure_custom�s�����J�J�t������{�{�	 ����Q���A�P�P�P�P��P�P�P������V�����
�
�3��%�%���	-�$�{�{�}�}�
-�
-���e����e�,�,�,�,��
r;c�N�t|t��rt|��}|S)z0Utility function which converts lists to tuples.)r	r~r�r�s  r'�as_tuplezBaseConfigurator.as_tuple�s$���e�T�"�"�	!��%�L�L�E��r;N)r�r�r�r��re�compiler�r�r�r�r�r��staticmethodr-r�r�r�r�r�r�r�r�r�r;r'r�r�ls��������!�b�j�!I�J�J�O��2�:�o�.�.�L��"�*�.�/�/�K��B�J�5�6�6�M��B�J�x�(�(�M�������|�J�'�'�H�(�(�(����*#�#�#� � � �D���8�������r;r�c�N�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	d
d	�Z
d
d
�Zd
d�ZdS)�DictConfiguratorz]
    Configure logging using a dictionary-like object to describe the
    configuration.
    c��|j}d|vrtd���|ddkrtd|dz���|�dd��}i}tj��	|�rm|�d|��}|D]�}|tjvrtd|z���	tj|}||}|�d	d
��}|r'|�tj|�����}#t$r}	td|z��|	�d
}	~	wwxYw|�d|��}
|
D]E}	|�
||
|d
���!#t$r}	td|z��|	�d
}	~	wwxYw|�dd
��}|r;	|�|d
���n�#t$r}	td��|	�d
}	~	wwxYw�n||�dd
��}t��|�d|��}
|
D]F}	|�
|
|��|
|<�"#t$r}	td|z��|	�d
}	~	wwxYw|�d|��}|D]F}	|�||��||<�"#t$r}	td|z��|	�d
}	~	wwxYw|�d|��}g}t|��D]�}	|�||��}||_|||<�+#t$rI}	dt%|	j��vr|�|��ntd|z��|	�Yd
}	~	�yd
}	~	wwxYw|D]O}	|�||��}||_|||<�+#t$r}	td|z��|	�d
}	~	wwxYwtj}t-|jj�����}|���g}|�d|��}
|
D]�}||vr�|�|��dz}|dz}t9|��}t9|��}||kr:||d
|�|kr|�||��|dz
}||k�:|�|��	|�
||
|����#t$r}	td|z��|	�d
}	~	wwxYwt=|||��|�dd
��}|r9	|�|��n"#t$r}	td��|	�d
}	~	wwxYwtj��d
S#tj��wxYw)zDo the configuration.�versionz$dictionary doesn't specify a versionr}zUnsupported version: %s�incrementalFr&zNo handler found with name %rrXNzUnable to configure handler %rrzTzUnable to configure logger %rrlzUnable to configure root loggerr"r%z Unable to configure formatter %r�filterszUnable to configure filter %r�target not configured yetr*) r�r�r,rrrGr�r]�_checkLevel�	Exception�configure_logger�configure_rootr�configure_formatter�configure_filter�sorted�configure_handlerr0r
�	__cause__rarlr~rmrnr=r�r�rFrrxr)r�r�r��
EMPTY_DICTr&r0�handler�handler_configrXr$rzrlrur%r��deferredrsrtr�r�r�r�s                      r'�	configurezDictConfigurator.configure�sG������F�"�"��C�D�D�D��)���!�!��6��	�9J�J�K�K�K��j�j���6�6���
������Q	#��N
:�!�:�:�j�*�=�=��$�
A�
A�D��7�#4�4�4�(�*3�6:�*;�<�<�<�A�&-�&7��&=�G�-5�d�^�N�$2�$6�$6�w��$E�$E�E�$�M� '� 0� 0��1D�U�1K�1K� L� L� L���(�A�A�A�",�.2�48�.9�#:�#:�?@�A�����A����!�*�*�Y�
�;�;��#�=�=�D�=��-�-�d�G�D�M�4�H�H�H�H��$�=�=�=�(�*.�04�*5�6�6�;<�=�����=�����z�z�&�$�/�/���:�:��+�+�D�$�7�7�7�7��$�:�:�:�(�*2�3�3�89�:�����:����:�$*�:�:�.H�$�#O�#O� �&�(�(�(�$�Z�Z��j�A�A�
�&�G�G�D�G�+/�+C�+C�<F�t�<L�,N�,N�
�4�(�(��$�G�G�G�(�*8�:>�*?�@�@�EF�G�����G����!�*�*�Y�
�;�;��#�D�D�D�D�(,�(=�(=�g�d�m�(L�(L���
�
��$�D�D�D�(�*5�7;�*<�=�=�BC�D�����D����"�:�:�j�*�=�=����"�8�,�,�
A�
A�D�	A�"&�"8�"8��$��"H�"H��'+���)0������$�A�A�A�6�#�a�k�:J�:J�J�J�$�O�O�D�1�1�1�1�",�.2�48�.9�#:�#:�?@�A�2�1�1�1�1�����A����%�=�=�D�=�"&�"8�"8��$��"H�"H��'+���)0������$�=�=�=�(�*.�04�*5�6�6�;<�=�����=�����|����� 7� <� <� >� >�?�?��
�
�
����!#�
� �*�*�Y�
�;�;��#�=�=�D��x�'�'�$�N�N�4�0�0�1�4��#'�#�:�� #�H�
�
��'*�8�}�}���,�.�.�'��{�6�E�6�2�h�>�>� -� 4� 4�X�a�[� A� A� A���F�A� �,�.�.�!����-�-�-�=��-�-�d�G�D�M�B�B�B�B��$�=�=�=�(�*.�04�*5�6�6�;<�=�����=����")��=�)9�;�;�;��z�z�&�$�/�/���:�:��+�+�D�1�1�1�1��$�:�:�:�(�*2�3�3�89�:�����:����
� �"�"�"�"�"��G� �"�"�"�"���sY�+=U,�)AD�U,�
D%�
D � D%�%U,�E!� U,�!
F�+E>�>F�U,�F7�5U,�7
G�G�G�AU,�H9�8U,�9
I�I�I�U,�9J�U,�
J:�"J5�5J:�:,U,�''L�U,�
M"�?M�U,�M"�"U,�*'N�U,�
N4�N/�/N4�4C>U,�3S�U,�
S2�S-�-S2�2,U,�T5�4U,�5
U�?U�U�U,�,Vc�:�d|vrz|d}	|�|��}n�#t$rN}dt|��vr�|�d��|d<||d<|�|��}Yd}~n�d}~wwxYw|�dd��}|�dd��}|�dd��}|�d	d��}|s
t
j}	nt|��}	d
|vr|	||||d
��}n
|	|||��}|S)z(Configure a formatter from a dictionary.rVz'format'r?rhNrBrCrDrE�validate)r�r�r
r,rGrrHr4)
r�r��factoryr��terh�dfmtrC�cnamerOs
          r'rz$DictConfigurator.configure_formatter�sJ���6�>�>��T�l�G�
7��.�.�v�6�6�����	
7�	
7�	
7��S��W�W�,�,��
!'�
�
�8� 4� 4��u�
�&��t���.�.�v�6�6�����������	
7�����*�*�X�t�,�,�C��:�:�i��.�.�D��J�J�w��,�,�E��J�J�w��-�-�E��
$��%����U�O�O���V�#�#���3��e�V�J�-?�@�@�����3��e�,�,���
s�$�
A<�AA7�7A<c��d|vr|�|��}n*|�dd��}tj|��}|S)z%Configure a filter from a dictionary.rVr0rT)r�rGr�Filter)r�r�r�r0s    r'rz!DictConfigurator.configure_filter�sG���6�>�>��*�*�6�2�2�F�F��:�:�f�b�)�)�D��^�D�)�)�F��
r;c��|D]�}	t|��stt|dd����r|}n|jd|}|�|���\#t$r}td|z��|�d}~wwxYwdS)z/Add filters to a filterer from a list of names.�filterNr�zUnable to add filter %r)r�r.r��	addFilterrr�)r��filtererr�rQ�filter_r$s      r'�add_filterszDictConfigurator.add_filters�s����	G�	G�A�
G��A�;�;�8�(�7�1�h��+E�+E�"F�"F�8��G�G�"�k�)�4�Q�7�G��"�"�7�+�+�+�+���
G�
G�
G� �!:�Q�!>�?�?�Q�F�����
G����	G�	Gs�AA�
B�)A<�<Bc�R��t���}��dd��}|r:	|jd|}n%#t$r}t	d|z��|�d}~wwxYw��dd��}��dd��}d�vr=��d��}t|��s|�|��}|}�n[��d��}	|�|	��}
t|
tj	j
��r�d	�vr�	|jd
�d	}t|tj��s$��
|��td���|�d	<n�#t$r}t	d�d	z��|�d}~wwxYwt|
tj	j��r#d
�vr|��d
���d
<nAt|
tj	j��r"d�vr|��d���d<|
}�fd��D��}	|di|��}
nI#t$r<}dt%|��vr�|�d��|d<|di|��}
Yd}~nd}~wwxYw|r|
�|��|�'|
�tj|����|r|�|
|����dd��}|r+|���D]\}}t1|
||���|
S)z&Configure a handler from a dictionary.rSNr%zUnable to set formatter %rrXr�rVrErYr&r�zUnable to set target handler %r�mailhost�addressc�L��i|] }|dk�t|���|�|��!Sr�r�r�s  �r'r�z6DictConfigurator.configure_handler.<locals>.<dictcomp>�r�r;z'stream'�stream�strmr*r�)r�r,r�rr�r�r�r_rr&r`r	�Handler�updater��SMTPHandlerr��
SysLogHandlerr
r^r]r�rr�r�)r�r��config_copyrSr$rXr�rOrrrg�thrWr�rr�r0r�s `                r'rz"DictConfigurator.configure_handler�s�����6�l�l���J�J�{�D�1�1�	��	:�
:� �K��5�i�@�	�	���
:�
:�
:� �"&�(1�"2�3�3�89�:�����
:�����
�
�7�D�)�)���*�*�Y��-�-���6�>�>��
�
�4� � �A��A�;�;�
$��L�L��O�O���G�G��J�J�w�'�'�E��L�L��'�'�E��%��!1�!?�@�@�
E��F�"�"�E���Z�0���1A�B�B�%�b�'�/�:�:�E��
�
�k�2�2�2�'�(C�D�D�D�')�F�8�$�$�� �E�E�E�$�&*�,2�8�,<�&=�>�>�CD�E�����E�����E�7�#3�#?�@�@�
E��f�$�$�%)�]�]�6�*�3E�%F�%F��z�"�"��E�7�#3�#A�B�B�
E��V�#�#�$(�M�M�&��2C�$D�$D��y�!��G�P�P�P�P��P�P�P��
	'��W�&�&�v�&�&�F�F���	'�	'�	'���R���(�(��
$�Z�Z��1�1�F�6�N��W�&�&�v�&�&�F�F�F�F�F�F�����	'�����	+����	�*�*�*����O�O�G�/��6�6�7�7�7��	.����V�W�-�-�-��
�
�3��%�%���	-�$�{�{�}�}�
-�
-���e����e�,�,�,�,��
sF�>�
A �A�A �AE;�;
F#�F�F#�:I�
J	�
2J�J	c��|D]N}	|�|jd|���*#t$r}td|z��|�d}~wwxYwdS)z.Add handlers to a logger from a list of names.r&zUnable to add handler %rN)r�r�rr�)r�rwr&rir$s     r'�add_handlerszDictConfigurator.add_handlerss����	H�	H�A�
H��!�!�$�+�j�"9�!�"<�=�=�=�=���
H�
H�
H� �!;�a�!?�@�@�a�G�����
H����	H�	Hs�&-�
A�A
�
AFc��|�dd��}|�'|�tj|����|s�|jdd�D]}|�|���|�dd��}|r|�||��|�dd��}|r|�||��dSdSdS)zU
        Perform configuration which is common to root and non-root loggers.
        rXNr&r�)rGr]rr�r&r�r(r)r�rwr�r�rXrir&r�s        r'�common_logger_configz%DictConfigurator.common_logger_configs����
�
�7�D�)�)�����O�O�G�/��6�6�7�7�7��		2��_�Q�Q�Q�'�
(�
(���$�$�Q�'�'�'�'��z�z�*�d�3�3�H��
4��!�!�&�(�3�3�3��j�j��D�1�1�G��
2�� � ���1�1�1�1�1�		2�		2�
2�
2r;c��tj|��}|�|||��d|_|�dd��}|�	||_dSdS)z.Configure a non-root logger from a dictionary.FrqN)rr�r*rrrGrq)r�r0r�r�rwrqs      r'rz!DictConfigurator.configure_logger%s`���"�4�(�(���!�!�&�&�+�>�>�>�����J�J�{�D�1�1�	�� �(�F����!� r;c�Z�tj��}|�|||��dS)z*Configure a root logger from a dictionary.N)rr�r*)r�r�r�rls    r'rzDictConfigurator.configure_root.s.��� �"�"���!�!�$���<�<�<�<�<r;N)F)
r�r�r�r�rrrrrr(r*rrr�r;r'r�r��s���������
\#�\#�\#�|"�"�"�H���
G�
G�
G�=�=�=�~H�H�H�2�2�2�2�$)�)�)�)�=�=�=�=�=�=r;r�c�H�t|�����dS)z%Configure logging using a dictionary.N)�dictConfigClassr)r�s r'�
dictConfigr/5s"���F���%�%�'�'�'�'�'r;c���Gd�dt��}Gd�dt��}G�fd�dtj����||||��S)au
    Start up a socket server on the specified port, and listen for new
    configurations.

    These will be sent as a file suitable for processing by fileConfig().
    Returns a Thread object on which you can call start() to start the server,
    and which you can join() when appropriate. To stop the server, call
    stopListening().

    Use the ``verify`` argument to verify any bytes received across the wire
    from a client. If specified, it should be a callable which receives a
    single argument - the bytes of configuration data received across the
    network - and it should return either ``None``, to indicate that the
    passed in bytes could not be verified and should be discarded, or a
    byte string which is then passed to the configuration machinery as
    normal. Note that you can return transformed bytes, e.g. by decrypting
    the bytes passed in.
    c��eZdZdZd�ZdS)�#listen.<locals>.ConfigStreamHandlerz�
        Handler for a logging configuration request.

        It expects a completely new logging configuration and uses fileConfig
        to install it.
        c��	|j}|�d��}t|��dk�rntjd|��d}|j�|��}t|��|kr;||�|t|��z
��z}t|��|k�;|jj�|j�|��}|��|�d��}	ddl}|�	|��}t|��nX#t$rKtj
|��}	t|��n##t$rtj��YnwxYwYnwxYw|jjr"|jj���dSdSdS#t&$r}|jt*kr�Yd}~dSd}~wwxYw)z�
            Handle a request.

            Each request is expected to be a 4-byte length, packed using
            struct.pack(">L", n), followed by the config file.
            Uses fileConfig() to do the grunt work.
            �z>LrNzutf-8)�
connection�recvrF�struct�unpack�server�verify�decode�json�loadsr/rr�StringIOr(�	traceback�	print_exc�ready�set�OSError�errno�RESET_ERROR)r��conn�chunk�slenr<r��filer$s        r'�handlez*listen.<locals>.ConfigStreamHandler.handleUs���
�����	�	�!�����u�:�:��?�?�!�=��u�5�5�a�8�D� �O�0�0��6�6�E��e�*�*�t�+�+� %��	�	�$��U���2C�(D�(D� D���e�*�*�t�+�+��{�)�5� $�� 2� 2�5� 9� 9���(� %���W� 5� 5��6�'�K�K�K�#�z�z�%�0�0�A�&�q�M�M�M�M��(�6�6�6�$&�;�u�#5�#5�D�6� *�4� 0� 0� 0� 0��#,�6�6�6� )� 3� 5� 5� 5� 5� 5�6������
6�����{�(�0���)�-�-�/�/�/�/�/�/#�?�,0�0���
�
�
��7�k�)�)��*�)�)�)�)�)�����
���s`�C0F$�3(D�F$�E1�;E�
E1�E+�(E1�*E+�+E1�.F$�0E1�1-F$�$
G
�.G�G
N)r�r�r�r�rJr�r;r'�ConfigStreamHandlerr2Ns-������	�	�%	�%	�%	�%	�%	r;rKc�.�eZdZdZdZdedddfd�Zd�ZdS)�$listen.<locals>.ConfigSocketReceiverzD
        A simple TCP socket-based logging config receiver.
        r}�	localhostNc��tj|||f|��tj��d|_tj��d|_||_||_dS)Nrr})	rr�rr�abortr�timeoutrAr:)r��host�portr	rAr:s      r'r�z-listen.<locals>.ConfigSocketReceiver.__init__�sY���'��t�T�l�G�D�D�D�� �"�"�"��D�J�� �"�"�"��D�L��D�J� �D�K�K�Kr;c�:�ddl}d}|s~|�|j���ggg|j��\}}}|r|���tj��|j}tj��|�~|�	��dS)Nr)
�select�socket�filenorQ�handle_requestrrrPr�server_close)r�rUrP�rd�wr�exs      r'�serve_until_stoppedz8listen.<locals>.ConfigSocketReceiver.serve_until_stopped�s����M�M�M��E��
'�#�]�]�D�K�,>�,>�,@�,@�+A�+-�r�+/�<�9�9�
��B���*��'�'�)�)�)��$�&�&�&��
���$�&�&�&��
'�
�������r;)r�r�r�r��allow_reuse_address�DEFAULT_LOGGING_CONFIG_PORTr�r]r�r;r'�ConfigSocketReceiverrM|sV������	�	� �� +�2M�!��d�	!�	!�	!�	!�	 �	 �	 �	 �	 r;r`c�(���eZdZ��fd�Zd�Z�xZS)�listen.<locals>.Serverc���t�|�����||_||_||_||_t
j��|_dSr6)	�superr��rcvr�hdlrrSr:�	threading�EventrA)r�rerfrSr:�Server�	__class__s     ��r'r�zlisten.<locals>.Server.__init__�sN����&�$���(�(�*�*�*��D�I��D�I��D�I� �D�K�"��*�*�D�J�J�Jr;c�D�|�|j|j|j|j���}|jdkr|jd|_|j���tj��|a	tj
��|���dS)N)rSr	rAr:rr})rerSrfrAr:�server_addressrBrr�	_listenerrr])r�r9s  r'�runzlisten.<locals>.Server.run�s����Y�Y�D�I�t�y�%)�Z�&*�k��3�3�F��y�A�~�~�"�1�!�4��	��J�N�N����� �"�"�"��I�� �"�"�"��&�&�(�(�(�(�(r;)r�r�r�r�rn�
__classcell__)rjris@�r'rirb�sM��������	+�	+�	+�	+�	+�	+�	)�	)�	)�	)�	)�	)�	)r;ri)rrrg�Thread)rSr:rKr`ris    @r'�listenrq:s����(,�,�,�,�,�2�,�,�,�\ � � � � �1� � � �>)�)�)�)�)�)�)��!�)�)�)�.�6�&�(;�T�6�J�J�Jr;c��tj��	trdt_datj��dS#tj��wxYw)zN
    Stop the listening server which was created with a call to listen().
    r}N)rrrmrPrr�r;r'�
stopListeningrs�sV��
�������	��I�O��I�����������������s	�?�A)NTN),r�rDrr�logging.handlersr�queuer�r7rgr?�socketserverrrr_�
ECONNRESETrErmr(r4r:rrrxrrr��Ir�r��objectr�r�r�r~r�r�r�r�r�r.r/rqrsr�r;r'�<module>rzs���"��
����	�	�	�	���������	�	�	�	�����	�	�	�	�
�
�
�
���������A�A�A�A�A�A�A�A�#�����
�	�)�)�)�)�X���!�!�!����,$�$�$�L/�/�/�,TH�TH�TH�n � � ��R�Z�,�b�d�
3�
3�
���������f����B
@�
@�
@�
@�
@�T�?�
@�
@�
@�#�#�#�#�#�T�?�#�#�#�@�@�@�@�@�e�_�@�@�@�A�A�A�A�A�v�A�A�A�FB=�B=�B=�B=�B=�'�B=�B=�B=�H
#��(�(�(�
,�D�xK�xK�xK�xK�t����r;PK�]���EE*__pycache__/handlers.cpython-311.opt-1.pycnu�[����

���Yb�_���t�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZddl
Z
ddlZddlZdZdZdZdZdZdZd	ZGd
�dej��ZGd�d
e��ZGd�de��ZGd�dej��ZGd�dej��ZGd�de��ZGd�dej��ZGd�dej��Z Gd�dej��Z!Gd�dej��Z"Gd�dej��Z#Gd �d!e#��Z$Gd"�d#ej��Z%Gd$�d%e&��Z'dS)&z�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i�Qc�4�eZdZdZdZdZdd�Zd�Zd�Zd�Z	dS)	�BaseRotatingHandlerz�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    NFc�z�tj�||||||���||_||_||_dS)zA
        Use the specified filename for streamed logging
        ��mode�encoding�delay�errorsN)�logging�FileHandler�__init__rrr��self�filenamerrr
rs      �;/opt/alt/python-internal/lib/python3.11/logging/handlers.pyrzBaseRotatingHandler.__init__6sM��	��$�$�T�8�$�.6�e�,2�	%�	4�	4�	4���	� ��
������c���	|�|��r|���tj�||��dS#t
$r|�|��YdSwxYw)z�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)�shouldRollover�
doRolloverrr�emit�	Exception�handleError�r�records  rrzBaseRotatingHandler.emitAs���	%��"�"�6�*�*�
"����!�!�!���$�$�T�6�2�2�2�2�2���	%�	%�	%����V�$�$�$�$�$�$�	%���s�A	A
�
A0�/A0c�^�t|j��s|}n|�|��}|S)a�
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        )�callable�namer)r�default_name�results   r�rotation_filenamez%BaseRotatingHandler.rotation_filenameOs3����
�#�#�	.�!�F�F��Z�Z��-�-�F��
rc���t|j��s8tj�|��rtj||��dSdS|�||��dS)aL
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        N)r �rotator�os�path�exists�rename)r�source�dests   r�rotatezBaseRotatingHandler.rotatebsj�����%�%�	'��w�~�~�f�%�%�
(��	�&�$�'�'�'�'�'�
(�
(�
�L�L���&�&�&�&�&r)NFN)
�__name__�
__module__�__qualname__�__doc__r!r&rrr$r-�rrrr-sk��������

�E��G�	�	�	�	�%�%�%����&'�'�'�'�'rrc�*�eZdZdZ		d	d�Zd�Zd�ZdS)
�RotatingFileHandlerz�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    �arNFc��|dkrd}d|vrtj|��}t�||||||���||_||_dS)a�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        rr5�b�rr
rN)�io�
text_encodingrr�maxBytes�backupCount)rrrr;r<rr
rs        rrzRotatingFileHandler.__init__|sm��6�a�<�<��D��d�?�?��'��1�1�H��$�$�T�8�T�H�+0��	%�	A�	A�	A� ��
�&����rc��|jr |j���d|_|jdk�r/t|jdz
dd��D]�}|�d|j|fz��}|�d|j|dzfz��}tj�|��rHtj�|��rt
j	|��t
j
||����|�|jdz��}tj�|��rt
j	|��|�|j|��|js|�
��|_dSdS)z<
        Do a rollover, as described in __init__().
        Nr����z%s.%dz.1)�stream�closer<�ranger$�baseFilenamer'r(r)�remover*r-r
�_open)r�i�sfn�dfns    rrzRotatingFileHandler.doRollover�sq���;�	��K�������D�K���a����4�+�a�/��B�7�7�
(�
(���,�,�W��8I�1�7M�-M�N�N���,�,�W��8I�89�A��8?�.?�@�@���7�>�>�#�&�&�(��w�~�~�c�*�*�'��	�#�����I�c�3�'�'�'���(�(��):�T�)A�B�B�C��w�~�~�c�"�"�
��	�#�����K�K��)�3�/�/�/��z�	'��*�*�,�,�D�K�K�K�	'�	'rc��tj�|j��r&tj�|j��sdS|j�|���|_|jdkrgd|�|��z}|j�	dd��|j�
��t|��z|jkrdSdS)z�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        FNrz%s
�T)r'r(r)rC�isfiler@rEr;�format�seek�tell�len�rr�msgs   rrz"RotatingFileHandler.shouldRollover�s����7�>�>�$�+�,�,�	�R�W�^�^�D�DU�5V�5V�	��5��;���*�*�,�,�D�K��=�1����4�;�;�v�.�.�.�C��K���Q��"�"�"��{���!�!�C��H�H�,��
�=�=��t��ur)r5rrNFN)r.r/r0r1rrrr2rrr4r4ws[��������DE�48�"'�"'�"'�"'�H'�'�'�.����rr4c�8�eZdZdZ			dd�Zd�Zd	�Zd
�Zd�ZdS)
�TimedRotatingFileHandlerz�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    �hr>rNFc
��tj|��}t�||d|||	���|���|_||_||_||_|jdkrd|_	d|_
d}
�n)|jdkrd|_	d	|_
d
}
�n|jdkrd|_	d
|_
d}
n�|jdks|jdkrd|_	d|_
d}
n�|j�d��r�d|_	t|j��dkrtd|jz���|jddks|jddkrtd|jz���t|jd��|_d|_
d}
ntd|jz���t!j|
t j��|_|j	|z|_	|j}t*j�|��r t+j|��t2}n tt5j����}|�|��|_dS)Nr5r8�Sr>z%Y-%m-%d_%H-%M-%Sz0(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(?!\d)�M�<z%Y-%m-%d_%H-%Mz*(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(?!\d)�H�z%Y-%m-%d_%Hz$(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}(?!\d)�D�MIDNIGHTrz%Y-%m-%dz(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)�Wi�:	rJzHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %s)r9r:rr�upper�whenr<�utc�atTime�interval�suffix�
startswithrO�
ValueError�int�	dayOfWeek�re�compile�ASCII�extMatchrCr'r(r)�statr�time�computeRollover�
rolloverAt)rrrardr<rr
rbrcrrm�ts            rrz!TimedRotatingFileHandler.__init__�s@���#�H�-�-���$�$�T�8�S�8�+0��	%�	A�	A�	A��J�J�L�L��	�&����������9�����D�M�-�D�K�J�H�H�
�Y�#�
�
��D�M�*�D�K�D�H�H�
�Y�#�
�
�#�D�M�'�D�K�>�H�H�
�Y�#�
�
���j�!8�!8�(�D�M�$�D�K�8�H�H�
�Y�
!�
!�#�
&�
&�
	T�,�D�M��4�9�~�~��"�"� �!k�nr�nw�!w�x�x�x��y��|�c�!�!�T�Y�q�\�C�%7�%7� �!P�SW�S\�!\�]�]�]� ���1��.�.�D�N�$�D�K�8�H�H��F���R�S�S�S��
�8�R�X�6�6��
��
��0��
��$��
�7�>�>�(�#�#�	!����!�!�(�+�A�A��D�I�K�K� � �A��.�.�q�1�1����rc��||jz}|jdks|j�d���r�|jrt	j|��}nt	j|��}|d}|d}|d}|d}|j�t}n,|jj	dz|jj
zdz|jjz}||dz|zdz|zz
}	|	d	kr|	tz
}	|d
zdz}||	z}|j�d��rV|}
|
|jkr3|
|jkr|j|
z
}nd|
z
|jzd
z}||tzz
}||jtdzz
z
}n||jtz
z
}|jsS|d}t	j|��d}
||
kr+|s"d
}t	j|dz
��dsd	}nd}||z
}|S)zI
        Work out the rollover time based on the specified time.
        r\r]����NrXrr>�r?���rZ)
rdrarfrbro�gmtime�	localtimerc�	_MIDNIGHT�hour�minute�secondri)r�currentTimer#rr�currentHour�
currentMinute�
currentSecond�
currentDay�	rotate_ts�r�day�
daysToWait�dstNow�
dstAtRollover�addends               rrpz(TimedRotatingFileHandler.computeRollovers���t�}�,���9�
�"�"�d�i�&:�&:�3�&?�&?�"��x�
0��K��,�,����N�;�/�/���A�$�K��a�D�M��a�D�M��1��J��{�"�%�	�	�"�k�.��3�d�k�6H�H�"�L��K�&�'�	��k�B�.��>�"�D����A��A�v�v��Y���(�1�n��1�
� �1�_�F� �y�#�#�C�(�(�

4� ���$�.�(�(��T�^�+�+�%)�^�c�%9�
�
�%&��W�t�~�%=��%A�
��j�9�4�4�F��$�-�)�a�-�7�7����$�-�)�3�3���8�

%��2��� $��v� 6� 6�r� :�
��]�*�*�!�&�!&��#�~�f�T�k�:�:�2�>�'�%&�F��!%���f�$�F��
rc�(�ttj����}||jkrftj�|j��r@tj�|j��s|�|��|_dSdSdS)z�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        FT)	rhrorqr'r(r)rCrKrp)rrrrs   rrz'TimedRotatingFileHandler.shouldRolloverbs{��
��	������������w�~�~�d�/�0�0�
������HY�9Z�9Z�
�#'�"6�"6�q�"9�"9����u��4��urc���tj�|j��\}}tj|��}g}|j�|dz}t
|��}|D]g}|d|�|krW||d�}|j�|��r3|�	tj�
||�����hn�|D]�}|j�|��}	|	r�|�|jdz|	dz��}
tj�|
��|kr4|�	tj�
||����n2|j�||	�
��dz��}	|	����t
|��|jkrg}n3|���|dt
|��|jz
�}|S)z�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        N�.rr>)r'r(�splitrC�listdirr!rOrm�	fullmatch�append�join�search�basename�startr<�sort)r�dirName�baseName�	fileNamesr#�prefix�plen�fileNamere�mrHs           r�getFilesToDeletez)TimedRotatingFileHandler.getFilesToDeleteus����G�M�M�$�*;�<�<�����J�w�'�'�	����:����^�F��v�;�;�D�%�
G�
G���E�T�E�?�f�,�,�%�d�e�e�_�F��}�.�.�v�6�6�G��
�
�b�g�l�l�7�H�&E�&E�F�F�F��	
G�&�
F�
F��
�M�(�(��2�2���F��*�*�T�%6��%<�q��t�%C�D�D�C��w�'�'��,�,��8�8��
�
�b�g�l�l�7�H�&E�&E�F�F�F���
�,�,�X�q�w�w�y�y�1�}�E�E�A��F���v�;�;��)�)�)��F�F��K�K�M�M�M��;�S��[�[�4�+;�;�;�<�F��
rc�f�ttj����}|j|jz
}|jrtj|��}nZtj|��}tj|��d}|d}||kr|rd}nd}tj||z��}|�|jdztj	|j
|��z��}tj�
|��rdS|jr |j���d|_|�|j|��|jdkr+|���D]}tj|���|js|���|_|�|��|_dS)ax
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        r?rZryr�Nr)rhrorqrdrbrzr{r$rC�strftimerer'r(r)r@rAr-r<r�rDr
rErp)	rr�rr�	timeTupler��dstThenr�rH�ss	         rrz#TimedRotatingFileHandler.doRollover�s����$�)�+�+�&�&���O�d�m�+���8�	7���A���I�I���q�)�)�I��^�K�0�0��4�F���m�G��� � ��#�!�F�F�"�F� �N�1�v�:�6�6�	��$�$�T�%6��%<�%)�]�4�;�	�%J�%J�&K�L�L��
�7�>�>�#���	��F��;�	��K�������D�K����D�%�s�+�+�+���a����*�*�,�,�
�
���	�!������z�	'��*�*�,�,�D�K��.�.�{�;�;����r)rTr>rNFFNN)	r.r/r0r1rrprr�rr2rrrSrS�s���������DE�?C��A2�A2�A2�A2�FK�K�K�Z���&$�$�$�L&<�&<�&<�&<�&<rrSc�0�eZdZdZ		d	d�Zd�Zd�Zd�ZdS)
�WatchedFileHandlera�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    r5NFc���d|vrtj|��}tj�||||||���d\|_|_|���dS)Nr7r
)r?r?)r9r:rrr�dev�ino�_statstreamrs      rrzWatchedFileHandler.__init__�sq���d�?�?��'��1�1�H���$�$�T�8�$�.6�e�,2�	%�	4�	4�	4�$����$�(��������rc��|jrRtj|j�����}|t|t
c|_|_dSdS�N)r@r'�fstat�filenorrr�r��r�sress  rr�zWatchedFileHandler._statstream�sO���;�	<��8�D�K�.�.�0�0�1�1�D�!%�f��t�F�|��D�H�d�h�h�h�	<�	<rc��	tj|j��}n#t$rd}YnwxYw|r,|t|jks|t|jkrq|j�h|j�	��|j�
��d|_|���|_|���dSdSdS)z�
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N)
r'rnrC�FileNotFoundErrorrr�rr�r@�flushrArEr�r�s  r�reopenIfNeededz!WatchedFileHandler.reopenIfNeeded�s���	��7�4�,�-�-�D�D�� �	�	�	��D�D�D�	�����	#�t�F�|�t�x�/�/�4��<�4�8�3K�3K��{�&���!�!�#�#�#���!�!�#�#�#�"���"�j�j�l�l���� � �"�"�"�"�"�'�&�4L�3Ks��+�+c�n�|���tj�||��dS)z�
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        N)r�rrrrs  rrzWatchedFileHandler.emits5��	
�������� � ��v�.�.�.�.�.r)r5NFN)r.r/r0r1rr�r�rr2rrr�r��si��������&AF������<�<�<�
#�#�#�8/�/�/�/�/rr�c�D�eZdZdZd�Zdd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�ZdS)
�
SocketHandlera
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    c���tj�|��||_||_|�||_n	||f|_d|_d|_d|_d|_	d|_
d|_dS)a
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        NFg�?g>@g@)r�Handlerr�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor�rr�r�s   rrzSocketHandler.__init__su��	�� � ��&�&�&���	���	��<��D�L�L� �$�<�D�L���	�!�����������
�����rr>c�F�|j�tj|j|���}n}tjtjtj��}|�|��	|�|j��n##t$r|�	���wxYw|S)zr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        N��timeout)
r��socket�create_connectionr��AF_UNIX�SOCK_STREAM�
settimeout�connect�OSErrorrA)rr�r#s   r�
makeSocketzSocketHandler.makeSocket3s���
�9� ��-�d�l�G�L�L�L�F�F��]�6�>�6�3E�F�F�F����g�&�&�&�
����t�|�,�,�,�,���
�
�
��������
�����
s�#A>�> Bc�h�tj��}|j�d}n||jk}|r�	|���|_d|_dS#t$rW|j�
|j|_n0|j|jz|_|j|jkr|j|_||jz|_YdSwxYwdS)z�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        NT)	ror�r�r�r�r��retryPeriodr�r�)r�now�attempts   r�createSocketzSocketHandler.createSocketDs����i�k�k���>�!��G�G��d�n�,�G��	8�
8� �O�O�-�-��	�!%�������
8�
8�
8��>�)�'+��D�$�$�'+�'7�$�:J�'J�D�$��'�$�-�7�7�+/�=��(�!$�t�'7�!7������
8����		8�	8s� A�AB/�.B/c���|j�|���|jrN	|j�|��dS#t$r$|j���d|_YdSwxYwdS)z�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        N)r�r��sendallr�rA�rr�s  r�sendzSocketHandler.send`s����9���������9�	!�
!��	�!�!�!�$�$�$�$�$���
!�
!�
!��	���!�!�!� ��	�	�	�	�
!����	!�	!s�A�*A.�-A.c�L�|j}|r|�|��}t|j��}|���|d<d|d<d|d<|�dd��t
j|d��}tj	dt|����}||zS)z�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        rQN�args�exc_info�messager>z>L)r�rL�dict�__dict__�
getMessage�pop�pickle�dumps�struct�packrO)rr�ei�dummy�dr��slens       r�
makePicklezSocketHandler.makePickless���
�_��
�	(��K�K��'�'�E�
���!�!���$�$�&�&��%����&�	���*�
�	���i������L��A�����{�4��Q���(�(���a�x�rc��|jr)|jr"|j���d|_dStj�||��dS)z�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N)r�r�rArr�rrs  rrzSocketHandler.handleError�sS����	6���	6��I�O�O�����D�I�I�I��O�'�'��f�5�5�5�5�5rc��	|�|��}|�|��dS#t$r|�|��YdSwxYw)a
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N)r�r�rr)rrr�s   rrzSocketHandler.emit�sc��	%�����'�'�A��I�I�a�L�L�L�L�L���	%�	%�	%����V�$�$�$�$�$�$�	%���s�*.�A�Ac��|���	|j}|rd|_|���tj�|��|���dS#|���wxYw�z$
        Closes the socket.
        N)�acquirer�rArr��release�rr�s  rrAzSocketHandler.close�sr��	
������	��9�D��
� ��	��
�
�����O�!�!�$�'�'�'��L�L�N�N�N�N�N��D�L�L�N�N�N�N�����AA/�/BN)r>)r.r/r0r1rr�r�r�r�rrrAr2rrr�r�
s�������
�
����2����"8�8�8�8!�!�!�&���,6�6�6�
%�
%�
%�����rr�c�$�eZdZdZd�Zd�Zd�ZdS)�DatagramHandlera�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    c�L�t�|||��d|_dS)zP
        Initializes the handler with a specific host address and port.
        FN)r�rr�r�s   rrzDatagramHandler.__init__�s*��	���t�T�4�0�0�0�!����rc��|j�
tj}ntj}tj|tj��}|S)zu
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        )r�r�r��AF_INET�
SOCK_DGRAM)r�familyr�s   rr�zDatagramHandler.makeSocket�s5��
�9���^�F�F��^�F��M�&�&�"3�4�4���rc�|�|j�|���|j�||j��dS)z�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N)r�r��sendtor�r�s  rr�zDatagramHandler.send�s>���9���������	����D�L�)�)�)�)�)rN)r.r/r0r1rr�r�r2rrr�r��sK������	�	�"�"�"�
�
�
�
*�
*�
*�
*�
*rr�c
�|�eZdZdZdZdZdZdZdZdZ	dZ
d	ZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#eeeeeeee
e	eeed�Z$ide�de�de�de�de�d e�d!e�d"e�d#e�d$e�d%e�d&e�d'e�d(e�d)e
�d*e�d+e�eeee e!e"e#d,��Z%d-d.d/d0d1d2�Z&d3e'fe
d4fd5�Z(d6�Z)d7�Z*d8�Z+d9�Z,d:�Z-d;Z.d<Z/d=�Z0d4S)>�
SysLogHandlera
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    rr>rJrtrurvrwrx��	�
���
����������)�alert�crit�critical�debug�emerg�err�error�info�notice�panic�warn�warning�auth�authpriv�console�cron�daemon�ftp�kern�lpr�mail�news�ntp�securityzsolaris-cron�syslog�user�uucp�local0)�local1�local2�local3�local4�local5�local6�local7rrrrr)�DEBUG�INFO�WARNING�ERROR�CRITICAL�	localhostNc��tj�|��||_||_||_d|_|���dS)a
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        N)rr�rr��facility�socktyper�r�)rr�r6r7s    rrzSysLogHandler.__init__JsN��	�� � ��&�&�&���� ��
� ��
�����������rc��|j}|�tj}tjtj|��|_	|j�|��||_dS#t
$r�|j���|j��tj}tjtj|��|_	|j�|��||_YdS#t
$r|j����wxYwwxYwr�)r7r�r�r�r�r�rAr�)rr��use_socktypes   r�_connect_unixsocketz!SysLogHandler._connect_unixsocket_s���}����!�,�L��m�F�N�L�A�A���	��K����(�(�(�(�D�M�M�M���
	�
	�
	��K�������}�(��!�-�L� �-����E�E�D�K�
���#�#�G�,�,�,� ,��
�
�
�
���
�
�
���!�!�#�#�#��
����
	���s�!A�AD�:!C�%D�Dc�N�|j}|j}t|t��r0d|_	|�|��dS#t$rYdSwxYwd|_|�tj}|\}}tj	||d|��}|st
d���|D]z}|\}}}}	}
dx}}	tj|||��}|tj
kr|�|
��n/#t$r"}
|
}|�|���Yd}
~
�sd}
~
wwxYw|�|�||_||_dS)af
        Try to create a socket and, if it's not a datagram socket, connect it
        to the other end. This method is called during handler initialization,
        but it's not regarded as an error if the other end isn't listening yet
        --- the method will be called again when emitting an event,
        if there is no socket at that point.
        TFNrz!getaddrinfo returns an empty list)
r�r7�
isinstance�str�
unixsocketr:r�r�r��getaddrinfor�r�rA)rr�r7r�r��ress�res�af�proto�_�sarr��excs              rr�zSysLogHandler.createSocketwsz���,���=���g�s�#�#�!	%�"�D�O�

��(�(��1�1�1�1�1���
�
�
����
����$�D�O���!�,�� �J�D�$��%�d�D�!�X�>�>�D��
C��A�B�B�B��
%�
%��-0�*��H�e�Q��!�!��d�%�!�=��X�u�=�=�D��6�#5�5�5����R�(�(�(��E���%�%�%��C��'��
�
�������������%�������	��D�K�$�D�M�M�Ms)�A�
A�A�';C$�$
D�.D�Dc��t|t��r
|j|}t|t��r
|j|}|dz|zS)z�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        rt)r<r=�facility_names�priority_names)rr6�prioritys   r�encodePriorityzSysLogHandler.encodePriority�sQ���h��$�$�	5��*�8�4�H��h��$�$�	5��*�8�4�H��A�
��)�)rc��|���	|j}|rd|_|���tj�|��|���dS#|���wxYwr�)r�r�rArr�r�r�s  rrAzSysLogHandler.close�sr��	
������	��;�D��
�"����
�
�����O�!�!�$�'�'�'��L�L�N�N�N�N�N��D�L�L�N�N�N�N���r�c�8�|j�|d��S)aK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        r)�priority_map�get)r�	levelNames  r�mapPriorityzSysLogHandler.mapPriority�s��� �$�$�Y�	�:�:�:r�Tc�^�	|�|��}|jr
|j|z}|jr|dz
}d|�|j|�|j����z}|�d��}|�d��}||z}|js|�	��|j
r{	|j�|��dS#t$rQ|j�
��|�|j��|j�|��YdSwxYw|jtjkr"|j�||j��dS|j�|��dS#t($r|�|��YdSwxYw)z�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        �z<%d>�utf-8N)rL�ident�
append_nulrKr6rQ�	levelname�encoder�r�r>r�r�rAr:r�r7r�r�r�rr)rrrQ�prios    rrzSysLogHandler.emit�s���	%��+�+�f�%�%�C��z�
'��j�3�&����
��v�
���D�/�/��
�04�0@�0@��AQ�0R�0R�T�T�T�D��;�;�w�'�'�D��*�*�W�%�%�C���*�C��;�
$��!�!�#�#�#���

)�*��K�$�$�S�)�)�)�)�)���*�*�*��K�%�%�'�'�'��,�,�T�\�:�:�:��K�$�$�S�)�)�)�)�)�)�*������&�"3�3�3���"�"�3���5�5�5�5�5���#�#�C�(�(�(�(�(���	%�	%�	%����V�$�$�$�$�$�$�	%���s7�B9F	�<C�AD3�/F	�2D3�38F	�-F	�	F,�+F,)1r.r/r0r1�	LOG_EMERG�	LOG_ALERT�LOG_CRIT�LOG_ERR�LOG_WARNING�
LOG_NOTICE�LOG_INFO�	LOG_DEBUG�LOG_KERN�LOG_USER�LOG_MAIL�
LOG_DAEMON�LOG_AUTH�
LOG_SYSLOG�LOG_LPR�LOG_NEWS�LOG_UUCP�LOG_CRON�LOG_AUTHPRIV�LOG_FTP�LOG_NTP�LOG_SECURITY�LOG_CONSOLE�LOG_SOLCRON�
LOG_LOCAL0�
LOG_LOCAL1�
LOG_LOCAL2�
LOG_LOCAL3�
LOG_LOCAL4�
LOG_LOCAL5�
LOG_LOCAL6�
LOG_LOCAL7rIrHrN�SYSLOG_UDP_PORTrr:r�rKrArQrVrWrr2rrr�r��s���������$�I��I��H��G��K��J��H��I��H��H��H��J��H��J��G��H��H��H��L��G��G��L��K��K��J��J��J��J��J��J��J��J�������������

�

�N�
���
���
�	��
�	��	
�
	�
�
�	��

�	��
�	��
�	��
�	��
�	��
�	��
�	��
�	�
�
�	��
� 	��!
�"	�
�#
�$#�"�"�"�"�"�"�1
�
�
�N�<�������L�!,�_�=�"�T�����*���0,%�,%�,%�\*�*�*����;�;�;�
�E��J�&%�&%�&%�&%�&%rr�c�(�eZdZdZ	dd�Zd�Zd�ZdS)�SMTPHandlerzK
    A handler class which sends an SMTP email for each logging event.
    N�@c��tj�|��t|tt
f��r|\|_|_n|dc|_|_t|tt
f��r|\|_|_	nd|_||_
t|t��r|g}||_||_
||_||_dS)ax
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        N)rr�rr<�list�tuple�mailhost�mailport�username�password�fromaddrr=�toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�s        rrzSMTPHandler.__init__�s���$	�� � ��&�&�&��h��u�
�.�.�	:�+3�(�D�M�4�=�=�+3�T�(�D�M�4�=��k�D�%�=�1�1�	!�+6�(�D�M�4�=�=� �D�M� ��
��g�s�#�#�	 ��i�G��������������rc��|jS)z�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        )r�rs  r�
getSubjectzSMTPHandler.getSubjects���|�rc�
�	ddl}ddlm}ddl}|j}|s|j}|�|j||j���}|��}|j	|d<d�
|j��|d<|�|��|d<|j
���|d	<|�|�|����|jr^|j�7|���|j|j�|���|�|j|j��|�|��|���dS#t2$r|�|��YdSwxYw)
zd
        Emit a record.

        Format the record and send it to the specified addressees.
        rN)�EmailMessager��From�,�To�Subject�Date)�smtplib�
email.messager��email.utilsr��	SMTP_PORT�SMTPr�r�r�r�r�r��utilsr{�set_contentrLr�r��ehlo�starttls�loginr��send_message�quitrr)rrr�r��emailr��smtprQs        rrzSMTPHandler.emit%s���	%��N�N�N�2�2�2�2�2�2������=�D��
)��(���<�<��
�t�T�\�<�J�J�D��,�.�.�C��-�C��K������.�.�C��I�!�_�_�V�4�4�C�	�N��+�/�/�1�1�C��K��O�O�D�K�K��/�/�0�0�0��}�
9��;�*��I�I�K�K�K�!�D�M�4�;�/�/��I�I�K�K�K��
�
�4�=�$�-�8�8�8����c�"�"�"��I�I�K�K�K�K�K���	%�	%�	%����V�$�$�$�$�$�$�	%���s�EE�F�F)NNr~)r.r/r0r1rr�rr2rrr}r}�sV��������9<�!�!�!�!�F���%�%�%�%�%rr}c�8�eZdZdZd
d�Zd�Zd�Zd�Zd�Zd	�Z	dS)�NTEventLogHandlera�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    N�Applicationc
�.�tj�|��	ddl}ddl}||_||_|sttj�	|jj
��}tj�	|d��}tj�|dd��}||_||_
	|j�|||��n-#t$r }t!|dd��dkr�Yd}~nd}~wwxYw|j|_tj|jtj|jtj|jtj|jtj|ji|_dS#t6$rt9d��d|_YdSwxYw)Nrzwin32service.pyd�winerrorrvzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr�r�win32evtlogutil�win32evtlog�appname�_welur'r(r��__file__r��dllname�logtype�AddSourceToRegistryr�getattr�EVENTLOG_ERROR_TYPE�deftyper/�EVENTLOG_INFORMATION_TYPEr0r1�EVENTLOG_WARNING_TYPEr2r3�typemap�ImportError�print)rr�r�r�r�r��es       rrzNTEventLogHandler.__init__Os����� � ��&�&�&�	�/�/�/�/�/�/�/�/�"�D�L�(�D�J��
H��'�-�-��
�(;�<�<���'�-�-���
�3�3���'�,�,�w�q�z�3F�G�G��"�D�L�"�D�L�
��
�.�.�w���I�I�I�I���
�
�
��1�j�$�/�/�1�4�4��5�4�4�4�4�����
����
'�:�D�L��
�+�"G���+�"G���+�"C��
�+�"A�� �+�"A��D�L�L�L���	�	�	��?�
@�
@�
@��D�J�J�J�J�	���s=�BE0�<C�E0�
D�#C>�9E0�>D�A+E0�0 F�Fc��dS)ay
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        r>r2rs  r�getMessageIDzNTEventLogHandler.getMessageIDrs	���qrc��dS)z�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        rr2rs  r�getEventCategoryz"NTEventLogHandler.getEventCategory|s	���qrc�L�|j�|j|j��S)a�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        )r�rO�levelnor�rs  r�getEventTypezNTEventLogHandler.getEventType�s ���|�������=�=�=rc�V�|jr�	|�|��}|�|��}|�|��}|�|��}|j�|j||||g��dS#t$r|�|��YdSwxYwdS)z�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N)	r�r�r�r�rL�ReportEventr�rr)rr�id�cat�typerQs      rrzNTEventLogHandler.emit�s����:�	)�
)��&�&�v�.�.���+�+�F�3�3���(�(��0�0���k�k�&�)�)���
�&�&�t�|�R��d�S�E�J�J�J�J�J���
)�
)�
)�� � ��(�(�(�(�(�(�
)����	)�	)s�A8B�B&�%B&c�D�tj�|��dS)aS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N)rr�rA�rs rrAzNTEventLogHandler.close�s ��	����d�#�#�#�#�#r)Nr�)
r.r/r0r1rr�r�r�rrAr2rrr�r�Es~��������!�!�!�!�F������>�>�>�)�)�)�"$�$�$�$�$rr�c�0�eZdZdZ		d	d�Zd�Zd�Zd�ZdS)
�HTTPHandlerz^
    A class which sends records to a web server, using either GET or
    POST semantics.
    �GETFNc��tj�|��|���}|dvrt	d���|s|�t	d���||_||_||_||_||_	||_
dS)zr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        )r��POSTzmethod must be GET or POSTNz3context parameter only makes sense with secure=True)rr�rr`rgr��url�methodr�r��context)rr�r�r�r�r�r�s       rrzHTTPHandler.__init__�s���	�� � ��&�&�&���������(�(��9�:�:�:��	1�'�-��0�1�1�
1���	����������&�������rc��|jS)z�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        )r�rs  r�mapLogRecordzHTTPHandler.mapLogRecord�s����rc��ddl}|r"|j�||j���}n|j�|��}|S)z�
        get a HTTP[S]Connection.

        Override when a custom connection is required, for example if
        there is a proxy.
        rN)r�)�http.client�client�HTTPSConnectionr��HTTPConnection)rr�r��http�
connections     r�
getConnectionzHTTPHandler.getConnection�sQ��	�����	:���4�4�T�4�<�4�P�P�J�J���3�3�D�9�9�J��rc�<�	ddl}|j}|�||j��}|j}|j�|�|����}|jdkr(|�	d��dkrd}nd}|d||fzz}|�
|j|��|�	d��}|dkr
|d|�}|jdkrF|�d	d
��|�dtt|������|jrtddl}	d|jz�d
��}
d|	�|
������d��z}
|�d|
��|���|jdkr(|�|�d
����|���dS#t.$r|�|��YdSwxYw)zk
        Emit a record.

        Send the record to the web server as a percent-encoded dictionary
        rNr��?�&z%c%s�:r�zContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%srUzBasic �ascii�
Authorization)�urllib.parser�r�r�r��parse�	urlencoder�r��find�
putrequest�	putheaderr=rOr��base64rY�	b64encode�strip�decode�
endheadersr��getresponserr)rr�urllibr�rTr��data�seprFr�r�s           rrzHTTPHandler.emit�s��#	%������9�D��"�"�4���5�5�A��(�C��<�)�)�$�*;�*;�F�*C�*C�D�D�D��{�e�#�#��H�H�S�M�M�Q�&�&��C�C��C��F�c�4�[�0�0��
�L�L���c�*�*�*��	�	�#���A��A�v�v��B�Q�B�x���{�f�$�$����N�?�A�A�A����,�c�#�d�)�)�n�n�=�=�=���
0��
�
�
��t�/�/�7�7��@�@���v�/�/��2�2�8�8�:�:�A�A�'�J�J�J�����O�Q�/�/�/�
�L�L�N�N�N��{�f�$�$����t�{�{�7�+�+�,�,�,�
�M�M�O�O�O�O�O���	%�	%�	%����V�$�$�$�$�$�$�	%���s�G4G8�8H�H)r�FNN)r.r/r0r1rr�r�rr2rrr�r��si��������KO������(������)%�)%�)%�)%�)%rr�c�0�eZdZdZd�Zd�Zd�Zd�Zd�ZdS)�BufferingHandlerz�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    c�`�tj�|��||_g|_dS)z>
        Initialize the handler with the buffer size.
        N)rr�r�capacity�buffer)rr�s  rrzBufferingHandler.__init__s,��	�� � ��&�&�&� ��
�����rc�<�t|j��|jkS)z�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        )rOr�r�rs  r�shouldFlushzBufferingHandler.shouldFlushs���D�K� � �D�M�1�2rc��|j�|��|�|��r|���dSdS)z�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N)r�r�r�r�rs  rrzBufferingHandler.emit!sK��	
����6�"�"�"����F�#�#�	��J�J�L�L�L�L�L�	�	rc��|���	|j���|���dS#|���wxYw)zw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N)r�r��clearr�r�s rr�zBufferingHandler.flush,sM��	
������	��K�������L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�A�Ac��	|���tj�|��dS#tj�|��wxYw)zp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N)r�rr�rAr�s rrAzBufferingHandler.close8sL��	(��J�J�L�L�L��O�!�!�$�'�'�'�'�'��G�O�!�!�$�'�'�'�'���s	�7�!AN)	r.r/r0r1rr�rr�rAr2rrr�r�
si��������
���3�3�3�	�	�	�
�
�
�	(�	(�	(�	(�	(rr�c�B�eZdZdZejddfd�Zd�Zd�Zd�Z	d�Z
dS)	�
MemoryHandlerz�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    NTc�f�t�||��||_||_||_dS)a;
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        N)r�r�
flushLevel�target�flushOnClose)rr�r�r�r�s     rrzMemoryHandler.__init__Is6��	�!�!�$��1�1�1�$������(����rc�\�t|j��|jkp|j|jkS)zP
        Check for buffer full or a record at the flushLevel or higher.
        )rOr�r�r�r�rs  rr�zMemoryHandler.shouldFlush]s.���D�K� � �D�M�1�4���4�?�2�	4rc��|���	||_|���dS#|���wxYw)z:
        Set the target handler for this handler.
        N)r�r�r�)rr�s  r�	setTargetzMemoryHandler.setTargetds@��	
������	� �D�K��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s	�3�A	c��|���	|jr=|jD]}|j�|���|j���|���dS#|���wxYw)z�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is only cleared if a target has been set.
        N)r�r�r��handler�r�rs  rr�zMemoryHandler.flushns���	
������	��{�
$�"�k�/�/�F��K�&�&�v�.�.�.�.���!�!�#�#�#��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�AA0�0Bc���	|jr|���|���	d|_t�|��|���dS#|���wxYw#|���	d|_t�|��|���w#|���wxYwxYw)zi
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        N)r�r�r�r�r�rAr�r�s rrAzMemoryHandler.closes���
		�� �
��
�
�����L�L�N�N�N�
�"��� �&�&�t�,�,�,���������������������
�L�L�N�N�N�
�"��� �&�&�t�,�,�,���������������������s.�B�!A)�)A?�C'�!C�9C'�C$�$C')r.r/r0r1rr2rr�rr�rAr2rrr�r�Csz��������
-4�M�$�"�)�)�)�)�(4�4�4�������"����rr�c�*�eZdZdZd�Zd�Zd�Zd�ZdS)�QueueHandlera�
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    c�R�tj�|��||_dS)zA
        Initialise an instance, using the passed queue.
        N)rr�r�queue)rrs  rrzQueueHandler.__init__�s%��	�� � ��&�&�&���
�
�
rc�:�|j�|��dS)z�
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        N)r�
put_nowaitrs  r�enqueuezQueueHandler.enqueue�s ��	
�
���f�%�%�%�%�%rc��|�|��}tj|��}||_||_d|_d|_d|_d|_|S)a�
        Prepare a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message and
        arguments, and removes unpickleable items from the record in-place.
        Specifically, it overwrites the record's `msg` and
        `message` attributes with the merged message (obtained by
        calling the handler's `format` method), and sets the `args`,
        `exc_info` and `exc_text` attributes to None.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        N)rL�copyr�rQr�r��exc_text�
stack_inforPs   r�preparezQueueHandler.prepare�sT��,�k�k�&�!�!����6�"�"�������
���������� ����
rc��	|�|�|����dS#t$r|�|��YdSwxYw)zm
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        N)r
rrrrs  rrzQueueHandler.emit�sc��	%��L�L����f�-�-�.�.�.�.�.���	%�	%�	%����V�$�$�$�$�$�$�	%���s�(,�A�AN)r.r/r0r1rr
rrr2rrrr�s[�����������&�&�&����B	%�	%�	%�	%�	%rrc�L�eZdZdZdZdd�d�Zd�Zd�Zd�Zd	�Z	d
�Z
d�Zd�ZdS)
�
QueueListenerz�
    This class implements an internal threaded listener which watches for
    LogRecords being added to a queue, removes them and passes them to a
    list of handlers for processing.
    NF)�respect_handler_levelc�>�||_||_d|_||_dS)zW
        Initialise an instance with the specified queue and
        handlers.
        N)r�handlers�_threadr)rrrrs    rrzQueueListener.__init__�s'��
��
� ��
����%:��"�"�"rc�6�|j�|��S)z�
        Dequeue a record and return it, optionally blocking.

        The base implementation uses get. You may want to override this method
        if you want to use timeouts or work with custom queue implementations.
        )rrO)r�blocks  r�dequeuezQueueListener.dequeue�s���z�~�~�e�$�$�$rc�~�tj|j���x|_}d|_|���dS)z�
        Start the listener.

        This starts up a background thread to monitor the queue for
        LogRecords to process.
        )r�TN)�	threading�Thread�_monitorrrr�)rrrs  rr�zQueueListener.start�s8��%�+�4�=�A�A�A�A���q����	���	�	�	�	�	rc��|S)a
        Prepare a record for handling.

        This method just returns the passed-in record. You may want to
        override this method if you need to do any custom marshalling or
        manipulation of the record before passing it to the handlers.
        r2rs  rrzQueueListener.prepare�s	���
rc��|�|��}|jD]3}|jsd}n|j|jk}|r|�|���4dS)z|
        Handle a record.

        This just loops through the handlers offering them the record
        to handle.
        TN)rrrr��levelr)rr�handler�processs    rrzQueueListener.handle	sk�����f�%�%���}�	'�	'�G��-�
:���� �.�G�M�9���
'����v�&�&�&��
	'�	'rc�&�|j}t|d��}		|�d��}||jur|r|���dS|�|��|r|���n#tj$rYdSwxYw�z)z�
        Monitor the queue for records, and ask the handler
        to deal with them.

        This method runs on a separate, internal thread.
        The thread will terminate if it sees a sentinel object in the queue.
        �	task_doneTN)r�hasattrr�	_sentinelr$r�Empty)r�q�
has_task_doners    rrzQueueListener._monitors���
�J����;�/�/�
�	�

����d�+�+���T�^�+�+�$�&����
�
�
��E����F�#�#�#� �"��K�K�M�M�M����;�
�
�
����
����	s�4A<�+A<�<B�Bc�D�|j�|j��dS)z�
        This is used to enqueue the sentinel record.

        The base implementation uses put_nowait. You may want to override this
        method if you want to use timeouts or work with custom queue
        implementations.
        N)rr	r&r�s r�enqueue_sentinelzQueueListener.enqueue_sentinel0s"��	
�
���d�n�-�-�-�-�-rc�n�|���|j���d|_dS)a

        Stop the listener.

        This asks the thread to terminate, and then waits for it to do so.
        Note that if you don't call this before your application exits, there
        may be some records still left on the queue, which won't be processed.
        N)r+rr�r�s r�stopzQueueListener.stop:s5��	
�����������������r)
r.r/r0r1r&rrr�rrrr+r-r2rrrr�s���������
�I�?D�;�;�;�;�;�%�%�%�	�	�	����'�'�'� ���..�.�.�
�
�
�
�
rr)(r1r9rr�r'r�r�rorjrnrrrrrr�DEFAULT_TCP_LOGGING_PORT�DEFAULT_UDP_LOGGING_PORT�DEFAULT_HTTP_LOGGING_PORT�DEFAULT_SOAP_LOGGING_PORTr{�SYSLOG_TCP_PORTr|rrr4rSr�r�r�r�r�r}r�r�r�r�r�objectrr2rr�<module>r4s���"��9�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�)�)�)�)�)�)�)�)�)�)�������������#��"��"��"��!��!���	�H'�H'�H'�H'�H'�'�-�H'�H'�H'�TQ�Q�Q�Q�Q�-�Q�Q�Q�fw<�w<�w<�w<�w<�2�w<�w<�w<�rG/�G/�G/�G/�G/��,�G/�G/�G/�Te�e�e�e�e�G�O�e�e�e�N(*�(*�(*�(*�(*�m�(*�(*�(*�TU%�U%�U%�U%�U%�G�O�U%�U%�U%�nN%�N%�N%�N%�N%�'�/�N%�N%�N%�`i$�i$�i$�i$�i$���i$�i$�i$�VX%�X%�X%�X%�X%�'�/�X%�X%�X%�t7(�7(�7(�7(�7(�w��7(�7(�7(�rJ�J�J�J�J�$�J�J�J�ZF%�F%�F%�F%�F%�7�?�F%�F%�F%�Rk�k�k�k�k�F�k�k�k�k�krPK�]�q'�����*__pycache__/__init__.cpython-311.opt-1.pycnu�[����

Ħ�=�v�����dZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ddlmZddl
mZddl
mZgd�ZddlZdZdZd	Zd
Zej��ZdZdZdZdZdZeZd
ZdZeZ dZ!dZ"dZ#ededede!de"de#diZ$eeeeee!e"e#d�Z%d�Z&d�Z'd�Z(e)ed��rd�Z*nd�Z*ej+�,e(j-j.��Z/d�Z0d�Z1ej2��Z3d �Z4d!�Z5e)ed"��sd#�Z6n(ej7��Z8d$�Z6d%�Z9ej:e4e9e5�&��Gd'�d(e;��Z<e<a=d)�Z>d*�Z?d+�Z@e��ZA[Gd,�d-e;��ZBGd.�d/eB��ZCGd0�d1eB��ZDd2ZEeBeEfeCd3feDd4fd5�ZFGd6�d7e;��Ze��ZGGd8�d9e;��ZHGd:�d;e;��ZIGd<�d=e;��ZJejK��ZLgZMd>�ZNd?�ZOGd@�dAeJ��ZPGdB�dCeP��ZQGdD�dEeQ��ZRGdF�dGeQ��ZSeSe��ZTeTZUGdH�dIe;��ZVdJ�ZWdK�ZXGdL�dMe;��ZYGdN�dOeJ��ZZGdP�dQeZ��Z[eZa\GdR�dSe;��Z]e[e��Z^e^eZ_^eYeZj^��eZ__dT�Z`dfdU�ZadV�ZbdW�ZcdX�ZdddY�dZ�Zed[�Zfd\�Zgd]�Zhd^�Zid_�Zjefd`�ZkeMfda�ZlddlmZmemjnel��Gdb�dceP��Zodapdgdd�Zqde�ZrdS)hz�
Logging package for Python. Based on PEP 282 and comments thereto in
comp.lang.python.

Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging' and log away!
�N)�GenericAlias)�Template)�	Formatter)+�BASIC_FORMAT�BufferingFormatter�CRITICAL�DEBUG�ERROR�FATAL�FileHandler�Filterr�Handler�INFO�	LogRecord�Logger�
LoggerAdapter�NOTSET�NullHandler�
StreamHandler�WARN�WARNING�addLevelName�basicConfig�captureWarnings�critical�debug�disable�error�	exception�fatal�getLevelName�	getLogger�getLoggerClass�info�log�
makeLogRecord�setLoggerClass�shutdown�warn�warning�getLogRecordFactory�setLogRecordFactory�
lastResort�raiseExceptions�getLevelNamesMappingz&Vinay Sajip <vinay_sajip@red-dove.com>�
productionz0.5.1.2z07 February 2010T�2�(���
rr
rrr	r)rrr
rrrr	rc�4�t���S�N)�_nameToLevel�copy���;/opt/alt/python-internal/lib/python3.11/logging/__init__.pyr/r/xs�������r;c��t�|��}|�|St�|��}|�|Sd|zS)a�
    Return the textual or numeric representation of logging level 'level'.

    If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,
    INFO, DEBUG) then you get the corresponding string. If you have
    associated levels with names using addLevelName then the name you have
    associated with 'level' is returned.

    If a numeric value corresponding to one of the defined levels is passed
    in, the corresponding string representation is returned.

    If a string representation of the level is passed in, the corresponding
    numeric value is returned.

    If no matching numeric or string value is passed in, the string
    'Level %s' % level is returned.
    NzLevel %s)�_levelToName�getr8)�level�results  r<r!r!{sK��&�
�
�e�
$�
$�F�
���
�
�
�
�e�
$�
$�F�
���
����r;c��t��	|t|<|t|<t��dS#t��wxYw)zy
    Associate 'levelName' with 'level'.

    This is used when converting levels to text during message formatting.
    N)�_acquireLockr>r8�_releaseLock)r@�	levelNames  r<rr�sA���N�N�N��'��U��"'��Y����������������s	�4�A�	_getframec�*�tjd��S)N�)�sysrFr:r;r<�<lambda>rJ�s��3�=��+�+�r;c�x�	t�#t$r&tj��djjcYSwxYw)z5Return the frame object for the caller's stack frame.�)�	ExceptionrI�exc_info�tb_frame�f_backr:r;r<�currentframerQ�sD��	5��O���	5�	5�	5��<�>�>�!�$�-�4�4�4�4�	5���s�	�-9�9c�z�tj�|jj��}|t
kpd|vod|vS)zASignal whether the frame is a CPython or logging module internal.�	importlib�
_bootstrap)�os�path�normcase�f_code�co_filename�_srcfile)�frame�filenames  r<�_is_internal_framer]�s@���w����� 8�9�9�H��x����x��<�L�H�$<�r;c���t|t��r|}nNt|��|kr)|tvrt	d|z���t|}ntd|�����|S)NzUnknown level: %rz(Level not an integer or a valid string: )�
isinstance�int�strr8�
ValueError�	TypeError)r@�rvs  r<�_checkLevelre�sz���%����$�
���	�U���u�	�	���$�$��0�5�8�9�9�9�
�%�
 ����i� �5�#�$�$�	$�
�Ir;c�J�trt���dSdS)z�
    Acquire the module-level lock for serializing access to shared data.

    This should be released with _releaseLock().
    N)�_lock�acquirer:r;r<rCrC�s'��
��
�
�
�������r;c�J�trt���dSdS)zK
    Release the module-level lock acquired by calling _acquireLock().
    N)rg�releaser:r;r<rDrD�s'��
��
�
�
�������r;�register_at_forkc��dSr7r:��instances r<�_register_at_fork_reinit_lockro�����r;c��t��	t�|��t��dS#t��wxYwr7)rC�_at_fork_reinit_lock_weakset�addrDrms r<roros?������	�(�,�,�X�6�6�6��N�N�N�N�N��L�N�N�N�N���s	�:�A
c�t�tD]}|����t���dSr7)rr�_at_fork_reinitrg��handlers r<�!_after_at_fork_child_reinit_locksrxs@��3�	&�	&�G��#�#�%�%�%�%�	�������r;)�before�after_in_child�after_in_parentc�(�eZdZdZ	dd�Zd�Zd�ZdS)ra
    A LogRecord instance represents an event being logged.

    LogRecord instances are created every time something is logged. They
    contain all the information pertinent to the event being logged. The
    main information passed in is in msg and args, which are combined
    using str(msg) % args to create the message field of the record. The
    record also includes information such as when the record was created,
    the source line where the logging call was made, and any exception
    information to be logged.
    Nc
���tj��}||_||_|rHt|��dkr5t	|dt
jj��r|dr|d}||_t|��|_
||_||_	tj�|��|_tj�|j��d|_n+#t&t(t*f$r||_d|_YnwxYw||_d|_|	|_||_||_||_t9|t9|��z
dz��dz|_|jt<z
dz|_t@r6tCj"��|_#tCj$��j|_%nd|_#d|_%tLsd|_'nXd|_'tPj)�*d��}|�0	|�+��j|_'n#tX$rYnwxYwtZr/t]td	��rtj/��|_0dSd|_0dS)
zK
        Initialize a logging record with interesting information.
        rHrzUnknown moduleNi�g�MainProcess�multiprocessing�getpid)1�time�name�msg�lenr_�collections�abc�Mapping�argsr!�	levelname�levelno�pathnamerUrV�basenamer\�splitext�modulercrb�AttributeErrorrN�exc_text�
stack_info�lineno�funcName�createdr`�msecs�
_startTime�relativeCreated�
logThreads�	threading�	get_ident�thread�current_thread�
threadName�logMultiprocessing�processNamerI�modulesr?�current_processrM�logProcesses�hasattrr��process)
�selfr�r@r�r�r�r�rN�func�sinfo�kwargs�ct�mps
             r<�__init__zLogRecord.__init__$s;��
�Y�[�[����	����&
�	�S��Y�Y�!�^�^�
�4��7�K�O�<S�(T�(T�^��Q��$���7�D���	�%�e�,�,������ ��
�	+��G�,�,�X�6�6�D�M��'�*�*�4�=�9�9�!�<�D�K�K���:�~�6�	+�	+�	+�$�D�M�*�D�K�K�K�	+����!��
���
���������
�����"�s�2�w�w�,�$�.�/�/�#�5��
� $��z� 9�T�A����	#�#�-�/�/�D�K�'�6�8�8�=�D�O�O��D�K�"�D�O�!�
	�#�D���,�D������!2�3�3�B��~�
�')�'9�'9�';�';�'@�D�$�$�� �����D������	 �G�B��1�1�	 ��9�;�;�D�L�L�L��D�L�L�Ls%�AC*�*%D�D�H"�"
H/�.H/c�X�d|j�d|j�d|j�d|j�d|j�d�S)Nz<LogRecord: �, z, "z">)r�r�r�r�r��r�s r<�__repr__zLogRecord.__repr__ls8���48�I�I�I�t�|�|�|��M�M�M�4�;�;�;�����2�	2r;c�P�t|j��}|jr
||jz}|S)z�
        Return the message for this LogRecord.

        Return the message for this LogRecord after merging any user-supplied
        arguments with the message.
        )rar�r�)r�r�s  r<�
getMessagezLogRecord.getMessageps+���$�(�m�m���9�	"���	�/�C��
r;�NN)�__name__�
__module__�__qualname__�__doc__r�r�r�r:r;r<rrsZ������
�
�8<�F �F �F �F �P2�2�2�
�
�
�
�
r;rc�
�|adS)z�
    Set the factory to be used when instantiating a log record.

    :param factory: A callable which will be called to instantiate
    a log record.
    N��_logRecordFactory)�factorys r<r,r,�s�� ���r;c��tS)zH
    Return the factory to be used when instantiating a log record.
    r�r:r;r<r+r+�s
��
�r;c
�f�tdddddddd��}|j�|��|S)z�
    Make a LogRecord whose attributes are defined by the specified dictionary,
    This function is useful for converting a logging event received over
    a socket connection (which is sent as a dictionary) into a LogRecord
    instance.
    N�rr:)r��__dict__�update)�dictrds  r<r&r&�s:��
�4��r�1�b�"�d�D�	A�	A�B��K���t����
�Ir;c�j�eZdZdZdZdZejdej��Z	dd�d�Z
d�Zd	�Zd
�Z
d�ZdS)�PercentStylez%(message)sz%(asctime)sz
%(asctime)z5%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]N��defaultsc�0�|p|j|_||_dSr7)�default_format�_fmt�	_defaults)r��fmtr�s   r<r�zPercentStyle.__init__�s���.�4�.��	�!����r;c�H�|j�|j��dkS)Nr�r��find�asctime_searchr�s r<�usesTimezPercentStyle.usesTime�s���y�~�~�d�1�2�2�a�7�7r;c��|j�|j��s&td|j�d|jd�d����dS)z>Validate the input format, ensure it matches the correct stylezInvalid format 'z' for 'rz' styleN)�validation_pattern�searchr�rbr�r�s r<�validatezPercentStyle.validate�sU���&�-�-�d�i�8�8�	i��*�T�Y�Y�Y�PT�Pc�de�Pf�Pf�Pf�g�h�h�h�	i�	ir;c�L�|jx}r||jz}n|j}|j|zSr7)r�r�r��r��recordr��valuess    r<�_formatzPercentStyle._format�s3���~�%�8�	%����/�F�F��_�F��y�6�!�!r;c�v�	|�|��S#t$r}td|z���d}~wwxYw)Nz(Formatting field not found in record: %s)r��KeyErrorrb)r�r��es   r<�formatzPercentStyle.format�sQ��	M��<�<��'�'�'���	M�	M�	M��G�!�K�L�L�L�����	M���s��
8�3�8)r�r�r�r��asctime_formatr��re�compile�Ir�r�r�r�r�r�r:r;r<r�r��s�������"�N�"�N�!�N�#���$\�^`�^b�c�c��(,�"�"�"�"�"�8�8�8�i�i�i�
"�"�"�M�M�M�M�Mr;r�c�r�eZdZdZdZdZejdej��Z	ejd��Z
d�Zd�ZdS)	�StrFormatStylez	{message}z	{asctime}z{asctimezF^(.?[<>=^])?[+ -]?#?0?(\d+|{\w+})?[,_]?(\.(\d+|{\w+}))?[bcdefgnosx%]?$z^(\d+|\w+)(\.\w+|\[[^]]+\])*$c�\�|jx}r||jz}n|j}|jjdi|��S�Nr:)r�r�r�r�r�s    r<r�zStrFormatStyle._format�sA���~�%�8�	%����/�F�F��_�F��t�y��)�)�&�)�)�)r;c���t��}	t�|j��D]�\}}}}|rA|j�|��st
d|z���|�|��|r|dvrt
d|z���|r,|j�|��st
d|z�����n$#t$r}t
d|z���d}~wwxYw|st
d���dS)zKValidate the input format, ensure it is the correct string formatting stylez!invalid field name/expression: %r�rsazinvalid conversion: %rzbad specifier: %rzinvalid format: %sN�invalid format: no fields)	�set�_str_formatter�parser��
field_spec�matchrbrs�fmt_spec)r��fields�_�	fieldname�spec�
conversionr�s       r<r�zStrFormatStyle.validate�s:������	7�2@�2F�2F�t�y�2Q�2Q�
A�
A�.��9�d�J��*��?�0�0��;�;�Z�(�)L�y�)X�Y�Y�Y��J�J�y�)�)�)��L�*�E�"9�"9�$�%=�
�%J�K�K�K��A��
� 3� 3�D� 9� 9�A�$�%8�4�%?�@�@�@��
A���	7�	7�	7��1�A�5�6�6�6�����	7�����	:��8�9�9�9�	:�	:s�B0C�
C"�C�C"N)
r�r�r�r�r�r�r�r�r�r�r�r�r�r:r;r<r�r��sk������ �N� �N��N��r�z�c�eg�ei�j�j�H����<�=�=�J�*�*�*�:�:�:�:�:r;r�c�<��eZdZdZdZdZ�fd�Zd�Zd�Zd�Z	�xZ
S)�StringTemplateStylez
${message}z
${asctime}c�l��t��j|i|��t|j��|_dSr7)�superr�rr��_tpl)r�r�r��	__class__s   �r<r�zStringTemplateStyle.__init__�s4��������$�)�&�)�)�)��T�Y�'�'��	�	�	r;c�~�|j}|�d��dkp|�|j��dkS)Nz$asctimerr��r�r�s  r<r�zStringTemplateStyle.usesTime�s9���i���x�x�
�#�#�q�(�N�C�H�H�T�5H�,I�,I�Q�,N�Nr;c��tj}t��}|�|j��D]�}|���}|dr|�|d���:|dr|�|d���^|�d��dkrtd�����|std���dS)N�named�bracedr�$z$invalid format: bare '$' not allowedr�)	r�patternr��finditerr��	groupdictrs�grouprb)r�r�r��m�ds     r<r�zStringTemplateStyle.validate�s����"�������!�!�$�)�,�,�	K�	K�A����
�
�A���z�
K��
�
�1�W�:�&�&�&�&��8��
K��
�
�1�X�;�'�'�'�'�������s�"�"� �!I�J�J�J�#��	:��8�9�9�9�	:�	:r;c�\�|jx}r||jz}n|j}|jjdi|��Sr�)r�r�r��
substituter�s    r<r�zStringTemplateStyle._formatsA���~�%�8�	%����/�F�F��_�F�#�t�y�#�-�-�f�-�-�-r;)r�r�r�r�r�r�r�r�r�r��
__classcell__)r�s@r<r�r��sw�������!�N�!�N�!�N�(�(�(�(�(�O�O�O�:�:�:�.�.�.�.�.�.�.r;r�z"%(levelname)s:%(name)s:%(message)sz{levelname}:{name}:{message}z${levelname}:${name}:${message})�%�{r�c�\�eZdZdZejZddd�d�ZdZdZ	dd	�Z
d
�Zd�Zd�Z
d
�Zd�ZdS)ra�
    Formatter instances are used to convert a LogRecord to text.

    Formatters need to know how a LogRecord is constructed. They are
    responsible for converting a LogRecord to (usually) a string which can
    be interpreted by either a human or an external system. The base Formatter
    allows a formatting string to be specified. If none is supplied, the
    style-dependent default value, "%(message)s", "{message}", or
    "${message}", is used.

    The Formatter can be initialized with a format string which makes use of
    knowledge of the LogRecord attributes - e.g. the default value mentioned
    above makes use of the fact that the user's message and arguments are pre-
    formatted into a LogRecord's message attribute. Currently, the useful
    attributes in a LogRecord are described by:

    %(name)s            Name of the logger (logging channel)
    %(levelno)s         Numeric logging level for the message (DEBUG, INFO,
                        WARNING, ERROR, CRITICAL)
    %(levelname)s       Text logging level for the message ("DEBUG", "INFO",
                        "WARNING", "ERROR", "CRITICAL")
    %(pathname)s        Full pathname of the source file where the logging
                        call was issued (if available)
    %(filename)s        Filename portion of pathname
    %(module)s          Module (name portion of filename)
    %(lineno)d          Source line number where the logging call was issued
                        (if available)
    %(funcName)s        Function name
    %(created)f         Time when the LogRecord was created (time.time()
                        return value)
    %(asctime)s         Textual time when the LogRecord was created
    %(msecs)d           Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
                        relative to the time the logging module was loaded
                        (typically at application startup time)
    %(thread)d          Thread ID (if available)
    %(threadName)s      Thread name (if available)
    %(process)d         Process ID (if available)
    %(message)s         The result of record.getMessage(), computed just as
                        the record is emitted
    NrTr�c�:�|tvr<tdd�t�����z���t|d||���|_|r|j���|jj|_||_dS)a�
        Initialize the formatter with specified format strings.

        Initialize the formatter either with the specified format string, or a
        default as described above. Allow for specialized date formatting with
        the optional datefmt argument. If datefmt is omitted, you get an
        ISO8601-like (or RFC 3339-like) format.

        Use a style parameter of '%', '{' or '$' to specify that you want to
        use one of %-formatting, :meth:`str.format` (``{}``) formatting or
        :class:`string.Template` formatting in your format string.

        .. versionchanged:: 3.2
           Added the ``style`` parameter.
        �Style must be one of: %s�,rr�N)�_STYLESrb�join�keys�_styler�r��datefmt)r�r�r�styler�r�s      r<r�zFormatter.__init__@s���"�����7�#�(�(�$�\�\�^�^�;-�;-�-�.�.�
.��e�n�Q�'��h�?�?�?����	#��K� � �"�"�"��K�$��	�����r;z%Y-%m-%d %H:%M:%Sz%s,%03dc���|�|j��}|rtj||��}n2tj|j|��}|jr|j||jfz}|S)a%
        Return the creation time of the specified LogRecord as formatted text.

        This method should be called from format() by a formatter which
        wants to make use of a formatted time. This method can be overridden
        in formatters to provide for any specific requirement, but the
        basic behaviour is as follows: if datefmt (a string) is specified,
        it is used with time.strftime() to format the creation time of the
        record. Otherwise, an ISO8601-like (or RFC 3339-like) format is used.
        The resulting string is returned. This function uses a user-configurable
        function to convert the creation time to a tuple. By default,
        time.localtime() is used; to change this for a particular formatter
        instance, set the 'converter' attribute to a function with the same
        signature as time.localtime() or time.gmtime(). To change it for all
        formatters, for example if you want all logging times to be shown in GMT,
        set the 'converter' attribute in the Formatter class.
        )�	converterr�r��strftime�default_time_format�default_msec_formatr�)r�r�rr��ss     r<�
formatTimezFormatter.formatTime^sl��$�^�^�F�N�
+�
+���	A��
�g�r�*�*�A�A��
�d�6��;�;�A��'�
A��,��6�<�/@�@���r;c��tj��}|d}tj|d|d|d|��|���}|���|dd�dkr
|dd�}|S)z�
        Format and return the specified exception information as a string.

        This default implementation just uses
        traceback.print_exception()
        rLrrHN����
)�io�StringIO�	traceback�print_exception�getvalue�close)r��ei�sio�tbrs     r<�formatExceptionzFormatter.formatExceptionysx���k�m�m��
��U��	�!�"�Q�%��A���D�#�>�>�>��L�L�N�N���	�	�����R�S�S�6�T�>�>��#�2�#��A��r;c�4�|j���S)zK
        Check if the format uses the creation time of the record.
        )rr�r�s r<r�zFormatter.usesTime�s���{�#�#�%�%�%r;c�6�|j�|��Sr7)rr��r�r�s  r<�
formatMessagezFormatter.formatMessage�s���{�!�!�&�)�)�)r;c��|S)aU
        This method is provided as an extension point for specialized
        formatting of stack information.

        The input data is a string as returned from a call to
        :func:`traceback.print_stack`, but with the last trailing newline
        removed.

        The base implementation just returns the value passed in.
        r:)r�r�s  r<�formatStackzFormatter.formatStack�s
���r;c���|���|_|���r |�||j��|_|�|��}|jr&|js|�	|j��|_|jr|dd�dkr|dz}||jz}|j
r0|dd�dkr|dz}||�|j
��z}|S)az
        Format the specified record as text.

        The record's attribute dictionary is used as the operand to a
        string formatting operation which yields the returned string.
        Before formatting the dictionary, a couple of preparatory steps
        are carried out. The message attribute of the record is computed
        using LogRecord.getMessage(). If the formatting string uses the
        time (as determined by a call to usesTime(), formatTime() is
        called to format the event time. If there is exception information,
        it is formatted using formatException() and appended to the message.
        rNr)r��messager�rr�asctimer*rNr�r&r�r,)r�r�rs   r<r�zFormatter.format�s��� �*�*�,�,����=�=�?�?�	C�!�_�_�V�T�\�B�B�F�N����v�&�&���?�	H��?�
H�"&�"6�"6�v��"G�"G����?�	$�����v��~�~���H���F�O�#�A���	8�����v��~�~���H���D�$�$�V�%6�7�7�7�A��r;)NNrTr7)r�r�r�r�r��	localtimerr�rrrr&r�r*r,r�r:r;r<rrs�������(�(�T��I��������6.��#������6���&&�&�&�*�*�*��������r;rc�,�eZdZdZdd�Zd�Zd�Zd�ZdS)rzB
    A formatter suitable for formatting a number of records.
    Nc�4�|r	||_dSt|_dS)zm
        Optionally specify a formatter which will be used to format each
        individual record.
        N)�linefmt�_defaultFormatter)r�r3s  r<r�zBufferingFormatter.__init__�s"��
�	-�"�D�L�L�L�,�D�L�L�Lr;c��dS)zE
        Return the header string for the specified records.
        r�r:�r��recordss  r<�formatHeaderzBufferingFormatter.formatHeader��	���rr;c��dS)zE
        Return the footer string for the specified records.
        r�r:r6s  r<�formatFooterzBufferingFormatter.formatFooter�r9r;c���d}t|��dkrR||�|��z}|D]}||j�|��z}� ||�|��z}|S)zQ
        Format the specified records and return the result as a string.
        r�r)r�r8r3r�r;)r�r7rdr�s    r<r�zBufferingFormatter.format�sz�����w�<�<�!����d�'�'��0�0�0�B�!�
6�
6���$�,�-�-�f�5�5�5����d�'�'��0�0�0�B��	r;r7)r�r�r�r�r�r8r;r�r:r;r<rr�s_��������-�-�-�-�������
�
�
�
�
r;rc� �eZdZdZdd�Zd�ZdS)r
a�
    Filter instances are used to perform arbitrary filtering of LogRecords.

    Loggers and Handlers can optionally use Filter instances to filter
    records as desired. The base filter class only allows events which are
    below a certain point in the logger hierarchy. For example, a filter
    initialized with "A.B" will allow events logged by loggers "A.B",
    "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If
    initialized with the empty string, all events are passed.
    r�c�<�||_t|��|_dS)z�
        Initialize a filter.

        Initialize with the name of the logger which, together with its
        children, will have its events allowed through the filter. If no
        name is specified, allow every event.
        N)r�r��nlen�r�r�s  r<r�zFilter.__init__�s����	���I�I��	�	�	r;c���|jdkrdS|j|jkrdS|j�|jd|j��dkrdS|j|jdkS)z�
        Determine if the specified record is to be logged.

        Returns True if the record should be logged, or False otherwise.
        If deemed appropriate, the record may be modified in-place.
        rTF�.)r?r�r�r)s  r<�filterz
Filter.filtersd���9��>�>��4�
�Y�&�+�
%�
%��4�
�[�
�
�d�i��D�I�
6�
6�!�
;�
;��5���D�I�&�#�-�.r;N)r�)r�r�r�r�r�rCr:r;r<r
r
�sA������	�	�	�	�	�	�
/�
/�
/�
/�
/r;r
c�*�eZdZdZd�Zd�Zd�Zd�ZdS)�Filtererz[
    A base class for loggers and handlers which allows them to share
    common code.
    c��g|_dS)zE
        Initialize the list of filters to be an empty list.
        N)�filtersr�s r<r�zFilterer.__init__s������r;c�P�||jvr|j�|��dSdS)z;
        Add the specified filter to this handler.
        N)rG�append�r�rCs  r<�	addFilterzFilterer.addFilter!s5���$�,�&�&��L����'�'�'�'�'�'�&r;c�P�||jvr|j�|��dSdS)z@
        Remove the specified filter from this handler.
        N)rG�removerJs  r<�removeFilterzFilterer.removeFilter(s5���T�\�!�!��L����'�'�'�'�'�"�!r;c��d}|jD]9}t|d��r|�|��}n||��}|sd}n�:|S)ah
        Determine if a record is loggable by consulting all the filters.

        The default is to allow the record to be logged; any filter can veto
        this and the record is then dropped. Returns a zero value if a record
        is to be dropped, else non-zero.

        .. versionchanged:: 3.2

           Allow filters to be just callables.
        TrCF)rGr�rC)r�r�rd�frAs     r<rCzFilterer.filter/sj������	�	�A��q�(�#�#�
#����&�)�)�����6�����
�����
��	r;N)r�r�r�r�r�rKrNrCr:r;r<rErEsZ�����������(�(�(�(�(�(�����r;rEc���ttt}}}|rP|rP|rP|��	|�|��n#t$rYnwxYw|��dS#|��wxYwdSdSdS)zD
    Remove a handler reference from the internal cleanup list.
    N)rCrD�_handlerListrMrb)�wrrhrj�handlerss    r<�_removeHandlerRefrUMs���".�|�\�h�W�G���7��x����	�	�	�	��O�O�B�������	�	�	��D�	����
�G�I�I�I�I�I��G�G�I�I�I�I���������s&�=�A�
A
�A�	A
�
A�A%c���t��	t�tj|t
����t
��dS#t
��wxYw)zL
    Add a handler to the internal cleanup list using a weak reference.
    N)rCrRrI�weakref�refrUrDrvs r<�_addHandlerRefrY_sN���N�N�N�����G�K��1B�C�C�D�D�D���������������s�2A�A"c��eZdZdZefd�Zd�Zd�Zeee��Z	d�Z
d�Zd�Zd�Z
d	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�ZdS)raq
    Handler instances dispatch logging events to specific destinations.

    The base handler class. Acts as a placeholder which defines the Handler
    interface. Handlers can optionally use Formatter instances to format
    records as desired. By default, no formatter is specified; in this case,
    the 'raw' message as determined by record.message is logged.
    c���t�|��d|_t|��|_d|_d|_t|��|���dS)zz
        Initializes the instance - basically setting the formatter to None
        and the filter list to empty.
        NF)	rEr��_namerer@�	formatter�_closedrY�
createLock�r�r@s  r<r�zHandler.__init__rs`��
	���$������
� ��'�'��
��������t�����������r;c��|jSr7)r\r�s r<�get_namezHandler.get_name�s
���z�r;c���t��	|jtvr
t|j=||_|r
|t|<t��dS#t��wxYwr7)rCr\�	_handlersrDr@s  r<�set_namezHandler.set_name�sZ������	��z�Y�&�&��d�j�)��D�J��
'�"&�	�$���N�N�N�N�N��L�N�N�N�N���s�.A�Ac�T�tj��|_t|��dS)zU
        Acquire a thread lock for serializing access to the underlying I/O.
        N)r��RLock�lockror�s r<r_zHandler.createLock�s'���O�%�%��	�%�d�+�+�+�+�+r;c�8�|j���dSr7)rhrur�s r<ruzHandler._at_fork_reinit�s���	�!�!�#�#�#�#�#r;c�J�|jr|j���dSdS)z.
        Acquire the I/O thread lock.
        N)rhrhr�s r<rhzHandler.acquire��2���9�	 ��I��������	 �	 r;c�J�|jr|j���dSdS)z.
        Release the I/O thread lock.
        N)rhrjr�s r<rjzHandler.release�rkr;c�.�t|��|_dS)zX
        Set the logging level of this handler.  level must be an int or a str.
        N)rer@r`s  r<�setLevelzHandler.setLevel�s��!��'�'��
�
�
r;c�X�|jr|j}nt}|�|��S)z�
        Format the specified record.

        If a formatter is set, use it. Otherwise, use the default formatter
        for the module.
        )r]r4r�)r�r�r�s   r<r�zHandler.format�s.���>�	$��.�C�C�#�C��z�z�&�!�!�!r;c� �td���)z�
        Do whatever it takes to actually log the specified logging record.

        This version is intended to be implemented by subclasses and so
        raises a NotImplementedError.
        z.emit must be implemented by Handler subclasses)�NotImplementedErrorr)s  r<�emitzHandler.emit�s��"�#:�;�;�	;r;c���|�|��}|rX|���	|�|��|���n#|���wxYw|S)a<
        Conditionally emit the specified logging record.

        Emission depends on filters which may have been added to the handler.
        Wrap the actual emission of the record with acquisition/release of
        the I/O thread lock. Returns whether the filter passed the record for
        emission.
        )rCrhrrrj)r�r�rds   r<�handlezHandler.handle�sg���[�[��
 �
 ��
�	��L�L�N�N�N�
��	�	�&�!�!�!��������������������	s�A�A-c��||_dS)z5
        Set the formatter for this handler.
        N)r]r�s  r<�setFormatterzHandler.setFormatter�s������r;c��dS)z�
        Ensure all logging output has been flushed.

        This version does nothing and is intended to be implemented by
        subclasses.
        Nr:r�s r<�flushz
Handler.flush�s	��	
�r;c��t��	d|_|jr|jtvr
t|j=t	��dS#t	��wxYw)a%
        Tidy up any resources used by the handler.

        This version removes the handler from an internal map of handlers,
        _handlers, which is used for handler lookup by name. Subclasses
        should ensure that this gets called from overridden close()
        methods.
        TN)rCr^r\rdrDr�s r<r"z
Handler.close�sT��	����	��D�L��z�
*�d�j�I�5�5��d�j�)��N�N�N�N�N��L�N�N�N�N���s�)A	�	Ac���t�r�tj�r�tj��\}}}	tj�d��tj|||dtj��tj�d��|j}|rytj	�
|jj��tdkrA|j}|r8tj	�
|jj��tdk�A|r!tj|tj���n0tj�d|j�d|j�d���	tj�d	|j�d
|j�d���n9#t($r�t*$r"tj�d��YnwxYwn#t,$rYnwxYw~~~dS#~~~wxYwdSdS)aD
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception is
        encountered during an emit() call. If raiseExceptions is false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors in
        the logging system, they are more interested in application errors.
        You could, however, replace this with a custom handler if you wish.
        The record which was being processed is passed in to this method.
        z--- Logging error ---
NzCall stack:
r��filezLogged from file z, line rz	Message: z
Arguments: zwUnable to print the message and arguments - possible formatting error.
Use the traceback above to help find the error.
)r.rI�stderrrN�writerr rOrUrV�dirnamerXrY�__path__rP�print_stackr\r�r�r��RecursionErrorrM�OSError)r�r��t�vr%r[s      r<�handleErrorzHandler.handleError�s3���!	�s�z�!	��|�~�~�H�A�q�"�
��
� � �!:�;�;�;��)�!�Q��D�#�*�E�E�E��
� � ��1�1�1�����)�������1I�!J�!J���{�"#�"#�!�L�E��)�������1I�!J�!J���{�"#�"#��F��)�%�c�j�A�A�A�A�A��J�$�$�$�%+�_�_�_�f�m�m�m�&E�F�F�F�
&��J�$�$�$�:@�*�*�*�:@�+�+�+�&G�H�H�H�H��&����� �&�&�&��J�$�$�&R�&�&�&�&�&�&������
�
�
�
���
�����q�"�"�"��A�q�"�����C!	�!	�!	�!	sN�D5G�$0F�G�3G�G�
G�G�G$�
G�G$�G�G$�$G)c�P�t|j��}d|jj�d|�d�S)N�<� (�)>)r!r@r�r�r`s  r<r�zHandler.__repr__'s-���T�Z�(�(���"�n�5�5�5�u�u�u�=�=r;N)r�r�r�r�rr�rbre�propertyr�r_rurhrjrnr�rrrtrvrxr"r�r�r:r;r<rris,��������$��������	�	�	��8�H�h�'�'�D�,�,�,�$�$�$� � � � � � �(�(�(�"�"�"�;�;�;����$���
�
�
����$-�-�-�^>�>�>�>�>r;rc�L�eZdZdZdZd	d�Zd�Zd�Zd�Zd�Z	e
e��ZdS)
rz�
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    rNc�d�t�|��|�tj}||_dS)zb
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        N)rr�rIr}�stream�r�r�s  r<r�zStreamHandler.__init__4s/��	��������>��Z�F�����r;c���|���	|jr.t|jd��r|j���|���dS#|���wxYw)z%
        Flushes the stream.
        rxN)rhr�r�rxrjr�s r<rxzStreamHandler.flush?sj��	
������	��{�
$�w�t�{�G�<�<�
$���!�!�#�#�#��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�5A!�!A7c��	|�|��}|j}|�||jz��|���dS#t
$r�t$r|�|��YdSwxYw)a�
        Emit a record.

        If a formatter is specified, it is used to format the record.
        The record is then written to the stream with a trailing newline.  If
        exception information is present, it is formatted using
        traceback.print_exception and appended to the stream.  If the stream
        has an 'encoding' attribute, it is used to determine how to do the
        output to the stream.
        N)r�r�r~�
terminatorrxr�rMr�)r�r�r�r�s    r<rrzStreamHandler.emitJs���		%��+�+�f�%�%�C��[�F��L�L��t��.�/�/�/��J�J�L�L�L�L�L���	�	�	���	%�	%�	%����V�$�$�$�$�$�$�	%���s�A
A�)A>�=A>c���||jurd}ne|j}|���	|���||_|���n#|���wxYw|S)z�
        Sets the StreamHandler's stream to the specified value,
        if it is different.

        Returns the old stream, if the stream was changed, or None
        if it wasn't.
        N)r�rhrxrj)r�r�rAs   r<�	setStreamzStreamHandler.setStream`sk���T�[� � ��F�F��[�F��L�L�N�N�N�
��
�
����$����������������������
s�A�A/c��t|j��}t|jdd��}t	|��}|r|dz
}d|jj�d|�d|�d�S)Nr�r�� r��(r�)r!r@�getattrr�rar�r�)r�r@r�s   r<r�zStreamHandler.__repr__tsa���T�Z�(�(���t�{�F�B�/�/���4�y�y���	��C�K�D�� $�� 7� 7� 7����u�u�u�E�Er;r7)
r�r�r�r�r�r�rxrrr�r��classmethodr�__class_getitem__r:r;r<rr+s����������J�	�	�	�	�	�	�	�%�%�%�,���(F�F�F�$��L�1�1���r;rc�2�eZdZdZd
d�Zd�Zd�Zd�Zd	�ZdS)rzO
    A handler class which writes formatted logging records to disk files.
    �aNFc��tj|��}tj�|��|_||_||_d|vrtj|��|_||_	||_
t|_|r#t�|��d|_dSt �||�����dS)zO
        Open the specified file and use it as the stream for logging.
        �bN)rU�fspathrV�abspath�baseFilename�mode�encodingr�
text_encoding�errors�delay�open�
_builtin_openrr�r�r�_open)r�r\r�r�r�r�s      r<r�zFileHandler.__init__�s���
�9�X�&�&���G�O�O�H�5�5�����	� ��
��d�?�?��,�X�6�6�D�M������
�"����	7�
���T�"�"�"��D�K�K�K��"�"�4������6�6�6�6�6r;c��|���		|jr�	|���|j}d|_t|d��r|���n8#|j}d|_t|d��r|���wwxYwt
�|��n#t
�|��wxYw	|���dS#|���wxYw)z$
        Closes the stream.
        Nr")rhr�rxr�r"rrjr�s  r<r"zFileHandler.close�s���	
������	�
*��;�+�+��
�
����!%���&*���"�6�7�3�3�+�"�L�L�N�N�N���"&���&*���"�6�7�3�3�+�"�L�L�N�N�N�N�+�����#�#�D�)�)�)�)��
�#�#�D�)�)�)�)����)��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s3�B9�A&�3B9�&5B�B9�C/�9C�C/�/Dc�V�|j}||j|j|j|j���S)zx
        Open the current base file with the (original) mode and encoding.
        Return the resulting stream.
        �r�r�)r�r�r�r�r�)r��	open_funcs  r<r�zFileHandler._open�s;��
�&�	��y��*�D�I�"&�-���E�E�E�	Er;c��|j�+|jdks|js|���|_|jrt�||��dSdS)a-
        Emit a record.

        If the stream was not opened because 'delay' was specified in the
        constructor, open it before calling the superclass's emit.

        If stream is not open, current mode is 'w' and `_closed=True`, record
        will not be emitted (see Issue #42378).
        N�w)r�r�r^r�rrrr)s  r<rrzFileHandler.emit�s_���;���y�C���t�|��"�j�j�l�l����;�	-����t�V�,�,�,�,�,�	-�	-r;c�`�t|j��}d|jj�d|j�d|�d�S�Nr�r�r�r�)r!r@r�r�r�r`s  r<r�zFileHandler.__repr__�s8���T�Z�(�(���!%��!8�!8�!8�$�:K�:K�:K�U�U�U�S�Sr;)r�NFN)	r�r�r�r�r�r"r�rrr�r:r;r<rr�sv��������7�7�7�7�6���0E�E�E�-�-�-� T�T�T�T�Tr;rc�2�eZdZdZefd�Zed���ZdS)�_StderrHandlerz�
    This class is like a StreamHandler using sys.stderr, but always uses
    whatever sys.stderr is currently set to rather than the value of
    sys.stderr at handler construction time.
    c�<�t�||��dS)z)
        Initialize the handler.
        N)rr�r`s  r<r�z_StderrHandler.__init__�s ��	����u�%�%�%�%�%r;c��tjSr7)rIr}r�s r<r�z_StderrHandler.stream�s
���z�r;N)r�r�r�r�rr�r�r�r:r;r<r�r��sR��������
$�&�&�&�&�����X���r;r�c��eZdZdZd�Zd�ZdS)�PlaceHolderz�
    PlaceHolder instances are used in the Manager logger hierarchy to take
    the place of nodes for which no loggers have been defined. This class is
    intended for internal use only and not as part of the public API.
    c��|di|_dS)zY
        Initialize with the specified logger being a child of this placeholder.
        N��	loggerMap�r��aloggers  r<r�zPlaceHolder.__init__�s��#�T�+����r;c�0�||jvrd|j|<dSdS)zJ
        Add the specified logger as a child of this placeholder.
        Nr�r�s  r<rIzPlaceHolder.append�s+���$�.�(�(�&*�D�N�7�#�#�#�)�(r;N)r�r�r�r�r�rIr:r;r<r�r��s<��������
,�,�,�+�+�+�+�+r;r�c�x�|tkr,t|t��std|jz���|adS)z�
    Set the class to be used when instantiating a logger. The class should
    define __init__() such that only a name argument is required, and the
    __init__() should call Logger.__init__()
    �(logger not derived from logging.Logger: N)r�
issubclassrcr��_loggerClass)�klasss r<r'r'sI��
�����%��(�(�	.��F�#�n�-�.�.�
.��L�L�Lr;c��tS)zB
    Return the class to be used when instantiating a logger.
    )r�r:r;r<r#r#s
���r;c�r�eZdZdZd�Zed���Zejd���Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
dS)�Managerzt
    There is [under normal circumstances] just one Manager instance, which
    holds the hierarchy of loggers.
    c�Z�||_d|_d|_i|_d|_d|_dS)zT
        Initialize the manager with the root node of the logger hierarchy.
        rFN)�rootr�emittedNoHandlerWarning�
loggerDict�loggerClass�logRecordFactory)r��rootnodes  r<r�zManager.__init__s7����	����',��$������� $����r;c��|jSr7)�_disabler�s r<rzManager.disable's
���}�r;c�.�t|��|_dSr7)rer��r��values  r<rzManager.disable+s��#�E�*�*��
�
�
r;c�0�d}t|t��std���t��	||jvrx|j|}t|t
��rU|}|jpt|��}||_||j|<|�	||��|�
|��n=|jpt|��}||_||j|<|�
|��t��n#t��wxYw|S)a�
        Get a logger with the specified name (channel name), creating it
        if it doesn't yet exist. This name is a dot-separated hierarchical
        name, such as "a", "a.b", "a.b.c" or similar.

        If a PlaceHolder existed for the specified name [i.e. the logger
        didn't exist but a child of it did], replace it with the created
        logger and fix up the parent/child references which pointed to the
        placeholder to now point to the logger.
        NzA logger name must be a string)r_rarcrCr�r�r�r��manager�_fixupChildren�
_fixupParentsrD)r�r�rd�phs    r<r"zManager.getLogger/s�����$��$�$�	>��<�=�=�=�����	��t��&�&��_�T�*���b�+�.�.�+��B�:�$�*�:�l�D�A�A�B�!%�B�J�,.�D�O�D�)��'�'��B�/�/�/��&�&�r�*�*�*��6�d�&�6�,��=�=��!��
�(*����%��"�"�2�&�&�&��N�N�N�N��L�N�N�N�N�����	s�B>D�Dc��|tkr,t|t��std|jz���||_dS)zY
        Set the class to be used when instantiating a logger with this Manager.
        r�N)rr�rcr�r�)r�r�s  r<r'zManager.setLoggerClassQsL���F�?�?��e�V�,�,�
2�� J�"'�.�!1�2�2�2� ����r;c��||_dS)zg
        Set the factory to be used when instantiating a log record with this
        Manager.
        N)r�)r�r�s  r<r,zManager.setLogRecordFactory[s��
!(����r;c��|j}|�d��}d}|dkr�|s�|d|�}||jvrt|��|j|<n:|j|}t	|t
��r|}n|�|��|�dd|dz
��}|dkr|��|s|j}||_dS)z�
        Ensure that there are either loggers or placeholders all the way
        from the specified logger to the root of the logger hierarchy.
        rBNrrH)	r��rfindr�r�r_rrIr��parent)r�r�r��ird�substr�objs       r<r�zManager._fixupParentsbs���
�|���J�J�s�O�O��
���1�u�u�b�u��"�1�"�X�F��T�_�,�,�*5�g�*>�*>����'�'��o�f�-���c�6�*�*�(��B�B��J�J�w�'�'�'��
�
�3��1�q�5�)�)�A��1�u�u�b�u��	���B�����r;c��|j}t|��}|j���D]-}|jjd|�|kr|j|_||_�.dS)zk
        Ensure that children of the placeholder ph are connected to the
        specified logger.
        N)r�r�r�rr�)r�r�r�r��namelen�cs      r<r�zManager._fixupChildrenzsf��
�|���d�)�)����"�"�$�$�	#�	#�A��x�}�X�g�X�&�$�.�.�!"����"����		#�	#r;c��t��|j���D]0}t|t��r|j����1|jj���t��dS)zj
        Clear the cache for all loggers in loggerDict
        Called when level changes are made
        N)	rCr�r�r_r�_cache�clearr�rD�r��loggers  r<�_clear_cachezManager._clear_cache�su��	�����o�,�,�.�.�	&�	&�F��&�&�)�)�
&��
�#�#�%�%�%���	���� � � ������r;N)r�r�r�r�r�r�r�setterr"r'r,r�r�r�r:r;r<r�r�s���������	%�	%�	%�����X��
�^�+�+��^�+� � � �D!�!�!�(�(�(����0#�#�#�����r;r�c��eZdZdZefd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	d
�d�Zd�Z
d
�Zd�Zdd�Z	d d�Z		d!d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZdS)"rar
    Instances of the Logger class represent a single logging channel. A
    "logging channel" indicates an area of an application. Exactly how an
    "area" is defined is up to the application developer. Since an
    application can have any number of areas, logging channels are identified
    by a unique string. Application areas can be nested (e.g. an area
    of "input processing" might include sub-areas "read CSV files", "read
    XLS files" and "read Gnumeric files"). To cater for this natural nesting,
    channel names are organized into a namespace hierarchy where levels are
    separated by periods, much like the Java or Python package namespace. So
    in the instance given above, channel names might be "input" for the upper
    level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
    There is no arbitrary limit to the depth of nesting.
    c��t�|��||_t|��|_d|_d|_g|_d|_i|_	dS)zJ
        Initialize the logger with a name and an optional level.
        NTF)
rEr�r�rer@r��	propagaterT�disabledr�)r�r�r@s   r<r�zLogger.__init__�sU��	���$������	� ��'�'��
���������
���
�����r;c�`�t|��|_|j���dS)zW
        Set the logging level of this logger.  level must be an int or a str.
        N)rer@r�r�r`s  r<rnzLogger.setLevel�s-��!��'�'��
���!�!�#�#�#�#�#r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'DEBUG'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.debug("Houston, we have a %s", "thorny problem", exc_info=True)
        N)�isEnabledForr	�_log�r�r�r�r�s    r<rzLogger.debug��H�����U�#�#�	2��D�I�e�S�$�1�1�&�1�1�1�1�1�	2�	2r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'INFO'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.info("Houston, we have a %s", "interesting problem", exc_info=True)
        N)r�rr�r�s    r<r$zLogger.info�sH�����T�"�"�	1��D�I�d�C��0�0��0�0�0�0�0�	1�	1r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'WARNING'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.warning("Houston, we have a %s", "bit of a problem", exc_info=True)
        N)r�rr�r�s    r<r*zLogger.warning�sH�����W�%�%�	4��D�I�g�s�D�3�3�F�3�3�3�3�3�	4�	4r;c�^�tjdtd��|j|g|�Ri|��dS�Nz6The 'warn' method is deprecated, use 'warning' insteadrL��warningsr)�DeprecationWarningr*r�s    r<r)zLogger.warn��H���
�$�%7��	<�	<�	<����S�*�4�*�*�*�6�*�*�*�*�*r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'ERROR'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.error("Houston, we have a %s", "major problem", exc_info=True)
        N)r�r
r�r�s    r<rzLogger.error�r�r;T�rNc�,�|j|g|�Rd|i|��dS)zU
        Convenience method for logging an ERROR with exception information.
        rNN�r�r�r�rNr�r�s     r<rzLogger.exception�s1��	��
�3�;��;�;�;��;�F�;�;�;�;�;r;c�h�|�t��r|jt||fi|��dSdS)z�
        Log 'msg % args' with severity 'CRITICAL'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.critical("Houston, we have a %s", "major disaster", exc_info=True)
        N)r�rr�r�s    r<rzLogger.critical�sH�����X�&�&�	5��D�I�h��T�4�4�V�4�4�4�4�4�	5�	5r;c�(�|j|g|�Ri|��dS)z@
        Don't use this method, use critical() instead.
        N�rr�s    r<r zLogger.fatals,��	��
�c�+�D�+�+�+�F�+�+�+�+�+r;c��t|t��strtd���dS|�|��r|j|||fi|��dSdS)z�
        Log 'msg % args' with the integer severity 'level'.

        To pass exception information, use the keyword argument exc_info with
        a true value, e.g.

        logger.log(level, "We have a %s", "mysterious problem", exc_info=True)
        zlevel must be an integerN)r_r`r.rcr�r��r�r@r�r�r�s     r<r%z
Logger.logsv���%��%�%�	��
�� :�;�;�;������U�#�#�	2��D�I�e�S�$�1�1�&�1�1�1�1�1�	2�	2r;FrHc��t��}|�dS|dkr&|j}|�n|}t|��s|dz}|dk�&|j}d}|r�t	j��5}|�d��tj||���|�	��}|ddkr
|dd�}ddd��n#1swxYwY|j
|j|j|fS)	z�
        Find the stack frame of the caller so that we can note the source
        file name, line number and function name.
        N)�(unknown file)r�(unknown function)NrrHzStack (most recent call last):
r{rr)
rQrPr]rXrrr~rr�r!rY�f_lineno�co_name)r�r��
stacklevelrP�next_f�cor�r$s        r<�
findCallerzLogger.findCallers<��

�N�N��
�9�B�B��1�n�n��X�F��~��
�A�%�a�(�(�
 ��a��
��1�n�n��X�����	'�����
'�#��	�	�<�=�=�=��%�a�c�2�2�2�2���������9��$�$�!�#�2�#�J�E�
'�
'�
'�
'�
'�
'�
'�
'�
'�
'�
'����
'�
'�
'�
'��~�q�z�2�:�u�<�<s�AB?�?C�CNc��t|||||||||
�	�	}|	�4|	D]1}|dvs	||jvrtd|z���|	||j|<�2|S)zr
        A factory method which can be overridden in subclasses to create
        specialized LogRecords.
        N)r.r/z$Attempt to overwrite %r in LogRecord)r�r�r�)
r�r�r@�fn�lnor�r�rNr��extrar�rd�keys
             r<�
makeRecordzLogger.makeRecord;s���t�U�B��S�$��$�"�$�$�����
.�
.���1�1�1�s�b�k�7I�7I�"�#I�C�#O�P�P�P�#(��:���C� � ��	r;c��d}tr3	|�||��\}	}
}}n#t$r	d\}	}
}Yn
wxYwd\}	}
}|rUt|t��rt|��||jf}n(t|t��stj	��}|�
|j||	|
||||||�
�
}|�|��dS)z�
        Low-level logging routine which creates a LogRecord and then calls
        all the handlers of this logger to handle the record.
        N)rrr)
rZr
rbr_�
BaseException�type�
__traceback__�tuplerIrNrr�rt)
r�r@r�r�rNrr�r
r�rrr�r�s
             r<r�zLogger._logJs�����		F�
J�'+���z�:�'N�'N�$��C��u�u���
J�
J�
J� I�
��C����
J����F�M�B��T��	*��(�M�2�2�
*� ��N�N�H�h�6L�M�����%�0�0�
*��<�>�>�������E�2�s�C��!)�4���?�?�����F�����s�'�:�:c�p�|js,|�|��r|�|��dSdSdS)z�
        Call the handlers for the specified record.

        This method is used for unpickled records received from a socket, as
        well as those created locally. Logger-level filtering is applied.
        N)r�rC�callHandlersr)s  r<rtz
Logger.handledsO���
�	&�4�;�;�v�#6�#6�	&����f�%�%�%�%�%�	&�	&�	&�	&r;c��t��	||jvr|j�|��t��dS#t��wxYw)z;
        Add the specified handler to this logger.
        N)rCrTrIrD�r��hdlrs  r<�
addHandlerzLogger.addHandlernsP��	����	��D�M�)�)��
�$�$�T�*�*�*��N�N�N�N�N��L�N�N�N�N�����#A�Ac��t��	||jvr|j�|��t��dS#t��wxYw)z@
        Remove the specified handler from this logger.
        N)rCrTrMrDrs  r<�
removeHandlerzLogger.removeHandlerysP��	����	��t�}�$�$��
�$�$�T�*�*�*��N�N�N�N�N��L�N�N�N�N���rc�H�|}d}|r|jrd}n|jsn	|j}|�|S)a�
        See if this logger has any handlers configured.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. Return True if a handler was found, else False.
        Stop searching up the hierarchy whenever a logger with the "propagate"
        attribute set to zero is found - that will be the last logger which
        is checked for the existence of handlers.
        FT)rTr�r�)r�r�rds   r<�hasHandlerszLogger.hasHandlers�sM��
��
���	��z�
�����;�
���H���	��	r;c��|}d}|rG|jD],}|dz}|j|jkr|�|���-|jsd}n|j}|�G|dkr�tr3|jtjkrt�|��dSdStrC|jj	s9tj�d|j
z��d|j_	dSdSdSdS)a�
        Pass a record to all relevant handlers.

        Loop through all handlers for this logger and its parents in the
        logger hierarchy. If no handler was found, output a one-off error
        message to sys.stderr. Stop searching up the hierarchy whenever a
        logger with the "propagate" attribute set to zero is found - that
        will be the last logger whose handlers are called.
        rrHNz+No handlers could be found for logger "%s"
T)rTr�r@rtr�r�r-r.r�r�rIr}r~r�)r�r�r��foundrs     r<rzLogger.callHandlers�s!��
�����	��
�
(�
(����	���>�T�Z�/�/��K�K��'�'�'���;�
�����H���	�
�Q�J�J��
<��>�Z�%5�5�5��%�%�f�-�-�-�-�-�6�5� �
<���)M�
<��
� � �"-�/3�y�"9�:�:�:�7;���4�4�4�
�J�
<�
<�
<�
<r;c�F�|}|r|jr|jS|j}|�tS)z�
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger hierarchy,
        looking for a non-zero logging level. Return the first one found.
        )r@r�rr�s  r<�getEffectiveLevelzLogger.getEffectiveLevel�s;�����	#��|�
$��|�#��]�F��	#��
r;c�4�|jrdS	|j|S#t$rut��	|jj|kr
dx}|j|<n"||���kx}|j|<t��n#t��wxYw|cYSwxYw)�;
        Is this logger enabled for level 'level'?
        F)r�r�r�rCr�rr'rD)r�r@�
is_enableds   r<r�zLogger.isEnabledFor�s����=�	��5�
	��;�u�%�%���	�	�	��N�N�N�
��<�'�5�0�0�6;�;�J���U�!3�!3���!7�!7�!9�!9�9��J���U�!3�������������������	���s&��B�?A?�0B�?B�B�Bc��|j|urd�|j|f��}|j�|��S)ab
        Get a logger which is a descendant to this one.

        This is a convenience method, such that

        logging.getLogger('abc').getChild('def.ghi')

        is the same as

        logging.getLogger('abc.def.ghi')

        It's useful, for example, when the parent logger is named using
        __name__ rather than a literal string.
        rB)r�rr�r�r")r��suffixs  r<�getChildzLogger.getChild�s?���9�D� � ��X�X�t�y�&�1�2�2�F��|�%�%�f�-�-�-r;c�z�t|�����}d|jj�d|j�d|�d�Sr�)r!r'r�r�r�r`s  r<r�zLogger.__repr__�s?���T�3�3�5�5�6�6���!%��!8�!8�!8�$�)�)�)�U�U�U�K�Kr;c�~�t|j��|urddl}|�d���t|jffS)Nrzlogger cannot be pickled)r"r��pickle�
PicklingError)r�r0s  r<�
__reduce__zLogger.__reduce__�sD���T�Y���t�+�+��M�M�M��&�&�'A�B�B�B��4�9�,�&�&r;)FrH)NNN)NNFrH)r�r�r�r�rr�rnrr$r*r)rrrr r%r
rr�rtrr!r#rr'r�r-r�r2r:r;r<rr�s�������
�
�$*�����$�$�$�
2�
2�
2�
1�
1�
1�
4�
4�
4�+�+�+�

2�
2�
2�.2�<�<�<�<�<�
5�
5�
5�,�,�,�2�2�2�" =� =� =� =�F15�
�
�
�
�LQ������4&�&�&�	�	�	�	�	�	����,<�<�<�<������,.�.�.�&L�L�L�'�'�'�'�'r;rc��eZdZdZd�Zd�ZdS)�
RootLoggerz�
    A root logger is not that different to any other logger, except that
    it must have a logging level and there is only one instance of it in
    the hierarchy.
    c�>�t�|d|��dS)z=
        Initialize the logger with the name "root".
        r�N)rr�r`s  r<r�zRootLogger.__init__s ��	����f�e�,�,�,�,�,r;c��tdfSr�)r"r�s r<r2zRootLogger.__reduce__s���"�}�r;N)r�r�r�r�r�r2r:r;r<r4r4�s<��������
-�-�-�����r;r4c���eZdZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
d�d�Zd
�Zd�Z
d�Zd�Zd�Zd�Zd�Zed���Zejd���Zed���Zd�Zee��ZdS)rzo
    An adapter for loggers which makes it easier to specify contextual
    information in logging output.
    Nc�"�||_||_dS)ax
        Initialize the adapter with a logger and a dict-like object which
        provides contextual information. This constructor signature allows
        easy stacking of LoggerAdapters, if so desired.

        You can effectively pass keyword arguments as shown in the
        following example:

        adapter = LoggerAdapter(someLogger, dict(p1=v1, p2="v2"))
        N)r�r)r�r�rs   r<r�zLoggerAdapter.__init__s�������
�
�
r;c��|j|d<||fS)a�
        Process the logging message and keyword arguments passed in to
        a logging call to insert contextual information. You can either
        manipulate the message itself, the keyword args or both. Return
        the message and kwargs modified (or not) to suit your needs.

        Normally, you'll only need to override this one method in a
        LoggerAdapter subclass for your specific needs.
        r)r)r�r�r�s   r<r�zLoggerAdapter.processs���*��w���F�{�r;c�4�|jt|g|�Ri|��dS)zA
        Delegate a debug call to the underlying logger.
        N)r%r	r�s    r<rzLoggerAdapter.debug/�.��	�����-�d�-�-�-�f�-�-�-�-�-r;c�4�|jt|g|�Ri|��dS)zA
        Delegate an info call to the underlying logger.
        N)r%rr�s    r<r$zLoggerAdapter.info5s.��	����s�,�T�,�,�,�V�,�,�,�,�,r;c�4�|jt|g|�Ri|��dS)zC
        Delegate a warning call to the underlying logger.
        N)r%rr�s    r<r*zLoggerAdapter.warning;s.��	����#�/��/�/�/��/�/�/�/�/r;c�^�tjdtd��|j|g|�Ri|��dSr�r�r�s    r<r)zLoggerAdapter.warnAr�r;c�4�|jt|g|�Ri|��dS)zB
        Delegate an error call to the underlying logger.
        N�r%r
r�s    r<rzLoggerAdapter.errorFr;r;Tr�c�8�|jt|g|�Rd|i|��dS)zF
        Delegate an exception call to the underlying logger.
        rNNr@r�s     r<rzLoggerAdapter.exceptionLs3��	�����@�d�@�@�@�X�@��@�@�@�@�@r;c�4�|jt|g|�Ri|��dS)zD
        Delegate a critical call to the underlying logger.
        N)r%rr�s    r<rzLoggerAdapter.criticalRs.��	����3�0��0�0�0��0�0�0�0�0r;c��|�|��r2|�||��\}}|jj||g|�Ri|��dSdS)z�
        Delegate a log call to the underlying logger, after adding
        contextual information from this adapter instance.
        N)r�r�r�r%rs     r<r%zLoggerAdapter.logXsg��
���U�#�#�	9��,�,�s�F�3�3�K�C���D�K�O�E�3�8��8�8�8��8�8�8�8�8�	9�	9r;c�6�|j�|��S)r))r�r�r`s  r<r�zLoggerAdapter.isEnabledForas���{�'�'��.�.�.r;c�:�|j�|��dS)zC
        Set the specified level on the underlying logger.
        N)r�rnr`s  r<rnzLoggerAdapter.setLevelgs ��	
����U�#�#�#�#�#r;c�4�|j���S)zD
        Get the effective level for the underlying logger.
        )r�r'r�s r<r'zLoggerAdapter.getEffectiveLevelms���{�,�,�.�.�.r;c�4�|j���S)z@
        See if the underlying logger has any handlers.
        )r�r#r�s r<r#zLoggerAdapter.hasHandlersss���{�&�&�(�(�(r;c�,�|jj|||fi|��S)zX
        Low-level log implementation, proxied to allow nested logger adapters.
        )r�r�rs     r<r�zLoggerAdapter._logys%�� �t�{���s�D�;�;�F�;�;�;r;c��|jjSr7�r�r�r�s r<r�zLoggerAdapter.managers
���{�"�"r;c��||j_dSr7rJr�s  r<r�zLoggerAdapter.manager�s��#�����r;c��|jjSr7)r�r�r�s r<r�zLoggerAdapter.name�s
���{��r;c��|j}t|�����}d|jj�d|j�d|�d�Sr�)r�r!r'r�r�r�)r�r�r@s   r<r�zLoggerAdapter.__repr__�sF������V�5�5�7�7�8�8���!%��!8�!8�!8�&�+�+�+�u�u�u�M�Mr;r7)r�r�r�r�r�r�rr$r*r)rrrr%r�rnr'r#r�r�r�r�r�r�r�rr�r:r;r<rrs���������
������� .�.�.�-�-�-�0�0�0�+�+�+�
.�.�.�.2�A�A�A�A�A�1�1�1�9�9�9�/�/�/�$�$�$�/�/�/�)�)�)�<�<�<��#�#��X�#�
�^�$�$��^�$�� � ��X� �N�N�N�
$��L�1�1���r;rc���t��	|�dd��}|�dd��}|�dd��}|rEtjdd�D]0}t�|��|����1t
tj��dk�r|�dd��}|�d	|vrd
|vrtd���nd	|vsd
|vrtd���|��|�d
d��}|�d
d��}|r/d|vrd}ntj	|��}t||||���}n%|�d	d��}t|��}|g}|�dd��}	|�dd��}
|
tvr<tdd�
t�����z���|�dt|
d��}t||	|
��}|D]8}|j�|�|��t�|���9|�dd��}
|
�t�|
��|r9d�
|�����}td|z���t)��dS#t)��wxYw)a8

    Do basic configuration for the logging system.

    This function does nothing if the root logger already has handlers
    configured, unless the keyword argument *force* is set to ``True``.
    It is a convenience method intended for use by simple scripts
    to do one-shot configuration of the logging package.

    The default behaviour is to create a StreamHandler which writes to
    sys.stderr, set a formatter using the BASIC_FORMAT format string, and
    add the handler to the root logger.

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    filename  Specifies that a FileHandler be created, using the specified
              filename, rather than a StreamHandler.
    filemode  Specifies the mode to open the file, if filename is specified
              (if filemode is unspecified, it defaults to 'a').
    format    Use the specified format string for the handler.
    datefmt   Use the specified date/time format.
    style     If a format string is specified, use this to specify the
              type of format string (possible values '%', '{', '$', for
              %-formatting, :meth:`str.format` and :class:`string.Template`
              - defaults to '%').
    level     Set the root logger level to the specified level.
    stream    Use the specified stream to initialize the StreamHandler. Note
              that this argument is incompatible with 'filename' - if both
              are present, 'stream' is ignored.
    handlers  If specified, this should be an iterable of already created
              handlers, which will be added to the root logger. Any handler
              in the list which does not have a formatter assigned will be
              assigned the formatter created in this function.
    force     If this keyword  is specified as true, any existing handlers
              attached to the root logger are removed and closed, before
              carrying out the configuration as specified by the other
              arguments.
    encoding  If specified together with a filename, this encoding is passed to
              the created FileHandler, causing it to be used when the file is
              opened.
    errors    If specified together with a filename, this value is passed to the
              created FileHandler, causing it to be used when the file is
              opened in text mode. If not specified, the default value is
              `backslashreplace`.

    Note that you could specify a stream created using open(filename, mode)
    rather than passing the filename and mode in. However, it should be
    remembered that StreamHandler does not close its stream (since it may be
    using sys.stdout or sys.stderr), whereas FileHandler closes its stream
    when the handler is closed.

    .. versionchanged:: 3.2
       Added the ``style`` parameter.

    .. versionchanged:: 3.3
       Added the ``handlers`` parameter. A ``ValueError`` is now thrown for
       incompatible arguments (e.g. ``handlers`` specified together with
       ``filename``/``filemode``, or ``filename``/``filemode`` specified
       together with ``stream``, or ``handlers`` specified together with
       ``stream``.

    .. versionchanged:: 3.8
       Added the ``force`` parameter.

    .. versionchanged:: 3.9
       Added the ``encoding`` and ``errors`` parameters.
    �forceFr�Nr��backslashreplacerrTr�r\z8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'�filemoder�r�r�rrrrrr�rHr@r�zUnrecognised argument(s): %s)rC�popr�rTr!r"r�rbrr�rrr
rrrr]rvrrnrD)r�rOr�r��hrTr\r�r��dfsr�fsr�r@rs               r<rr�s��L�N�N�N�2��
�
�7�E�*�*���:�:�j�$�/�/�����H�&8�9�9���	��]�1�1�1�%�
�
���"�"�1�%�%�%����	�	�	�	��t�}����"�"��z�z�*�d�3�3�H����v�%�%�*��*>�*>�$�&:�;�;�;���v�%�%��v�)=�)=�$�&J�K�K�K���!�:�:�j�$�7�7���z�z�*�c�2�2���	.��d�{�{�!%���#%�#3�H�#=�#=��#�H�d�-5�f�F�F�F�A�A�$�Z�Z��$�7�7�F�%�f�-�-�A��3���*�*�Y��-�-�C��J�J�w��,�,�E��G�#�#� �!;�c�h�h�!(�����?1�?1�"1�2�2�2����H�g�e�n�Q�&7�8�8�B��B��U�+�+�C��
#�
#���;�&��N�N�3�'�'�'�����"�"�"�"��J�J�w��-�-�E�� ��
�
�e�$�$�$��
H��y�y������/�/�� �!?�$�!F�G�G�G���������������s�KK&�&K6c��|r%t|t��r|tjkrtStj�|��S)z�
    Return a logger with the specified name, creating it if necessary.

    If no name is specified, return the root logger.
    )r_rar�r�rr�r")r�s r<r"r"sD����:�d�C�(�(��T�T�Y�->�->����>�#�#�D�)�)�)r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'CRITICAL' on the root logger. If the logger
    has no handlers, call basicConfig() to add a console handler with a
    pre-defined format.
    rN)r�r�rTrr�r�r�r�s   r<rr$sH���4�=���Q����
�
�
��M�#�'��'�'�'��'�'�'�'�'r;c�&�t|g|�Ri|��dS)z:
    Don't use this function, use critical() instead.
    NrrXs   r<r r .s(��
�S�"�4�"�"�"�6�"�"�"�"�"r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'ERROR' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrrrXs   r<rr4�H���4�=���Q����
�
�
��J�s�$�T�$�$�$�V�$�$�$�$�$r;r�c�*�t|g|�Rd|i|��dS)z�
    Log a message with severity 'ERROR' on the root logger, with exception
    information. If the logger has no handlers, basicConfig() is called to add
    a console handler with a pre-defined format.
    rNNr�)r�rNr�r�s    r<rr>s-��
�#�2��2�2�2�x�2�6�2�2�2�2�2r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'WARNING' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrr*rXs   r<r*r*FsH���4�=���Q����
�
�
��L��&�t�&�&�&�v�&�&�&�&�&r;c�\�tjdtd��t|g|�Ri|��dS)Nz8The 'warn' function is deprecated, use 'warning' insteadrLr�rXs   r<r)r)PsD���M� �!3�Q�8�8�8��C�!�$�!�!�!�&�!�!�!�!�!r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'INFO' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrr$rXs   r<r$r$UsH���4�=���Q����
�
�
��I�c�#�D�#�#�#�F�#�#�#�#�#r;c��ttj��dkrt��tj|g|�Ri|��dS)z�
    Log a message with severity 'DEBUG' on the root logger. If the logger has
    no handlers, call basicConfig() to add a console handler with a pre-defined
    format.
    rN)r�r�rTrrrXs   r<rr_r[r;c��ttj��dkrt��tj||g|�Ri|��dS)z�
    Log 'msg % args' with the integer severity 'level' on the root logger. If
    the logger has no handlers, call basicConfig() to add a console handler
    with a pre-defined format.
    rN)r�r�rTrr%)r@r�r�r�s    r<r%r%isJ���4�=���Q����
�
�
��H�U�C�)�$�)�)�)�&�)�)�)�)�)r;c�d�|tj_tj���dS)zB
    Disable all logging calls of severity 'level' and below.
    N)r�r�rr�)r@s r<rrss(��!�D�L���L�������r;c�x�t|dd���D]�}	|��}|r�	|���|���|���n#tt
f$rYnwxYw|���n#|���wxYw��#tr�Y��xYwdS)z�
    Perform any cleanup actions in the logging system (e.g. flushing
    buffers).

    Should be called at application exit.
    N)�reversedrhrxr"r�rbrjr.)�handlerListrSrSs   r<r(r(zs����{�1�1�1�~�&�&����	�����A��
 � ��I�I�K�K�K��G�G�I�I�I��G�G�I�I�I�I����,����
�D������I�I�K�K�K�K��A�I�I�K�K�K�K������	��
��
�
����'�s@�B+�<A%�$B�%A9�6B�8A9�9B�<B+�B'�'B+�+
B7c�*�eZdZdZd�Zd�Zd�Zd�ZdS)ra�
    This handler does nothing. It's intended to be used to avoid the
    "No handlers could be found for logger XXX" one-off warning. This is
    important for library code, which may contain code to log events. If a user
    of the library does not configure logging, the one-off warning might be
    produced; to avoid this, the library developer simply needs to instantiate
    a NullHandler and add it to the top-level logger of the library module or
    package.
    c��dS�zStub.Nr:r)s  r<rtzNullHandler.handle�����r;c��dSrhr:r)s  r<rrzNullHandler.emit�rir;c��d|_dSr7)rhr�s r<r_zNullHandler.createLock�s
����	�	�	r;c��dSr7r:r�s r<ruzNullHandler._at_fork_reinit�rpr;N)r�r�r�r�rtrrr_rur:r;r<rr�sZ�����������������
�
�
�
�
r;rc�*�|�t�t||||||��dSdStj|||||��}td��}|js!|�t
����|�t|����dS)a�
    Implementation of showwarnings which redirects to logging, which will first
    check to see if the file parameter is None. If a file is specified, it will
    delegate to the original warnings implementation of showwarning. Otherwise,
    it will call warnings.formatwarning and will log the resulting string to a
    warnings logger named "py.warnings" with level logging.WARNING.
    Nzpy.warnings)	�_warnings_showwarningr��
formatwarningr"rTrrr*ra)r.�categoryr\r�r|�linerr�s        r<�_showwarningrr�s����� �,�!�'�8�X�v�t�T�R�R�R�R�R�-�,�
�"�7�H�h���M�M���=�)�)����	-����k�m�m�,�,�,�	���s�1�v�v�����r;c��|r(t�tjatt_dSdSt�tt_dadSdS)z�
    If capture is true, redirect all warnings to the logging package.
    If capture is False, ensure that warnings are not redirected to logging
    but to their original destinations.
    N)rnr��showwarningrr)�captures r<rr�sU���)� �(�$,�$8�!�#/�H� � � �)�(�!�,�#8�H� �$(�!�!�!�-�,r;r7r�)sr�rIrUr�rr�rr�rW�collections.abcr��typesr�stringrr�StrFormatter�__all__r��
__author__�
__status__�__version__�__date__r�r.r�r�r�rrr
rrrr	rr>r8r/r!rr�rQrVrW�__code__rYrZr]rergrgrCrDro�WeakSetrrrxrk�objectrr�r,r+r&r�r�r�r�rr
r4rr
rE�WeakValueDictionaryrdrRrUrYrrrr��_defaultLastResortr-r�r'r#r�rr4r�rr�r�rr"rr rrr*r)r$rr%rr(�atexit�registerrrnrrrr:r;r<�<module>r�s���"��L�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�K�������������,�,�,�,�,�,�D�D�D������6�
��
��� ���T�Y�[�[�
���
�
�
��
������
��
����	��
��	
��
�j�	�7��Y��&�	�7�
�H�
���
�
����
��	�	��������6����7�3����5�+�+�L�L�5�5�5�&�7���L�1�=�>�>�����
�
�
�0	�	������������w�r�%�&�&�6�
�
�
�
�$3�7�?�#4�#4� ���� � � ��B��|�'H�(4�6�6�6�6�b�b�b�b�b��b�b�b�N�� � � ����	�	�	�������M�M�M�M�M�6�M�M�M�B:�:�:�:�:�\�:�:�:�D .� .� .� .� .�,� .� .� .�F4����	%�
�8�	9�
�@�	A����m�m�m�m�m��m�m�m�d�I�K�K��$�$�$�$�$��$�$�$�T#/�#/�#/�#/�#/�V�#/�#/�#/�J.�.�.�.�.�v�.�.�.�h
(�G�'�)�)�	������$���@>�@>�@>�@>�@>�h�@>�@>�@>�DR2�R2�R2�R2�R2�G�R2�R2�R2�jRT�RT�RT�RT�RT�-�RT�RT�RT�j�����]����"$�^�G�,�,��
�
�+�+�+�+�+�&�+�+�+�.������{�{�{�{�{�f�{�{�{�B_'�_'�_'�_'�_'�X�_'�_'�_'�D
�
�
�
�
��
�
�
���E2�E2�E2�E2�E2�F�E2�E2�E2�N�z�'�����������%�%���y�y�y�@*�*�*�*�(�(�(�#�#�#�%�%�%�$(�3�3�3�3�3�'�'�'�"�"�"�
$�$�$�%�%�%�*�*�*�� � � � �&�����>�
�
�
��������
�
�
�
�
�'�
�
�
�0������()�)�)�)�)r;PK�]���EE$__pycache__/handlers.cpython-311.pycnu�[����

���Yb�_���t�dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZddl
Z
ddlZddlZdZdZdZdZdZdZd	ZGd
�dej��ZGd�d
e��ZGd�de��ZGd�dej��ZGd�dej��ZGd�de��ZGd�dej��ZGd�dej��Z Gd�dej��Z!Gd�dej��Z"Gd�dej��Z#Gd �d!e#��Z$Gd"�d#ej��Z%Gd$�d%e&��Z'dS)&z�
Additional handlers for the logging package for Python. The core package is
based on PEP 282 and comments thereto in comp.lang.python.

Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved.

To use, simply 'import logging.handlers' and log away!
�N)�ST_DEV�ST_INO�ST_MTIMEi<#i=#i>#i?#i�Qc�4�eZdZdZdZdZdd�Zd�Zd�Zd�Z	dS)	�BaseRotatingHandlerz�
    Base class for handlers that rotate log files at a certain point.
    Not meant to be instantiated directly.  Instead, use RotatingFileHandler
    or TimedRotatingFileHandler.
    NFc�z�tj�||||||���||_||_||_dS)zA
        Use the specified filename for streamed logging
        ��mode�encoding�delay�errorsN)�logging�FileHandler�__init__rrr��self�filenamerrr
rs      �;/opt/alt/python-internal/lib/python3.11/logging/handlers.pyrzBaseRotatingHandler.__init__6sM��	��$�$�T�8�$�.6�e�,2�	%�	4�	4�	4���	� ��
������c���	|�|��r|���tj�||��dS#t
$r|�|��YdSwxYw)z�
        Emit a record.

        Output the record to the file, catering for rollover as described
        in doRollover().
        N)�shouldRollover�
doRolloverrr�emit�	Exception�handleError�r�records  rrzBaseRotatingHandler.emitAs���	%��"�"�6�*�*�
"����!�!�!���$�$�T�6�2�2�2�2�2���	%�	%�	%����V�$�$�$�$�$�$�	%���s�A	A
�
A0�/A0c�^�t|j��s|}n|�|��}|S)a�
        Modify the filename of a log file when rotating.

        This is provided so that a custom filename can be provided.

        The default implementation calls the 'namer' attribute of the
        handler, if it's callable, passing the default name to
        it. If the attribute isn't callable (the default is None), the name
        is returned unchanged.

        :param default_name: The default name for the log file.
        )�callable�namer)r�default_name�results   r�rotation_filenamez%BaseRotatingHandler.rotation_filenameOs3����
�#�#�	.�!�F�F��Z�Z��-�-�F��
rc���t|j��s8tj�|��rtj||��dSdS|�||��dS)aL
        When rotating, rotate the current log.

        The default implementation calls the 'rotator' attribute of the
        handler, if it's callable, passing the source and dest arguments to
        it. If the attribute isn't callable (the default is None), the source
        is simply renamed to the destination.

        :param source: The source filename. This is normally the base
                       filename, e.g. 'test.log'
        :param dest:   The destination filename. This is normally
                       what the source is rotated to, e.g. 'test.log.1'.
        N)r �rotator�os�path�exists�rename)r�source�dests   r�rotatezBaseRotatingHandler.rotatebsj�����%�%�	'��w�~�~�f�%�%�
(��	�&�$�'�'�'�'�'�
(�
(�
�L�L���&�&�&�&�&r)NFN)
�__name__�
__module__�__qualname__�__doc__r!r&rrr$r-�rrrr-sk��������

�E��G�	�	�	�	�%�%�%����&'�'�'�'�'rrc�*�eZdZdZ		d	d�Zd�Zd�ZdS)
�RotatingFileHandlerz�
    Handler for logging to a set of files, which switches from one file
    to the next when the current file reaches a certain size.
    �arNFc��|dkrd}d|vrtj|��}t�||||||���||_||_dS)a�
        Open the specified file and use it as the stream for logging.

        By default, the file grows indefinitely. You can specify particular
        values of maxBytes and backupCount to allow the file to rollover at
        a predetermined size.

        Rollover occurs whenever the current log file is nearly maxBytes in
        length. If backupCount is >= 1, the system will successively create
        new files with the same pathname as the base file, but with extensions
        ".1", ".2" etc. appended to it. For example, with a backupCount of 5
        and a base file name of "app.log", you would get "app.log",
        "app.log.1", "app.log.2", ... through to "app.log.5". The file being
        written to is always "app.log" - when it gets filled up, it is closed
        and renamed to "app.log.1", and if files "app.log.1", "app.log.2" etc.
        exist, then they are renamed to "app.log.2", "app.log.3" etc.
        respectively.

        If maxBytes is zero, rollover never occurs.
        rr5�b�rr
rN)�io�
text_encodingrr�maxBytes�backupCount)rrrr;r<rr
rs        rrzRotatingFileHandler.__init__|sm��6�a�<�<��D��d�?�?��'��1�1�H��$�$�T�8�T�H�+0��	%�	A�	A�	A� ��
�&����rc��|jr |j���d|_|jdk�r/t|jdz
dd��D]�}|�d|j|fz��}|�d|j|dzfz��}tj�|��rHtj�|��rt
j	|��t
j
||����|�|jdz��}tj�|��rt
j	|��|�|j|��|js|�
��|_dSdS)z<
        Do a rollover, as described in __init__().
        Nr����z%s.%dz.1)�stream�closer<�ranger$�baseFilenamer'r(r)�remover*r-r
�_open)r�i�sfn�dfns    rrzRotatingFileHandler.doRollover�sq���;�	��K�������D�K���a����4�+�a�/��B�7�7�
(�
(���,�,�W��8I�1�7M�-M�N�N���,�,�W��8I�89�A��8?�.?�@�@���7�>�>�#�&�&�(��w�~�~�c�*�*�'��	�#�����I�c�3�'�'�'���(�(��):�T�)A�B�B�C��w�~�~�c�"�"�
��	�#�����K�K��)�3�/�/�/��z�	'��*�*�,�,�D�K�K�K�	'�	'rc��tj�|j��r&tj�|j��sdS|j�|���|_|jdkrgd|�|��z}|j�	dd��|j�
��t|��z|jkrdSdS)z�
        Determine if rollover should occur.

        Basically, see if the supplied record would cause the file to exceed
        the size limit we have.
        FNrz%s
�T)r'r(r)rC�isfiler@rEr;�format�seek�tell�len�rr�msgs   rrz"RotatingFileHandler.shouldRollover�s����7�>�>�$�+�,�,�	�R�W�^�^�D�DU�5V�5V�	��5��;���*�*�,�,�D�K��=�1����4�;�;�v�.�.�.�C��K���Q��"�"�"��{���!�!�C��H�H�,��
�=�=��t��ur)r5rrNFN)r.r/r0r1rrrr2rrr4r4ws[��������DE�48�"'�"'�"'�"'�H'�'�'�.����rr4c�8�eZdZdZ			dd�Zd�Zd	�Zd
�Zd�ZdS)
�TimedRotatingFileHandlerz�
    Handler for logging to a file, rotating the log file at certain timed
    intervals.

    If backupCount is > 0, when rollover is done, no more than backupCount
    files are kept - the oldest ones are deleted.
    �hr>rNFc
��tj|��}t�||d|||	���|���|_||_||_||_|jdkrd|_	d|_
d}
�n)|jdkrd|_	d	|_
d
}
�n|jdkrd|_	d
|_
d}
n�|jdks|jdkrd|_	d|_
d}
n�|j�d��r�d|_	t|j��dkrtd|jz���|jddks|jddkrtd|jz���t|jd��|_d|_
d}
ntd|jz���t!j|
t j��|_|j	|z|_	|j}t*j�|��r t+j|��t2}n tt5j����}|�|��|_dS)Nr5r8�Sr>z%Y-%m-%d_%H-%M-%Sz0(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(?!\d)�M�<z%Y-%m-%d_%H-%Mz*(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(?!\d)�H�z%Y-%m-%d_%Hz$(?<!\d)\d{4}-\d{2}-\d{2}_\d{2}(?!\d)�D�MIDNIGHTrz%Y-%m-%dz(?<!\d)\d{4}-\d{2}-\d{2}(?!\d)�Wi�:	rJzHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s�0�6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %s)r9r:rr�upper�whenr<�utc�atTime�interval�suffix�
startswithrO�
ValueError�int�	dayOfWeek�re�compile�ASCII�extMatchrCr'r(r)�statr�time�computeRollover�
rolloverAt)rrrardr<rr
rbrcrrm�ts            rrz!TimedRotatingFileHandler.__init__�s@���#�H�-�-���$�$�T�8�S�8�+0��	%�	A�	A�	A��J�J�L�L��	�&����������9�����D�M�-�D�K�J�H�H�
�Y�#�
�
��D�M�*�D�K�D�H�H�
�Y�#�
�
�#�D�M�'�D�K�>�H�H�
�Y�#�
�
���j�!8�!8�(�D�M�$�D�K�8�H�H�
�Y�
!�
!�#�
&�
&�
	T�,�D�M��4�9�~�~��"�"� �!k�nr�nw�!w�x�x�x��y��|�c�!�!�T�Y�q�\�C�%7�%7� �!P�SW�S\�!\�]�]�]� ���1��.�.�D�N�$�D�K�8�H�H��F���R�S�S�S��
�8�R�X�6�6��
��
��0��
��$��
�7�>�>�(�#�#�	!����!�!�(�+�A�A��D�I�K�K� � �A��.�.�q�1�1����rc��||jz}|jdks|j�d���r�|jrt	j|��}nt	j|��}|d}|d}|d}|d}|j�t}n,|jj	dz|jj
zdz|jjz}||dz|zdz|zz
}	|	d	kr|	tz
}	|d
zdz}||	z}|j�d��rV|}
|
|jkr3|
|jkr|j|
z
}nd|
z
|jzd
z}||tzz
}||jtdzz
z
}n||jtz
z
}|jsS|d}t	j|��d}
||
kr+|s"d
}t	j|dz
��dsd	}nd}||z
}|S)zI
        Work out the rollover time based on the specified time.
        r\r]����NrXrr>�r?���rZ)
rdrarfrbro�gmtime�	localtimerc�	_MIDNIGHT�hour�minute�secondri)r�currentTimer#rr�currentHour�
currentMinute�
currentSecond�
currentDay�	rotate_ts�r�day�
daysToWait�dstNow�
dstAtRollover�addends               rrpz(TimedRotatingFileHandler.computeRollovers���t�}�,���9�
�"�"�d�i�&:�&:�3�&?�&?�"��x�
0��K��,�,����N�;�/�/���A�$�K��a�D�M��a�D�M��1��J��{�"�%�	�	�"�k�.��3�d�k�6H�H�"�L��K�&�'�	��k�B�.��>�"�D����A��A�v�v��Y���(�1�n��1�
� �1�_�F� �y�#�#�C�(�(�

4� ���$�.�(�(��T�^�+�+�%)�^�c�%9�
�
�%&��W�t�~�%=��%A�
��j�9�4�4�F��$�-�)�a�-�7�7����$�-�)�3�3���8�

%��2��� $��v� 6� 6�r� :�
��]�*�*�!�&�!&��#�~�f�T�k�:�:�2�>�'�%&�F��!%���f�$�F��
rc�(�ttj����}||jkrftj�|j��r@tj�|j��s|�|��|_dSdSdS)z�
        Determine if rollover should occur.

        record is not used, as we are just comparing times, but it is needed so
        the method signatures are the same
        FT)	rhrorqr'r(r)rCrKrp)rrrrs   rrz'TimedRotatingFileHandler.shouldRolloverbs{��
��	������������w�~�~�d�/�0�0�
������HY�9Z�9Z�
�#'�"6�"6�q�"9�"9����u��4��urc���tj�|j��\}}tj|��}g}|j�|dz}t
|��}|D]g}|d|�|krW||d�}|j�|��r3|�	tj�
||�����hn�|D]�}|j�|��}	|	r�|�|jdz|	dz��}
tj�|
��|kr4|�	tj�
||����n2|j�||	�
��dz��}	|	����t
|��|jkrg}n3|���|dt
|��|jz
�}|S)z�
        Determine the files to delete when rolling over.

        More specific than the earlier method, which just used glob.glob().
        N�.rr>)r'r(�splitrC�listdirr!rOrm�	fullmatch�append�join�search�basename�startr<�sort)r�dirName�baseName�	fileNamesr#�prefix�plen�fileNamere�mrHs           r�getFilesToDeletez)TimedRotatingFileHandler.getFilesToDeleteus����G�M�M�$�*;�<�<�����J�w�'�'�	����:����^�F��v�;�;�D�%�
G�
G���E�T�E�?�f�,�,�%�d�e�e�_�F��}�.�.�v�6�6�G��
�
�b�g�l�l�7�H�&E�&E�F�F�F��	
G�&�
F�
F��
�M�(�(��2�2���F��*�*�T�%6��%<�q��t�%C�D�D�C��w�'�'��,�,��8�8��
�
�b�g�l�l�7�H�&E�&E�F�F�F���
�,�,�X�q�w�w�y�y�1�}�E�E�A��F���v�;�;��)�)�)��F�F��K�K�M�M�M��;�S��[�[�4�+;�;�;�<�F��
rc�f�ttj����}|j|jz
}|jrtj|��}nZtj|��}tj|��d}|d}||kr|rd}nd}tj||z��}|�|jdztj	|j
|��z��}tj�
|��rdS|jr |j���d|_|�|j|��|jdkr+|���D]}tj|���|js|���|_|�|��|_dS)ax
        do a rollover; in this case, a date/time stamp is appended to the filename
        when the rollover happens.  However, you want the file to be named for the
        start of the interval, not the current time.  If there is a backup count,
        then we have to get a list of matching filenames, sort them and remove
        the one with the oldest suffix.
        r?rZryr�Nr)rhrorqrdrbrzr{r$rC�strftimerer'r(r)r@rAr-r<r�rDr
rErp)	rr�rr�	timeTupler��dstThenr�rH�ss	         rrz#TimedRotatingFileHandler.doRollover�s����$�)�+�+�&�&���O�d�m�+���8�	7���A���I�I���q�)�)�I��^�K�0�0��4�F���m�G��� � ��#�!�F�F�"�F� �N�1�v�:�6�6�	��$�$�T�%6��%<�%)�]�4�;�	�%J�%J�&K�L�L��
�7�>�>�#���	��F��;�	��K�������D�K����D�%�s�+�+�+���a����*�*�,�,�
�
���	�!������z�	'��*�*�,�,�D�K��.�.�{�;�;����r)rTr>rNFFNN)	r.r/r0r1rrprr�rr2rrrSrS�s���������DE�?C��A2�A2�A2�A2�FK�K�K�Z���&$�$�$�L&<�&<�&<�&<�&<rrSc�0�eZdZdZ		d	d�Zd�Zd�Zd�ZdS)
�WatchedFileHandlera�
    A handler for logging to a file, which watches the file
    to see if it has changed while in use. This can happen because of
    usage of programs such as newsyslog and logrotate which perform
    log file rotation. This handler, intended for use under Unix,
    watches the file to see if it has changed since the last emit.
    (A file has changed if its device or inode have changed.)
    If it has changed, the old file stream is closed, and the file
    opened to get a new stream.

    This handler is not appropriate for use under Windows, because
    under Windows open files cannot be moved or renamed - logging
    opens the files with exclusive locks - and so there is no need
    for such a handler. Furthermore, ST_INO is not supported under
    Windows; stat always returns zero for this value.

    This handler is based on a suggestion and patch by Chad J.
    Schroeder.
    r5NFc���d|vrtj|��}tj�||||||���d\|_|_|���dS)Nr7r
)r?r?)r9r:rrr�dev�ino�_statstreamrs      rrzWatchedFileHandler.__init__�sq���d�?�?��'��1�1�H���$�$�T�8�$�.6�e�,2�	%�	4�	4�	4�$����$�(��������rc��|jrRtj|j�����}|t|t
c|_|_dSdS�N)r@r'�fstat�filenorrr�r��r�sress  rr�zWatchedFileHandler._statstream�sO���;�	<��8�D�K�.�.�0�0�1�1�D�!%�f��t�F�|��D�H�d�h�h�h�	<�	<rc��	tj|j��}n#t$rd}YnwxYw|r,|t|jks|t|jkrq|j�h|j�	��|j�
��d|_|���|_|���dSdSdS)z�
        Reopen log file if needed.

        Checks if the underlying file has changed, and if it
        has, close the old stream and reopen the file to get the
        current stream.
        N)
r'rnrC�FileNotFoundErrorrr�rr�r@�flushrArEr�r�s  r�reopenIfNeededz!WatchedFileHandler.reopenIfNeeded�s���	��7�4�,�-�-�D�D�� �	�	�	��D�D�D�	�����	#�t�F�|�t�x�/�/�4��<�4�8�3K�3K��{�&���!�!�#�#�#���!�!�#�#�#�"���"�j�j�l�l���� � �"�"�"�"�"�'�&�4L�3Ks��+�+c�n�|���tj�||��dS)z�
        Emit a record.

        If underlying file has changed, reopen the file before emitting the
        record to it.
        N)r�rrrrs  rrzWatchedFileHandler.emits5��	
�������� � ��v�.�.�.�.�.r)r5NFN)r.r/r0r1rr�r�rr2rrr�r��si��������&AF������<�<�<�
#�#�#�8/�/�/�/�/rr�c�D�eZdZdZd�Zdd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�ZdS)
�
SocketHandlera
    A handler class which writes logging records, in pickle format, to
    a streaming socket. The socket is kept open across logging calls.
    If the peer resets it, an attempt is made to reconnect on the next call.
    The pickle which is sent is that of the LogRecord's attribute dictionary
    (__dict__), so that the receiver does not need to have the logging module
    installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.
    c���tj�|��||_||_|�||_n	||f|_d|_d|_d|_d|_	d|_
d|_dS)a
        Initializes the handler with a specific host address and port.

        When the attribute *closeOnError* is set to True - if a socket error
        occurs, the socket is silently closed and then reopened on the next
        logging call.
        NFg�?g>@g@)r�Handlerr�host�port�address�sock�closeOnError�	retryTime�
retryStart�retryMax�retryFactor�rr�r�s   rrzSocketHandler.__init__su��	�� � ��&�&�&���	���	��<��D�L�L� �$�<�D�L���	�!�����������
�����rr>c�F�|j�tj|j|���}n}tjtjtj��}|�|��	|�|j��n##t$r|�	���wxYw|S)zr
        A factory method which allows subclasses to define the precise
        type of socket they want.
        N��timeout)
r��socket�create_connectionr��AF_UNIX�SOCK_STREAM�
settimeout�connect�OSErrorrA)rr�r#s   r�
makeSocketzSocketHandler.makeSocket3s���
�9� ��-�d�l�G�L�L�L�F�F��]�6�>�6�3E�F�F�F����g�&�&�&�
����t�|�,�,�,�,���
�
�
��������
�����
s�#A>�> Bc�h�tj��}|j�d}n||jk}|r�	|���|_d|_dS#t$rW|j�
|j|_n0|j|jz|_|j|jkr|j|_||jz|_YdSwxYwdS)z�
        Try to create a socket, using an exponential backoff with
        a max retry time. Thanks to Robert Olson for the original patch
        (SF #815911) which has been slightly refactored.
        NT)	ror�r�r�r�r��retryPeriodr�r�)r�now�attempts   r�createSocketzSocketHandler.createSocketDs����i�k�k���>�!��G�G��d�n�,�G��	8�
8� �O�O�-�-��	�!%�������
8�
8�
8��>�)�'+��D�$�$�'+�'7�$�:J�'J�D�$��'�$�-�7�7�+/�=��(�!$�t�'7�!7������
8����		8�	8s� A�AB/�.B/c���|j�|���|jrN	|j�|��dS#t$r$|j���d|_YdSwxYwdS)z�
        Send a pickled string to the socket.

        This function allows for partial sends which can happen when the
        network is busy.
        N)r�r��sendallr�rA�rr�s  r�sendzSocketHandler.send`s����9���������9�	!�
!��	�!�!�!�$�$�$�$�$���
!�
!�
!��	���!�!�!� ��	�	�	�	�
!����	!�	!s�A�*A.�-A.c�L�|j}|r|�|��}t|j��}|���|d<d|d<d|d<|�dd��t
j|d��}tj	dt|����}||zS)z�
        Pickles the record in binary format with a length prefix, and
        returns it ready for transmission across the socket.
        rQN�args�exc_info�messager>z>L)r�rL�dict�__dict__�
getMessage�pop�pickle�dumps�struct�packrO)rr�ei�dummy�dr��slens       r�
makePicklezSocketHandler.makePickless���
�_��
�	(��K�K��'�'�E�
���!�!���$�$�&�&��%����&�	���*�
�	���i������L��A�����{�4��Q���(�(���a�x�rc��|jr)|jr"|j���d|_dStj�||��dS)z�
        Handle an error during logging.

        An error has occurred during logging. Most likely cause -
        connection lost. Close the socket so that we can retry on the
        next event.
        N)r�r�rArr�rrs  rrzSocketHandler.handleError�sS����	6���	6��I�O�O�����D�I�I�I��O�'�'��f�5�5�5�5�5rc��	|�|��}|�|��dS#t$r|�|��YdSwxYw)a
        Emit a record.

        Pickles the record and writes it to the socket in binary format.
        If there is an error with the socket, silently drop the packet.
        If there was a problem with the socket, re-establishes the
        socket.
        N)r�r�rr)rrr�s   rrzSocketHandler.emit�sc��	%�����'�'�A��I�I�a�L�L�L�L�L���	%�	%�	%����V�$�$�$�$�$�$�	%���s�*.�A�Ac��|���	|j}|rd|_|���tj�|��|���dS#|���wxYw�z$
        Closes the socket.
        N)�acquirer�rArr��release�rr�s  rrAzSocketHandler.close�sr��	
������	��9�D��
� ��	��
�
�����O�!�!�$�'�'�'��L�L�N�N�N�N�N��D�L�L�N�N�N�N�����AA/�/BN)r>)r.r/r0r1rr�r�r�r�rrrAr2rrr�r�
s�������
�
����2����"8�8�8�8!�!�!�&���,6�6�6�
%�
%�
%�����rr�c�$�eZdZdZd�Zd�Zd�ZdS)�DatagramHandlera�
    A handler class which writes logging records, in pickle format, to
    a datagram socket.  The pickle which is sent is that of the LogRecord's
    attribute dictionary (__dict__), so that the receiver does not need to
    have the logging module installed in order to process the logging event.

    To unpickle the record at the receiving end into a LogRecord, use the
    makeLogRecord function.

    c�L�t�|||��d|_dS)zP
        Initializes the handler with a specific host address and port.
        FN)r�rr�r�s   rrzDatagramHandler.__init__�s*��	���t�T�4�0�0�0�!����rc��|j�
tj}ntj}tj|tj��}|S)zu
        The factory method of SocketHandler is here overridden to create
        a UDP socket (SOCK_DGRAM).
        )r�r�r��AF_INET�
SOCK_DGRAM)r�familyr�s   rr�zDatagramHandler.makeSocket�s5��
�9���^�F�F��^�F��M�&�&�"3�4�4���rc�|�|j�|���|j�||j��dS)z�
        Send a pickled string to a socket.

        This function no longer allows for partial sends which can happen
        when the network is busy - UDP does not guarantee delivery and
        can deliver packets out of sequence.
        N)r�r��sendtor�r�s  rr�zDatagramHandler.send�s>���9���������	����D�L�)�)�)�)�)rN)r.r/r0r1rr�r�r2rrr�r��sK������	�	�"�"�"�
�
�
�
*�
*�
*�
*�
*rr�c
�|�eZdZdZdZdZdZdZdZdZ	dZ
d	ZdZdZ
dZdZdZdZdZd	Zd
ZdZdZd
ZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#eeeeeeee
e	eeed�Z$ide�de�de�de�de�d e�d!e�d"e�d#e�d$e�d%e�d&e�d'e�d(e�d)e
�d*e�d+e�eeee e!e"e#d,��Z%d-d.d/d0d1d2�Z&d3e'fe
d4fd5�Z(d6�Z)d7�Z*d8�Z+d9�Z,d:�Z-d;Z.d<Z/d=�Z0d4S)>�
SysLogHandlera
    A handler class which sends formatted logging records to a syslog
    server. Based on Sam Rushing's syslog module:
    http://www.nightmare.com/squirl/python-ext/misc/syslog.py
    Contributed by Nicolas Untz (after which minor refactoring changes
    have been made).
    rr>rJrtrurvrwrx��	�
���
����������)�alert�crit�critical�debug�emerg�err�error�info�notice�panic�warn�warning�auth�authpriv�console�cron�daemon�ftp�kern�lpr�mail�news�ntp�securityzsolaris-cron�syslog�user�uucp�local0)�local1�local2�local3�local4�local5�local6�local7rrrrr)�DEBUG�INFO�WARNING�ERROR�CRITICAL�	localhostNc��tj�|��||_||_||_d|_|���dS)a
        Initialize a handler.

        If address is specified as a string, a UNIX socket is used. To log to a
        local syslogd, "SysLogHandler(address="/dev/log")" can be used.
        If facility is not specified, LOG_USER is used. If socktype is
        specified as socket.SOCK_DGRAM or socket.SOCK_STREAM, that specific
        socket type will be used. For Unix sockets, you can also specify a
        socktype of None, in which case socket.SOCK_DGRAM will be used, falling
        back to socket.SOCK_STREAM.
        N)rr�rr��facility�socktyper�r�)rr�r6r7s    rrzSysLogHandler.__init__JsN��	�� � ��&�&�&���� ��
� ��
�����������rc��|j}|�tj}tjtj|��|_	|j�|��||_dS#t
$r�|j���|j��tj}tjtj|��|_	|j�|��||_YdS#t
$r|j����wxYwwxYwr�)r7r�r�r�r�r�rAr�)rr��use_socktypes   r�_connect_unixsocketz!SysLogHandler._connect_unixsocket_s���}����!�,�L��m�F�N�L�A�A���	��K����(�(�(�(�D�M�M�M���
	�
	�
	��K�������}�(��!�-�L� �-����E�E�D�K�
���#�#�G�,�,�,� ,��
�
�
�
���
�
�
���!�!�#�#�#��
����
	���s�!A�AD�:!C�%D�Dc�N�|j}|j}t|t��r0d|_	|�|��dS#t$rYdSwxYwd|_|�tj}|\}}tj	||d|��}|st
d���|D]z}|\}}}}	}
dx}}	tj|||��}|tj
kr|�|
��n/#t$r"}
|
}|�|���Yd}
~
�sd}
~
wwxYw|�|�||_||_dS)af
        Try to create a socket and, if it's not a datagram socket, connect it
        to the other end. This method is called during handler initialization,
        but it's not regarded as an error if the other end isn't listening yet
        --- the method will be called again when emitting an event,
        if there is no socket at that point.
        TFNrz!getaddrinfo returns an empty list)
r�r7�
isinstance�str�
unixsocketr:r�r�r��getaddrinfor�r�rA)rr�r7r�r��ress�res�af�proto�_�sarr��excs              rr�zSysLogHandler.createSocketwsz���,���=���g�s�#�#�!	%�"�D�O�

��(�(��1�1�1�1�1���
�
�
����
����$�D�O���!�,�� �J�D�$��%�d�D�!�X�>�>�D��
C��A�B�B�B��
%�
%��-0�*��H�e�Q��!�!��d�%�!�=��X�u�=�=�D��6�#5�5�5����R�(�(�(��E���%�%�%��C��'��
�
�������������%�������	��D�K�$�D�M�M�Ms)�A�
A�A�';C$�$
D�.D�Dc��t|t��r
|j|}t|t��r
|j|}|dz|zS)z�
        Encode the facility and priority. You can pass in strings or
        integers - if strings are passed, the facility_names and
        priority_names mapping dictionaries are used to convert them to
        integers.
        rt)r<r=�facility_names�priority_names)rr6�prioritys   r�encodePriorityzSysLogHandler.encodePriority�sQ���h��$�$�	5��*�8�4�H��h��$�$�	5��*�8�4�H��A�
��)�)rc��|���	|j}|rd|_|���tj�|��|���dS#|���wxYwr�)r�r�rArr�r�r�s  rrAzSysLogHandler.close�sr��	
������	��;�D��
�"����
�
�����O�!�!�$�'�'�'��L�L�N�N�N�N�N��D�L�L�N�N�N�N���r�c�8�|j�|d��S)aK
        Map a logging level name to a key in the priority_names map.
        This is useful in two scenarios: when custom levels are being
        used, and in the case where you can't do a straightforward
        mapping by lowercasing the logging level name because of locale-
        specific issues (see SF #1524081).
        r)�priority_map�get)r�	levelNames  r�mapPriorityzSysLogHandler.mapPriority�s��� �$�$�Y�	�:�:�:r�Tc�^�	|�|��}|jr
|j|z}|jr|dz
}d|�|j|�|j����z}|�d��}|�d��}||z}|js|�	��|j
r{	|j�|��dS#t$rQ|j�
��|�|j��|j�|��YdSwxYw|jtjkr"|j�||j��dS|j�|��dS#t($r|�|��YdSwxYw)z�
        Emit a record.

        The record is formatted, and then sent to the syslog server. If
        exception information is present, it is NOT sent to the server.
        �z<%d>�utf-8N)rL�ident�
append_nulrKr6rQ�	levelname�encoder�r�r>r�r�rAr:r�r7r�r�r�rr)rrrQ�prios    rrzSysLogHandler.emit�s���	%��+�+�f�%�%�C��z�
'��j�3�&����
��v�
���D�/�/��
�04�0@�0@��AQ�0R�0R�T�T�T�D��;�;�w�'�'�D��*�*�W�%�%�C���*�C��;�
$��!�!�#�#�#���

)�*��K�$�$�S�)�)�)�)�)���*�*�*��K�%�%�'�'�'��,�,�T�\�:�:�:��K�$�$�S�)�)�)�)�)�)�*������&�"3�3�3���"�"�3���5�5�5�5�5���#�#�C�(�(�(�(�(���	%�	%�	%����V�$�$�$�$�$�$�	%���s7�B9F	�<C�AD3�/F	�2D3�38F	�-F	�	F,�+F,)1r.r/r0r1�	LOG_EMERG�	LOG_ALERT�LOG_CRIT�LOG_ERR�LOG_WARNING�
LOG_NOTICE�LOG_INFO�	LOG_DEBUG�LOG_KERN�LOG_USER�LOG_MAIL�
LOG_DAEMON�LOG_AUTH�
LOG_SYSLOG�LOG_LPR�LOG_NEWS�LOG_UUCP�LOG_CRON�LOG_AUTHPRIV�LOG_FTP�LOG_NTP�LOG_SECURITY�LOG_CONSOLE�LOG_SOLCRON�
LOG_LOCAL0�
LOG_LOCAL1�
LOG_LOCAL2�
LOG_LOCAL3�
LOG_LOCAL4�
LOG_LOCAL5�
LOG_LOCAL6�
LOG_LOCAL7rIrHrN�SYSLOG_UDP_PORTrr:r�rKrArQrVrWrr2rrr�r��s���������$�I��I��H��G��K��J��H��I��H��H��H��J��H��J��G��H��H��H��L��G��G��L��K��K��J��J��J��J��J��J��J��J�������������

�

�N�
���
���
�	��
�	��	
�
	�
�
�	��

�	��
�	��
�	��
�	��
�	��
�	��
�	��
�	�
�
�	��
� 	��!
�"	�
�#
�$#�"�"�"�"�"�"�1
�
�
�N�<�������L�!,�_�=�"�T�����*���0,%�,%�,%�\*�*�*����;�;�;�
�E��J�&%�&%�&%�&%�&%rr�c�(�eZdZdZ	dd�Zd�Zd�ZdS)�SMTPHandlerzK
    A handler class which sends an SMTP email for each logging event.
    N�@c��tj�|��t|tt
f��r|\|_|_n|dc|_|_t|tt
f��r|\|_|_	nd|_||_
t|t��r|g}||_||_
||_||_dS)ax
        Initialize the handler.

        Initialize the instance with the from and to addresses and subject
        line of the email. To specify a non-standard SMTP port, use the
        (host, port) tuple format for the mailhost argument. To specify
        authentication credentials, supply a (username, password) tuple
        for the credentials argument. To specify the use of a secure
        protocol (TLS), pass in a tuple for the secure argument. This will
        only be used when authentication credentials are supplied. The tuple
        will be either an empty tuple, or a single-value tuple with the name
        of a keyfile, or a 2-value tuple with the names of the keyfile and
        certificate file. (This tuple is passed to the `starttls` method).
        A timeout in seconds can be specified for the SMTP connection (the
        default is one second).
        N)rr�rr<�list�tuple�mailhost�mailport�username�password�fromaddrr=�toaddrs�subject�securer�)rr�r�r�r��credentialsr�r�s        rrzSMTPHandler.__init__�s���$	�� � ��&�&�&��h��u�
�.�.�	:�+3�(�D�M�4�=�=�+3�T�(�D�M�4�=��k�D�%�=�1�1�	!�+6�(�D�M�4�=�=� �D�M� ��
��g�s�#�#�	 ��i�G��������������rc��|jS)z�
        Determine the subject for the email.

        If you want to specify a subject line which is record-dependent,
        override this method.
        )r�rs  r�
getSubjectzSMTPHandler.getSubjects���|�rc�
�	ddl}ddlm}ddl}|j}|s|j}|�|j||j���}|��}|j	|d<d�
|j��|d<|�|��|d<|j
���|d	<|�|�|����|jr^|j�7|���|j|j�|���|�|j|j��|�|��|���dS#t2$r|�|��YdSwxYw)
zd
        Emit a record.

        Format the record and send it to the specified addressees.
        rN)�EmailMessager��From�,�To�Subject�Date)�smtplib�
email.messager��email.utilsr��	SMTP_PORT�SMTPr�r�r�r�r�r��utilsr{�set_contentrLr�r��ehlo�starttls�loginr��send_message�quitrr)rrr�r��emailr��smtprQs        rrzSMTPHandler.emit%s���	%��N�N�N�2�2�2�2�2�2������=�D��
)��(���<�<��
�t�T�\�<�J�J�D��,�.�.�C��-�C��K������.�.�C��I�!�_�_�V�4�4�C�	�N��+�/�/�1�1�C��K��O�O�D�K�K��/�/�0�0�0��}�
9��;�*��I�I�K�K�K�!�D�M�4�;�/�/��I�I�K�K�K��
�
�4�=�$�-�8�8�8����c�"�"�"��I�I�K�K�K�K�K���	%�	%�	%����V�$�$�$�$�$�$�	%���s�EE�F�F)NNr~)r.r/r0r1rr�rr2rrr}r}�sV��������9<�!�!�!�!�F���%�%�%�%�%rr}c�8�eZdZdZd
d�Zd�Zd�Zd�Zd�Zd	�Z	dS)�NTEventLogHandlera�
    A handler class which sends events to the NT Event Log. Adds a
    registry entry for the specified application name. If no dllname is
    provided, win32service.pyd (which contains some basic message
    placeholders) is used. Note that use of these placeholders will make
    your event logs big, as the entire message source is held in the log.
    If you want slimmer logs, you have to pass in the name of your own DLL
    which contains the message definitions you want to use in the event log.
    N�Applicationc
�.�tj�|��	ddl}ddl}||_||_|sttj�	|jj
��}tj�	|d��}tj�|dd��}||_||_
	|j�|||��n-#t$r }t!|dd��dkr�Yd}~nd}~wwxYw|j|_tj|jtj|jtj|jtj|jtj|ji|_dS#t6$rt9d��d|_YdSwxYw)Nrzwin32service.pyd�winerrorrvzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr�r�win32evtlogutil�win32evtlog�appname�_welur'r(r��__file__r��dllname�logtype�AddSourceToRegistryr�getattr�EVENTLOG_ERROR_TYPE�deftyper/�EVENTLOG_INFORMATION_TYPEr0r1�EVENTLOG_WARNING_TYPEr2r3�typemap�ImportError�print)rr�r�r�r�r��es       rrzNTEventLogHandler.__init__Os����� � ��&�&�&�	�/�/�/�/�/�/�/�/�"�D�L�(�D�J��
H��'�-�-��
�(;�<�<���'�-�-���
�3�3���'�,�,�w�q�z�3F�G�G��"�D�L�"�D�L�
��
�.�.�w���I�I�I�I���
�
�
��1�j�$�/�/�1�4�4��5�4�4�4�4�����
����
'�:�D�L��
�+�"G���+�"G���+�"C��
�+�"A�� �+�"A��D�L�L�L���	�	�	��?�
@�
@�
@��D�J�J�J�J�	���s=�BE0�<C�E0�
D�#C>�9E0�>D�A+E0�0 F�Fc��dS)ay
        Return the message ID for the event record. If you are using your
        own messages, you could do this by having the msg passed to the
        logger being an ID rather than a formatting string. Then, in here,
        you could use a dictionary lookup to get the message ID. This
        version returns 1, which is the base message ID in win32service.pyd.
        r>r2rs  r�getMessageIDzNTEventLogHandler.getMessageIDrs	���qrc��dS)z�
        Return the event category for the record.

        Override this if you want to specify your own categories. This version
        returns 0.
        rr2rs  r�getEventCategoryz"NTEventLogHandler.getEventCategory|s	���qrc�L�|j�|j|j��S)a�
        Return the event type for the record.

        Override this if you want to specify your own types. This version does
        a mapping using the handler's typemap attribute, which is set up in
        __init__() to a dictionary which contains mappings for DEBUG, INFO,
        WARNING, ERROR and CRITICAL. If you are using your own levels you will
        either need to override this method or place a suitable dictionary in
        the handler's typemap attribute.
        )r�rO�levelnor�rs  r�getEventTypezNTEventLogHandler.getEventType�s ���|�������=�=�=rc�V�|jr�	|�|��}|�|��}|�|��}|�|��}|j�|j||||g��dS#t$r|�|��YdSwxYwdS)z�
        Emit a record.

        Determine the message ID, event category and event type. Then
        log the message in the NT event log.
        N)	r�r�r�r�rL�ReportEventr�rr)rr�id�cat�typerQs      rrzNTEventLogHandler.emit�s����:�	)�
)��&�&�v�.�.���+�+�F�3�3���(�(��0�0���k�k�&�)�)���
�&�&�t�|�R��d�S�E�J�J�J�J�J���
)�
)�
)�� � ��(�(�(�(�(�(�
)����	)�	)s�A8B�B&�%B&c�D�tj�|��dS)aS
        Clean up this handler.

        You can remove the application name from the registry as a
        source of event log entries. However, if you do this, you will
        not be able to see the events as you intended in the Event Log
        Viewer - it needs to be able to access the registry to get the
        DLL name.
        N)rr�rA�rs rrAzNTEventLogHandler.close�s ��	����d�#�#�#�#�#r)Nr�)
r.r/r0r1rr�r�r�rrAr2rrr�r�Es~��������!�!�!�!�F������>�>�>�)�)�)�"$�$�$�$�$rr�c�0�eZdZdZ		d	d�Zd�Zd�Zd�ZdS)
�HTTPHandlerz^
    A class which sends records to a web server, using either GET or
    POST semantics.
    �GETFNc��tj�|��|���}|dvrt	d���|s|�t	d���||_||_||_||_||_	||_
dS)zr
        Initialize the instance with the host, the request URL, and the method
        ("GET" or "POST")
        )r��POSTzmethod must be GET or POSTNz3context parameter only makes sense with secure=True)rr�rr`rgr��url�methodr�r��context)rr�r�r�r�r�r�s       rrzHTTPHandler.__init__�s���	�� � ��&�&�&���������(�(��9�:�:�:��	1�'�-��0�1�1�
1���	����������&�������rc��|jS)z�
        Default implementation of mapping the log record into a dict
        that is sent as the CGI data. Overwrite in your class.
        Contributed by Franz Glasner.
        )r�rs  r�mapLogRecordzHTTPHandler.mapLogRecord�s����rc��ddl}|r"|j�||j���}n|j�|��}|S)z�
        get a HTTP[S]Connection.

        Override when a custom connection is required, for example if
        there is a proxy.
        rN)r�)�http.client�client�HTTPSConnectionr��HTTPConnection)rr�r��http�
connections     r�
getConnectionzHTTPHandler.getConnection�sQ��	�����	:���4�4�T�4�<�4�P�P�J�J���3�3�D�9�9�J��rc�<�	ddl}|j}|�||j��}|j}|j�|�|����}|jdkr(|�	d��dkrd}nd}|d||fzz}|�
|j|��|�	d��}|dkr
|d|�}|jdkrF|�d	d
��|�dtt|������|jrtddl}	d|jz�d
��}
d|	�|
������d��z}
|�d|
��|���|jdkr(|�|�d
����|���dS#t.$r|�|��YdSwxYw)zk
        Emit a record.

        Send the record to the web server as a percent-encoded dictionary
        rNr��?�&z%c%s�:r�zContent-typez!application/x-www-form-urlencodedzContent-lengthz%s:%srUzBasic �ascii�
Authorization)�urllib.parser�r�r�r��parse�	urlencoder�r��find�
putrequest�	putheaderr=rOr��base64rY�	b64encode�strip�decode�
endheadersr��getresponserr)rr�urllibr�rTr��data�seprFr�r�s           rrzHTTPHandler.emit�s��#	%������9�D��"�"�4���5�5�A��(�C��<�)�)�$�*;�*;�F�*C�*C�D�D�D��{�e�#�#��H�H�S�M�M�Q�&�&��C�C��C��F�c�4�[�0�0��
�L�L���c�*�*�*��	�	�#���A��A�v�v��B�Q�B�x���{�f�$�$����N�?�A�A�A����,�c�#�d�)�)�n�n�=�=�=���
0��
�
�
��t�/�/�7�7��@�@���v�/�/��2�2�8�8�:�:�A�A�'�J�J�J�����O�Q�/�/�/�
�L�L�N�N�N��{�f�$�$����t�{�{�7�+�+�,�,�,�
�M�M�O�O�O�O�O���	%�	%�	%����V�$�$�$�$�$�$�	%���s�G4G8�8H�H)r�FNN)r.r/r0r1rr�r�rr2rrr�r��si��������KO������(������)%�)%�)%�)%�)%rr�c�0�eZdZdZd�Zd�Zd�Zd�Zd�ZdS)�BufferingHandlerz�
  A handler class which buffers logging records in memory. Whenever each
  record is added to the buffer, a check is made to see if the buffer should
  be flushed. If it should, then flush() is expected to do what's needed.
    c�`�tj�|��||_g|_dS)z>
        Initialize the handler with the buffer size.
        N)rr�r�capacity�buffer)rr�s  rrzBufferingHandler.__init__s,��	�� � ��&�&�&� ��
�����rc�<�t|j��|jkS)z�
        Should the handler flush its buffer?

        Returns true if the buffer is up to capacity. This method can be
        overridden to implement custom flushing strategies.
        )rOr�r�rs  r�shouldFlushzBufferingHandler.shouldFlushs���D�K� � �D�M�1�2rc��|j�|��|�|��r|���dSdS)z�
        Emit a record.

        Append the record. If shouldFlush() tells us to, call flush() to process
        the buffer.
        N)r�r�r�r�rs  rrzBufferingHandler.emit!sK��	
����6�"�"�"����F�#�#�	��J�J�L�L�L�L�L�	�	rc��|���	|j���|���dS#|���wxYw)zw
        Override to implement custom flushing behaviour.

        This version just zaps the buffer to empty.
        N)r�r��clearr�r�s rr�zBufferingHandler.flush,sM��	
������	��K�������L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�A�Ac��	|���tj�|��dS#tj�|��wxYw)zp
        Close the handler.

        This version just flushes and chains to the parent class' close().
        N)r�rr�rAr�s rrAzBufferingHandler.close8sL��	(��J�J�L�L�L��O�!�!�$�'�'�'�'�'��G�O�!�!�$�'�'�'�'���s	�7�!AN)	r.r/r0r1rr�rr�rAr2rrr�r�
si��������
���3�3�3�	�	�	�
�
�
�	(�	(�	(�	(�	(rr�c�B�eZdZdZejddfd�Zd�Zd�Zd�Z	d�Z
dS)	�
MemoryHandlerz�
    A handler class which buffers logging records in memory, periodically
    flushing them to a target handler. Flushing occurs whenever the buffer
    is full, or when an event of a certain severity or greater is seen.
    NTc�f�t�||��||_||_||_dS)a;
        Initialize the handler with the buffer size, the level at which
        flushing should occur and an optional target.

        Note that without a target being set either here or via setTarget(),
        a MemoryHandler is no use to anyone!

        The ``flushOnClose`` argument is ``True`` for backward compatibility
        reasons - the old behaviour is that when the handler is closed, the
        buffer is flushed, even if the flush level hasn't been exceeded nor the
        capacity exceeded. To prevent this, set ``flushOnClose`` to ``False``.
        N)r�r�
flushLevel�target�flushOnClose)rr�r�r�r�s     rrzMemoryHandler.__init__Is6��	�!�!�$��1�1�1�$������(����rc�\�t|j��|jkp|j|jkS)zP
        Check for buffer full or a record at the flushLevel or higher.
        )rOr�r�r�r�rs  rr�zMemoryHandler.shouldFlush]s.���D�K� � �D�M�1�4���4�?�2�	4rc��|���	||_|���dS#|���wxYw)z:
        Set the target handler for this handler.
        N)r�r�r�)rr�s  r�	setTargetzMemoryHandler.setTargetds@��	
������	� �D�K��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s	�3�A	c��|���	|jr=|jD]}|j�|���|j���|���dS#|���wxYw)z�
        For a MemoryHandler, flushing means just sending the buffered
        records to the target, if there is one. Override if you want
        different behaviour.

        The record buffer is only cleared if a target has been set.
        N)r�r�r��handler�r�rs  rr�zMemoryHandler.flushns���	
������	��{�
$�"�k�/�/�F��K�&�&�v�.�.�.�.���!�!�#�#�#��L�L�N�N�N�N�N��D�L�L�N�N�N�N���s�AA0�0Bc���	|jr|���|���	d|_t�|��|���dS#|���wxYw#|���	d|_t�|��|���w#|���wxYwxYw)zi
        Flush, if appropriately configured, set the target to None and lose the
        buffer.
        N)r�r�r�r�r�rAr�r�s rrAzMemoryHandler.closes���
		�� �
��
�
�����L�L�N�N�N�
�"��� �&�&�t�,�,�,���������������������
�L�L�N�N�N�
�"��� �&�&�t�,�,�,���������������������s.�B�!A)�)A?�C'�!C�9C'�C$�$C')r.r/r0r1rr2rr�rr�rAr2rrr�r�Csz��������
-4�M�$�"�)�)�)�)�(4�4�4�������"����rr�c�*�eZdZdZd�Zd�Zd�Zd�ZdS)�QueueHandlera�
    This handler sends events to a queue. Typically, it would be used together
    with a multiprocessing Queue to centralise logging to file in one process
    (in a multi-process application), so as to avoid file write contention
    between processes.

    This code is new in Python 3.2, but this class can be copy pasted into
    user code for use with earlier Python versions.
    c�R�tj�|��||_dS)zA
        Initialise an instance, using the passed queue.
        N)rr�r�queue)rrs  rrzQueueHandler.__init__�s%��	�� � ��&�&�&���
�
�
rc�:�|j�|��dS)z�
        Enqueue a record.

        The base implementation uses put_nowait. You may want to override
        this method if you want to use blocking, timeouts or custom queue
        implementations.
        N)r�
put_nowaitrs  r�enqueuezQueueHandler.enqueue�s ��	
�
���f�%�%�%�%�%rc��|�|��}tj|��}||_||_d|_d|_d|_d|_|S)a�
        Prepare a record for queuing. The object returned by this method is
        enqueued.

        The base implementation formats the record to merge the message and
        arguments, and removes unpickleable items from the record in-place.
        Specifically, it overwrites the record's `msg` and
        `message` attributes with the merged message (obtained by
        calling the handler's `format` method), and sets the `args`,
        `exc_info` and `exc_text` attributes to None.

        You might want to override this method if you want to convert
        the record to a dict or JSON string, or send a modified copy
        of the record while leaving the original intact.
        N)rL�copyr�rQr�r��exc_text�
stack_inforPs   r�preparezQueueHandler.prepare�sT��,�k�k�&�!�!����6�"�"�������
���������� ����
rc��	|�|�|����dS#t$r|�|��YdSwxYw)zm
        Emit a record.

        Writes the LogRecord to the queue, preparing it for pickling first.
        N)r
rrrrs  rrzQueueHandler.emit�sc��	%��L�L����f�-�-�.�.�.�.�.���	%�	%�	%����V�$�$�$�$�$�$�	%���s�(,�A�AN)r.r/r0r1rr
rrr2rrrr�s[�����������&�&�&����B	%�	%�	%�	%�	%rrc�L�eZdZdZdZdd�d�Zd�Zd�Zd�Zd	�Z	d
�Z
d�Zd�ZdS)
�
QueueListenerz�
    This class implements an internal threaded listener which watches for
    LogRecords being added to a queue, removes them and passes them to a
    list of handlers for processing.
    NF)�respect_handler_levelc�>�||_||_d|_||_dS)zW
        Initialise an instance with the specified queue and
        handlers.
        N)r�handlers�_threadr)rrrrs    rrzQueueListener.__init__�s'��
��
� ��
����%:��"�"�"rc�6�|j�|��S)z�
        Dequeue a record and return it, optionally blocking.

        The base implementation uses get. You may want to override this method
        if you want to use timeouts or work with custom queue implementations.
        )rrO)r�blocks  r�dequeuezQueueListener.dequeue�s���z�~�~�e�$�$�$rc�~�tj|j���x|_}d|_|���dS)z�
        Start the listener.

        This starts up a background thread to monitor the queue for
        LogRecords to process.
        )r�TN)�	threading�Thread�_monitorrrr�)rrrs  rr�zQueueListener.start�s8��%�+�4�=�A�A�A�A���q����	���	�	�	�	�	rc��|S)a
        Prepare a record for handling.

        This method just returns the passed-in record. You may want to
        override this method if you need to do any custom marshalling or
        manipulation of the record before passing it to the handlers.
        r2rs  rrzQueueListener.prepare�s	���
rc��|�|��}|jD]3}|jsd}n|j|jk}|r|�|���4dS)z|
        Handle a record.

        This just loops through the handlers offering them the record
        to handle.
        TN)rrrr��levelr)rr�handler�processs    rrzQueueListener.handle	sk�����f�%�%���}�	'�	'�G��-�
:���� �.�G�M�9���
'����v�&�&�&��
	'�	'rc�&�|j}t|d��}		|�d��}||jur|r|���dS|�|��|r|���n#tj$rYdSwxYw�z)z�
        Monitor the queue for records, and ask the handler
        to deal with them.

        This method runs on a separate, internal thread.
        The thread will terminate if it sees a sentinel object in the queue.
        �	task_doneTN)r�hasattrr�	_sentinelr$r�Empty)r�q�
has_task_doners    rrzQueueListener._monitors���
�J����;�/�/�
�	�

����d�+�+���T�^�+�+�$�&����
�
�
��E����F�#�#�#� �"��K�K�M�M�M����;�
�
�
����
����	s�4A<�+A<�<B�Bc�D�|j�|j��dS)z�
        This is used to enqueue the sentinel record.

        The base implementation uses put_nowait. You may want to override this
        method if you want to use timeouts or work with custom queue
        implementations.
        N)rr	r&r�s r�enqueue_sentinelzQueueListener.enqueue_sentinel0s"��	
�
���d�n�-�-�-�-�-rc�n�|���|j���d|_dS)a

        Stop the listener.

        This asks the thread to terminate, and then waits for it to do so.
        Note that if you don't call this before your application exits, there
        may be some records still left on the queue, which won't be processed.
        N)r+rr�r�s r�stopzQueueListener.stop:s5��	
�����������������r)
r.r/r0r1r&rrr�rrrr+r-r2rrrr�s���������
�I�?D�;�;�;�;�;�%�%�%�	�	�	����'�'�'� ���..�.�.�
�
�
�
�
rr)(r1r9rr�r'r�r�rorjrnrrrrrr�DEFAULT_TCP_LOGGING_PORT�DEFAULT_UDP_LOGGING_PORT�DEFAULT_HTTP_LOGGING_PORT�DEFAULT_SOAP_LOGGING_PORTr{�SYSLOG_TCP_PORTr|rrr4rSr�r�r�r�r�r}r�r�r�r�r�objectrr2rr�<module>r4s���"��9�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�8�)�)�)�)�)�)�)�)�)�)�������������#��"��"��"��!��!���	�H'�H'�H'�H'�H'�'�-�H'�H'�H'�TQ�Q�Q�Q�Q�-�Q�Q�Q�fw<�w<�w<�w<�w<�2�w<�w<�w<�rG/�G/�G/�G/�G/��,�G/�G/�G/�Te�e�e�e�e�G�O�e�e�e�N(*�(*�(*�(*�(*�m�(*�(*�(*�TU%�U%�U%�U%�U%�G�O�U%�U%�U%�nN%�N%�N%�N%�N%�'�/�N%�N%�N%�`i$�i$�i$�i$�i$���i$�i$�i$�VX%�X%�X%�X%�X%�'�/�X%�X%�X%�t7(�7(�7(�7(�7(�w��7(�7(�7(�rJ�J�J�J�J�$�J�J�J�ZF%�F%�F%�F%�F%�7�?�F%�F%�F%�Rk�k�k�k�k�F�k�k�k�k�krPK�]��,
����handlers.pynu�[���PK�]�C�H%;%;�__init__.pynu�[���PK�]��ú����	{-config.pynu�[���PK�]6B�;����$=�__pycache__/__init__.cpython-311.pycnu�[���PK�]a�6⻟��(�@__pycache__/config.cpython-311.opt-2.pycnu�[���PK�]DL&RR*��__pycache__/__init__.cpython-311.opt-2.pycnu�[���PK�]:�+�����*I�__pycache__/handlers.cpython-311.opt-2.pycnu�[���PK�]/4U����"��__pycache__/config.cpython-311.pycnu�[���PK�]-Ī�8�8�(qj__pycache__/config.cpython-311.opt-1.pycnu�[���PK�]���EE*__pycache__/handlers.cpython-311.opt-1.pycnu�[���PK�]�q'�����*�,	__pycache__/__init__.cpython-311.opt-1.pycnu�[���PK�]���EE$��
__pycache__/handlers.cpython-311.pycnu�[���PK�J�