]> granicus.if.org Git - python/commitdiff
bpo-36842: Implement PEP 578 (GH-12613)
authorSteve Dower <steve.dower@microsoft.com>
Thu, 23 May 2019 15:45:22 +0000 (08:45 -0700)
committerGitHub <noreply@github.com>
Thu, 23 May 2019 15:45:22 +0000 (08:45 -0700)
Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs.

70 files changed:
Doc/c-api/code.rst
Doc/c-api/file.rst
Doc/c-api/sys.rst
Doc/howto/instrumentation.rst
Doc/library/array.rst
Doc/library/ctypes.rst
Doc/library/functions.rst
Doc/library/io.rst
Doc/library/mmap.rst
Doc/library/os.rst
Doc/library/pickle.rst
Doc/library/socket.rst
Doc/library/sys.rst
Doc/library/urllib.request.rst
Doc/tools/extensions/pyspecific.py
Include/cpython/fileobject.h [new file with mode: 0644]
Include/cpython/sysmodule.h [new file with mode: 0644]
Include/fileobject.h
Include/internal/pycore_pystate.h
Include/pydtrace.d
Include/pydtrace.h
Include/sysmodule.h
Lib/_pyio.py
Lib/importlib/_bootstrap_external.py
Lib/io.py
Lib/pickle.py
Lib/test/libregrtest/setup.py
Lib/test/test_audit.py [new file with mode: 0644]
Lib/test/test_embed.py
Lib/test/test_fileio.py
Lib/test/test_io.py
Lib/urllib/request.py
Lib/zipimport.py
Makefile.pre.in
Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst [new file with mode: 0644]
Modules/_ctypes/_ctypes.c
Modules/_ctypes/callproc.c
Modules/_io/_iomodule.c
Modules/_io/clinic/_iomodule.c.h
Modules/_io/fileio.c
Modules/_pickle.c
Modules/_winapi.c
Modules/arraymodule.c
Modules/mmapmodule.c
Modules/posixmodule.c
Modules/socketmodule.c
Objects/codeobject.c
Objects/descrobject.c
Objects/fileobject.c
Objects/funcobject.c
Objects/object.c
Objects/typeobject.c
PCbuild/pythoncore.vcxproj
PCbuild/pythoncore.vcxproj.filters
Parser/asdl_c.py
Parser/parsetok.c
Programs/_testembed.c
Python/Python-ast.c
Python/bltinmodule.c
Python/ceval.c
Python/clinic/sysmodule.c.h
Python/fileutils.c
Python/import.c
Python/importdl.c
Python/importlib_external.h
Python/importlib_zipimport.h
Python/pylifecycle.c
Python/pystate.c
Python/pythonrun.c
Python/sysmodule.c

index 27d3f76d7a3dd5218cde00c609cbbc8b744cdd27..fd3f6919d6d75e3a77fe9d91a2f63e0865bcdf9b 100644 (file)
@@ -40,6 +40,7 @@ bound into a function.
    :c:func:`PyCode_New` directly can bind you to a precise Python
    version since the definition of the bytecode changes often.
 
+   .. audit-event:: code.__new__ "code filename name argcount kwonlyargcount nlocals stacksize flags"
 
 .. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)
 
index defc859dd5c478d1b0f875353c5f2506b73a6c27..543dc60b9f55abba5e68dedbf127fdffb8cf137d 100644 (file)
@@ -60,6 +60,32 @@ the :mod:`io` APIs instead.
    raised if the end of the file is reached immediately.
 
 
+.. c:function:: int PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction handler)
+
+   Overrides the normal behavior of :func:`io.open_code` to pass its parameter
+   through the provided handler.
+
+   The handler is a function of type :c:type:`PyObject *(\*)(PyObject *path,
+   void *userData)`, where *path* is guaranteed to be :c:type:`PyUnicodeObject`.
+
+   The *userData* pointer is passed into the hook function. Since hook
+   functions may be called from different runtimes, this pointer should not
+   refer directly to Python state.
+
+   As this hook is intentionally used during import, avoid importing new modules
+   during its execution unless they are known to be frozen or available in
+   ``sys.modules``.
+
+   Once a hook has been set, it cannot be removed or replaced, and later calls to
+   :c:func:`PyFile_SetOpenCodeHook` will fail. On failure, the function returns
+   -1 and sets an exception if the interpreter has been initialized.
+
+   This function is safe to call before :c:func:`Py_Initialize`.
+
+   .. versionadded:: 3.8
+
+
+
 .. c:function:: int PyFile_WriteObject(PyObject *obj, PyObject *p, int flags)
 
    .. index:: single: Py_PRINT_RAW
index 04e169a00dc699d7a3ea9dd661836de05daf45ad..2091da6af0be5350304bd2cb159437da9ee7024d 100644 (file)
@@ -289,6 +289,56 @@ accessible to C code.  They all work with the current interpreter thread's
    .. versionadded:: 3.2
 
 
+.. c:function:: int PySys_Audit(const char *event, const char *format, ...)
+
+   .. index:: single: audit events
+
+   Raises an auditing event with any active hooks. Returns zero for success
+   and non-zero with an exception set on failure.
+
+   If any hooks have been added, *format* and other arguments will be used
+   to construct a tuple to pass. Apart from ``N``, the same format characters
+   as used in :c:func:`Py_BuildValue` are available. If the built value is not
+   a tuple, it will be added into a single-element tuple. (The ``N`` format
+   option consumes a reference, but since there is no way to know whether
+   arguments to this function will be consumed, using it may cause reference
+   leaks.)
+
+   :func:`sys.audit` performs the same function from Python code.
+
+   .. versionadded:: 3.8
+
+
+.. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
+
+   .. index:: single: audit events
+
+   Adds to the collection of active auditing hooks. Returns zero for success
+   and non-zero on failure. If the runtime has been initialized, also sets an
+   error on failure. Hooks added through this API are called for all
+   interpreters created by the runtime.
+
+   This function is safe to call before :c:func:`Py_Initialize`. When called
+   after runtime initialization, existing audit hooks are notified and may
+   silently abort the operation by raising an error subclassed from
+   :class:`Exception` (other errors will not be silenced).
+
+   The hook function is of type :c:type:`int (*)(const char *event, PyObject
+   *args, void *userData)`, where *args* is guaranteed to be a
+   :c:type:`PyTupleObject`. The hook function is always called with the GIL
+   held by the Python interpreter that raised the event.
+
+   The *userData* pointer is passed into the hook function. Since hook
+   functions may be called from different runtimes, this pointer should not
+   refer directly to Python state.
+
+   See :pep:`578` for a detailed decription of auditing. Functions in the
+   runtime and standard library that raise events include the details in each
+   function's documentation.
+
+   .. versionadded:: 3.8
+
+
 .. _processcontrol:
 
 Process Control
index 50cde3595034b504d21ea5ca56bb5a22beac7442..909deb5fed33fff52c6cd28249c3294541accc93 100644 (file)
@@ -332,6 +332,15 @@ Available static markers
    .. versionadded:: 3.7
 
 
+.. c:function:: audit(str event, void *tuple)
+
+   Fires when :func:`sys.audit` or :c:func:`PySys_Audit` is called.
+   ``arg0`` is the event name as C string, ``arg1`` is a :c:type:`PyObject`
+   pointer to a tuple object.
+
+   .. versionadded:: 3.8
+
+
 SystemTap Tapsets
 -----------------
 
index 4ac7bb5391a7a49f7d7ba452ddf5c63456cdc9f1..1f95dd61b9fcd790391b7ba08474bacbf7f345a3 100644 (file)
@@ -83,6 +83,7 @@ The module defines the following type:
    to add initial items to the array.  Otherwise, the iterable initializer is
    passed to the :meth:`extend` method.
 
+   .. audit-event:: array.__new__ "typecode initializer"
 
 .. data:: typecodes
 
index 1c60b4bbda13ecdc7f9d383b96aea93c9387eef2..97172c588ae97f83be853b6958d4529ede8332df 100644 (file)
@@ -1509,6 +1509,17 @@ object is available:
    :c:type:`int`, which is of course not always the truth, so you have to assign
    the correct :attr:`restype` attribute to use these functions.
 
+.. audit-event:: ctypes.dlopen name
+
+   Loading a library through any of these objects raises an
+   :ref:`auditing event <auditing>` ``ctypes.dlopen`` with string argument
+   ``name``, the name used to load the library.
+
+.. audit-event:: ctypes.dlsym "library name"
+
+   Accessing a function on a loaded library raises an auditing event
+   ``ctypes.dlsym`` with arguments ``library`` (the library object) and ``name``
+   (the symbol's name as a string or integer).
 
 .. _ctypes-foreign-functions:
 
@@ -2032,6 +2043,12 @@ Data types
       This method returns a ctypes type instance using the memory specified by
       *address* which must be an integer.
 
+      .. audit-event:: ctypes.cdata address
+
+         This method, and others that indirectly call this method, raises an
+         :func:`auditing event <sys.audit>` ``ctypes.cdata`` with argument
+         ``address``.
+
    .. method:: from_param(obj)
 
       This method adapts *obj* to a ctypes type.  It is called with the actual
index 1a9a8b5beeeebed96a701661395c75d54bdd7309..7170a7817205b770de77716271f3cc358a1cb42f 100644 (file)
@@ -275,6 +275,12 @@ are always available.  They are listed here in alphabetical order.
    If you want to parse Python code into its AST representation, see
    :func:`ast.parse`.
 
+   .. audit-event:: compile "source filename"
+
+      Raises an :func:`auditing event <sys.audit>` ``compile`` with arguments
+      ``source`` and ``filename``. This event may also be raised by implicit
+      compilation.
+
    .. note::
 
       When compiling a string with multi-line code in ``'single'`` or
@@ -473,6 +479,11 @@ are always available.  They are listed here in alphabetical order.
    See :func:`ast.literal_eval` for a function that can safely evaluate strings
    with expressions containing only literals.
 
+   .. audit-event:: exec code_object
+
+      Raises an :func:`auditing event <sys.audit>` ``exec`` with the code object as
+      the argument. Code compilation events may also be raised.
+
 .. index:: builtin: exec
 
 .. function:: exec(object[, globals[, locals]])
@@ -502,6 +513,11 @@ are always available.  They are listed here in alphabetical order.
    builtins are available to the executed code by inserting your own
    ``__builtins__`` dictionary into *globals* before passing it to :func:`exec`.
 
+   .. audit-event:: exec code_object
+
+      Raises an :func:`auditing event <sys.audit>` ``exec`` with the code object as
+      the argument. Code compilation events may also be raised.
+
    .. note::
 
       The built-in functions :func:`globals` and :func:`locals` return the current
@@ -747,6 +763,16 @@ are always available.  They are listed here in alphabetical order.
    If the :mod:`readline` module was loaded, then :func:`input` will use it
    to provide elaborate line editing and history features.
 
+   .. audit-event:: builtins.input prompt
+
+      Raises an :func:`auditing event <sys.audit>` ``builtins.input`` with
+      argument ``prompt`` before reading input
+
+   .. audit-event:: builtins.input/result result
+
+      Raises an auditing event ``builtins.input/result`` with the result after
+      successfully reading input.
+
 
 .. class:: int([x])
            int(x, base=10)
@@ -1176,6 +1202,11 @@ are always available.  They are listed here in alphabetical order.
    (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`,
    and :mod:`shutil`.
 
+   .. audit-event:: open "file mode flags"
+
+   The ``mode`` and ``flags`` arguments may have been modified or inferred from
+   the original call.
+
    .. versionchanged::
       3.3
 
index 0f1251687aeb131513a60d2ee5c966fa48e73489..2fb27c3aad78b97b6f8f4bf18d8fb9c3fd300f51 100644 (file)
@@ -120,6 +120,27 @@ High-level Module Interface
 
    This is an alias for the builtin :func:`open` function.
 
+   .. audit-event:: open "path mode flags"
+
+      This function raises an :func:`auditing event <sys.audit>` ``open`` with
+      arguments ``path``, ``mode`` and ``flags``. The ``mode`` and ``flags``
+      arguments may have been modified or inferred from the original call.
+
+
+.. function:: open_code(path)
+
+   Opens the provided file with mode ``'rb'``. This function should be used
+   when the intent is to treat the contents as executable code.
+
+   ``path`` should be an absolute path.
+
+   The behavior of this function may be overridden by an earlier call to the
+   :c:func:`PyFile_SetOpenCodeHook`, however, it should always be considered
+   interchangeable with ``open(path, 'rb')``. Overriding the behavior is
+   intended for additional validation or preprocessing of the file.
+
+   .. versionadded:: 3.8
+
 
 .. exception:: BlockingIOError
 
index 0f895d76b83fa89767d2ce8641435eec9086f3d3..a82caf86e8018a24a739c52c4c6d48e7b3dfa3f0 100644 (file)
@@ -67,6 +67,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
    will be relative to the offset from the beginning of the file. *offset*
    defaults to 0.  *offset* must be a multiple of the :const:`ALLOCATIONGRANULARITY`.
 
+   .. audit-event:: mmap.__new__ "fileno length access offset"
 
 .. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])
    :noindex:
@@ -155,6 +156,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
 
           mm.close()
 
+   .. audit-event:: mmap.__new__ "fileno length access offset"
 
    Memory-mapped file objects support the following methods:
 
index 0bbfce97c54ba63f87a2b054b9bfac7147bb5d11..6df2b49c5325e698ce5027041804dccb5de9d67c 100644 (file)
@@ -651,7 +651,7 @@ process and user.
 File Object Creation
 --------------------
 
-This function creates new :term:`file objects <file object>`.  (See also
+These functions create new :term:`file objects <file object>`.  (See also
 :func:`~os.open` for opening file descriptors.)
 
 
@@ -829,11 +829,14 @@ as internal buffering of data.
    most *length* bytes in size.  As of Python 3.3, this is equivalent to
    ``os.truncate(fd, length)``.
 
+   .. audit-event:: os.truncate "fd length"
+
    .. availability:: Unix, Windows.
 
    .. versionchanged:: 3.5
       Added support for Windows
 
+
 .. function:: get_blocking(fd)
 
    Get the blocking mode of the file descriptor: ``False`` if the
@@ -845,6 +848,7 @@ as internal buffering of data.
 
    .. versionadded:: 3.5
 
+
 .. function:: isatty(fd)
 
    Return ``True`` if the file descriptor *fd* is open and connected to a
@@ -912,6 +916,8 @@ as internal buffering of data.
    This function can support :ref:`paths relative to directory descriptors
    <dir_fd>` with the *dir_fd* parameter.
 
+   .. audit-event:: open "path mode flags"
+
    .. versionchanged:: 3.4
       The new file descriptor is now non-inheritable.
 
@@ -2756,6 +2762,8 @@ features:
 
    This function can support :ref:`specifying a file descriptor <path_fd>`.
 
+   .. audit-event:: os.truncate "path length"
+
    .. availability:: Unix, Windows.
 
    .. versionadded:: 3.3
@@ -3715,6 +3723,8 @@ written in Python, such as a mail server's external command delivery program.
    to using this function.  See the :ref:`subprocess-replacements` section in
    the :mod:`subprocess` documentation for some helpful recipes.
 
+   .. audit-event:: os.system command
+
    .. availability:: Unix, Windows.
 
 
index 27721e698826a15f9bf06c12841e1d81a9792cb1..f4c41ac68d2f7997004f2a59a6ff05cccc0ee187 100644 (file)
@@ -427,6 +427,7 @@ The :mod:`pickle` module exports two classes, :class:`Pickler` and
       how they can be loaded, potentially reducing security risks. Refer to
       :ref:`pickle-restrict` for details.
 
+      .. audit-event:: pickle.find_class "module name"
 
 .. _pickle-picklable:
 
index 379633a3b6052bac3fe0a817b66662ed2ebbc214..e23a4f5380bd7b62963eb71a36afad575f033a83 100644 (file)
@@ -526,6 +526,8 @@ The following functions all create :ref:`socket objects <socket-objects>`.
 
    The newly created socket is :ref:`non-inheritable <fd_inheritance>`.
 
+   .. audit-event:: socket.__new__ "self family type protocol"
+
    .. versionchanged:: 3.3
       The AF_CAN family was added.
       The AF_RDS family was added.
@@ -718,6 +720,8 @@ The :mod:`socket` module also offers various network-related services:
    :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect`
    method.
 
+   .. audit-event:: socket.getaddrinfo "host port family type protocol"
+
    The following example fetches address information for a hypothetical TCP
    connection to ``example.org`` on port 80 (results may differ on your
    system if IPv6 isn't enabled)::
@@ -753,6 +757,8 @@ The :mod:`socket` module also offers various network-related services:
    interface. :func:`gethostbyname` does not support IPv6 name resolution, and
    :func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support.
 
+   .. audit-event:: socket.gethostbyname hostname
+
 
 .. function:: gethostbyname_ex(hostname)
 
@@ -765,12 +771,16 @@ The :mod:`socket` module also offers various network-related services:
    resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual
    stack support.
 
+   .. audit-event:: socket.gethostbyname hostname
+
 
 .. function:: gethostname()
 
    Return a string containing the hostname of the machine where  the Python
    interpreter is currently executing.
 
+   .. audit-event:: socket.gethostname
+
    Note: :func:`gethostname` doesn't always return the fully qualified domain
    name; use :func:`getfqdn` for that.
 
@@ -785,6 +795,8 @@ The :mod:`socket` module also offers various network-related services:
    domain name, use the function :func:`getfqdn`. :func:`gethostbyaddr` supports
    both IPv4 and IPv6.
 
+   .. audit-event:: socket.gethostbyaddr ip_address
+
 
 .. function:: getnameinfo(sockaddr, flags)
 
@@ -798,6 +810,8 @@ The :mod:`socket` module also offers various network-related services:
 
    For more information about *flags* you can consult :manpage:`getnameinfo(3)`.
 
+   .. audit-event:: socket.getnameinfo sockaddr
+
 .. function:: getprotobyname(protocolname)
 
    Translate an Internet protocol name (for example, ``'icmp'``) to a constant
@@ -813,6 +827,8 @@ The :mod:`socket` module also offers various network-related services:
    service.  The optional protocol name, if given, should be ``'tcp'`` or
    ``'udp'``, otherwise any protocol will match.
 
+   .. audit-event:: socket.getservbyname "servicename protocolname"
+
 
 .. function:: getservbyport(port[, protocolname])
 
@@ -820,6 +836,8 @@ The :mod:`socket` module also offers various network-related services:
    service.  The optional protocol name, if given, should be ``'tcp'`` or
    ``'udp'``, otherwise any protocol will match.
 
+   .. audit-event:: socket.getservbyport "port protocolname"
+
 
 .. function:: ntohl(x)
 
@@ -1003,6 +1021,8 @@ The :mod:`socket` module also offers various network-related services:
    Set the machine's hostname to *name*.  This will raise an
    :exc:`OSError` if you don't have enough rights.
 
+   .. audit-event:: socket.sethostname name
+
    .. availability:: Unix.
 
    .. versionadded:: 3.3
@@ -1078,6 +1098,7 @@ to sockets.
    Bind the socket to *address*.  The socket must not already be bound. (The format
    of *address* depends on the address family --- see above.)
 
+   .. audit-event:: socket.bind "self address"
 
 .. method:: socket.close()
 
@@ -1115,6 +1136,8 @@ to sockets.
    :exc:`InterruptedError` exception if the connection is interrupted by a
    signal (or the exception raised by the signal handler).
 
+   .. audit-event:: socket.connect "self address"
+
    .. versionchanged:: 3.5
       The method now waits until the connection completes instead of raising an
       :exc:`InterruptedError` exception if the connection is interrupted by a
@@ -1131,6 +1154,7 @@ to sockets.
    :c:data:`errno` variable.  This is useful to support, for example, asynchronous
    connects.
 
+   .. audit-event:: socket.connect "self address"
 
 .. method:: socket.detach()
 
@@ -1472,6 +1496,8 @@ to sockets.
    bytes sent. (The format of *address* depends on the address family --- see
    above.)
 
+   .. audit-event:: socket.sendto "self address"
+
    .. versionchanged:: 3.5
       If the system call is interrupted and the signal handler does not raise
       an exception, the method now retries the system call instead of raising
@@ -1511,6 +1537,8 @@ to sockets.
 
    .. availability:: most Unix platforms, possibly others.
 
+   .. audit-event:: socket.sendmsg "self address"
+
    .. versionadded:: 3.3
 
    .. versionchanged:: 3.5
index 3b754bd4e27677e0b17d1bd9920a289dba8be389..0294f74368c0faca95d2c1f5ba16955f180fb2db 100644 (file)
@@ -19,6 +19,30 @@ always available.
    .. versionadded:: 3.2
 
 
+.. function:: addaudithook(hook)
+
+   Adds the callable *hook* to the collection of active auditing hooks for the
+   current interpreter.
+
+   When an auditing event is raised through the :func:`sys.audit` function, each
+   hook will be called in the order it was added with the event name and the
+   tuple of arguments. Native hooks added by :c:func:`PySys_AddAuditHook` are
+   called first, followed by hooks added in the current interpreter.
+
+   Calling this function will trigger an event for all existing hooks, and if
+   any raise an exception derived from :class:`Exception`, the add will be
+   silently ignored. As a result, callers cannot assume that their hook has been
+   added unless they control all existing hooks.
+
+   .. versionadded:: 3.8
+
+   .. impl-detail::
+
+      When tracing is enabled, Python hooks are only traced if the callable has
+      a ``__cantrace__`` member that is set to a true value. Otherwise, trace
+      functions will not see the hook.
+
+
 .. data:: argv
 
    The list of command line arguments passed to a Python script. ``argv[0]`` is the
@@ -37,6 +61,30 @@ always available.
       ``[os.fsencode(arg) for arg in sys.argv]``.
 
 
+.. _auditing:
+
+.. function:: audit(event, *args)
+
+   .. index:: single: auditing
+
+   Raises an auditing event with any active hooks. The event name is a string
+   identifying the event and its associated schema, which is the number and
+   types of arguments. The schema for a given event is considered public and
+   stable API and should not be modified between releases.
+
+   This function will raise the first exception raised by any hook. In general,
+   these errors should not be handled and should terminate the process as
+   quickly as possible.
+
+   Hooks are added using the :func:`sys.addaudithook` or
+   :c:func:`PySys_AddAuditHook` functions.
+
+   The native equivalent of this function is :c:func:`PySys_Audit`. Using the
+   native function is preferred when possible.
+
+   .. versionadded:: 3.8
+
+
 .. data:: base_exec_prefix
 
    Set during Python startup, before ``site.py`` is run, to the same value as
@@ -114,6 +162,8 @@ always available.
 
    This function should be used for internal and specialized purposes only.
 
+   .. audit-event:: sys._current_frames
+
 
 .. function:: breakpointhook()
 
@@ -617,6 +667,8 @@ always available.
    that is deeper than the call stack, :exc:`ValueError` is raised.  The default
    for *depth* is zero, returning the frame at the top of the call stack.
 
+   .. audit-event:: sys._getframe
+
    .. impl-detail::
 
       This function should be used for internal and specialized purposes only.
@@ -1146,6 +1198,8 @@ always available.
    ``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends
    on the event type.
 
+   .. audit-event:: sys.setprofile
+
    The events have the following meaning:
 
    ``'call'``
@@ -1266,6 +1320,8 @@ always available.
 
    For more information on code and frame objects, refer to :ref:`types`.
 
+   .. audit-event:: sys.settrace
+
    .. impl-detail::
 
       The :func:`settrace` function is intended only for implementing debuggers,
@@ -1286,6 +1342,13 @@ always available.
    first time. The *finalizer* will be called when an asynchronous generator
    is about to be garbage collected.
 
+   .. audit-event:: sys.set_asyncgen_hooks_firstiter
+
+   .. audit-event:: sys.set_asyncgen_hooks_finalizer
+
+   Two auditing events are raised because the underlying API consists of two
+   calls, each of which must raise its own event.
+
    .. versionadded:: 3.6
       See :pep:`525` for more details, and for a reference example of a
       *finalizer* method see the implementation of
index 14fa27bb08af207b358552d0a4a017b4498ea76b..1895ae74b4f5de84a0e82d60b0597f777b6bed27 100644 (file)
@@ -95,6 +95,12 @@ The :mod:`urllib.request` module defines the following functions:
    parameter to ``urllib.urlopen``, can be obtained by using
    :class:`ProxyHandler` objects.
 
+   .. audit-event:: urllib.request "fullurl data headers method"
+
+      The default opener raises an :func:`auditing event <sys.audit>`
+      ``urllib.request`` with arguments ``fullurl``, ``data``, ``headers``,
+      ``method`` taken from the request object.
+
    .. versionchanged:: 3.2
       *cafile* and *capath* were added.
 
@@ -118,6 +124,7 @@ The :mod:`urllib.request` module defines the following functions:
        :func:`ssl.create_default_context` select the system's trusted CA
        certificates for you.
 
+
 .. function:: install_opener(opener)
 
    Install an :class:`OpenerDirector` instance as the default global opener.
index e097c13eab5f4b6cdd95f71279ec23d7385f43e8..f79b25048a5a64f5f4ef27a1d1af18e80cc616c4 100644 (file)
@@ -151,6 +151,45 @@ class Availability(Directive):
         return [pnode]
 
 
+# Support for documenting audit event
+
+class AuditEvent(Directive):
+
+    has_content = True
+    required_arguments = 1
+    optional_arguments = 1
+    final_argument_whitespace = True
+
+    _label = [
+        "Raises an :ref:`auditing event <auditing>` {name} with no arguments.",
+        "Raises an :ref:`auditing event <auditing>` {name} with argument {args}.",
+        "Raises an :ref:`auditing event <auditing>` {name} with arguments {args}.",
+    ]
+
+    def run(self):
+        if len(self.arguments) >= 2 and self.arguments[1]:
+            args = [
+                "``{}``".format(a.strip())
+                for a in self.arguments[1].strip("'\"").split()
+                if a.strip()
+            ]
+        else:
+            args = []
+
+        label = translators['sphinx'].gettext(self._label[min(2, len(args))])
+        text = label.format(name="``{}``".format(self.arguments[0]),
+                            args=", ".join(args))
+
+        pnode = nodes.paragraph(text, classes=["audit-hook"])
+        if self.content:
+            self.state.nested_parse(self.content, self.content_offset, pnode)
+        else:
+            n, m = self.state.inline_text(text, self.lineno)
+            pnode.extend(n + m)
+
+        return [pnode]
+
+
 # Support for documenting decorators
 
 class PyDecoratorMixin(object):
@@ -424,6 +463,7 @@ def setup(app):
     app.add_role('source', source_role)
     app.add_directive('impl-detail', ImplementationDetail)
     app.add_directive('availability', Availability)
+    app.add_directive('audit-event', AuditEvent)
     app.add_directive('deprecated-removed', DeprecatedRemoved)
     app.add_builder(PydocTopicsBuilder)
     app.add_builder(suspicious.CheckSuspiciousMarkupBuilder)
diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h
new file mode 100644 (file)
index 0000000..57eac13
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef Py_CPYTHON_FILEOBJECT_H
+#  error "this header file must not be included directly"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
+
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
+PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
+#endif
+
+#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
+PyAPI_DATA(int) Py_UTF8Mode;
+#endif
+
+/* The std printer acts as a preliminary sys.stderr until the new io
+   infrastructure is in place. */
+PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int);
+PyAPI_DATA(PyTypeObject) PyStdPrinter_Type;
+
+typedef PyObject * (*Py_OpenCodeHookFunction)(PyObject *, void *);
+
+PyAPI_FUNC(PyObject *) PyFile_OpenCode(const char *utf8path);
+PyAPI_FUNC(PyObject *) PyFile_OpenCodeObject(PyObject *path);
+PyAPI_FUNC(int) PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h
new file mode 100644 (file)
index 0000000..72d8ffe
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef Py_CPYTHON_SYSMODULE_H
+#  error "this header file must not be included directly"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key);
+PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *);
+
+PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *);
+
+typedef int(*Py_AuditHookFunction)(const char *, PyObject *, void *);
+
+PyAPI_FUNC(int) PySys_Audit(const char*, const char *, ...);
+PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*);
+
+#ifdef __cplusplus
+}
+#endif
index 89e8dd6a2850ca9709b95a5d7f8dcf8954999a26..456887ef9d045da0e5fa3147554164cd01a70522 100644 (file)
@@ -15,32 +15,13 @@ PyAPI_FUNC(PyObject *) PyFile_GetLine(PyObject *, int);
 PyAPI_FUNC(int) PyFile_WriteObject(PyObject *, PyObject *, int);
 PyAPI_FUNC(int) PyFile_WriteString(const char *, PyObject *);
 PyAPI_FUNC(int) PyObject_AsFileDescriptor(PyObject *);
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *);
-#endif
 
 /* The default encoding used by the platform file system APIs
    If non-NULL, this is different than the default encoding for strings
 */
 PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
-#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
-PyAPI_DATA(const char *) Py_FileSystemDefaultEncodeErrors;
-#endif
 PyAPI_DATA(int) Py_HasFileSystemDefaultEncoding;
 
-#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
-PyAPI_DATA(int) Py_UTF8Mode;
-#endif
-
-/* Internal API
-
-   The std printer acts as a preliminary sys.stderr until the new io
-   infrastructure is in place. */
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) PyFile_NewStdPrinter(int);
-PyAPI_DATA(PyTypeObject) PyStdPrinter_Type;
-#endif /* Py_LIMITED_API */
-
 /* A routine to check if a file descriptor can be select()-ed. */
 #ifdef _MSC_VER
     /* On Windows, any socket fd can be select()-ed, no matter how high */
@@ -49,6 +30,12 @@ PyAPI_DATA(PyTypeObject) PyStdPrinter_Type;
     #define _PyIsSelectable_fd(FD) ((unsigned int)(FD) < (unsigned int)FD_SETSIZE)
 #endif
 
+#ifndef Py_LIMITED_API
+#  define Py_CPYTHON_FILEOBJECT_H
+#  include  "cpython/fileobject.h"
+#  undef Py_CPYTHON_FILEOBJECT_H
+#endif
+
 #ifdef __cplusplus
 }
 #endif
index 1561328e60790365c64069b276151c13c3118946..ef1d8a061f17f5925358074a634600ffca325f3a 100644 (file)
@@ -9,8 +9,10 @@ extern "C" {
 #endif
 
 #include "cpython/coreconfig.h"
+#include "fileobject.h"
 #include "pystate.h"
 #include "pythread.h"
+#include "sysmodule.h"
 
 #include "pycore_gil.h"   /* _gil_runtime_state  */
 #include "pycore_pathconfig.h"
@@ -131,6 +133,8 @@ struct _is {
     uint64_t tstate_next_unique_id;
 
     struct _warnings_runtime_state warnings;
+
+    PyObject *audit_hooks;
 };
 
 PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T);
@@ -154,6 +158,13 @@ struct _xidregitem {
     struct _xidregitem *next;
 };
 
+/* runtime audit hook state */
+
+typedef struct _Py_AuditHookEntry {
+    struct _Py_AuditHookEntry *next;
+    Py_AuditHookFunction hookCFunction;
+    void *userData;
+} _Py_AuditHookEntry;
 
 /* GIL state */
 
@@ -224,6 +235,11 @@ typedef struct pyruntimestate {
     struct _gilstate_runtime_state gilstate;
 
     _PyPreConfig preconfig;
+
+    Py_OpenCodeHookFunction open_code_hook;
+    void *open_code_userdata;
+    _Py_AuditHookEntry *audit_hook_head;
+
     // XXX Consolidate globals found via the check-c-globals script.
 } _PyRuntimeState;
 
index a6a5e7ec224f484c2e8887c4c0ac468f269a3386..5e6a626b01b82f669d685668d4c5ffa3ff474111 100644 (file)
@@ -12,6 +12,7 @@ provider python {
     probe gc__done(long);
     probe import__find__load__start(const char *);
     probe import__find__load__done(const char *, int);
+    probe audit(const char *, void *);
 };
 
 #pragma D attributes Evolving/Evolving/Common provider python provider
index 7a04278166b0ce1e13894c079ffe6bebb5613265..75f8e7f70979c5266635dcf476605421b6a0fad9 100644 (file)
@@ -36,6 +36,7 @@ static inline void PyDTrace_INSTANCE_DELETE_START(int arg0) {}
 static inline void PyDTrace_INSTANCE_DELETE_DONE(int arg0) {}
 static inline void PyDTrace_IMPORT_FIND_LOAD_START(const char *arg0) {}
 static inline void PyDTrace_IMPORT_FIND_LOAD_DONE(const char *arg0, int arg1) {}
+static inline void PyDTrace_AUDIT(const char *arg0, void *arg1) {}
 
 static inline int PyDTrace_LINE_ENABLED(void) { return 0; }
 static inline int PyDTrace_FUNCTION_ENTRY_ENABLED(void) { return 0; }
@@ -48,6 +49,7 @@ static inline int PyDTrace_INSTANCE_DELETE_START_ENABLED(void) { return 0; }
 static inline int PyDTrace_INSTANCE_DELETE_DONE_ENABLED(void) { return 0; }
 static inline int PyDTrace_IMPORT_FIND_LOAD_START_ENABLED(void) { return 0; }
 static inline int PyDTrace_IMPORT_FIND_LOAD_DONE_ENABLED(void) { return 0; }
+static inline int PyDTrace_AUDIT_ENABLED(void) { return 0; }
 
 #endif /* !WITH_DTRACE */
 
index c5547ff6742e068833f4c982b36093033b2e850a..670e5d283f770197b30bb691162195a1ffea9709 100644 (file)
@@ -9,10 +9,6 @@ extern "C" {
 
 PyAPI_FUNC(PyObject *) PySys_GetObject(const char *);
 PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *);
-#ifndef Py_LIMITED_API
-PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key);
-PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *);
-#endif
 
 PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **);
 PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int);
@@ -34,7 +30,9 @@ PyAPI_FUNC(void) PySys_AddXOption(const wchar_t *);
 PyAPI_FUNC(PyObject *) PySys_GetXOptions(void);
 
 #ifndef Py_LIMITED_API
-PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *);
+#  define Py_CPYTHON_SYSMODULE_H
+#  include  "cpython/sysmodule.h"
+#  undef Py_CPYTHON_SYSMODULE_H
 #endif
 
 #ifdef __cplusplus
index be5e4266daffd8339cd5818d2f481ca4e5fef10d..5baca4df82ff44607310789ab3dc5d3c4a4e658b 100644 (file)
@@ -254,6 +254,29 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
         result.close()
         raise
 
+# Define a default pure-Python implementation for open_code()
+# that does not allow hooks. Warn on first use. Defined for tests.
+def _open_code_with_warning(path):
+    """Opens the provided file with mode ``'rb'``. This function
+    should be used when the intent is to treat the contents as
+    executable code.
+
+    ``path`` should be an absolute path.
+
+    When supported by the runtime, this function can be hooked
+    in order to allow embedders more control over code files.
+    This functionality is not supported on the current runtime.
+    """
+    import warnings
+    warnings.warn("_pyio.open_code() may not be using hooks",
+                  RuntimeWarning, 2)
+    return open(path, "rb")
+
+try:
+    open_code = io.open_code
+except AttributeError:
+    open_code = _open_code_with_warning
+
 
 class DocDescriptor:
     """Helper for builtins.open.__doc__
index f8ff5f4f2c5c69dcc6f6b712385ea8850985b408..7da0cd0f196554865a2f6b9c7a883ccb14b64e6f 100644 (file)
@@ -963,8 +963,12 @@ class FileLoader:
 
     def get_data(self, path):
         """Return the data from path as raw bytes."""
-        with _io.FileIO(path, 'r') as file:
-            return file.read()
+        if isinstance(self, (SourceLoader, ExtensionFileLoader)):
+            with _io.open_code(str(path)) as file:
+                return file.read()
+        else:
+            with _io.FileIO(path, 'r') as file:
+                return file.read()
 
     # ResourceReader ABC API.
 
index 968ee5073df1bebbea01a4fdfea7b131cb92d926..fbce6efc010c07c78bcf7b4458d5f7f22cd6f0ba 100644 (file)
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -41,8 +41,8 @@ __author__ = ("Guido van Rossum <guido@python.org>, "
               "Amaury Forgeot d'Arc <amauryfa@gmail.com>, "
               "Benjamin Peterson <benjamin@python.org>")
 
-__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO",
-           "BytesIO", "StringIO", "BufferedIOBase",
+__all__ = ["BlockingIOError", "open", "open_code", "IOBase", "RawIOBase",
+           "FileIO", "BytesIO", "StringIO", "BufferedIOBase",
            "BufferedReader", "BufferedWriter", "BufferedRWPair",
            "BufferedRandom", "TextIOBase", "TextIOWrapper",
            "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"]
@@ -52,7 +52,7 @@ import _io
 import abc
 
 from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation,
-                 open, FileIO, BytesIO, StringIO, BufferedReader,
+                 open, open_code, FileIO, BytesIO, StringIO, BufferedReader,
                  BufferedWriter, BufferedRWPair, BufferedRandom,
                  IncrementalNewlineDecoder, TextIOWrapper)
 
index 595beda4765afec5a243a2c1e8bfcfe8da4e59f3..be8e3811947b74aaf0f854dc38cb8aa581b747e0 100644 (file)
@@ -1436,6 +1436,7 @@ class _Unpickler:
 
     def find_class(self, module, name):
         # Subclasses may override this.
+        sys.audit('pickle.find_class', module, name)
         if self.proto < 3 and self.fix_imports:
             if (module, name) in _compat_pickle.NAME_MAPPING:
                 module, name = _compat_pickle.NAME_MAPPING[(module, name)]
index 9a6585af9d0dd62690be2557380a6c4b5098ef49..84931140b10286b67d257aa21da57ca2b5661741 100644 (file)
@@ -107,6 +107,12 @@ def setup_tests(ns):
 
     support.use_resources = ns.use_resources
 
+    if hasattr(sys, 'addaudithook'):
+        # Add an auditing hook for all tests to ensure PySys_Audit is tested
+        def _test_audit_hook(name, args):
+            pass
+        sys.addaudithook(_test_audit_hook)
+
 
 def replace_stdout():
     """Set stdout encoder error handler to backslashreplace (as stderr error
diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py
new file mode 100644 (file)
index 0000000..5b33d97
--- /dev/null
@@ -0,0 +1,260 @@
+"""Tests for sys.audit and sys.addaudithook
+"""
+
+import os
+import subprocess
+import sys
+import unittest
+from test import support
+
+if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"):
+    raise unittest.SkipTest("test only relevant when sys.audit is available")
+
+
+class TestHook:
+    """Used in standard hook tests to collect any logged events.
+
+    Should be used in a with block to ensure that it has no impact
+    after the test completes. Audit hooks cannot be removed, so the
+    best we can do for the test run is disable it by calling close().
+    """
+
+    def __init__(self, raise_on_events=None, exc_type=RuntimeError):
+        self.raise_on_events = raise_on_events or ()
+        self.exc_type = exc_type
+        self.seen = []
+        self.closed = False
+
+    def __enter__(self, *a):
+        sys.addaudithook(self)
+        return self
+
+    def __exit__(self, *a):
+        self.close()
+
+    def close(self):
+        self.closed = True
+
+    @property
+    def seen_events(self):
+        return [i[0] for i in self.seen]
+
+    def __call__(self, event, args):
+        if self.closed:
+            return
+        self.seen.append((event, args))
+        if event in self.raise_on_events:
+            raise self.exc_type("saw event " + event)
+
+
+class TestFinalizeHook:
+    """Used in the test_finalize_hooks function to ensure that hooks
+    are correctly cleaned up, that they are notified about the cleanup,
+    and are unable to prevent it.
+    """
+
+    def __init__(self):
+        print("Created", id(self), file=sys.stderr, flush=True)
+
+    def __call__(self, event, args):
+        # Avoid recursion when we call id() below
+        if event == "builtins.id":
+            return
+
+        print(event, id(self), file=sys.stderr, flush=True)
+
+        if event == "cpython._PySys_ClearAuditHooks":
+            raise RuntimeError("Should be ignored")
+        elif event == "cpython.PyInterpreterState_Clear":
+            raise RuntimeError("Should be ignored")
+
+
+def run_finalize_test():
+    """Called by test_finalize_hooks in a subprocess."""
+    sys.addaudithook(TestFinalizeHook())
+
+
+class AuditTest(unittest.TestCase):
+    def test_basic(self):
+        with TestHook() as hook:
+            sys.audit("test_event", 1, 2, 3)
+            self.assertEqual(hook.seen[0][0], "test_event")
+            self.assertEqual(hook.seen[0][1], (1, 2, 3))
+
+    def test_block_add_hook(self):
+        # Raising an exception should prevent a new hook from being added,
+        # but will not propagate out.
+        with TestHook(raise_on_events="sys.addaudithook") as hook1:
+            with TestHook() as hook2:
+                sys.audit("test_event")
+                self.assertIn("test_event", hook1.seen_events)
+                self.assertNotIn("test_event", hook2.seen_events)
+
+    def test_block_add_hook_baseexception(self):
+        # Raising BaseException will propagate out when adding a hook
+        with self.assertRaises(BaseException):
+            with TestHook(
+                raise_on_events="sys.addaudithook", exc_type=BaseException
+            ) as hook1:
+                # Adding this next hook should raise BaseException
+                with TestHook() as hook2:
+                    pass
+
+    def test_finalize_hooks(self):
+        events = []
+        with subprocess.Popen(
+            [
+                sys.executable,
+                "-c",
+                "import test.test_audit; test.test_audit.run_finalize_test()",
+            ],
+            encoding="utf-8",
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+        ) as p:
+            p.wait()
+            for line in p.stderr:
+                events.append(line.strip().partition(" "))
+        firstId = events[0][2]
+        self.assertSequenceEqual(
+            [
+                ("Created", " ", firstId),
+                ("cpython._PySys_ClearAuditHooks", " ", firstId),
+            ],
+            events,
+        )
+
+    def test_pickle(self):
+        pickle = support.import_module("pickle")
+
+        class PicklePrint:
+            def __reduce_ex__(self, p):
+                return str, ("Pwned!",)
+
+        payload_1 = pickle.dumps(PicklePrint())
+        payload_2 = pickle.dumps(("a", "b", "c", 1, 2, 3))
+
+        # Before we add the hook, ensure our malicious pickle loads
+        self.assertEqual("Pwned!", pickle.loads(payload_1))
+
+        with TestHook(raise_on_events="pickle.find_class") as hook:
+            with self.assertRaises(RuntimeError):
+                # With the hook enabled, loading globals is not allowed
+                pickle.loads(payload_1)
+            # pickles with no globals are okay
+            pickle.loads(payload_2)
+
+    def test_monkeypatch(self):
+        class A:
+            pass
+
+        class B:
+            pass
+
+        class C(A):
+            pass
+
+        a = A()
+
+        with TestHook() as hook:
+            # Catch name changes
+            C.__name__ = "X"
+            # Catch type changes
+            C.__bases__ = (B,)
+            # Ensure bypassing __setattr__ is still caught
+            type.__dict__["__bases__"].__set__(C, (B,))
+            # Catch attribute replacement
+            C.__init__ = B.__init__
+            # Catch attribute addition
+            C.new_attr = 123
+            # Catch class changes
+            a.__class__ = B
+
+        actual = [(a[0], a[1]) for e, a in hook.seen if e == "object.__setattr__"]
+        self.assertSequenceEqual(
+            [(C, "__name__"), (C, "__bases__"), (C, "__bases__"), (a, "__class__")],
+            actual,
+        )
+
+    def test_open(self):
+        # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open()
+        try:
+            import ssl
+
+            load_dh_params = ssl.create_default_context().load_dh_params
+        except ImportError:
+            load_dh_params = None
+
+        # Try a range of "open" functions.
+        # All of them should fail
+        with TestHook(raise_on_events={"open"}) as hook:
+            for fn, *args in [
+                (open, support.TESTFN, "r"),
+                (open, sys.executable, "rb"),
+                (open, 3, "wb"),
+                (open, support.TESTFN, "w", -1, None, None, None, False, lambda *a: 1),
+                (load_dh_params, support.TESTFN),
+            ]:
+                if not fn:
+                    continue
+                self.assertRaises(RuntimeError, fn, *args)
+
+        actual_mode = [(a[0], a[1]) for e, a in hook.seen if e == "open" and a[1]]
+        actual_flag = [(a[0], a[2]) for e, a in hook.seen if e == "open" and not a[1]]
+        self.assertSequenceEqual(
+            [
+                i
+                for i in [
+                    (support.TESTFN, "r"),
+                    (sys.executable, "r"),
+                    (3, "w"),
+                    (support.TESTFN, "w"),
+                    (support.TESTFN, "rb") if load_dh_params else None,
+                ]
+                if i is not None
+            ],
+            actual_mode,
+        )
+        self.assertSequenceEqual([], actual_flag)
+
+    def test_cantrace(self):
+        traced = []
+
+        def trace(frame, event, *args):
+            if frame.f_code == TestHook.__call__.__code__:
+                traced.append(event)
+
+        old = sys.settrace(trace)
+        try:
+            with TestHook() as hook:
+                # No traced call
+                eval("1")
+
+                # No traced call
+                hook.__cantrace__ = False
+                eval("2")
+
+                # One traced call
+                hook.__cantrace__ = True
+                eval("3")
+
+                # Two traced calls (writing to private member, eval)
+                hook.__cantrace__ = 1
+                eval("4")
+
+                # One traced call (writing to private member)
+                hook.__cantrace__ = 0
+        finally:
+            sys.settrace(old)
+
+        self.assertSequenceEqual(["call"] * 4, traced)
+
+
+if __name__ == "__main__":
+    if len(sys.argv) >= 2 and sys.argv[1] == "spython_test":
+        # Doesn't matter what we add - it will be blocked
+        sys.addaudithook(None)
+
+        sys.exit(0)
+
+    unittest.main()
index 32aabe30a5c8c3b6d403d235187606231b470ba9..87e90f74bb13db084d018f5770e10fcc75d958b2 100644 (file)
@@ -927,5 +927,16 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
                           api=API_PYTHON)
 
 
+class AuditingTests(EmbeddingTestsMixin, unittest.TestCase):
+    def test_open_code_hook(self):
+        self.run_embedded_interpreter("test_open_code_hook")
+
+    def test_audit(self):
+        self.run_embedded_interpreter("test_audit")
+
+    def test_audit_subinterpreter(self):
+        self.run_embedded_interpreter("test_audit_subinterpreter")
+
+
 if __name__ == "__main__":
     unittest.main()
index 57a02656206ff4cd15d76e6ddee34edef6cb2b44..26e4500ae8cfcd763d96989c25682a9a672b1d8b 100644 (file)
@@ -565,6 +565,7 @@ class OtherFileTests:
         self.assertRaises(MyException, MyFileIO, fd)
         os.close(fd)  # should not raise OSError(EBADF)
 
+
 class COtherFileTests(OtherFileTests, unittest.TestCase):
     FileIO = _io.FileIO
     modulename = '_io'
@@ -576,10 +577,32 @@ class COtherFileTests(OtherFileTests, unittest.TestCase):
         self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MAX + 1)
         self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MIN - 1)
 
+    def test_open_code(self):
+        # Check that the default behaviour of open_code matches
+        # open("rb")
+        with self.FileIO(__file__, "rb") as f:
+            expected = f.read()
+        with _io.open_code(__file__) as f:
+            actual = f.read()
+        self.assertEqual(expected, actual)
+
+
 class PyOtherFileTests(OtherFileTests, unittest.TestCase):
     FileIO = _pyio.FileIO
     modulename = '_pyio'
 
+    def test_open_code(self):
+        # Check that the default behaviour of open_code matches
+        # open("rb")
+        with self.FileIO(__file__, "rb") as f:
+            expected = f.read()
+        with check_warnings(quiet=True) as w:
+            # Always test _open_code_with_warning
+            with _pyio._open_code_with_warning(__file__) as f:
+                actual = f.read()
+            self.assertEqual(expected, actual)
+            self.assertNotEqual(w.warnings, [])
+
 
 def test_main():
     # Historically, these tests have been sloppy about removing TESTFN.
index 2c3bf89066799703cd6324ab89e4b2be3d7aa228..6f22b35a9ab9f1561eca1075fa5c8cccc5178557 100644 (file)
@@ -3861,7 +3861,7 @@ class MiscIOTest(unittest.TestCase):
         for name in self.io.__all__:
             obj = getattr(self.io, name, None)
             self.assertIsNotNone(obj, name)
-            if name == "open":
+            if name in ("open", "open_code"):
                 continue
             elif "error" in name.lower() or name == "UnsupportedOperation":
                 self.assertTrue(issubclass(obj, Exception), name)
index 9b21afb74e6e27e598b699ea5bf2524f4cf69cc4..afce8eb1a1b16561195b3a9904029ff46fb9a08f 100644 (file)
@@ -521,6 +521,7 @@ class OpenerDirector:
             meth = getattr(processor, meth_name)
             req = meth(req)
 
+        sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method())
         response = self._open(req, data)
 
         # post-process response
index f430abd6a77c59820185aa400be935e103ab0bd3..fd917c16b01535e0a1503033fbddb681e6570a0e 100644 (file)
@@ -351,7 +351,7 @@ def _get_module_info(self, fullname):
 # data_size and file_offset are 0.
 def _read_directory(archive):
     try:
-        fp = _io.open(archive, 'rb')
+        fp = _io.open_code(archive)
     except OSError:
         raise ZipImportError(f"can't open Zip file: {archive!r}", path=archive)
 
@@ -533,7 +533,7 @@ def _get_data(archive, toc_entry):
     if data_size < 0:
         raise ZipImportError('negative data size')
 
-    with _io.open(archive, 'rb') as fp:
+    with _io.open_code(archive) as fp:
         # Check to make sure the local file header is correct
         try:
             fp.seek(file_offset)
index d006a73c38bed6826523bba896dad6cd199acbf2..12891e938236a4bb308eca590e8398f8c23747bb 100644 (file)
@@ -1052,6 +1052,7 @@ PYTHON_HEADERS= \
                $(srcdir)/Include/cpython/abstract.h \
                $(srcdir)/Include/cpython/coreconfig.h \
                $(srcdir)/Include/cpython/dictobject.h \
+               $(srcdir)/Include/cpython/fileobject.h \
                $(srcdir)/Include/cpython/interpreteridobject.h \
                $(srcdir)/Include/cpython/object.h \
                $(srcdir)/Include/cpython/objimpl.h \
@@ -1059,6 +1060,7 @@ PYTHON_HEADERS= \
                $(srcdir)/Include/cpython/pylifecycle.h \
                $(srcdir)/Include/cpython/pymem.h \
                $(srcdir)/Include/cpython/pystate.h \
+               $(srcdir)/Include/cpython/sysmodule.h \
                $(srcdir)/Include/cpython/traceback.h \
                $(srcdir)/Include/cpython/tupleobject.h \
                $(srcdir)/Include/cpython/unicodeobject.h \
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst
new file mode 100644 (file)
index 0000000..5e23d31
--- /dev/null
@@ -0,0 +1 @@
+Implement PEP 578, adding sys.audit, io.open_code and related APIs.
index 7b5115359ed7e8a72b0b47bb0809daf55b6aa01f..f4eb53657dd4081e2a3f70d3afbee5606d2cb7b2 100644 (file)
@@ -2920,6 +2920,10 @@ PyCData_AtAddress(PyObject *type, void *buf)
     CDataObject *pd;
     StgDictObject *dict;
 
+    if (PySys_Audit("ctypes.cdata", "n", (Py_ssize_t)buf) < 0) {
+        return NULL;
+    }
+
     assert(PyType_Check(type));
     dict = PyType_stgdict(type);
     if (!dict) {
@@ -3455,6 +3459,18 @@ PyCFuncPtr_FromDll(PyTypeObject *type, PyObject *args, PyObject *kwds)
         return NULL;
     }
 
+#ifdef MS_WIN32
+    if (PySys_Audit("ctypes.dlsym",
+                    ((uintptr_t)name & ~0xFFFF) ? "Os" : "On",
+                    dll, name) < 0) {
+        return NULL;
+    }
+#else
+    if (PySys_Audit("ctypes.dlsym", "Os", dll, name) < 0) {
+        return NULL;
+    }
+#endif
+
     obj = PyObject_GetAttrString(dll, "_handle");
     if (!obj) {
         Py_DECREF(ftuple);
index a8ba84be4a76126c5387ec4bc97db55384b38b80..8682d548722015beb4222a316ba15fd94bc5bc34 100644 (file)
@@ -1277,6 +1277,10 @@ static PyObject *load_library(PyObject *self, PyObject *args)
     if (!name)
         return NULL;
 
+    if (PySys_Audit("ctypes.dlopen", "O", nameobj) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     /* bpo-36085: Limit DLL search directories to avoid pre-loading
      * attacks and enable use of the AddDllDirectory function.
@@ -1382,6 +1386,9 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args)
         name_str = NULL;
         name2 = NULL;
     }
+    if (PySys_Audit("ctypes.dlopen", "s", name_str) < 0) {
+        return NULL;
+    }
     handle = ctypes_dlopen(name_str, mode);
     Py_XDECREF(name2);
     if (!handle) {
index 590d6ce9f1e52ee36ad69b9273c019afe1d2326e..ba8f0018043f7d2a850ad60ba4e0e0379b82f8cd 100644 (file)
@@ -503,6 +503,25 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode,
     Py_XDECREF(modeobj);
     return NULL;
 }
+
+/*[clinic input]
+_io.open_code
+
+    path : unicode
+
+Opens the provided file with the intent to import the contents.
+
+This may perform extra validation beyond open(), but is otherwise interchangeable
+with calling open(path, 'rb').
+
+[clinic start generated code]*/
+
+static PyObject *
+_io_open_code_impl(PyObject *module, PyObject *path)
+/*[clinic end generated code: output=2fe4ecbd6f3d6844 input=f5c18e23f4b2ed9f]*/
+{
+    return PyFile_OpenCodeObject(path);
+}
 \f
 /*
  * Private helpers for the io module.
@@ -630,6 +649,7 @@ iomodule_free(PyObject *mod) {
 
 static PyMethodDef module_methods[] = {
     _IO_OPEN_METHODDEF
+    _IO_OPEN_CODE_METHODDEF
     {NULL, NULL}
 };
 
index 990c81c355747ad5237b8faa0d93df84f660050d..00ad616b41fe6e98b9637022aabd5b8a8cee6ead 100644 (file)
@@ -281,4 +281,46 @@ skip_optional_pos:
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=19fc9b69a5166f63 input=a9049054013a1b77]*/
+
+PyDoc_STRVAR(_io_open_code__doc__,
+"open_code($module, /, path)\n"
+"--\n"
+"\n"
+"Opens the provided file with the intent to import the contents.\n"
+"\n"
+"This may perform extra validation beyond open(), but is otherwise interchangeable\n"
+"with calling open(path, \'rb\').");
+
+#define _IO_OPEN_CODE_METHODDEF    \
+    {"open_code", (PyCFunction)(void(*)(void))_io_open_code, METH_FASTCALL|METH_KEYWORDS, _io_open_code__doc__},
+
+static PyObject *
+_io_open_code_impl(PyObject *module, PyObject *path);
+
+static PyObject *
+_io_open_code(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+    PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"path", NULL};
+    static _PyArg_Parser _parser = {NULL, _keywords, "open_code", 0};
+    PyObject *argsbuf[1];
+    PyObject *path;
+
+    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+    if (!args) {
+        goto exit;
+    }
+    if (!PyUnicode_Check(args[0])) {
+        _PyArg_BadArgument("open_code", 1, "str", args[0]);
+        goto exit;
+    }
+    if (PyUnicode_READY(args[0]) == -1) {
+        goto exit;
+    }
+    path = args[0];
+    return_value = _io_open_code_impl(module, path);
+
+exit:
+    return return_value;
+}
+/*[clinic end generated code: output=d479285078750d68 input=a9049054013a1b77]*/
index c502c430134ef6ccbd2aae9b4247ca4dca469448..52a6f49e1d325b38c034a3c4d17fe932e9767a9b 100644 (file)
@@ -358,6 +358,10 @@ _io_FileIO___init___impl(fileio *self, PyObject *nameobj, const char *mode,
     flags |= O_CLOEXEC;
 #endif
 
+    if (PySys_Audit("open", "Osi", nameobj, mode, flags) < 0) {
+        goto error;
+    }
+
     if (fd >= 0) {
         self->fd = fd;
         self->closefd = closefd;
index 87f3cf7b614aabac89caf6aeafc0decc23546043..24a5d22770127412cfb06e249226e59cb365010b 100644 (file)
@@ -6659,6 +6659,11 @@ _pickle_Unpickler_find_class_impl(UnpicklerObject *self,
     PyObject *global;
     PyObject *module;
 
+    if (PySys_Audit("pickle.find_class", "OO",
+                    module_name, global_name) < 0) {
+        return NULL;
+    }
+
     /* Try to map the old names used in Python 2.x to the new ones used in
        Python 3.x.  We do this only with old pickle protocols and when the
        user has not disabled the feature. */
index 8873519e6ce5df9070bf93da7872bf0e9cdae8e0..1317fc9a172c0d8bf7a838fee0615cf4488ffbe8 100644 (file)
@@ -461,6 +461,12 @@ _winapi_CreateFile_impl(PyObject *module, LPCTSTR file_name,
 {
     HANDLE handle;
 
+    if (PySys_Audit("_winapi.CreateFile", "uIIII",
+                    file_name, desired_access, share_mode,
+                    creation_disposition, flags_and_attributes) < 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     handle = CreateFile(file_name, desired_access,
                         share_mode, security_attributes,
@@ -542,6 +548,10 @@ _winapi_CreateJunction_impl(PyObject *module, LPWSTR src_path,
     if (wcsncmp(src_path, L"\\??\\", prefix_len) == 0)
         return PyErr_SetFromWindowsErr(ERROR_INVALID_PARAMETER);
 
+    if (PySys_Audit("_winapi.CreateJunction", "uu", src_path, dst_path) < 0) {
+        return NULL;
+    }
+
     /* Adjust privileges to allow rewriting directory entry as a
        junction point. */
     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
@@ -670,6 +680,11 @@ _winapi_CreateNamedPipe_impl(PyObject *module, LPCTSTR name, DWORD open_mode,
 {
     HANDLE handle;
 
+    if (PySys_Audit("_winapi.CreateNamedPipe", "uII",
+                    name, open_mode, pipe_mode) < 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     handle = CreateNamedPipe(name, open_mode, pipe_mode,
                              max_instances, out_buffer_size,
@@ -704,6 +719,10 @@ _winapi_CreatePipe_impl(PyObject *module, PyObject *pipe_attrs, DWORD size)
     HANDLE write_pipe;
     BOOL result;
 
+    if (PySys_Audit("_winapi.CreatePipe", NULL) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     result = CreatePipe(&read_pipe, &write_pipe, NULL, size);
     Py_END_ALLOW_THREADS
@@ -1055,6 +1074,11 @@ _winapi_CreateProcess_impl(PyObject *module,
     wchar_t *command_line_copy = NULL;
     AttributeList attribute_list = {0};
 
+    if (PySys_Audit("_winapi.CreateProcess", "uuu", application_name,
+                    command_line, current_directory) < 0) {
+        return NULL;
+    }
+
     ZeroMemory(&si, sizeof(si));
     si.StartupInfo.cb = sizeof(si);
 
@@ -1270,8 +1294,10 @@ _winapi_GetModuleFileName_impl(PyObject *module, HMODULE module_handle)
     BOOL result;
     WCHAR filename[MAX_PATH];
 
+    Py_BEGIN_ALLOW_THREADS
     result = GetModuleFileNameW(module_handle, filename, MAX_PATH);
     filename[MAX_PATH-1] = '\0';
+    Py_END_ALLOW_THREADS
 
     if (! result)
         return PyErr_SetFromWindowsErr(GetLastError());
@@ -1402,9 +1428,16 @@ _winapi_OpenProcess_impl(PyObject *module, DWORD desired_access,
 {
     HANDLE handle;
 
+    if (PySys_Audit("_winapi.OpenProcess", "II",
+                    process_id, desired_access) < 0) {
+        return INVALID_HANDLE_VALUE;
+    }
+
+    Py_BEGIN_ALLOW_THREADS
     handle = OpenProcess(desired_access, inherit_handle, process_id);
+    Py_END_ALLOW_THREADS
     if (handle == NULL) {
-        PyErr_SetFromWindowsErr(0);
+        PyErr_SetFromWindowsErr(GetLastError());
         handle = INVALID_HANDLE_VALUE;
     }
 
@@ -1539,6 +1572,7 @@ _winapi_SetNamedPipeHandleState_impl(PyObject *module, HANDLE named_pipe,
     PyObject *oArgs[3] = {mode, max_collection_count, collect_data_timeout};
     DWORD dwArgs[3], *pArgs[3] = {NULL, NULL, NULL};
     int i;
+    BOOL b;
 
     for (i = 0 ; i < 3 ; i++) {
         if (oArgs[i] != Py_None) {
@@ -1549,7 +1583,11 @@ _winapi_SetNamedPipeHandleState_impl(PyObject *module, HANDLE named_pipe,
         }
     }
 
-    if (!SetNamedPipeHandleState(named_pipe, pArgs[0], pArgs[1], pArgs[2]))
+    Py_BEGIN_ALLOW_THREADS
+    b = SetNamedPipeHandleState(named_pipe, pArgs[0], pArgs[1], pArgs[2]);
+    Py_END_ALLOW_THREADS
+
+    if (!b)
         return PyErr_SetFromWindowsErr(0);
 
     Py_RETURN_NONE;
@@ -1573,6 +1611,11 @@ _winapi_TerminateProcess_impl(PyObject *module, HANDLE handle,
 {
     BOOL result;
 
+    if (PySys_Audit("_winapi.TerminateProcess", "nI",
+                    (Py_ssize_t)handle, exit_code) < 0) {
+        return NULL;
+    }
+
     result = TerminateProcess(handle, exit_code);
 
     if (! result)
index 523afb99e8ae6eb718d72ea56e2e1cb172eb5fad..423cac9910a29339ad196578ae70778894c8a474 100644 (file)
@@ -2635,6 +2635,11 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
     if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
         return NULL;
 
+    if (PySys_Audit("array.__new__", "CO",
+                    c, initial ? initial : Py_None) < 0) {
+        return NULL;
+    }
+
     if (initial && c != 'u') {
         if (PyUnicode_Check(initial)) {
             PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
index 917c6362c11d9af0861949eb522186c9cffa4927..fdd60bbb6eefcacadd0d1ba5cbc1a52e0c118c9b 100644 (file)
@@ -1110,6 +1110,11 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
                             "mmap invalid access parameter.");
     }
 
+    if (PySys_Audit("mmap.__new__", "ini" _Py_PARSE_OFF_T,
+                    fileno, map_size, access, offset) < 0) {
+        return NULL;
+    }
+
 #ifdef __APPLE__
     /* Issue #11277: fsync(2) is not enough on OS X - a special, OS X specific
        fcntl(2) is necessary to force DISKSYNC and get around mmap(2) bug */
@@ -1240,6 +1245,11 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
         return NULL;
     }
 
+    if (PySys_Audit("mmap.__new__", "iniL",
+                    fileno, map_size, access, offset) < 0) {
+        return NULL;
+    }
+
     switch((access_mode)access) {
     case ACCESS_READ:
         flProtect = PAGE_READONLY;
index 9f15866d9d3db4048ea2c875c1f51755bea26196..8ebe3a0be05350191810f25fac351ab03ab4423e 100644 (file)
@@ -4264,6 +4264,11 @@ os_system_impl(PyObject *module, const Py_UNICODE *command)
 /*[clinic end generated code: output=5b7c3599c068ca42 input=303f5ce97df606b0]*/
 {
     long result;
+
+    if (PySys_Audit("system", "(u)", command) < 0) {
+        return -1;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     _Py_BEGIN_SUPPRESS_IPH
     result = _wsystem(command);
@@ -4286,6 +4291,11 @@ os_system_impl(PyObject *module, PyObject *command)
 {
     long result;
     const char *bytes = PyBytes_AsString(command);
+
+    if (PySys_Audit("system", "(O)", command) < 0) {
+        return -1;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     result = system(bytes);
     Py_END_ALLOW_THREADS
@@ -8279,6 +8289,10 @@ os_open_impl(PyObject *module, path_t *path, int flags, int mode, int dir_fd)
     flags |= O_CLOEXEC;
 #endif
 
+    if (PySys_Audit("open", "OOi", path->object, Py_None, flags) < 0) {
+        return -1;
+    }
+
     _Py_BEGIN_SUPPRESS_IPH
     do {
         Py_BEGIN_ALLOW_THREADS
@@ -9598,6 +9612,10 @@ os_ftruncate_impl(PyObject *module, int fd, Py_off_t length)
     int result;
     int async_err = 0;
 
+    if (PySys_Audit("os.truncate", "in", fd, length) < 0) {
+        return NULL;
+    }
+
     do {
         Py_BEGIN_ALLOW_THREADS
         _Py_BEGIN_SUPPRESS_IPH
@@ -9641,6 +9659,10 @@ os_truncate_impl(PyObject *module, path_t *path, Py_off_t length)
     if (path->fd != -1)
         return os_ftruncate_impl(module, path->fd, length);
 
+    if (PySys_Audit("os.truncate", "On", path->object, length) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     _Py_BEGIN_SUPPRESS_IPH
 #ifdef MS_WINDOWS
index c024542fe70923c1457cab84e99fb22042fd83f3..74cdc0f2f6caed5aec4e942521ecd8a90dd1fc32 100644 (file)
@@ -3053,6 +3053,11 @@ sock_bind(PySocketSockObject *s, PyObject *addro)
     if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
         return NULL;
     }
+
+    if (PySys_Audit("socket.bind", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
     Py_END_ALLOW_THREADS
@@ -3219,6 +3224,10 @@ sock_connect(PySocketSockObject *s, PyObject *addro)
         return NULL;
     }
 
+    if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
     if (res < 0)
         return NULL;
@@ -3246,6 +3255,10 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro)
         return NULL;
     }
 
+    if (PySys_Audit("socket.connect", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
     if (res < 0)
         return NULL;
@@ -4248,6 +4261,10 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
         return NULL;
     }
 
+    if (PySys_Audit("socket.sendto", "OO", s, addro) < 0) {
+        return NULL;
+    }
+
     ctx.buf = pbuf.buf;
     ctx.len = pbuf.len;
     ctx.flags = flags;
@@ -4379,8 +4396,15 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args)
         {
             goto finally;
         }
+        if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) {
+            return NULL;
+        }
         msg.msg_name = &addrbuf;
         msg.msg_namelen = addrlen;
+    } else {
+        if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) {
+            return NULL;
+        }
     }
 
     /* Fill in an iovec for each message part, and save the Py_buffer
@@ -5030,6 +5054,17 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
                                      &family, &type, &proto, &fdobj))
         return -1;
 
+#ifdef MS_WINDOWS
+    /* In this case, we don't use the family, type and proto args */
+    if (fdobj != NULL && fdobj != Py_None)
+#endif
+    {
+        if (PySys_Audit("socket.__new__", "Oiii",
+                        s, family, type, proto) < 0) {
+            return -1;
+        }
+    }
+
     if (fdobj != NULL && fdobj != Py_None) {
 #ifdef MS_WINDOWS
         /* recreate a socket that was duplicated */
@@ -5042,6 +5077,12 @@ sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
                 return -1;
             }
             memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
+
+            if (PySys_Audit("socket()", "iii", info.iAddressFamily,
+                            info.iSocketType, info.iProtocol) < 0) {
+                return -1;
+            }
+
             Py_BEGIN_ALLOW_THREADS
             fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
                      FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
@@ -5284,6 +5325,10 @@ static PyTypeObject sock_type = {
 static PyObject *
 socket_gethostname(PyObject *self, PyObject *unused)
 {
+    if (PySys_Audit("socket.gethostname", NULL) < 0) {
+        return NULL;
+    }
+
 #ifdef MS_WINDOWS
     /* Don't use winsock's gethostname, as this returns the ANSI
        version of the hostname, whereas we need a Unicode string.
@@ -5362,6 +5407,11 @@ extern int sethostname(const char *, size_t);
             return NULL;
         flag = 1;
     }
+
+    if (PySys_Audit("socket.sethostname", "(O)", hnobj) < 0) {
+        return NULL;
+    }
+
     res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
     if (!res) {
         res = sethostname(buf.buf, buf.len);
@@ -5387,6 +5437,9 @@ socket_gethostbyname(PyObject *self, PyObject *args)
 
     if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
         return NULL;
+    if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
+        goto finally;
+    }
     if (setipaddr(name, (struct sockaddr *)&addrbuf,  sizeof(addrbuf), AF_INET) < 0)
         goto finally;
     ret = make_ipv4_addr(&addrbuf);
@@ -5571,6 +5624,9 @@ socket_gethostbyname_ex(PyObject *self, PyObject *args)
 
     if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
         return NULL;
+    if (PySys_Audit("socket.gethostbyname", "O", args) < 0) {
+        goto finally;
+    }
     if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
         goto finally;
     Py_BEGIN_ALLOW_THREADS
@@ -5649,6 +5705,9 @@ socket_gethostbyaddr(PyObject *self, PyObject *args)
 
     if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
         return NULL;
+    if (PySys_Audit("socket.gethostbyaddr", "O", args) < 0) {
+        goto finally;
+    }
     af = AF_UNSPEC;
     if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
         goto finally;
@@ -5720,6 +5779,11 @@ socket_getservbyname(PyObject *self, PyObject *args)
     struct servent *sp;
     if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
         return NULL;
+
+    if (PySys_Audit("socket.getservbyname", "ss", name, proto) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     sp = getservbyname(name, proto);
     Py_END_ALLOW_THREADS
@@ -5757,6 +5821,11 @@ socket_getservbyport(PyObject *self, PyObject *args)
             "getservbyport: port must be 0-65535.");
         return NULL;
     }
+
+    if (PySys_Audit("socket.getservbyport", "is", port, proto) < 0) {
+        return NULL;
+    }
+
     Py_BEGIN_ALLOW_THREADS
     sp = getservbyport(htons((short)port), proto);
     Py_END_ALLOW_THREADS
@@ -6392,6 +6461,12 @@ socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
         pptr = "00";
     }
 #endif
+
+    if (PySys_Audit("socket.getaddrinfo", "OOiii",
+                    hobj, pobj, family, socktype, protocol) < 0) {
+        return NULL;
+    }
+
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = family;
     hints.ai_socktype = socktype;
@@ -6483,6 +6558,11 @@ socket_getnameinfo(PyObject *self, PyObject *args)
                         "getnameinfo(): flowinfo must be 0-1048575.");
         return NULL;
     }
+
+    if (PySys_Audit("socket.getnameinfo", "(O)", sa) < 0) {
+        return NULL;
+    }
+
     PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
     memset(&hints, 0, sizeof(hints));
     hints.ai_family = AF_UNSPEC;
index 62d7c5d329f07b1a17e6818e6a57c98ccd2cebfc..f4e48a9757e5879bb510e031ca118fefb0cdbd59 100644 (file)
@@ -380,6 +380,12 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
                           &PyTuple_Type, &cellvars))
         return NULL;
 
+    if (PySys_Audit("code.__new__", "OOOiiiii",
+                    code, filename, name, argcount, kwonlyargcount,
+                    nlocals, stacksize, flags) < 0) {
+        goto cleanup;
+    }
+
     if (argcount < 0) {
         PyErr_SetString(
             PyExc_ValueError,
index 8f1a823768f393bb322f006fc8102a51d63a135c..0db8057334fd3629291a942791fbc004a5800162 100644 (file)
@@ -144,6 +144,14 @@ member_get(PyMemberDescrObject *descr, PyObject *obj, PyObject *type)
 
     if (descr_check((PyDescrObject *)descr, obj, &res))
         return res;
+
+    if (descr->d_member->flags & READ_RESTRICTED) {
+        if (PySys_Audit("object.__getattr__", "Os",
+            obj ? obj : Py_None, descr->d_member->name) < 0) {
+            return NULL;
+        }
+    }
+
     return PyMember_GetOne((char *)obj, descr->d_member);
 }
 
index 39c7c109979a4816c9dc47dd97c550aed08a85bf..3b026335d3f8f231090f64981f7ca31b4f594f88 100644 (file)
@@ -2,6 +2,7 @@
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
+#include "pycore_pystate.h"
 
 #if defined(HAVE_GETC_UNLOCKED) && !defined(_Py_MEMORY_SANITIZER)
 /* clang MemorySanitizer doesn't yet understand getc_unlocked. */
@@ -33,7 +34,8 @@ PyFile_FromFd(int fd, const char *name, const char *mode, int buffering, const c
     PyObject *io, *stream;
     _Py_IDENTIFIER(open);
 
-    io = PyImport_ImportModule("io");
+    /* import _io in case we are being used to open io.py */
+    io = PyImport_ImportModule("_io");
     if (io == NULL)
         return NULL;
     stream = _PyObject_CallMethodId(io, &PyId_open, "isisssi", fd, mode,
@@ -514,6 +516,72 @@ PyTypeObject PyStdPrinter_Type = {
 };
 
 
+/* ************************** open_code hook ***************************
+ * The open_code hook allows embedders to override the method used to
+ * open files that are going to be used by the runtime to execute code
+ */
+
+int
+PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData) {
+    if (Py_IsInitialized() &&
+        PySys_Audit("setopencodehook", NULL) < 0) {
+        return -1;
+    }
+
+    if (_PyRuntime.open_code_hook) {
+        if (Py_IsInitialized()) {
+            PyErr_SetString(PyExc_SystemError,
+                "failed to change existing open_code hook");
+        }
+        return -1;
+    }
+
+    _PyRuntime.open_code_hook = hook;
+    _PyRuntime.open_code_userdata = userData;
+    return 0;
+}
+
+PyObject *
+PyFile_OpenCodeObject(PyObject *path)
+{
+    PyObject *iomod, *f = NULL;
+    _Py_IDENTIFIER(open);
+
+    if (!PyUnicode_Check(path)) {
+        PyErr_Format(PyExc_TypeError, "'path' must be 'str', not '%.200s'",
+                     Py_TYPE(path)->tp_name);
+        return NULL;
+    }
+
+    Py_OpenCodeHookFunction hook = _PyRuntime.open_code_hook;
+    if (hook) {
+        f = hook(path, _PyRuntime.open_code_userdata);
+    } else {
+        iomod = PyImport_ImportModule("_io");
+        if (iomod) {
+            f = _PyObject_CallMethodId(iomod, &PyId_open, "Os",
+                                       path, "rb");
+            Py_DECREF(iomod);
+        }
+    }
+
+    return f;
+}
+
+PyObject *
+PyFile_OpenCode(const char *utf8path)
+{
+    PyObject *pathobj = PyUnicode_FromString(utf8path);
+    PyObject *f;
+    if (!pathobj) {
+        return NULL;
+    }
+    f = PyFile_OpenCodeObject(pathobj);
+    Py_DECREF(pathobj);
+    return f;
+}
+
+
 #ifdef __cplusplus
 }
 #endif
index e8e2d2e15ccabf27a4ba72dba6187451efe51c76..09b94c2642366690945f13ef30ced3632669ec4a 100644 (file)
@@ -250,6 +250,10 @@ static PyMemberDef func_memberlist[] = {
 static PyObject *
 func_get_code(PyFunctionObject *op, void *Py_UNUSED(ignored))
 {
+    if (PySys_Audit("object.__getattr__", "Os", op, "__code__") < 0) {
+        return NULL;
+    }
+
     Py_INCREF(op->func_code);
     return op->func_code;
 }
@@ -266,6 +270,12 @@ func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
                         "__code__ must be set to a code object");
         return -1;
     }
+
+    if (PySys_Audit("object.__setattr__", "OsO",
+                    op, "__code__", value) < 0) {
+        return -1;
+    }
+
     nfree = PyCode_GetNumFree((PyCodeObject *)value);
     nclosure = (op->func_closure == NULL ? 0 :
             PyTuple_GET_SIZE(op->func_closure));
@@ -329,6 +339,9 @@ func_set_qualname(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
 static PyObject *
 func_get_defaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
 {
+    if (PySys_Audit("object.__getattr__", "Os", op, "__defaults__") < 0) {
+        return NULL;
+    }
     if (op->func_defaults == NULL) {
         Py_RETURN_NONE;
     }
@@ -348,6 +361,16 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
                         "__defaults__ must be set to a tuple object");
         return -1;
     }
+    if (value) {
+        if (PySys_Audit("object.__setattr__", "OsO",
+                        op, "__defaults__", value) < 0) {
+            return -1;
+        }
+    } else if (PySys_Audit("object.__delattr__", "Os",
+                           op, "__defaults__") < 0) {
+        return -1;
+    }
+
     Py_XINCREF(value);
     Py_XSETREF(op->func_defaults, value);
     return 0;
@@ -356,6 +379,10 @@ func_set_defaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored
 static PyObject *
 func_get_kwdefaults(PyFunctionObject *op, void *Py_UNUSED(ignored))
 {
+    if (PySys_Audit("object.__getattr__", "Os",
+                    op, "__kwdefaults__") < 0) {
+        return NULL;
+    }
     if (op->func_kwdefaults == NULL) {
         Py_RETURN_NONE;
     }
@@ -375,6 +402,16 @@ func_set_kwdefaults(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignor
             "__kwdefaults__ must be set to a dict object");
         return -1;
     }
+    if (value) {
+        if (PySys_Audit("object.__setattr__", "OsO",
+                        op, "__kwdefaults__", value) < 0) {
+            return -1;
+        }
+    } else if (PySys_Audit("object.__delattr__", "Os",
+                           op, "__kwdefaults__") < 0) {
+        return -1;
+    }
+
     Py_XINCREF(value);
     Py_XSETREF(op->func_kwdefaults, value);
     return 0;
@@ -507,6 +544,9 @@ func_new_impl(PyTypeObject *type, PyCodeObject *code, PyObject *globals,
             }
         }
     }
+    if (PySys_Audit("function.__new__", "O", code) < 0) {
+        return NULL;
+    }
 
     newfunc = (PyFunctionObject *)PyFunction_New((PyObject *)code,
                                                  globals);
index 604f5e0d488259c310a7c50c6d749a215d7cfa1d..f842ab3889675e840a0aac01dec529e9c25f8593 100644 (file)
@@ -1366,6 +1366,14 @@ _PyObject_GenericSetAttrWithDict(PyObject *obj, PyObject *name,
         }
     }
 
+    /* XXX [Steve Dower] These are really noisy - worth it? */
+    /*if (PyType_Check(obj) || PyModule_Check(obj)) {
+        if (value && PySys_Audit("object.__setattr__", "OOO", obj, name, value) < 0)
+            return -1;
+        if (!value && PySys_Audit("object.__delattr__", "OO", obj, name) < 0)
+            return -1;
+    }*/
+
     if (dict == NULL) {
         dictptr = _PyObject_GetDictPtr(obj);
         if (dictptr == NULL) {
index c086f182aa958a21f4e25b90f799b1dc0e68c13b..49b45b8518cc45ec18add7da46fdc29f896aeaee 100644 (file)
@@ -392,6 +392,12 @@ check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *nam
                      "can't delete %s.%s", type->tp_name, name);
         return 0;
     }
+
+    if (PySys_Audit("object.__setattr__", "OsO",
+                    type, name, value) < 0) {
+        return 0;
+    }
+
     return 1;
 }
 
@@ -3956,6 +3962,11 @@ object_set_class(PyObject *self, PyObject *value, void *closure)
           Py_TYPE(value)->tp_name);
         return -1;
     }
+    if (PySys_Audit("object.__setattr__", "OsO",
+                    self, "__class__", value) < 0) {
+        return -1;
+    }
+
     newto = (PyTypeObject *)value;
     /* In versions of CPython prior to 3.5, the code in
        compatible_for_assignment was not set up to correctly check for memory
index df57adcfd6050c775c69b324ae2d591ed02dddbc..681c4db65df0ac7f43445daef4a3ae0bdf7296f6 100644 (file)
     <ClInclude Include="..\Include\cpython\abstract.h" />
     <ClInclude Include="..\Include\cpython\coreconfig.h" />
     <ClInclude Include="..\Include\cpython\dictobject.h" />
+    <ClInclude Include="..\Include\cpython\fileobject.h" />
     <ClInclude Include="..\Include\cpython\object.h" />
     <ClInclude Include="..\Include\cpython\objimpl.h" />
     <ClInclude Include="..\Include\cpython\pyerrors.h" />
     <ClInclude Include="..\Include\cpython\pylifecycle.h" />
     <ClInclude Include="..\Include\cpython\pymem.h" />
     <ClInclude Include="..\Include\cpython\pystate.h" />
+    <ClInclude Include="..\Include\cpython\sysmodule.h" />
     <ClInclude Include="..\Include\cpython\traceback.h" />
     <ClInclude Include="..\Include\cpython\tupleobject.h" />
     <ClInclude Include="..\Include\cpython\unicodeobject.h" />
index 5515d9bedeb166bd9a0960a516b8f063276623d4..32964c008aa2579d5952a5c3682a75d96ed3c549 100644 (file)
@@ -90,6 +90,9 @@
     <ClInclude Include="..\Include\cpython\dictobject.h">
       <Filter>Include</Filter>
     </ClInclude>
+    <ClInclude Include="..\Include\cpython\fileobject.h">
+      <Filter>Include</Filter>
+    </ClInclude>
     <ClInclude Include="..\Include\cpython\object.h">
       <Filter>Include</Filter>
     </ClInclude>
     <ClInclude Include="..\Include\cpython\pystate.h">
       <Filter>Include</Filter>
     </ClInclude>
+    <ClInclude Include="..\Include\cpython\sysmodule.h">
+      <Filter>Include</Filter>
+    </ClInclude>
     <ClInclude Include="..\Include\cpython\traceback.h">
       <Filter>Include</Filter>
     </ClInclude>
index cb0e6d7f9df26af8a521bb073fb628a01ca95f01..d84c1b13cf103cdb0c238b53f98e2ccdf0267c9b 100644 (file)
@@ -1201,6 +1201,10 @@ mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_ver
     char *req_name[] = {"Module", "Expression", "Interactive"};
     int isinstance;
 
+    if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
+        return NULL;
+    }
+
     req_type[0] = (PyObject*)Module_type;
     req_type[1] = (PyObject*)Expression_type;
     req_type[2] = (PyObject*)Interactive_type;
index 55fd7f7db3da812a0d10ebfa2d59b048077741e6..a5d78974b871b3e975d140ba43e09895336c9d1b 100644 (file)
@@ -94,6 +94,11 @@ PyParser_ParseStringObject(const char *s, PyObject *filename,
     if (initerr(err_ret, filename) < 0)
         return NULL;
 
+    if (PySys_Audit("compile", "yO", s, err_ret->filename) < 0) {
+        err_ret->error = E_ERROR;
+        return NULL;
+    }
+
     if (*flags & PyPARSE_IGNORE_COOKIE)
         tok = PyTokenizer_FromUTF8(s, exec_input);
     else
@@ -165,6 +170,10 @@ PyParser_ParseFileObject(FILE *fp, PyObject *filename,
     if (initerr(err_ret, filename) < 0)
         return NULL;
 
+    if (PySys_Audit("compile", "OO", Py_None, err_ret->filename) < 0) {
+        return NULL;
+    }
+
     if ((tok = PyTokenizer_FromFile(fp, enc, ps1, ps2)) == NULL) {
         err_ret->error = E_NOMEM;
         return NULL;
index 6bd55deab4012a4fedab7551f3056e2b5eec652e..21d3b445d7752ca777f67b9943860f9b76ad6825 100644 (file)
@@ -1091,6 +1091,164 @@ static int test_init_dev_mode(void)
     return 0;
 }
 
+static PyObject *_open_code_hook(PyObject *path, void *data)
+{
+    if (PyUnicode_CompareWithASCIIString(path, "$$test-filename") == 0) {
+        return PyLong_FromVoidPtr(data);
+    }
+    PyObject *io = PyImport_ImportModule("_io");
+    if (!io) {
+        return NULL;
+    }
+    return PyObject_CallMethod(io, "open", "Os", path, "rb");
+}
+
+static int test_open_code_hook(void)
+{
+    int result = 0;
+
+    /* Provide a hook */
+    result = PyFile_SetOpenCodeHook(_open_code_hook, &result);
+    if (result) {
+        printf("Failed to set hook\n");
+        return 1;
+    }
+    /* A second hook should fail */
+    result = PyFile_SetOpenCodeHook(_open_code_hook, &result);
+    if (!result) {
+        printf("Should have failed to set second hook\n");
+        return 2;
+    }
+
+    Py_IgnoreEnvironmentFlag = 0;
+    _testembed_Py_Initialize();
+    result = 0;
+
+    PyObject *r = PyFile_OpenCode("$$test-filename");
+    if (!r) {
+        PyErr_Print();
+        result = 3;
+    } else {
+        void *cmp = PyLong_AsVoidPtr(r);
+        Py_DECREF(r);
+        if (cmp != &result) {
+            printf("Did not get expected result from hook\n");
+            result = 4;
+        }
+    }
+
+    if (!result) {
+        PyObject *io = PyImport_ImportModule("_io");
+        PyObject *r = io
+            ? PyObject_CallMethod(io, "open_code", "s", "$$test-filename")
+            : NULL;
+        if (!r) {
+            PyErr_Print();
+            result = 5;
+        } else {
+            void *cmp = PyLong_AsVoidPtr(r);
+            Py_DECREF(r);
+            if (cmp != &result) {
+                printf("Did not get expected result from hook\n");
+                result = 6;
+            }
+        }
+        Py_XDECREF(io);
+    }
+
+    Py_Finalize();
+    return result;
+}
+
+static int _audit_hook(const char *event, PyObject *args, void *userdata)
+{
+    if (strcmp(event, "_testembed.raise") == 0) {
+        PyErr_SetString(PyExc_RuntimeError, "Intentional error");
+        return -1;
+    } else if (strcmp(event, "_testembed.set") == 0) {
+        if (!PyArg_ParseTuple(args, "n", userdata)) {
+            return -1;
+        }
+        return 0;
+    }
+    return 0;
+}
+
+static int _test_audit(Py_ssize_t setValue)
+{
+    Py_ssize_t sawSet = 0;
+
+    Py_IgnoreEnvironmentFlag = 0;
+    PySys_AddAuditHook(_audit_hook, &sawSet);
+    _testembed_Py_Initialize();
+
+    if (PySys_Audit("_testembed.raise", NULL) == 0) {
+        printf("No error raised");
+        return 1;
+    }
+    if (PySys_Audit("_testembed.nop", NULL) != 0) {
+        printf("Nop event failed");
+        /* Exception from above may still remain */
+        PyErr_Clear();
+        return 2;
+    }
+    if (!PyErr_Occurred()) {
+        printf("Exception not preserved");
+        return 3;
+    }
+    PyErr_Clear();
+
+    if (PySys_Audit("_testembed.set", "n", setValue) != 0) {
+        PyErr_Print();
+        printf("Set event failed");
+        return 4;
+    }
+
+    if (sawSet != 42) {
+        printf("Failed to see *userData change\n");
+        return 5;
+    }
+    return 0;
+}
+
+static int test_audit(void)
+{
+    int result = _test_audit(42);
+    Py_Finalize();
+    return result;
+}
+
+static volatile int _audit_subinterpreter_interpreter_count = 0;
+
+static int _audit_subinterpreter_hook(const char *event, PyObject *args, void *userdata)
+{
+    printf("%s\n", event);
+    if (strcmp(event, "cpython.PyInterpreterState_New") == 0) {
+        _audit_subinterpreter_interpreter_count += 1;
+    }
+    return 0;
+}
+
+static int test_audit_subinterpreter(void)
+{
+    PyThreadState *ts;
+
+    Py_IgnoreEnvironmentFlag = 0;
+    PySys_AddAuditHook(_audit_subinterpreter_hook, NULL);
+    _testembed_Py_Initialize();
+
+    ts = Py_NewInterpreter();
+    ts = Py_NewInterpreter();
+    ts = Py_NewInterpreter();
+
+    Py_Finalize();
+
+    switch (_audit_subinterpreter_interpreter_count) {
+        case 3: return 0;
+        case 0: return -1;
+        default: return _audit_subinterpreter_interpreter_count;
+    }
+}
 
 static int test_init_read_set(void)
 {
@@ -1299,6 +1457,9 @@ static struct TestCase TestCases[] = {
     {"test_init_run_main", test_init_run_main},
     {"test_init_main", test_init_main},
     {"test_run_main", test_run_main},
+    {"test_open_code_hook", test_open_code_hook},
+    {"test_audit", test_audit},
+    {"test_audit_subinterpreter", test_audit_subinterpreter},
     {NULL, NULL}
 };
 
index e84a7586a70723ded9cfc20dc7b513a6773d5ce7..39a40eedca3267395c1748fded57c5cf06175963 100644 (file)
@@ -9024,6 +9024,10 @@ mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_ver
     char *req_name[] = {"Module", "Expression", "Interactive"};
     int isinstance;
 
+    if (PySys_Audit("compile", "OO", ast, Py_None) < 0) {
+        return NULL;
+    }
+
     req_type[0] = (PyObject*)Module_type;
     req_type[1] = (PyObject*)Expression_type;
     req_type[2] = (PyObject*)Interactive_type;
index 047cca057b41ae5c46cf8e4c7763b4e69c263ede..ff5a51216939e7c66e466c868f23232746dd9f45 100644 (file)
@@ -977,9 +977,13 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals,
     }
 
     if (PyCode_Check(source)) {
+        if (PySys_Audit("exec", "O", source) < 0) {
+            return NULL;
+        }
+
         if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
             PyErr_SetString(PyExc_TypeError,
-        "code object passed to eval() may not contain free variables");
+                "code object passed to eval() may not contain free variables");
             return NULL;
         }
         return PyEval_EvalCode(source, globals, locals);
@@ -1061,6 +1065,10 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals,
     }
 
     if (PyCode_Check(source)) {
+        if (PySys_Audit("exec", "O", source) < 0) {
+            return NULL;
+        }
+
         if (PyCode_GetNumFree((PyCodeObject *)source) > 0) {
             PyErr_SetString(PyExc_TypeError,
                 "code object passed to exec() may not "
@@ -1207,7 +1215,14 @@ static PyObject *
 builtin_id(PyModuleDef *self, PyObject *v)
 /*[clinic end generated code: output=0aa640785f697f65 input=5a534136419631f4]*/
 {
-    return PyLong_FromVoidPtr(v);
+    PyObject *id = PyLong_FromVoidPtr(v);
+
+    if (id && PySys_Audit("builtins.id", "O", id) < 0) {
+        Py_DECREF(id);
+        return NULL;
+    }
+
+    return id;
 }
 
 
@@ -1986,6 +2001,10 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
         return NULL;
     }
 
+    if (PySys_Audit("builtins.input", "O", prompt ? prompt : Py_None) < 0) {
+        return NULL;
+    }
+
     /* First of all, flush stderr */
     tmp = _PyObject_CallMethodId(ferr, &PyId_flush, NULL);
     if (tmp == NULL)
@@ -2116,6 +2135,13 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
         Py_DECREF(stdin_errors);
         Py_XDECREF(po);
         PyMem_FREE(s);
+
+        if (result != NULL) {
+            if (PySys_Audit("builtins.input/result", "O", result) < 0) {
+                return NULL;
+            }
+        }
+
         return result;
 
     _readline_errors:
index 1bb4704572b44b08ec707c49db2c48a7cd020a77..781b10dfac9aef794e8ba8cd12febb5479c64807 100644 (file)
@@ -4555,6 +4555,10 @@ maybe_call_line_trace(Py_tracefunc func, PyObject *obj,
 void
 PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
 {
+    if (PySys_Audit("sys.setprofile", NULL) < 0) {
+        return;
+    }
+
     PyThreadState *tstate = _PyThreadState_GET();
     PyObject *temp = tstate->c_profileobj;
     Py_XINCREF(arg);
@@ -4572,6 +4576,10 @@ PyEval_SetProfile(Py_tracefunc func, PyObject *arg)
 void
 PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
 {
+    if (PySys_Audit("sys.settrace", NULL) < 0) {
+        return;
+    }
+
     _PyRuntimeState *runtime = &_PyRuntime;
     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
     PyObject *temp = tstate->c_traceobj;
@@ -4608,6 +4616,11 @@ void
 _PyEval_SetCoroutineWrapper(PyObject *wrapper)
 {
     PyThreadState *tstate = _PyThreadState_GET();
+
+    if (PySys_Audit("sys.set_coroutine_wrapper", NULL) < 0) {
+        return;
+    }
+
     Py_XINCREF(wrapper);
     Py_XSETREF(tstate->coroutine_wrapper, wrapper);
 }
@@ -4623,6 +4636,11 @@ void
 _PyEval_SetAsyncGenFirstiter(PyObject *firstiter)
 {
     PyThreadState *tstate = _PyThreadState_GET();
+
+    if (PySys_Audit("sys.set_asyncgen_hook_firstiter", NULL) < 0) {
+        return;
+    }
+
     Py_XINCREF(firstiter);
     Py_XSETREF(tstate->async_gen_firstiter, firstiter);
 }
@@ -4638,6 +4656,11 @@ void
 _PyEval_SetAsyncGenFinalizer(PyObject *finalizer)
 {
     PyThreadState *tstate = _PyThreadState_GET();
+
+    if (PySys_Audit("sys.set_asyncgen_hook_finalizer", NULL) < 0) {
+        return;
+    }
+
     Py_XINCREF(finalizer);
     Py_XSETREF(tstate->async_gen_finalizer, finalizer);
 }
index aede60ac85b519ed17d9472e5958af0b7d5cef98..2a4ec72b0dc34ef1bf7479afbf756776173c6913 100644 (file)
@@ -2,6 +2,38 @@
 preserve
 [clinic start generated code]*/
 
+PyDoc_STRVAR(sys_addaudithook__doc__,
+"addaudithook($module, /, hook)\n"
+"--\n"
+"\n"
+"Adds a new audit hook callback.");
+
+#define SYS_ADDAUDITHOOK_METHODDEF    \
+    {"addaudithook", (PyCFunction)(void(*)(void))sys_addaudithook, METH_FASTCALL|METH_KEYWORDS, sys_addaudithook__doc__},
+
+static PyObject *
+sys_addaudithook_impl(PyObject *module, PyObject *hook);
+
+static PyObject *
+sys_addaudithook(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+    PyObject *return_value = NULL;
+    static const char * const _keywords[] = {"hook", NULL};
+    static _PyArg_Parser _parser = {NULL, _keywords, "addaudithook", 0};
+    PyObject *argsbuf[1];
+    PyObject *hook;
+
+    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+    if (!args) {
+        goto exit;
+    }
+    hook = args[0];
+    return_value = sys_addaudithook_impl(module, hook);
+
+exit:
+    return return_value;
+}
+
 PyDoc_STRVAR(sys_displayhook__doc__,
 "displayhook($module, object, /)\n"
 "--\n"
@@ -1076,4 +1108,4 @@ sys_getandroidapilevel(PyObject *module, PyObject *Py_UNUSED(ignored))
 #ifndef SYS_GETANDROIDAPILEVEL_METHODDEF
     #define SYS_GETANDROIDAPILEVEL_METHODDEF
 #endif /* !defined(SYS_GETANDROIDAPILEVEL_METHODDEF) */
-/*[clinic end generated code: output=603e4d5a453dc769 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=3c32bc91ec659509 input=a9049054013a1b77]*/
index dfad48edb81a1d45f3e071b74009436ff07fe187..178e2f1268f831ba5d0731807c8d0010d414c139 100644 (file)
@@ -1262,6 +1262,10 @@ _Py_open_impl(const char *pathname, int flags, int gil_held)
 #endif
 
     if (gil_held) {
+        if (PySys_Audit("open", "sOi", pathname, Py_None, flags) < 0) {
+            return -1;
+        }
+
         do {
             Py_BEGIN_ALLOW_THREADS
             fd = open(pathname, flags);
@@ -1331,6 +1335,9 @@ FILE *
 _Py_wfopen(const wchar_t *path, const wchar_t *mode)
 {
     FILE *f;
+    if (PySys_Audit("open", "uui", path, mode, 0) < 0) {
+        return NULL;
+    }
 #ifndef MS_WINDOWS
     char *cpath;
     char cmode[10];
@@ -1366,6 +1373,10 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode)
 FILE*
 _Py_fopen(const char *pathname, const char *mode)
 {
+    if (PySys_Audit("open", "ssi", pathname, mode, 0) < 0) {
+        return NULL;
+    }
+
     FILE *f = fopen(pathname, mode);
     if (f == NULL)
         return NULL;
@@ -1401,6 +1412,9 @@ _Py_fopen_obj(PyObject *path, const char *mode)
 
     assert(PyGILState_Check());
 
+    if (PySys_Audit("open", "Osi", path, mode, 0) < 0) {
+        return NULL;
+    }
     if (!PyUnicode_Check(path)) {
         PyErr_Format(PyExc_TypeError,
                      "str file path expected under Windows, got %R",
@@ -1434,6 +1448,10 @@ _Py_fopen_obj(PyObject *path, const char *mode)
         return NULL;
     path_bytes = PyBytes_AS_STRING(bytes);
 
+    if (PySys_Audit("open", "Osi", path, mode, 0) < 0) {
+        return NULL;
+    }
+
     do {
         Py_BEGIN_ALLOW_THREADS
         f = fopen(path_bytes, mode);
index c634edb4c7fcb7ecf0971462c3eda8abef147b14..ec172b29f739fc8c0f24d93448c1708542dc454e 100644 (file)
@@ -1661,6 +1661,17 @@ import_find_and_load(PyObject *abs_name)
 
     _PyTime_t t1 = 0, accumulated_copy = accumulated;
 
+    PyObject *sys_path = PySys_GetObject("path");
+    PyObject *sys_meta_path = PySys_GetObject("meta_path");
+    PyObject *sys_path_hooks = PySys_GetObject("path_hooks");
+    if (PySys_Audit("import", "OOOOO",
+                    abs_name, Py_None, sys_path ? sys_path : Py_None,
+                    sys_meta_path ? sys_meta_path : Py_None,
+                    sys_path_hooks ? sys_path_hooks : Py_None) < 0) {
+        return NULL;
+    }
+
+
     /* XOptions is initialized after first some imports.
      * So we can't have negative cache before completed initialization.
      * Anyway, importlib._find_and_load is much slower than
index 50231ff28848a18798ca6907408aba3ab450e20d..1d0d32a2371f80044d8b4e31a2e81876ed8bda98 100644 (file)
@@ -119,6 +119,11 @@ _PyImport_LoadDynamicModuleWithSpec(PyObject *spec, FILE *fp)
     if (path == NULL)
         goto error;
 
+    if (PySys_Audit("import", "OOOOO", name_unicode, path,
+                    Py_None, Py_None, Py_None) < 0) {
+        return NULL;
+    }
+
 #ifdef MS_WINDOWS
     exportfunc = _PyImport_FindSharedFuncptrWindows(hook_prefix, name_buf,
                                                     path, fp);
index b5b4df228057a3ff1b8c5c25e6eddaf234477133..36b95d99b237062a794ebe1bab7c3abbe85e8ffb 100644 (file)
@@ -1460,1235 +1460,1241 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     3,0,0,115,2,0,0,0,0,3,122,23,70,105,108,101,
     76,111,97,100,101,114,46,103,101,116,95,102,105,108,101,110,
     97,109,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    3,0,0,0,10,0,0,0,67,0,0,0,115,44,0,0,
-    0,116,0,160,1,124,1,100,1,161,2,143,22,125,2,124,
-    2,160,2,161,0,87,0,2,0,53,0,81,0,82,0,163,
-    0,83,0,81,0,82,0,88,0,100,2,83,0,41,3,122,
-    39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97,
-    32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,97,
-    119,32,98,121,116,101,115,46,218,1,114,78,41,3,114,64,
-    0,0,0,114,65,0,0,0,90,4,114,101,97,100,41,3,
-    114,119,0,0,0,114,44,0,0,0,114,68,0,0,0,114,
-    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,227,
-    0,0,0,196,3,0,0,115,4,0,0,0,0,2,14,1,
-    122,19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
-    95,100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,
-    0,0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,
-    0,100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,
-    0,169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,
-    116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,
-    114,203,3,0,0,115,6,0,0,0,0,2,10,1,4,1,
-    122,30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
+    3,0,0,0,10,0,0,0,67,0,0,0,115,102,0,0,
+    0,116,0,124,0,116,1,116,2,102,2,131,2,114,58,116,
+    3,160,4,116,5,124,1,131,1,161,1,143,22,125,2,124,
+    2,160,6,161,0,87,0,2,0,53,0,81,0,82,0,163,
+    0,83,0,81,0,82,0,88,0,110,40,116,3,160,7,124,
+    1,100,1,161,2,143,22,125,2,124,2,160,6,161,0,87,
+    0,2,0,53,0,81,0,82,0,163,0,83,0,81,0,82,
+    0,88,0,100,2,83,0,41,3,122,39,82,101,116,117,114,
+    110,32,116,104,101,32,100,97,116,97,32,102,114,111,109,32,
+    112,97,116,104,32,97,115,32,114,97,119,32,98,121,116,101,
+    115,46,218,1,114,78,41,8,114,161,0,0,0,114,221,0,
+    0,0,218,19,69,120,116,101,110,115,105,111,110,70,105,108,
+    101,76,111,97,100,101,114,114,64,0,0,0,90,9,111,112,
+    101,110,95,99,111,100,101,114,85,0,0,0,90,4,114,101,
+    97,100,114,65,0,0,0,41,3,114,119,0,0,0,114,44,
+    0,0,0,114,68,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,114,227,0,0,0,196,3,0,0,
+    115,10,0,0,0,0,2,14,1,16,1,28,2,14,1,122,
+    19,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+    100,97,116,97,99,2,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,3,0,0,0,67,0,0,0,115,18,0,
+    0,0,124,0,160,0,124,1,161,1,114,14,124,0,83,0,
+    100,0,83,0,114,110,0,0,0,41,1,114,182,0,0,0,
+    169,2,114,119,0,0,0,114,216,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,218,19,103,101,116,
     95,114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,
+    207,3,0,0,115,6,0,0,0,0,2,10,1,4,1,122,
+    30,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
+    114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,99,
+    2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
+    4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,116,
+    1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,125,
+    2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,78,
+    114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,0,
+    0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,0,
+    114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,101,
+    115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,110,
+    95,114,101,115,111,117,114,99,101,213,3,0,0,115,4,0,
+    0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,100,
+    101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,101,
     99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-    0,4,0,0,0,67,0,0,0,115,32,0,0,0,116,0,
-    116,1,124,0,106,2,131,1,100,1,25,0,124,1,131,2,
-    125,2,116,3,160,4,124,2,100,2,161,2,83,0,41,3,
-    78,114,73,0,0,0,114,251,0,0,0,41,5,114,38,0,
-    0,0,114,47,0,0,0,114,44,0,0,0,114,64,0,0,
-    0,114,65,0,0,0,169,3,114,119,0,0,0,90,8,114,
-    101,115,111,117,114,99,101,114,44,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,218,13,111,112,101,
-    110,95,114,101,115,111,117,114,99,101,209,3,0,0,115,4,
-    0,0,0,0,1,20,1,122,24,70,105,108,101,76,111,97,
-    100,101,114,46,111,112,101,110,95,114,101,115,111,117,114,99,
-    101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,
-    0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,
-    0,160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,
-    3,124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,
-    2,124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,
-    11,105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,
-    108,101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,
-    38,0,0,0,114,47,0,0,0,114,44,0,0,0,114,254,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,
-    104,213,3,0,0,115,8,0,0,0,0,1,10,1,4,1,
-    20,1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,
-    101,115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,
-    0,67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,
-    114,12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,
-    100,2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,
-    83,0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,
-    0,0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,
-    0,114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,
-    0,0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,114,1,1,0,0,219,3,0,0,115,
-    8,0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,
-    108,101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,
-    117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,
-    0,0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,
-    100,1,25,0,161,1,131,1,83,0,114,0,1,0,0,41,
-    5,218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,
-    115,116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,
-    246,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,218,8,99,111,110,116,101,110,116,115,225,3,0,
-    0,115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,
-    97,100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,
-    125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,
-    0,0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,
-    0,0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,
-    0,114,227,0,0,0,114,253,0,0,0,114,255,0,0,0,
-    114,3,1,0,0,114,1,1,0,0,114,7,1,0,0,90,
-    13,95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,
-    0,0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,
-    0,0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,
-    8,2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,
-    10,4,8,7,2,1,10,5,8,4,8,6,8,6,114,239,
-    0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,
-    0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,
-    3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,
-    7,156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,
-    11,218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,
-    100,101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,
-    112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,
-    83,111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,
-    110,103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,
-    101,109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    3,0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,
-    0,116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,
-    2,100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,
-    110,32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,
-    111,114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,
-    0,0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,
-    8,115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,
-    122,101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,
+    0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0,
+    160,0,124,1,161,1,115,14,116,1,130,1,116,2,116,3,
+    124,0,106,4,131,1,100,1,25,0,124,1,131,2,125,2,
+    124,2,83,0,169,2,78,114,73,0,0,0,41,5,218,11,
+    105,115,95,114,101,115,111,117,114,99,101,218,17,70,105,108,
+    101,78,111,116,70,111,117,110,100,69,114,114,111,114,114,38,
+    0,0,0,114,47,0,0,0,114,44,0,0,0,114,255,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,218,13,114,101,115,111,117,114,99,101,95,112,97,116,104,
+    217,3,0,0,115,8,0,0,0,0,1,10,1,4,1,20,
+    1,122,24,70,105,108,101,76,111,97,100,101,114,46,114,101,
+    115,111,117,114,99,101,95,112,97,116,104,99,2,0,0,0,
+    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
+    67,0,0,0,115,40,0,0,0,116,0,124,1,107,6,114,
+    12,100,1,83,0,116,1,116,2,124,0,106,3,131,1,100,
+    2,25,0,124,1,131,2,125,2,116,4,124,2,131,1,83,
+    0,41,3,78,70,114,73,0,0,0,41,5,114,35,0,0,
+    0,114,38,0,0,0,114,47,0,0,0,114,44,0,0,0,
+    114,54,0,0,0,169,3,114,119,0,0,0,114,117,0,0,
+    0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,114,2,1,0,0,223,3,0,0,115,8,
+    0,0,0,0,1,8,1,4,1,20,1,122,22,70,105,108,
+    101,76,111,97,100,101,114,46,105,115,95,114,101,115,111,117,
+    114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,0,
+    1,0,0,0,5,0,0,0,67,0,0,0,115,24,0,0,
+    0,116,0,116,1,160,2,116,3,124,0,106,4,131,1,100,
+    1,25,0,161,1,131,1,83,0,114,1,1,0,0,41,5,
+    218,4,105,116,101,114,114,2,0,0,0,218,7,108,105,115,
+    116,100,105,114,114,47,0,0,0,114,44,0,0,0,114,246,
     0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,224,0,0,0,233,3,0,0,115,4,0,0,0,
-    0,2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,
-    76,111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,
-    115,99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,
-    0,0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,
-    0,124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,
-    4,100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,
-    111,100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,
-    5,114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,
-    114,26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,114,226,0,0,0,238,3,
-    0,0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,
-    114,99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,
-    97,99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,
-    0,0,114,10,1,0,0,99,3,0,0,0,0,0,0,0,
-    1,0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,
-    115,0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,
-    5,103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,
-    52,116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,
-    2,124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,
-    0,93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,
-    14,116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,
-    0,116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,
-    60,89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,
-    8,1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,
-    3,1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,
-    0,53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,
-    0,113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,
-    0,116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,
-    48,4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,
-    18,116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,
-    0,53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,
-    0,100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,
-    121,116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,
-    105,108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,
-    99,114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,
-    125,78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,
-    41,12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,
-    0,114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,
-    90,5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,
-    115,116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,
-    0,0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,
-    0,0,0,114,44,0,0,0,114,26,0,0,0,114,11,1,
-    0,0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,
-    37,0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,
-    0,0,243,3,0,0,115,48,0,0,0,0,2,12,1,4,
-    2,12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,
-    2,8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,
-    1,12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,
-    114,99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,
-    116,95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,
-    0,0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,
-    0,0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
-    114,8,1,0,0,229,3,0,0,115,8,0,0,0,8,2,
-    4,2,8,5,8,5,114,8,1,0,0,99,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-    64,0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,
-    2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,
-    5,132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,
-    114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,
-    114,122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,
-    104,97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,
-    115,115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
-    0,5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,
-    160,0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,
-    125,3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,
-    124,1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,
-    100,2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,
-    83,0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,
-    2,114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,
-    0,0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,
-    0,114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,
-    0,0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,
-    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
-    114,213,0,0,0,22,4,0,0,115,22,0,0,0,0,1,
-    10,1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,
-    2,1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,
-    70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,
-    111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
-    2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,
-    0,100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,
-    78,111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,
-    32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,
-    78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,38,
-    4,0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,
-    99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,
-    46,103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,
+    0,0,218,8,99,111,110,116,101,110,116,115,229,3,0,0,
+    115,2,0,0,0,0,1,122,19,70,105,108,101,76,111,97,
+    100,101,114,46,99,111,110,116,101,110,116,115,41,17,114,125,
     0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,
-    0,0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
-    114,14,1,0,0,18,4,0,0,115,6,0,0,0,8,2,
-    4,2,8,16,114,14,1,0,0,99,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,
-    0,0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,
-    1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,
-    0,90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,
-    0,90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,
-    0,90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,
-    0,90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,
-    20,83,0,41,21,218,19,69,120,116,101,110,115,105,111,110,
-    70,105,108,101,76,111,97,100,101,114,122,93,76,111,97,100,
-    101,114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,
-    32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,
-    104,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,
-    115,32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,
-    114,107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,
-    101,114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,
-    0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,
-    0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,
-    0,95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,
-    0,114,4,1,0,0,114,3,0,0,0,114,3,0,0,0,
-    114,6,0,0,0,114,209,0,0,0,55,4,0,0,115,4,
-    0,0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,
-    111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,
-    110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,
-    0,0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,
-    0,106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,
-    114,240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,114,243,0,0,0,59,4,
-    0,0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,
-    120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
-    101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,
-    0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,
-    0,0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,
-    0,124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,
-    114,244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,114,247,0,0,0,63,4,
-    0,0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,
-    115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,
-    95,104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,
-    0,0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,
-    115,36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,
-    2,125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,
-    6,161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,
-    97,116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,
-    101,100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,
-    117,108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,
-    111,100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,
-    100,32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,
-    0,0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,
-    101,97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,
-    0,114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,
-    0,0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,
-    66,4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,
-    255,4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,
-    101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
-    46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,
-    0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,
-    116,2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,
-    124,0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,
-    41,3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,
-    110,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
-    108,101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,
-    100,117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,
-    101,100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,
-    134,0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,
-    101,120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,
-    0,114,117,0,0,0,114,44,0,0,0,114,252,0,0,0,
+    0,0,114,209,0,0,0,114,243,0,0,0,114,247,0,0,
+    0,114,136,0,0,0,114,220,0,0,0,114,179,0,0,0,
+    114,227,0,0,0,114,254,0,0,0,114,0,1,0,0,114,
+    4,1,0,0,114,2,1,0,0,114,8,1,0,0,90,13,
+    95,95,99,108,97,115,115,99,101,108,108,95,95,114,3,0,
+    0,0,114,3,0,0,0,114,249,0,0,0,114,6,0,0,
+    0,114,239,0,0,0,161,3,0,0,115,30,0,0,0,8,
+    2,4,3,8,6,8,4,8,3,2,1,14,11,2,1,10,
+    4,8,11,2,1,10,5,8,4,8,6,8,6,114,239,0,
+    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,3,0,0,0,64,0,0,0,115,46,0,0,0,
+    101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,
+    132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7,
+    156,1,100,8,100,9,132,2,90,6,100,10,83,0,41,11,
+    218,16,83,111,117,114,99,101,70,105,108,101,76,111,97,100,
+    101,114,122,62,67,111,110,99,114,101,116,101,32,105,109,112,
+    108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,83,
+    111,117,114,99,101,76,111,97,100,101,114,32,117,115,105,110,
+    103,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,
+    109,46,99,2,0,0,0,0,0,0,0,0,0,0,0,3,
+    0,0,0,3,0,0,0,67,0,0,0,115,22,0,0,0,
+    116,0,124,1,131,1,125,2,124,2,106,1,124,2,106,2,
+    100,1,156,2,83,0,41,2,122,33,82,101,116,117,114,110,
+    32,116,104,101,32,109,101,116,97,100,97,116,97,32,102,111,
+    114,32,116,104,101,32,112,97,116,104,46,41,2,114,169,0,
+    0,0,114,234,0,0,0,41,3,114,49,0,0,0,218,8,
+    115,116,95,109,116,105,109,101,90,7,115,116,95,115,105,122,
+    101,41,3,114,119,0,0,0,114,44,0,0,0,114,238,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,114,224,0,0,0,237,3,0,0,115,4,0,0,0,0,
+    2,8,1,122,27,83,111,117,114,99,101,70,105,108,101,76,
+    111,97,100,101,114,46,112,97,116,104,95,115,116,97,116,115,
+    99,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,
+    0,5,0,0,0,67,0,0,0,115,24,0,0,0,116,0,
+    124,1,131,1,125,4,124,0,106,1,124,2,124,3,124,4,
+    100,1,141,3,83,0,41,2,78,169,1,218,5,95,109,111,
+    100,101,41,2,114,115,0,0,0,114,225,0,0,0,41,5,
+    114,119,0,0,0,114,108,0,0,0,114,107,0,0,0,114,
+    26,0,0,0,114,52,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,114,226,0,0,0,242,3,0,
+    0,115,4,0,0,0,0,2,8,1,122,32,83,111,117,114,
+    99,101,70,105,108,101,76,111,97,100,101,114,46,95,99,97,
+    99,104,101,95,98,121,116,101,99,111,100,101,114,60,0,0,
+    0,114,11,1,0,0,99,3,0,0,0,0,0,0,0,1,
+    0,0,0,9,0,0,0,11,0,0,0,67,0,0,0,115,
+    0,1,0,0,116,0,124,1,131,1,92,2,125,4,125,5,
+    103,0,125,6,124,4,114,52,116,1,124,4,131,1,115,52,
+    116,0,124,4,131,1,92,2,125,4,125,7,124,6,160,2,
+    124,7,161,1,1,0,113,16,116,3,124,6,131,1,68,0,
+    93,112,125,7,116,4,124,4,124,7,131,2,125,4,122,14,
+    116,5,160,6,124,4,161,1,1,0,87,0,110,82,4,0,
+    116,7,107,10,114,112,1,0,1,0,1,0,89,0,113,60,
+    89,0,110,60,4,0,116,8,107,10,114,170,1,0,125,8,
+    1,0,122,30,116,9,160,10,100,1,124,4,124,8,161,3,
+    1,0,87,0,89,0,162,10,1,0,100,2,83,0,87,0,
+    53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0,
+    113,60,122,28,116,11,124,1,124,2,124,3,131,3,1,0,
+    116,9,160,10,100,3,124,1,161,2,1,0,87,0,110,48,
+    4,0,116,8,107,10,114,250,1,0,125,8,1,0,122,18,
+    116,9,160,10,100,1,124,1,124,8,161,3,1,0,87,0,
+    53,0,100,2,125,8,126,8,88,0,89,0,110,2,88,0,
+    100,2,83,0,41,4,122,27,87,114,105,116,101,32,98,121,
+    116,101,115,32,100,97,116,97,32,116,111,32,97,32,102,105,
+    108,101,46,122,27,99,111,117,108,100,32,110,111,116,32,99,
+    114,101,97,116,101,32,123,33,114,125,58,32,123,33,114,125,
+    78,122,12,99,114,101,97,116,101,100,32,123,33,114,125,41,
+    12,114,47,0,0,0,114,56,0,0,0,114,186,0,0,0,
+    114,42,0,0,0,114,38,0,0,0,114,2,0,0,0,90,
+    5,109,107,100,105,114,218,15,70,105,108,101,69,120,105,115,
+    116,115,69,114,114,111,114,114,50,0,0,0,114,134,0,0,
+    0,114,149,0,0,0,114,69,0,0,0,41,9,114,119,0,
+    0,0,114,44,0,0,0,114,26,0,0,0,114,12,1,0,
+    0,218,6,112,97,114,101,110,116,114,97,0,0,0,114,37,
+    0,0,0,114,33,0,0,0,114,228,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,
+    0,247,3,0,0,115,48,0,0,0,0,2,12,1,4,2,
+    12,1,12,1,12,2,12,1,10,1,2,1,14,1,14,2,
+    8,1,16,3,6,1,2,0,2,255,4,2,32,1,2,1,
+    12,1,16,1,16,2,8,1,2,255,122,25,83,111,117,114,
+    99,101,70,105,108,101,76,111,97,100,101,114,46,115,101,116,
+    95,100,97,116,97,78,41,7,114,125,0,0,0,114,124,0,
+    0,0,114,126,0,0,0,114,127,0,0,0,114,224,0,0,
+    0,114,226,0,0,0,114,225,0,0,0,114,3,0,0,0,
     114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    217,0,0,0,74,4,0,0,115,10,0,0,0,0,2,14,
-    1,6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,
-    111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,
-    99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,
-    0,0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,
-    0,115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,
-    25,0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,
-    116,3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,
-    116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,
-    32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
-    101,32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,
-    39,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,
-    0,0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,
-    107,2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,
-    0,0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,
-    218,6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,
-    95,110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,
-    9,60,103,101,110,101,120,112,114,62,83,4,0,0,115,4,
-    0,0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,
-    111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,
-    112,97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,
-    46,60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,
-    0,114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,
-    69,78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,
-    219,0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,
-    0,0,0,114,182,0,0,0,80,4,0,0,115,8,0,0,
-    0,0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,
-    115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
-    115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
-    0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,
-    0,0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,
-    101,116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,
+    9,1,0,0,233,3,0,0,115,8,0,0,0,8,2,4,
+    2,8,5,8,5,114,9,1,0,0,99,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,
+    0,0,0,115,32,0,0,0,101,0,90,1,100,0,90,2,
+    100,1,90,3,100,2,100,3,132,0,90,4,100,4,100,5,
+    132,0,90,5,100,6,83,0,41,7,218,20,83,111,117,114,
+    99,101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,
+    122,45,76,111,97,100,101,114,32,119,104,105,99,104,32,104,
+    97,110,100,108,101,115,32,115,111,117,114,99,101,108,101,115,
+    115,32,102,105,108,101,32,105,109,112,111,114,116,115,46,99,
+    2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,
+    5,0,0,0,67,0,0,0,115,68,0,0,0,124,0,160,
+    0,124,1,161,1,125,2,124,0,160,1,124,2,161,1,125,
+    3,124,1,124,2,100,1,156,2,125,4,116,2,124,3,124,
+    1,124,4,131,3,1,0,116,3,116,4,124,3,131,1,100,
+    2,100,0,133,2,25,0,124,1,124,2,100,3,141,3,83,
+    0,41,4,78,114,159,0,0,0,114,145,0,0,0,41,2,
+    114,117,0,0,0,114,107,0,0,0,41,5,114,179,0,0,
+    0,114,227,0,0,0,114,152,0,0,0,114,165,0,0,0,
+    114,235,0,0,0,41,5,114,119,0,0,0,114,139,0,0,
+    0,114,44,0,0,0,114,26,0,0,0,114,151,0,0,0,
+    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
+    213,0,0,0,26,4,0,0,115,22,0,0,0,0,1,10,
+    1,10,4,2,1,2,254,6,4,12,1,2,1,14,1,2,
+    1,2,253,122,29,83,111,117,114,99,101,108,101,115,115,70,
+    105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111,
+    100,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
+    0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
+    100,1,83,0,41,2,122,39,82,101,116,117,114,110,32,78,
+    111,110,101,32,97,115,32,116,104,101,114,101,32,105,115,32,
+    110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,
+    114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,229,0,0,0,42,4,
+    0,0,115,2,0,0,0,0,2,122,31,83,111,117,114,99,
+    101,108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,
+    103,101,116,95,115,111,117,114,99,101,78,41,6,114,125,0,
+    0,0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,
+    0,114,213,0,0,0,114,229,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
+    15,1,0,0,22,4,0,0,115,6,0,0,0,8,2,4,
+    2,8,16,114,15,1,0,0,99,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,
+    0,115,92,0,0,0,101,0,90,1,100,0,90,2,100,1,
+    90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0,
+    90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0,
+    90,7,100,10,100,11,132,0,90,8,100,12,100,13,132,0,
+    90,9,100,14,100,15,132,0,90,10,100,16,100,17,132,0,
+    90,11,101,12,100,18,100,19,132,0,131,1,90,13,100,20,
+    83,0,41,21,114,252,0,0,0,122,93,76,111,97,100,101,
+    114,32,102,111,114,32,101,120,116,101,110,115,105,111,110,32,
+    109,111,100,117,108,101,115,46,10,10,32,32,32,32,84,104,
+    101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,115,
+    32,100,101,115,105,103,110,101,100,32,116,111,32,119,111,114,
+    107,32,119,105,116,104,32,70,105,108,101,70,105,110,100,101,
+    114,46,10,10,32,32,32,32,99,3,0,0,0,0,0,0,
+    0,0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,
+    0,115,16,0,0,0,124,1,124,0,95,0,124,2,124,0,
+    95,1,100,0,83,0,114,110,0,0,0,114,159,0,0,0,
+    114,5,1,0,0,114,3,0,0,0,114,3,0,0,0,114,
+    6,0,0,0,114,209,0,0,0,59,4,0,0,115,4,0,
+    0,0,0,1,6,1,122,28,69,120,116,101,110,115,105,111,
+    110,70,105,108,101,76,111,97,100,101,114,46,95,95,105,110,
+    105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,2,0,0,0,67,0,0,0,115,24,0,
+    0,0,124,0,106,0,124,1,106,0,107,2,111,22,124,0,
+    106,1,124,1,106,1,107,2,83,0,114,110,0,0,0,114,
+    240,0,0,0,114,242,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,114,243,0,0,0,63,4,0,
+    0,115,6,0,0,0,0,1,12,1,10,255,122,26,69,120,
+    116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
+    114,46,95,95,101,113,95,95,99,1,0,0,0,0,0,0,
+    0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,
+    0,115,20,0,0,0,116,0,124,0,106,1,131,1,116,0,
+    124,0,106,2,131,1,65,0,83,0,114,110,0,0,0,114,
+    244,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,114,247,0,0,0,67,4,0,
+    0,115,2,0,0,0,0,1,122,28,69,120,116,101,110,115,
+    105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,
+    104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,
+    0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115,
+    36,0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,
+    125,2,116,0,160,4,100,1,124,1,106,5,124,0,106,6,
+    161,3,1,0,124,2,83,0,41,2,122,38,67,114,101,97,
+    116,101,32,97,110,32,117,110,105,116,105,97,108,105,122,101,
+    100,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,
+    108,101,122,38,101,120,116,101,110,115,105,111,110,32,109,111,
+    100,117,108,101,32,123,33,114,125,32,108,111,97,100,101,100,
+    32,102,114,111,109,32,123,33,114,125,41,7,114,134,0,0,
+    0,114,214,0,0,0,114,163,0,0,0,90,14,99,114,101,
+    97,116,101,95,100,121,110,97,109,105,99,114,149,0,0,0,
+    114,117,0,0,0,114,44,0,0,0,41,3,114,119,0,0,
+    0,114,187,0,0,0,114,216,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,70,
+    4,0,0,115,18,0,0,0,0,2,4,1,4,0,2,255,
+    4,2,6,1,4,0,4,255,4,2,122,33,69,120,116,101,
+    110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
+    99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,5,0,
+    0,0,67,0,0,0,115,36,0,0,0,116,0,160,1,116,
+    2,106,3,124,1,161,2,1,0,116,0,160,4,100,1,124,
+    0,106,5,124,0,106,6,161,3,1,0,100,2,83,0,41,
+    3,122,30,73,110,105,116,105,97,108,105,122,101,32,97,110,
     32,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,
-    101,32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,
-    97,32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,
-    3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,114,213,0,0,0,86,4,0,
-    0,115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,
-    105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,
-    116,95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
-    4,0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,
-    114,110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,
-    115,105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,
-    101,32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,
-    46,78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,
-    90,4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,
-    101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,
-    46,103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,
-    67,0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,
-    250,0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,
-    0,0,94,4,0,0,115,2,0,0,0,0,3,122,32,69,
-    120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,
-    101,114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,
-    41,14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,
-    0,114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,
-    114,247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,
-    182,0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,
-    0,0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,114,15,1,0,
-    0,47,4,0,0,115,22,0,0,0,8,2,4,6,8,4,
-    8,4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,
-    114,15,1,0,0,99,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,
-    0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,
-    2,100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,
-    6,100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,
-    10,100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,
-    14,100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,
-    18,100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,
-    22,100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,
-    78,97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,
-    0,0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,
-    97,109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,
-    39,115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,
-    115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,
-    101,10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,
-    115,32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,
-    32,97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,
-    105,116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,
-    112,97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,
-    97,116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,
-    115,32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,
-    111,100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,
-    32,105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,
-    32,32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,
-    105,110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,
-    108,101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,
-    104,101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,
-    39,115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,
-    121,115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,
-    0,0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,
-    0,115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,
-    95,1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,
-    124,3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,
-    6,218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,
-    112,0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,
-    116,95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,
-    114,101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,
-    95,102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,
-    0,0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,
-    105,110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,
-    6,0,0,0,114,209,0,0,0,107,4,0,0,115,8,0,
-    0,0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,
-    101,115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,
-    116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,
-    4,0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,
-    0,124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,
-    2,125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,
-    1,100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,
-    110,115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,
-    97,114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,
-    101,44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,
-    116,116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,
-    0,0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,
-    8,95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,
-    114,41,0,0,0,41,4,114,119,0,0,0,114,13,1,0,
-    0,218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,
-    95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,
-    101,115,113,4,0,0,115,8,0,0,0,0,2,18,1,8,
-    2,4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,
-    97,116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,
-    95,112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
-    67,0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,
-    2,125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,
-    2,131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,
-    0,114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,
-    117,108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,
-    101,110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,
-    14,112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,
-    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,
-    1,0,0,123,4,0,0,115,4,0,0,0,0,1,12,1,
-    122,31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,
-    46,95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,
-    104,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,
-    0,0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,
-    0,124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,
-    2,107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,
-    2,125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,
-    0,107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,
-    0,95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,
-    110,0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,
-    114,26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,
-    140,0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,
-    114,119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,
-    116,104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,
-    108,97,116,101,127,4,0,0,115,16,0,0,0,0,2,12,
-    1,10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,
-    78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,
-    101,99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,
-    0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,
-    0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,
-    131,1,83,0,114,110,0,0,0,41,2,114,5,1,0,0,
-    114,32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,
-    114,95,95,140,4,0,0,115,2,0,0,0,0,1,122,23,
-    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
-    95,105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,
-    0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
-    115,12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,
-    0,114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,
-    119,0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,
-    116,105,116,101,109,95,95,143,4,0,0,115,2,0,0,0,
-    0,1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,
-    116,104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,
-    0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
-    0,0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,
-    106,0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,
-    1,114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,
-    0,0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,
-    109,95,95,146,4,0,0,115,2,0,0,0,0,1,122,26,
-    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
-    95,115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,
-    0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,
-    0,0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,
-    131,1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,
-    114,32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,
-    3,0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,
-    95,95,149,4,0,0,115,2,0,0,0,0,1,122,22,95,
+    101,122,40,101,120,116,101,110,115,105,111,110,32,109,111,100,
+    117,108,101,32,123,33,114,125,32,101,120,101,99,117,116,101,
+    100,32,102,114,111,109,32,123,33,114,125,78,41,7,114,134,
+    0,0,0,114,214,0,0,0,114,163,0,0,0,90,12,101,
+    120,101,99,95,100,121,110,97,109,105,99,114,149,0,0,0,
+    114,117,0,0,0,114,44,0,0,0,114,253,0,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,217,
+    0,0,0,78,4,0,0,115,10,0,0,0,0,2,14,1,
+    6,1,4,0,4,255,122,31,69,120,116,101,110,115,105,111,
+    110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,99,
+    95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,
+    0,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,
+    115,36,0,0,0,116,0,124,0,106,1,131,1,100,1,25,
+    0,137,0,116,2,135,0,102,1,100,2,100,3,132,8,116,
+    3,68,0,131,1,131,1,83,0,41,4,122,49,82,101,116,
+    117,114,110,32,84,114,117,101,32,105,102,32,116,104,101,32,
+    101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+    32,105,115,32,97,32,112,97,99,107,97,103,101,46,114,39,
+    0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
+    2,0,0,0,4,0,0,0,51,0,0,0,115,26,0,0,
+    0,124,0,93,18,125,1,136,0,100,0,124,1,23,0,107,
+    2,86,0,1,0,113,2,100,1,83,0,41,2,114,209,0,
+    0,0,78,114,3,0,0,0,169,2,114,32,0,0,0,218,
+    6,115,117,102,102,105,120,169,1,90,9,102,105,108,101,95,
+    110,97,109,101,114,3,0,0,0,114,6,0,0,0,218,9,
+    60,103,101,110,101,120,112,114,62,87,4,0,0,115,4,0,
+    0,0,4,1,2,255,122,49,69,120,116,101,110,115,105,111,
+    110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,
+    97,99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,
+    60,103,101,110,101,120,112,114,62,41,4,114,47,0,0,0,
+    114,44,0,0,0,218,3,97,110,121,218,18,69,88,84,69,
+    78,83,73,79,78,95,83,85,70,70,73,88,69,83,114,219,
+    0,0,0,114,3,0,0,0,114,18,1,0,0,114,6,0,
+    0,0,114,182,0,0,0,84,4,0,0,115,8,0,0,0,
+    0,2,14,1,12,1,2,255,122,30,69,120,116,101,110,115,
+    105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,115,
+    95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
+    0,115,4,0,0,0,100,1,83,0,41,2,122,63,82,101,
+    116,117,114,110,32,78,111,110,101,32,97,115,32,97,110,32,
+    101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,
+    32,99,97,110,110,111,116,32,99,114,101,97,116,101,32,97,
+    32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,3,
+    0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,114,213,0,0,0,90,4,0,0,
+    115,2,0,0,0,0,2,122,28,69,120,116,101,110,115,105,
+    111,110,70,105,108,101,76,111,97,100,101,114,46,103,101,116,
+    95,99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,
+    0,0,0,100,1,83,0,41,2,122,53,82,101,116,117,114,
+    110,32,78,111,110,101,32,97,115,32,101,120,116,101,110,115,
+    105,111,110,32,109,111,100,117,108,101,115,32,104,97,118,101,
+    32,110,111,32,115,111,117,114,99,101,32,99,111,100,101,46,
+    78,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,94,
+    4,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101,
+    110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,
+    103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
+    0,0,0,115,6,0,0,0,124,0,106,0,83,0,114,250,
+    0,0,0,114,48,0,0,0,114,219,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0,
+    0,98,4,0,0,115,2,0,0,0,0,3,122,32,69,120,
+    116,101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,
+    114,46,103,101,116,95,102,105,108,101,110,97,109,101,78,41,
+    14,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,
+    114,127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,
+    247,0,0,0,114,212,0,0,0,114,217,0,0,0,114,182,
+    0,0,0,114,213,0,0,0,114,229,0,0,0,114,136,0,
+    0,0,114,179,0,0,0,114,3,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,114,252,0,0,0,
+    51,4,0,0,115,22,0,0,0,8,2,4,6,8,4,8,
+    4,8,3,8,8,8,6,8,6,8,4,8,4,2,1,114,
+    252,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,2,0,0,0,64,0,0,0,115,104,0,
+    0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,
+    100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,
+    100,7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,
+    100,11,132,0,90,8,100,12,100,13,132,0,90,9,100,14,
+    100,15,132,0,90,10,100,16,100,17,132,0,90,11,100,18,
+    100,19,132,0,90,12,100,20,100,21,132,0,90,13,100,22,
+    100,23,132,0,90,14,100,24,83,0,41,25,218,14,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,97,38,1,0,
+    0,82,101,112,114,101,115,101,110,116,115,32,97,32,110,97,
+    109,101,115,112,97,99,101,32,112,97,99,107,97,103,101,39,
+    115,32,112,97,116,104,46,32,32,73,116,32,117,115,101,115,
+    32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,
+    10,32,32,32,32,116,111,32,102,105,110,100,32,105,116,115,
+    32,112,97,114,101,110,116,32,109,111,100,117,108,101,44,32,
+    97,110,100,32,102,114,111,109,32,116,104,101,114,101,32,105,
+    116,32,108,111,111,107,115,32,117,112,32,116,104,101,32,112,
+    97,114,101,110,116,39,115,10,32,32,32,32,95,95,112,97,
+    116,104,95,95,46,32,32,87,104,101,110,32,116,104,105,115,
+    32,99,104,97,110,103,101,115,44,32,116,104,101,32,109,111,
+    100,117,108,101,39,115,32,111,119,110,32,112,97,116,104,32,
+    105,115,32,114,101,99,111,109,112,117,116,101,100,44,10,32,
+    32,32,32,117,115,105,110,103,32,112,97,116,104,95,102,105,
+    110,100,101,114,46,32,32,70,111,114,32,116,111,112,45,108,
+    101,118,101,108,32,109,111,100,117,108,101,115,44,32,116,104,
+    101,32,112,97,114,101,110,116,32,109,111,100,117,108,101,39,
+    115,32,112,97,116,104,10,32,32,32,32,105,115,32,115,121,
+    115,46,112,97,116,104,46,99,4,0,0,0,0,0,0,0,
+    0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0,
+    115,36,0,0,0,124,1,124,0,95,0,124,2,124,0,95,
+    1,116,2,124,0,160,3,161,0,131,1,124,0,95,4,124,
+    3,124,0,95,5,100,0,83,0,114,110,0,0,0,41,6,
+    218,5,95,110,97,109,101,218,5,95,112,97,116,104,114,112,
+    0,0,0,218,16,95,103,101,116,95,112,97,114,101,110,116,
+    95,112,97,116,104,218,17,95,108,97,115,116,95,112,97,114,
+    101,110,116,95,112,97,116,104,218,12,95,112,97,116,104,95,
+    102,105,110,100,101,114,169,4,114,119,0,0,0,114,117,0,
+    0,0,114,44,0,0,0,90,11,112,97,116,104,95,102,105,
+    110,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6,
+    0,0,0,114,209,0,0,0,111,4,0,0,115,8,0,0,
+    0,0,1,6,1,6,1,14,1,122,23,95,78,97,109,101,
+    115,112,97,99,101,80,97,116,104,46,95,95,105,110,105,116,
+    95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,4,
+    0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0,
+    124,0,106,0,160,1,100,1,161,1,92,3,125,1,125,2,
+    125,3,124,2,100,2,107,2,114,30,100,3,83,0,124,1,
+    100,4,102,2,83,0,41,5,122,62,82,101,116,117,114,110,
+    115,32,97,32,116,117,112,108,101,32,111,102,32,40,112,97,
+    114,101,110,116,45,109,111,100,117,108,101,45,110,97,109,101,
+    44,32,112,97,114,101,110,116,45,112,97,116,104,45,97,116,
+    116,114,45,110,97,109,101,41,114,71,0,0,0,114,40,0,
+    0,0,41,2,114,8,0,0,0,114,44,0,0,0,90,8,
+    95,95,112,97,116,104,95,95,41,2,114,23,1,0,0,114,
+    41,0,0,0,41,4,114,119,0,0,0,114,14,1,0,0,
+    218,3,100,111,116,90,2,109,101,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,218,23,95,102,105,110,100,95,
+    112,97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,
+    115,117,4,0,0,115,8,0,0,0,0,2,18,1,8,2,
+    4,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97,
+    116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95,
+    112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,
+    0,0,0,115,28,0,0,0,124,0,160,0,161,0,92,2,
+    125,1,125,2,116,1,116,2,106,3,124,1,25,0,124,2,
+    131,2,83,0,114,110,0,0,0,41,4,114,30,1,0,0,
+    114,130,0,0,0,114,8,0,0,0,218,7,109,111,100,117,
+    108,101,115,41,3,114,119,0,0,0,90,18,112,97,114,101,
+    110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,
+    112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,3,
+    0,0,0,114,3,0,0,0,114,6,0,0,0,114,25,1,
+    0,0,127,4,0,0,115,4,0,0,0,0,1,12,1,122,
+    31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
+    95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,
+    99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
+    0,4,0,0,0,67,0,0,0,115,80,0,0,0,116,0,
+    124,0,160,1,161,0,131,1,125,1,124,1,124,0,106,2,
+    107,3,114,74,124,0,160,3,124,0,106,4,124,1,161,2,
+    125,2,124,2,100,0,107,9,114,68,124,2,106,5,100,0,
+    107,8,114,68,124,2,106,6,114,68,124,2,106,6,124,0,
+    95,7,124,1,124,0,95,2,124,0,106,7,83,0,114,110,
+    0,0,0,41,8,114,112,0,0,0,114,25,1,0,0,114,
+    26,1,0,0,114,27,1,0,0,114,23,1,0,0,114,140,
+    0,0,0,114,178,0,0,0,114,24,1,0,0,41,3,114,
+    119,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116,
+    104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,218,12,95,114,101,99,97,108,99,117,108,
+    97,116,101,131,4,0,0,115,16,0,0,0,0,2,12,1,
+    10,1,14,3,18,1,6,1,8,1,6,1,122,27,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101,
+    99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0,
+    0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,
+    0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,
+    1,83,0,114,110,0,0,0,41,2,114,6,1,0,0,114,
+    32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,218,8,95,95,105,116,101,114,
+    95,95,144,4,0,0,115,2,0,0,0,0,1,122,23,95,
     78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
-    108,101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,
-    0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,
-    2,78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,
-    116,104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,
-    24,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,
-    95,95,152,4,0,0,115,2,0,0,0,0,1,122,23,95,
+    105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,0,
+    0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,
+    12,0,0,0,124,0,160,0,161,0,124,1,25,0,83,0,
+    114,110,0,0,0,169,1,114,32,1,0,0,41,2,114,119,
+    0,0,0,218,5,105,110,100,101,120,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,218,11,95,95,103,101,116,
+    105,116,101,109,95,95,147,4,0,0,115,2,0,0,0,0,
+    1,122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,
+    104,46,95,95,103,101,116,105,116,101,109,95,95,99,3,0,
+    0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,
+    0,0,67,0,0,0,115,14,0,0,0,124,2,124,0,106,
+    0,124,1,60,0,100,0,83,0,114,110,0,0,0,41,1,
+    114,24,1,0,0,41,3,114,119,0,0,0,114,35,1,0,
+    0,114,44,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,218,11,95,95,115,101,116,105,116,101,109,
+    95,95,150,4,0,0,115,2,0,0,0,0,1,122,26,95,
     78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
-    114,101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,
-    12,0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,
-    114,110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,
-    0,218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,
-    110,115,95,95,155,4,0,0,115,2,0,0,0,0,1,122,
-    27,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
-    95,95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,
-    0,67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,
-    124,1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,
-    2,114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    186,0,0,0,158,4,0,0,115,2,0,0,0,0,1,122,
-    21,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
-    97,112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,
-    0,0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,
-    0,0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,
-    0,114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,
-    114,38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,
-    186,0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,114,22,1,0,0,100,4,0,
-    0,115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,
-    8,13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,
-    1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,
-    0,101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,
-    3,101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,
-    6,132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,
-    10,132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,
-    14,132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,
-    0,41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,
-    111,97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,
-    0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,
-    0,0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,
-    1,100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,
-    0,114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,209,0,0,0,164,
-    4,0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,
-    101,115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,
-    110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,
+    115,101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,
+    0,0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,
+    0,0,115,12,0,0,0,116,0,124,0,160,1,161,0,131,
+    1,83,0,114,110,0,0,0,41,2,114,22,0,0,0,114,
+    32,1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,
+    0,0,0,114,6,0,0,0,218,7,95,95,108,101,110,95,
+    95,153,4,0,0,115,2,0,0,0,0,1,122,22,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,108,
+    101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,0,
+    0,1,0,0,0,3,0,0,0,67,0,0,0,115,12,0,
+    0,0,100,1,160,0,124,0,106,1,161,1,83,0,41,2,
+    78,122,20,95,78,97,109,101,115,112,97,99,101,80,97,116,
+    104,40,123,33,114,125,41,41,2,114,62,0,0,0,114,24,
+    1,0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,218,8,95,95,114,101,112,114,95,
+    95,156,4,0,0,115,2,0,0,0,0,1,122,23,95,78,
+    97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,114,
+    101,112,114,95,95,99,2,0,0,0,0,0,0,0,0,0,
     0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,
-    0,0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,
-    2,122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,
-    111,114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,
-    32,32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,
-    111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,
-    46,32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,
-    99,104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,
-    32,106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,
-    32,32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,
-    123,33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,
-    62,41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,
-    193,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,
-    0,0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,
-    95,114,101,112,114,167,4,0,0,115,2,0,0,0,0,7,
-    122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
-    101,114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
-    0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,
-    41,2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,
-    0,0,176,4,0,0,115,2,0,0,0,0,1,122,27,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    105,115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,
-    0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,
-    0,0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,
-    40,0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,
-    0,0,179,4,0,0,115,2,0,0,0,0,1,122,27,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,
-    0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,
-    0,0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,
-    100,4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,
-    122,8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,
-    41,1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,213,0,0,0,182,4,0,0,115,2,0,0,0,
-    0,1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,
-    97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
-    0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,
-    210,0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,
-    0,0,185,4,0,0,115,2,0,0,0,0,1,122,30,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    99,114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,
+    0,0,0,124,1,124,0,160,0,161,0,107,6,83,0,114,
+    110,0,0,0,114,34,1,0,0,169,2,114,119,0,0,0,
+    218,4,105,116,101,109,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,218,12,95,95,99,111,110,116,97,105,110,
+    115,95,95,159,4,0,0,115,2,0,0,0,0,1,122,27,
+    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
+    95,99,111,110,116,97,105,110,115,95,95,99,2,0,0,0,
+    0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,
+    67,0,0,0,115,16,0,0,0,124,0,106,0,160,1,124,
+    1,161,1,1,0,100,0,83,0,114,110,0,0,0,41,2,
+    114,24,1,0,0,114,186,0,0,0,114,40,1,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,186,
+    0,0,0,162,4,0,0,115,2,0,0,0,0,1,122,21,
+    95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,97,
+    112,112,101,110,100,78,41,15,114,125,0,0,0,114,124,0,
+    0,0,114,126,0,0,0,114,127,0,0,0,114,209,0,0,
+    0,114,30,1,0,0,114,25,1,0,0,114,32,1,0,0,
+    114,33,1,0,0,114,36,1,0,0,114,37,1,0,0,114,
+    38,1,0,0,114,39,1,0,0,114,42,1,0,0,114,186,
+    0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,114,22,1,0,0,104,4,0,0,
+    115,24,0,0,0,8,1,4,6,8,6,8,10,8,4,8,
+    13,8,3,8,3,8,3,8,3,8,3,8,3,114,22,1,
+    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,0,3,0,0,0,64,0,0,0,115,80,0,0,0,
+    101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3,
+    101,4,100,3,100,4,132,0,131,1,90,5,100,5,100,6,
+    132,0,90,6,100,7,100,8,132,0,90,7,100,9,100,10,
+    132,0,90,8,100,11,100,12,132,0,90,9,100,13,100,14,
+    132,0,90,10,100,15,100,16,132,0,90,11,100,17,83,0,
+    41,18,218,16,95,78,97,109,101,115,112,97,99,101,76,111,
+    97,100,101,114,99,4,0,0,0,0,0,0,0,0,0,0,
+    0,4,0,0,0,4,0,0,0,67,0,0,0,115,18,0,
+    0,0,116,0,124,1,124,2,124,3,131,3,124,0,95,1,
+    100,0,83,0,114,110,0,0,0,41,2,114,22,1,0,0,
+    114,24,1,0,0,114,28,1,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,209,0,0,0,168,4,
+    0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101,
+    115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110,
+    105,116,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
+    0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,
+    0,0,100,1,160,0,124,1,106,1,161,1,83,0,41,2,
+    122,115,82,101,116,117,114,110,32,114,101,112,114,32,102,111,
+    114,32,116,104,101,32,109,111,100,117,108,101,46,10,10,32,
+    32,32,32,32,32,32,32,84,104,101,32,109,101,116,104,111,
+    100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,
+    32,32,84,104,101,32,105,109,112,111,114,116,32,109,97,99,
+    104,105,110,101,114,121,32,100,111,101,115,32,116,104,101,32,
+    106,111,98,32,105,116,115,101,108,102,46,10,10,32,32,32,
+    32,32,32,32,32,122,25,60,109,111,100,117,108,101,32,123,
+    33,114,125,32,40,110,97,109,101,115,112,97,99,101,41,62,
+    41,2,114,62,0,0,0,114,125,0,0,0,41,2,114,193,
+    0,0,0,114,216,0,0,0,114,3,0,0,0,114,3,0,
+    0,0,114,6,0,0,0,218,11,109,111,100,117,108,101,95,
+    114,101,112,114,171,4,0,0,115,2,0,0,0,0,7,122,
+    28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,
+    114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0,
     0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
-    0,0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,
-    110,0,0,0,114,3,0,0,0,114,252,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,
-    0,0,188,4,0,0,115,2,0,0,0,0,1,122,28,95,
-    78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
-    101,120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
-    67,0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,
-    0,106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,
-    2,83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,
-    109,101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,
-    10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,
-    116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,
-    101,100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,
-    100,117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,
-    10,32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,
-    112,97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,
-    101,100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,
-    125,41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,
-    0,0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,
-    191,4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,
-    2,122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,
-    100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,
-    41,12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,
-    0,114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,
-    114,182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,
-    212,0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,43,1,0,0,163,4,0,0,115,18,0,0,0,
-    8,1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,
-    8,3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,
-    0,0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,
-    115,106,0,0,0,101,0,90,1,100,0,90,2,100,1,90,
-    3,101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,
-    4,100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,
-    0,131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,
-    8,101,4,100,17,100,11,100,12,132,1,131,1,90,9,101,
-    4,100,18,100,13,100,14,132,1,131,1,90,10,101,4,100,
-    19,100,15,100,16,132,1,131,1,90,11,100,10,83,0,41,
-    20,218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,
-    101,116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,
-    102,111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,
-    32,112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,
-    95,32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,
-    0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,
-    0,0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,
-    2,160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,
-    2,124,2,100,1,107,8,114,40,116,1,106,2,124,1,61,
-    0,113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,
-    5,161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,
-    97,108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,
-    116,101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,
-    111,100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,
-    110,116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,
-    32,32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,
-    121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,
-    95,99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,
-    109,112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,
-    110,118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,
-    41,6,218,4,108,105,115,116,114,8,0,0,0,218,19,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,218,5,105,116,101,109,115,114,128,0,0,0,114,46,
-    1,0,0,41,3,114,193,0,0,0,114,117,0,0,0,218,
-    6,102,105,110,100,101,114,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,114,46,1,0,0,209,4,0,0,115,
-    10,0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,
-    80,97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,
-    105,100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,
-    0,0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,
-    0,67,0,0,0,115,84,0,0,0,116,0,106,1,100,1,
-    107,9,114,28,116,0,106,1,115,28,116,2,160,3,100,2,
-    116,4,161,2,1,0,116,0,106,1,68,0,93,44,125,2,
-    122,14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,
-    4,0,116,5,107,10,114,76,1,0,1,0,1,0,89,0,
-    113,34,89,0,113,34,88,0,113,34,100,1,83,0,41,3,
-    122,46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,
-    104,95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,
-    110,100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,
-    78,122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,
-    115,32,105,115,32,101,109,112,116,121,41,6,114,8,0,0,
-    0,218,10,112,97,116,104,95,104,111,111,107,115,114,75,0,
-    0,0,114,76,0,0,0,114,138,0,0,0,114,118,0,0,
-    0,41,3,114,193,0,0,0,114,44,0,0,0,90,4,104,
-    111,111,107,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,218,11,95,112,97,116,104,95,104,111,111,107,115,219,
-    4,0,0,115,16,0,0,0,0,3,16,1,12,1,10,1,
-    2,1,14,1,14,1,12,2,122,22,80,97,116,104,70,105,
-    110,100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-    0,8,0,0,0,67,0,0,0,115,104,0,0,0,124,1,
-    100,1,107,2,114,44,122,12,116,0,160,1,161,0,125,1,
-    87,0,110,22,4,0,116,2,107,10,114,42,1,0,1,0,
-    1,0,89,0,100,2,83,0,88,0,122,14,116,3,106,4,
-    124,1,25,0,125,2,87,0,110,40,4,0,116,5,107,10,
-    114,98,1,0,1,0,1,0,124,0,160,6,124,1,161,1,
-    125,2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,
-    88,0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,
-    101,32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,
-    32,112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,
-    32,115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,
-    101,114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,
-    32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,
-    110,116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,
-    104,101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,
-    104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,
-    105,110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,
-    100,32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,
-    111,32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,
-    108,97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,
-    101,46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,
-    0,78,41,7,114,2,0,0,0,114,55,0,0,0,114,2,
-    1,0,0,114,8,0,0,0,114,48,1,0,0,218,8,75,
-    101,121,69,114,114,111,114,114,52,1,0,0,41,3,114,193,
-    0,0,0,114,44,0,0,0,114,50,1,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,218,20,95,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,232,4,0,0,115,22,0,0,0,0,8,8,1,2,
-    1,12,1,14,3,8,1,2,1,14,1,14,1,10,1,16,
-    1,122,31,80,97,116,104,70,105,110,100,101,114,46,95,112,
-    97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,
-    104,101,99,3,0,0,0,0,0,0,0,0,0,0,0,6,
-    0,0,0,4,0,0,0,67,0,0,0,115,82,0,0,0,
-    116,0,124,2,100,1,131,2,114,26,124,2,160,1,124,1,
-    161,1,92,2,125,3,125,4,110,14,124,2,160,2,124,1,
-    161,1,125,3,103,0,125,4,124,3,100,0,107,9,114,60,
-    116,3,160,4,124,1,124,3,161,2,83,0,116,3,160,5,
-    124,1,100,0,161,2,125,5,124,4,124,5,95,6,124,5,
-    83,0,41,2,78,114,137,0,0,0,41,7,114,128,0,0,
-    0,114,137,0,0,0,114,206,0,0,0,114,134,0,0,0,
-    114,201,0,0,0,114,183,0,0,0,114,178,0,0,0,41,
-    6,114,193,0,0,0,114,139,0,0,0,114,50,1,0,0,
-    114,140,0,0,0,114,141,0,0,0,114,187,0,0,0,114,
-    3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,
-    95,108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,
-    254,4,0,0,115,18,0,0,0,0,4,10,1,16,2,10,
-    1,4,1,8,1,12,1,12,1,6,1,122,27,80,97,116,
-    104,70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,
-    103,101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,
-    0,0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,
-    0,0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,
-    134,125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,
-    28,113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,
-    1,107,9,114,8,116,4,124,6,100,2,131,2,114,70,124,
-    6,160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,
-    6,124,1,124,6,161,2,125,7,124,7,100,1,107,8,114,
-    92,113,8,124,7,106,7,100,1,107,9,114,110,124,7,2,
-    0,1,0,83,0,124,7,106,8,125,8,124,8,100,1,107,
-    8,114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,
-    8,161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,
-    2,125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,
-    63,70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,
-    32,111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,
-    116,104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,
-    108,101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,
-    78,114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,
-    115,105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,
-    0,0,114,85,0,0,0,218,5,98,121,116,101,115,114,54,
-    1,0,0,114,128,0,0,0,114,203,0,0,0,114,55,1,
-    0,0,114,140,0,0,0,114,178,0,0,0,114,118,0,0,
-    0,114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,
-    41,9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,
-    0,114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,
-    101,95,112,97,116,104,90,5,101,110,116,114,121,114,50,1,
-    0,0,114,187,0,0,0,114,141,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,218,9,95,103,101,
-    116,95,115,112,101,99,13,5,0,0,115,40,0,0,0,0,
-    5,4,1,8,1,14,1,2,1,10,1,8,1,10,1,14,
-    2,12,1,8,1,2,1,10,1,8,1,6,1,8,1,8,
-    5,12,2,12,1,6,1,122,20,80,97,116,104,70,105,110,
-    100,101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,
-    0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,
-    0,0,67,0,0,0,115,100,0,0,0,124,2,100,1,107,
-    8,114,14,116,0,106,1,125,2,124,0,160,2,124,1,124,
-    2,124,3,161,3,125,4,124,4,100,1,107,8,114,40,100,
-    1,83,0,124,4,106,3,100,1,107,8,114,92,124,4,106,
-    4,125,5,124,5,114,86,100,1,124,4,95,5,116,6,124,
-    1,124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,
-    0,100,1,83,0,110,4,124,4,83,0,100,1,83,0,41,
-    2,122,141,84,114,121,32,116,111,32,102,105,110,100,32,97,
-    32,115,112,101,99,32,102,111,114,32,39,102,117,108,108,110,
-    97,109,101,39,32,111,110,32,115,121,115,46,112,97,116,104,
-    32,111,114,32,39,112,97,116,104,39,46,10,10,32,32,32,
-    32,32,32,32,32,84,104,101,32,115,101,97,114,99,104,32,
-    105,115,32,98,97,115,101,100,32,111,110,32,115,121,115,46,
-    112,97,116,104,95,104,111,111,107,115,32,97,110,100,32,115,
-    121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,
-    95,99,97,99,104,101,46,10,32,32,32,32,32,32,32,32,
-    78,41,7,114,8,0,0,0,114,44,0,0,0,114,58,1,
-    0,0,114,140,0,0,0,114,178,0,0,0,114,181,0,0,
-    0,114,22,1,0,0,41,6,114,193,0,0,0,114,139,0,
-    0,0,114,44,0,0,0,114,202,0,0,0,114,187,0,0,
-    0,114,57,1,0,0,114,3,0,0,0,114,3,0,0,0,
-    114,6,0,0,0,114,203,0,0,0,45,5,0,0,115,26,
-    0,0,0,0,6,8,1,6,1,14,1,8,1,4,1,10,
-    1,6,1,4,3,6,1,16,1,4,2,6,2,122,20,80,
-    97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,115,
-    112,101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,
-    4,0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,
-    0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,
-    1,107,8,114,24,100,1,83,0,124,3,106,1,83,0,41,
-    2,122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,
-    108,101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,
-    114,32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,
-    110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,
-    32,97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,
-    46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,
-    97,99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,
-    104,105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,
-    112,114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,
-    105,110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,
-    97,100,46,10,10,32,32,32,32,32,32,32,32,78,114,204,
-    0,0,0,114,205,0,0,0,114,3,0,0,0,114,3,0,
-    0,0,114,6,0,0,0,114,206,0,0,0,69,5,0,0,
-    115,8,0,0,0,0,8,12,1,8,1,4,1,122,22,80,
-    97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,
-    111,100,117,108,101,41,1,78,41,2,78,78,41,1,78,41,
-    12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,
-    114,127,0,0,0,114,207,0,0,0,114,46,1,0,0,114,
-    52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58,
-    1,0,0,114,203,0,0,0,114,206,0,0,0,114,3,0,
+    0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41,
+    2,78,84,114,3,0,0,0,114,219,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0,
+    0,180,4,0,0,115,2,0,0,0,0,1,122,27,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,105,
+    115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
+    0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,
+    0,0,115,4,0,0,0,100,1,83,0,41,2,78,114,40,
+    0,0,0,114,3,0,0,0,114,219,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,229,0,0,
+    0,183,4,0,0,115,2,0,0,0,0,1,122,27,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,103,
+    101,116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,
+    0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,0,
+    0,0,115,16,0,0,0,116,0,100,1,100,2,100,3,100,
+    4,100,5,141,4,83,0,41,6,78,114,40,0,0,0,122,
+    8,60,115,116,114,105,110,103,62,114,215,0,0,0,84,41,
+    1,114,231,0,0,0,41,1,114,232,0,0,0,114,219,0,
     0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
-    0,114,45,1,0,0,205,4,0,0,115,30,0,0,0,8,
-    2,4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,
-    1,10,14,2,1,12,31,2,1,12,23,2,1,114,45,1,
-    0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,
-    101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,
-    132,0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,
-    100,6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,
-    100,19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,
-    90,11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,
-    100,18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,
-    108,101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,
-    97,115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,
-    32,32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,
-    105,116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,
-    116,101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,
-    111,114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,
-    98,101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,
-    104,101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,
-    101,99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,
-    114,32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,
-    115,32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,
-    10,10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,
-    84,0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,
-    137,0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,
-    132,8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,
-    124,0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,
-    124,0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,
-    124,0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,
-    105,97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,
-    112,97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,
-    110,32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,
-    32,110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,
-    32,32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,
-    97,105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,
-    114,32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,
-    117,102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,
-    101,114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,
-    110,105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,
-    22,0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,
-    86,0,1,0,113,2,100,0,83,0,114,110,0,0,0,114,
-    3,0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,19,1,0,0,98,
-    5,0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,
-    108,101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,
-    95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,
-    120,112,114,62,114,71,0,0,0,114,105,0,0,0,78,41,
-    7,114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,
-    114,44,0,0,0,218,11,95,112,97,116,104,95,109,116,105,
-    109,101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,
-    97,99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,
-    97,116,104,95,99,97,99,104,101,41,5,114,119,0,0,0,
-    114,44,0,0,0,218,14,108,111,97,100,101,114,95,100,101,
-    116,97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,
-    0,0,0,114,3,0,0,0,114,60,1,0,0,114,6,0,
-    0,0,114,209,0,0,0,92,5,0,0,115,16,0,0,0,
-    0,4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,
-    122,19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,
-    110,105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,
-    0,0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,
-    31,73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,
-    100,105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,
-    114,105,0,0,0,78,41,1,114,62,1,0,0,114,246,0,
+    0,114,213,0,0,0,186,4,0,0,115,2,0,0,0,0,
+    1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97,
+    100,101,114,46,103,101,116,95,99,111,100,101,99,2,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+    0,67,0,0,0,115,4,0,0,0,100,1,83,0,114,210,
+    0,0,0,114,3,0,0,0,114,211,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,212,0,0,
+    0,189,4,0,0,115,2,0,0,0,0,1,122,30,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,99,
+    114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,
+    0,67,0,0,0,115,4,0,0,0,100,0,83,0,114,110,
+    0,0,0,114,3,0,0,0,114,253,0,0,0,114,3,0,
+    0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0,
+    0,192,4,0,0,115,2,0,0,0,0,1,122,28,95,78,
+    97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,101,
+    120,101,99,95,109,111,100,117,108,101,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,
+    0,0,0,115,26,0,0,0,116,0,160,1,100,1,124,0,
+    106,2,161,2,1,0,116,0,160,3,124,0,124,1,161,2,
+    83,0,41,2,122,98,76,111,97,100,32,97,32,110,97,109,
+    101,115,112,97,99,101,32,109,111,100,117,108,101,46,10,10,
+    32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116,
+    104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101,
+    100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100,
+    117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10,
+    32,32,32,32,32,32,32,32,122,38,110,97,109,101,115,112,
+    97,99,101,32,109,111,100,117,108,101,32,108,111,97,100,101,
+    100,32,119,105,116,104,32,112,97,116,104,32,123,33,114,125,
+    41,4,114,134,0,0,0,114,149,0,0,0,114,24,1,0,
+    0,114,218,0,0,0,114,219,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,114,220,0,0,0,195,
+    4,0,0,115,8,0,0,0,0,7,6,1,4,255,4,2,
+    122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
+    101,114,46,108,111,97,100,95,109,111,100,117,108,101,78,41,
+    12,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,
+    114,209,0,0,0,114,207,0,0,0,114,44,1,0,0,114,
+    182,0,0,0,114,229,0,0,0,114,213,0,0,0,114,212,
+    0,0,0,114,217,0,0,0,114,220,0,0,0,114,3,0,
     0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
-    0,114,46,1,0,0,106,5,0,0,115,2,0,0,0,0,
-    2,122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,
-    118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,
+    0,114,43,1,0,0,167,4,0,0,115,18,0,0,0,8,
+    1,8,3,2,1,10,8,8,3,8,3,8,3,8,3,8,
+    3,114,43,1,0,0,99,0,0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,
+    106,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,
+    101,4,100,2,100,3,132,0,131,1,90,5,101,4,100,4,
+    100,5,132,0,131,1,90,6,101,4,100,6,100,7,132,0,
+    131,1,90,7,101,4,100,8,100,9,132,0,131,1,90,8,
+    101,4,100,17,100,11,100,12,132,1,131,1,90,9,101,4,
+    100,18,100,13,100,14,132,1,131,1,90,10,101,4,100,19,
+    100,15,100,16,132,1,131,1,90,11,100,10,83,0,41,20,
+    218,10,80,97,116,104,70,105,110,100,101,114,122,62,77,101,
+    116,97,32,112,97,116,104,32,102,105,110,100,101,114,32,102,
+    111,114,32,115,121,115,46,112,97,116,104,32,97,110,100,32,
+    112,97,99,107,97,103,101,32,95,95,112,97,116,104,95,95,
+    32,97,116,116,114,105,98,117,116,101,115,46,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,
+    0,67,0,0,0,115,64,0,0,0,116,0,116,1,106,2,
+    160,3,161,0,131,1,68,0,93,44,92,2,125,1,125,2,
+    124,2,100,1,107,8,114,40,116,1,106,2,124,1,61,0,
+    113,14,116,4,124,2,100,2,131,2,114,14,124,2,160,5,
+    161,0,1,0,113,14,100,1,83,0,41,3,122,125,67,97,
+    108,108,32,116,104,101,32,105,110,118,97,108,105,100,97,116,
+    101,95,99,97,99,104,101,115,40,41,32,109,101,116,104,111,
+    100,32,111,110,32,97,108,108,32,112,97,116,104,32,101,110,
+    116,114,121,32,102,105,110,100,101,114,115,10,32,32,32,32,
+    32,32,32,32,115,116,111,114,101,100,32,105,110,32,115,121,
+    115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
+    99,97,99,104,101,115,32,40,119,104,101,114,101,32,105,109,
+    112,108,101,109,101,110,116,101,100,41,46,78,218,17,105,110,
+    118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,41,
+    6,218,4,108,105,115,116,114,8,0,0,0,218,19,112,97,
+    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+    101,218,5,105,116,101,109,115,114,128,0,0,0,114,46,1,
+    0,0,41,3,114,193,0,0,0,114,117,0,0,0,218,6,
+    102,105,110,100,101,114,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,114,46,1,0,0,213,4,0,0,115,10,
+    0,0,0,0,4,22,1,8,1,10,1,10,1,122,28,80,
+    97,116,104,70,105,110,100,101,114,46,105,110,118,97,108,105,
+    100,97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,
+    0,0,0,0,0,0,0,0,3,0,0,0,9,0,0,0,
+    67,0,0,0,115,84,0,0,0,116,0,106,1,100,1,107,
+    9,114,28,116,0,106,1,115,28,116,2,160,3,100,2,116,
+    4,161,2,1,0,116,0,106,1,68,0,93,44,125,2,122,
+    14,124,2,124,1,131,1,87,0,2,0,1,0,83,0,4,
+    0,116,5,107,10,114,76,1,0,1,0,1,0,89,0,113,
+    34,89,0,113,34,88,0,113,34,100,1,83,0,41,3,122,
+    46,83,101,97,114,99,104,32,115,121,115,46,112,97,116,104,
+    95,104,111,111,107,115,32,102,111,114,32,97,32,102,105,110,
+    100,101,114,32,102,111,114,32,39,112,97,116,104,39,46,78,
+    122,23,115,121,115,46,112,97,116,104,95,104,111,111,107,115,
+    32,105,115,32,101,109,112,116,121,41,6,114,8,0,0,0,
+    218,10,112,97,116,104,95,104,111,111,107,115,114,75,0,0,
+    0,114,76,0,0,0,114,138,0,0,0,114,118,0,0,0,
+    41,3,114,193,0,0,0,114,44,0,0,0,90,4,104,111,
+    111,107,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,218,11,95,112,97,116,104,95,104,111,111,107,115,223,4,
+    0,0,115,16,0,0,0,0,3,16,1,12,1,10,1,2,
+    1,14,1,14,1,12,2,122,22,80,97,116,104,70,105,110,
+    100,101,114,46,95,112,97,116,104,95,104,111,111,107,115,99,
     2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
-    3,0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,
-    0,124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,
-    1,103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,
-    38,103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,
-    111,32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,
-    102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,
-    100,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,
-    32,110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,
-    32,32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,
-    111,110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,
-    97,100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,
-    114,116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,
-    32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,
-    32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,
-    101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,
-    115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,
-    78,41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,
-    0,0,41,3,114,119,0,0,0,114,139,0,0,0,114,187,
-    0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,
-    0,0,114,137,0,0,0,112,5,0,0,115,8,0,0,0,
-    0,7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,
-    110,100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,
-    99,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,
-    0,6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,
-    124,2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,
-    124,4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,
-    41,1,114,190,0,0,0,41,7,114,119,0,0,0,114,188,
-    0,0,0,114,139,0,0,0,114,44,0,0,0,90,4,115,
-    109,115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,
-    0,124,5,0,0,115,8,0,0,0,0,1,10,1,8,1,
-    2,255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,
-    103,101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,
-    0,0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,
-    0,0,115,102,1,0,0,100,1,125,3,124,1,160,0,100,
-    2,161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,
-    2,112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,
-    0,110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,
-    0,100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,
-    7,107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,
-    0,95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,
-    4,160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,
-    4,125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,
-    2,124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,
-    2,125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,
-    8,124,11,131,2,125,12,116,15,124,12,131,1,114,208,124,
-    0,160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,
-    5,2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,
-    3,124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,
-    13,124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,
-    18,106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,
-    7,124,9,23,0,124,6,107,6,144,1,114,54,116,15,124,
-    12,131,1,144,1,114,54,124,0,160,16,124,10,124,1,124,
-    12,100,8,124,2,161,5,2,0,1,0,83,0,113,224,124,
-    3,144,1,114,98,116,18,160,19,100,9,124,8,161,2,1,
-    0,116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,
-    1,124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,
-    111,84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,
-    112,101,99,32,102,111,114,32,116,104,101,32,115,112,101,99,
-    105,102,105,101,100,32,109,111,100,117,108,101,46,10,10,32,
-    32,32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,
-    104,101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,
-    44,32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,
-    32,102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,
-    70,114,71,0,0,0,114,28,0,0,0,114,105,0,0,0,
-    114,209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,
-    41,1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,
-    112,111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,
-    99,101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,
-    114,49,0,0,0,114,44,0,0,0,114,2,0,0,0,114,
-    55,0,0,0,114,9,1,0,0,114,50,0,0,0,114,62,
-    1,0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,
-    114,7,0,0,0,114,65,1,0,0,114,106,0,0,0,114,
-    64,1,0,0,114,38,0,0,0,114,61,1,0,0,114,54,
-    0,0,0,114,58,1,0,0,114,56,0,0,0,114,134,0,
-    0,0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,
-    0,41,14,114,119,0,0,0,114,139,0,0,0,114,202,0,
-    0,0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,
-    90,11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,
-    0,0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,
-    95,109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,
-    116,104,114,17,1,0,0,114,188,0,0,0,90,13,105,110,
-    105,116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,
-    108,95,112,97,116,104,114,187,0,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,6,0,0,0,114,203,0,0,0,129,
-    5,0,0,115,74,0,0,0,0,5,4,1,14,1,2,1,
-    24,1,14,1,10,1,10,1,8,1,6,2,6,1,6,1,
-    10,2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,
-    8,1,26,4,8,2,14,1,16,1,16,1,14,1,10,1,
-    10,1,2,0,2,255,10,2,6,1,12,1,12,1,8,1,
-    4,1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,
-    105,110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,
-    0,0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,
-    0,115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,
-    160,2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,
-    87,0,110,30,4,0,116,4,116,5,116,6,102,3,107,10,
-    114,58,1,0,1,0,1,0,103,0,125,2,89,0,110,2,
-    88,0,116,7,106,8,160,9,100,1,161,1,115,84,116,10,
-    124,2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,
-    124,2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,
-    92,3,125,5,125,6,125,7,124,6,114,136,100,3,160,13,
-    124,5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,
-    125,8,124,3,160,15,124,8,161,1,1,0,113,94,124,3,
-    124,0,95,11,116,7,106,8,160,9,116,16,161,1,114,186,
-    100,4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,
-    100,6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,
-    32,99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,
-    105,97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,
-    112,97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,
-    115,32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,
-    0,114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,
-    0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,
-    83,0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,
-    1,124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,
-    0,0,41,1,114,106,0,0,0,41,2,114,32,0,0,0,
-    90,2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,218,9,60,115,101,116,99,111,109,112,62,206,5,
-    0,0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,
-    101,70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,
-    99,104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,
-    116,99,111,109,112,62,78,41,18,114,44,0,0,0,114,2,
-    0,0,0,114,6,1,0,0,114,55,0,0,0,114,2,1,
-    0,0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,
-    114,111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,
-    114,121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,
-    0,114,10,0,0,0,114,63,1,0,0,114,64,1,0,0,
-    114,101,0,0,0,114,62,0,0,0,114,106,0,0,0,218,
-    3,97,100,100,114,11,0,0,0,114,65,1,0,0,41,9,
-    114,119,0,0,0,114,44,0,0,0,114,7,1,0,0,90,
-    21,108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,
-    110,116,101,110,116,115,114,41,1,0,0,114,117,0,0,0,
-    114,29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,
-    110,97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,114,67,1,0,0,177,5,0,0,115,34,0,0,
-    0,0,2,6,1,2,1,22,1,20,3,10,3,12,1,12,
-    7,6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,
-    1,12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,
-    95,102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
-    7,0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,
-    1,100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,
-    0,0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,
-    32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,
-    32,99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,
-    111,110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,
-    10,32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,
-    105,108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,
-    115,116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,
-    32,115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,
-    114,115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,
-    32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,
-    110,32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,
-    32,32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,
-    97,116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,
-    101,32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,
-    32,97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,
-    112,111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,
-    32,32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,
-    32,32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,
-    0,0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,
-    34,0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,
-    124,0,100,2,141,2,130,1,136,0,124,0,102,1,136,1,
-    158,2,142,0,83,0,41,3,122,45,80,97,116,104,32,104,
-    111,111,107,32,102,111,114,32,105,109,112,111,114,116,108,105,
-    98,46,109,97,99,104,105,110,101,114,121,46,70,105,108,101,
-    70,105,110,100,101,114,46,122,30,111,110,108,121,32,100,105,
-    114,101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,
-    112,112,111,114,116,101,100,114,48,0,0,0,41,2,114,56,
-    0,0,0,114,118,0,0,0,114,48,0,0,0,169,2,114,
-    193,0,0,0,114,66,1,0,0,114,3,0,0,0,114,6,
-    0,0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,
-    111,114,95,70,105,108,101,70,105,110,100,101,114,218,5,0,
-    0,115,6,0,0,0,0,2,8,1,12,1,122,54,70,105,
-    108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,
-    111,107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,
-    95,104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,
-    110,100,101,114,114,3,0,0,0,41,3,114,193,0,0,0,
-    114,66,1,0,0,114,73,1,0,0,114,3,0,0,0,114,
-    72,1,0,0,114,6,0,0,0,218,9,112,97,116,104,95,
-    104,111,111,107,208,5,0,0,115,4,0,0,0,0,10,14,
-    6,122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,
-    116,104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,
-    0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,
-    115,12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,
-    0,41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,
-    40,123,33,114,125,41,41,2,114,62,0,0,0,114,44,0,
-    0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,
-    0,114,6,0,0,0,114,39,1,0,0,226,5,0,0,115,
-    2,0,0,0,0,1,122,19,70,105,108,101,70,105,110,100,
-    101,114,46,95,95,114,101,112,114,95,95,41,1,78,41,15,
+    8,0,0,0,67,0,0,0,115,104,0,0,0,124,1,100,
+    1,107,2,114,44,122,12,116,0,160,1,161,0,125,1,87,
+    0,110,22,4,0,116,2,107,10,114,42,1,0,1,0,1,
+    0,89,0,100,2,83,0,88,0,122,14,116,3,106,4,124,
+    1,25,0,125,2,87,0,110,40,4,0,116,5,107,10,114,
+    98,1,0,1,0,1,0,124,0,160,6,124,1,161,1,125,
+    2,124,2,116,3,106,4,124,1,60,0,89,0,110,2,88,
+    0,124,2,83,0,41,3,122,210,71,101,116,32,116,104,101,
+    32,102,105,110,100,101,114,32,102,111,114,32,116,104,101,32,
+    112,97,116,104,32,101,110,116,114,121,32,102,114,111,109,32,
+    115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101,
+    114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32,
+    32,32,73,102,32,116,104,101,32,112,97,116,104,32,101,110,
+    116,114,121,32,105,115,32,110,111,116,32,105,110,32,116,104,
+    101,32,99,97,99,104,101,44,32,102,105,110,100,32,116,104,
+    101,32,97,112,112,114,111,112,114,105,97,116,101,32,102,105,
+    110,100,101,114,10,32,32,32,32,32,32,32,32,97,110,100,
+    32,99,97,99,104,101,32,105,116,46,32,73,102,32,110,111,
+    32,102,105,110,100,101,114,32,105,115,32,97,118,97,105,108,
+    97,98,108,101,44,32,115,116,111,114,101,32,78,111,110,101,
+    46,10,10,32,32,32,32,32,32,32,32,114,40,0,0,0,
+    78,41,7,114,2,0,0,0,114,55,0,0,0,114,3,1,
+    0,0,114,8,0,0,0,114,48,1,0,0,218,8,75,101,
+    121,69,114,114,111,114,114,52,1,0,0,41,3,114,193,0,
+    0,0,114,44,0,0,0,114,50,1,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,218,20,95,112,97,
+    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+    101,236,4,0,0,115,22,0,0,0,0,8,8,1,2,1,
+    12,1,14,3,8,1,2,1,14,1,14,1,10,1,16,1,
+    122,31,80,97,116,104,70,105,110,100,101,114,46,95,112,97,
+    116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104,
+    101,99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,
+    0,0,4,0,0,0,67,0,0,0,115,82,0,0,0,116,
+    0,124,2,100,1,131,2,114,26,124,2,160,1,124,1,161,
+    1,92,2,125,3,125,4,110,14,124,2,160,2,124,1,161,
+    1,125,3,103,0,125,4,124,3,100,0,107,9,114,60,116,
+    3,160,4,124,1,124,3,161,2,83,0,116,3,160,5,124,
+    1,100,0,161,2,125,5,124,4,124,5,95,6,124,5,83,
+    0,41,2,78,114,137,0,0,0,41,7,114,128,0,0,0,
+    114,137,0,0,0,114,206,0,0,0,114,134,0,0,0,114,
+    201,0,0,0,114,183,0,0,0,114,178,0,0,0,41,6,
+    114,193,0,0,0,114,139,0,0,0,114,50,1,0,0,114,
+    140,0,0,0,114,141,0,0,0,114,187,0,0,0,114,3,
+    0,0,0,114,3,0,0,0,114,6,0,0,0,218,16,95,
+    108,101,103,97,99,121,95,103,101,116,95,115,112,101,99,2,
+    5,0,0,115,18,0,0,0,0,4,10,1,16,2,10,1,
+    4,1,8,1,12,1,12,1,6,1,122,27,80,97,116,104,
+    70,105,110,100,101,114,46,95,108,101,103,97,99,121,95,103,
+    101,116,95,115,112,101,99,78,99,4,0,0,0,0,0,0,
+    0,0,0,0,0,9,0,0,0,5,0,0,0,67,0,0,
+    0,115,166,0,0,0,103,0,125,4,124,2,68,0,93,134,
+    125,5,116,0,124,5,116,1,116,2,102,2,131,2,115,28,
+    113,8,124,0,160,3,124,5,161,1,125,6,124,6,100,1,
+    107,9,114,8,116,4,124,6,100,2,131,2,114,70,124,6,
+    160,5,124,1,124,3,161,2,125,7,110,12,124,0,160,6,
+    124,1,124,6,161,2,125,7,124,7,100,1,107,8,114,92,
+    113,8,124,7,106,7,100,1,107,9,114,110,124,7,2,0,
+    1,0,83,0,124,7,106,8,125,8,124,8,100,1,107,8,
+    114,132,116,9,100,3,131,1,130,1,124,4,160,10,124,8,
+    161,1,1,0,113,8,116,11,160,12,124,1,100,1,161,2,
+    125,7,124,4,124,7,95,8,124,7,83,0,41,4,122,63,
+    70,105,110,100,32,116,104,101,32,108,111,97,100,101,114,32,
+    111,114,32,110,97,109,101,115,112,97,99,101,95,112,97,116,
+    104,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,
+    101,47,112,97,99,107,97,103,101,32,110,97,109,101,46,78,
+    114,203,0,0,0,122,19,115,112,101,99,32,109,105,115,115,
+    105,110,103,32,108,111,97,100,101,114,41,13,114,161,0,0,
+    0,114,85,0,0,0,218,5,98,121,116,101,115,114,54,1,
+    0,0,114,128,0,0,0,114,203,0,0,0,114,55,1,0,
+    0,114,140,0,0,0,114,178,0,0,0,114,118,0,0,0,
+    114,167,0,0,0,114,134,0,0,0,114,183,0,0,0,41,
+    9,114,193,0,0,0,114,139,0,0,0,114,44,0,0,0,
+    114,202,0,0,0,218,14,110,97,109,101,115,112,97,99,101,
+    95,112,97,116,104,90,5,101,110,116,114,121,114,50,1,0,
+    0,114,187,0,0,0,114,141,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,218,9,95,103,101,116,
+    95,115,112,101,99,17,5,0,0,115,40,0,0,0,0,5,
+    4,1,8,1,14,1,2,1,10,1,8,1,10,1,14,2,
+    12,1,8,1,2,1,10,1,8,1,6,1,8,1,8,5,
+    12,2,12,1,6,1,122,20,80,97,116,104,70,105,110,100,
+    101,114,46,95,103,101,116,95,115,112,101,99,99,4,0,0,
+    0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,
+    0,67,0,0,0,115,100,0,0,0,124,2,100,1,107,8,
+    114,14,116,0,106,1,125,2,124,0,160,2,124,1,124,2,
+    124,3,161,3,125,4,124,4,100,1,107,8,114,40,100,1,
+    83,0,124,4,106,3,100,1,107,8,114,92,124,4,106,4,
+    125,5,124,5,114,86,100,1,124,4,95,5,116,6,124,1,
+    124,5,124,0,106,2,131,3,124,4,95,4,124,4,83,0,
+    100,1,83,0,110,4,124,4,83,0,100,1,83,0,41,2,
+    122,141,84,114,121,32,116,111,32,102,105,110,100,32,97,32,
+    115,112,101,99,32,102,111,114,32,39,102,117,108,108,110,97,
+    109,101,39,32,111,110,32,115,121,115,46,112,97,116,104,32,
+    111,114,32,39,112,97,116,104,39,46,10,10,32,32,32,32,
+    32,32,32,32,84,104,101,32,115,101,97,114,99,104,32,105,
+    115,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112,
+    97,116,104,95,104,111,111,107,115,32,97,110,100,32,115,121,
+    115,46,112,97,116,104,95,105,109,112,111,114,116,101,114,95,
+    99,97,99,104,101,46,10,32,32,32,32,32,32,32,32,78,
+    41,7,114,8,0,0,0,114,44,0,0,0,114,58,1,0,
+    0,114,140,0,0,0,114,178,0,0,0,114,181,0,0,0,
+    114,22,1,0,0,41,6,114,193,0,0,0,114,139,0,0,
+    0,114,44,0,0,0,114,202,0,0,0,114,187,0,0,0,
+    114,57,1,0,0,114,3,0,0,0,114,3,0,0,0,114,
+    6,0,0,0,114,203,0,0,0,49,5,0,0,115,26,0,
+    0,0,0,6,8,1,6,1,14,1,8,1,4,1,10,1,
+    6,1,4,3,6,1,16,1,4,2,6,2,122,20,80,97,
+    116,104,70,105,110,100,101,114,46,102,105,110,100,95,115,112,
+    101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4,
+    0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0,
+    124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1,
+    107,8,114,24,100,1,83,0,124,3,106,1,83,0,41,2,
+    122,170,102,105,110,100,32,116,104,101,32,109,111,100,117,108,
+    101,32,111,110,32,115,121,115,46,112,97,116,104,32,111,114,
+    32,39,112,97,116,104,39,32,98,97,115,101,100,32,111,110,
+    32,115,121,115,46,112,97,116,104,95,104,111,111,107,115,32,
+    97,110,100,10,32,32,32,32,32,32,32,32,115,121,115,46,
+    112,97,116,104,95,105,109,112,111,114,116,101,114,95,99,97,
+    99,104,101,46,10,10,32,32,32,32,32,32,32,32,84,104,
+    105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112,
+    114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105,
+    110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,
+    100,46,10,10,32,32,32,32,32,32,32,32,78,114,204,0,
+    0,0,114,205,0,0,0,114,3,0,0,0,114,3,0,0,
+    0,114,6,0,0,0,114,206,0,0,0,73,5,0,0,115,
+    8,0,0,0,0,8,12,1,8,1,4,1,122,22,80,97,
+    116,104,70,105,110,100,101,114,46,102,105,110,100,95,109,111,
+    100,117,108,101,41,1,78,41,2,78,78,41,1,78,41,12,
     114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,
-    127,0,0,0,114,209,0,0,0,114,46,1,0,0,114,143,
-    0,0,0,114,206,0,0,0,114,137,0,0,0,114,58,1,
-    0,0,114,203,0,0,0,114,67,1,0,0,114,207,0,0,
-    0,114,74,1,0,0,114,39,1,0,0,114,3,0,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    59,1,0,0,83,5,0,0,115,22,0,0,0,8,2,4,
-    7,8,14,8,4,4,2,8,12,8,5,10,48,8,31,2,
-    1,10,17,114,59,1,0,0,99,4,0,0,0,0,0,0,
-    0,0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,
-    0,115,146,0,0,0,124,0,160,0,100,1,161,1,125,4,
-    124,0,160,0,100,2,161,1,125,5,124,4,115,66,124,5,
-    114,36,124,5,106,1,125,4,110,30,124,2,124,3,107,2,
-    114,56,116,2,124,1,124,2,131,2,125,4,110,10,116,3,
-    124,1,124,2,131,2,125,4,124,5,115,84,116,4,124,1,
-    124,2,124,4,100,3,141,3,125,5,122,36,124,5,124,0,
-    100,2,60,0,124,4,124,0,100,1,60,0,124,2,124,0,
-    100,4,60,0,124,3,124,0,100,5,60,0,87,0,110,20,
-    4,0,116,5,107,10,114,140,1,0,1,0,1,0,89,0,
-    110,2,88,0,100,0,83,0,41,6,78,218,10,95,95,108,
-    111,97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,
-    95,114,60,1,0,0,90,8,95,95,102,105,108,101,95,95,
-    90,10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,
-    103,101,116,114,140,0,0,0,114,14,1,0,0,114,8,1,
-    0,0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,
-    111,110,41,6,90,2,110,115,114,117,0,0,0,90,8,112,
-    97,116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,
-    109,101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,
-    0,114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,
-    120,95,117,112,95,109,111,100,117,108,101,232,5,0,0,115,
-    34,0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,
-    8,1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,
-    8,1,12,1,14,2,114,79,1,0,0,99,0,0,0,0,
-    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
-    67,0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,
-    0,102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,
-    6,102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,
-    1,122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,
-    116,32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,
-    109,111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,
-    10,32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,
-    115,32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,
-    114,44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,
-    32,32,41,7,114,15,1,0,0,114,163,0,0,0,218,18,
-    101,120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,
-    101,115,114,8,1,0,0,114,102,0,0,0,114,14,1,0,
-    0,114,89,0,0,0,41,3,90,10,101,120,116,101,110,115,
-    105,111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,
-    116,101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,
-    114,6,0,0,0,114,184,0,0,0,255,5,0,0,115,8,
-    0,0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,
-    99,1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,
-    0,9,0,0,0,67,0,0,0,115,178,1,0,0,124,0,
-    97,0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,
-    106,3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,
-    124,2,116,1,106,3,107,7,114,56,116,0,160,5,124,2,
-    161,1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,
-    116,6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,
-    100,3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,
-    102,2,125,4,124,4,68,0,93,110,92,2,125,5,125,6,
-    116,7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,
-    115,136,116,8,130,1,124,6,100,8,25,0,125,7,124,5,
-    116,1,106,3,107,6,114,170,116,1,106,3,124,5,25,0,
-    125,8,1,0,113,226,113,106,122,20,116,0,160,5,124,5,
-    161,1,125,8,87,0,1,0,113,226,87,0,113,106,4,0,
-    116,9,107,10,114,214,1,0,1,0,1,0,89,0,113,106,
-    89,0,113,106,88,0,113,106,116,9,100,9,131,1,130,1,
-    116,6,124,1,100,10,124,8,131,3,1,0,116,6,124,1,
-    100,11,124,7,131,3,1,0,116,6,124,1,100,12,100,13,
-    160,10,124,6,161,1,131,3,1,0,116,6,124,1,100,14,
-    100,15,100,16,132,0,124,6,68,0,131,1,131,3,1,0,
-    116,0,160,5,100,17,161,1,125,9,116,6,124,1,100,17,
-    124,9,131,3,1,0,116,0,160,5,100,18,161,1,125,10,
-    116,6,124,1,100,18,124,10,131,3,1,0,124,5,100,4,
-    107,2,144,1,114,110,116,0,160,5,100,19,161,1,125,11,
-    116,6,124,1,100,20,124,11,131,3,1,0,116,6,124,1,
-    100,21,116,11,131,0,131,3,1,0,116,12,160,13,116,2,
-    160,14,161,0,161,1,1,0,124,5,100,4,107,2,144,1,
-    114,174,116,15,160,16,100,22,161,1,1,0,100,23,116,12,
-    107,6,144,1,114,174,100,24,116,17,95,18,100,25,83,0,
-    41,26,122,205,83,101,116,117,112,32,116,104,101,32,112,97,
-    116,104,45,98,97,115,101,100,32,105,109,112,111,114,116,101,
-    114,115,32,102,111,114,32,105,109,112,111,114,116,108,105,98,
-    32,98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,
-    101,100,101,100,10,32,32,32,32,98,117,105,108,116,45,105,
-    110,32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,
-    106,101,99,116,105,110,103,32,116,104,101,109,32,105,110,116,
-    111,32,116,104,101,32,103,108,111,98,97,108,32,110,97,109,
-    101,115,112,97,99,101,46,10,10,32,32,32,32,79,116,104,
-    101,114,32,99,111,109,112,111,110,101,110,116,115,32,97,114,
-    101,32,101,120,116,114,97,99,116,101,100,32,102,114,111,109,
-    32,116,104,101,32,99,111,114,101,32,98,111,111,116,115,116,
-    114,97,112,32,109,111,100,117,108,101,46,10,10,32,32,32,
-    32,41,4,114,64,0,0,0,114,75,0,0,0,218,8,98,
-    117,105,108,116,105,110,115,114,160,0,0,0,90,5,112,111,
-    115,105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,
-    0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,
-    0,0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,
-    1,116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,
-    2,100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,
-    22,0,0,0,41,2,114,32,0,0,0,114,95,0,0,0,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,
-    19,1,0,0,35,6,0,0,115,4,0,0,0,4,0,2,
-    0,122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,
-    115,62,46,60,103,101,110,101,120,112,114,62,114,73,0,0,
-    0,122,30,105,109,112,111,114,116,108,105,98,32,114,101,113,
-    117,105,114,101,115,32,112,111,115,105,120,32,111,114,32,110,
-    116,114,2,0,0,0,114,35,0,0,0,114,31,0,0,0,
-    114,40,0,0,0,114,58,0,0,0,99,1,0,0,0,0,
+    127,0,0,0,114,207,0,0,0,114,46,1,0,0,114,52,
+    1,0,0,114,54,1,0,0,114,55,1,0,0,114,58,1,
+    0,0,114,203,0,0,0,114,206,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
+    114,45,1,0,0,209,4,0,0,115,30,0,0,0,8,2,
+    4,2,2,1,10,9,2,1,10,12,2,1,10,21,2,1,
+    10,14,2,1,12,31,2,1,12,23,2,1,114,45,1,0,
+    0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+    0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101,
+    0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,
+    0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100,
+    6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100,
+    19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90,
+    11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100,
+    18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108,
+    101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97,
+    115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32,
+    32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105,
+    116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,
+    101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111,
+    114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,
+    101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104,
+    101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101,
+    99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114,
+    32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115,
+    32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10,
+    10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84,
+    0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137,
+    0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132,
+    8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124,
+    0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124,
+    0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124,
+    0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105,
+    97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112,
+    97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110,
+    32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32,
+    110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32,
+    32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97,
+    105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114,
+    32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117,
+    102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101,
+    114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110,
+    105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0,
+    0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22,
+    0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86,
+    0,1,0,113,2,100,0,83,0,114,110,0,0,0,114,3,
+    0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,19,1,0,0,102,5,
+    0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,108,
+    101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95,
+    46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120,
+    112,114,62,114,71,0,0,0,114,105,0,0,0,78,41,7,
+    114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,114,
+    44,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109,
+    101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97,
+    99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97,
+    116,104,95,99,97,99,104,101,41,5,114,119,0,0,0,114,
+    44,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116,
+    97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,0,
+    0,0,114,3,0,0,0,114,60,1,0,0,114,6,0,0,
+    0,114,209,0,0,0,96,5,0,0,115,16,0,0,0,0,
+    4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,122,
+    19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110,
+    105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,
+    0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0,
+    0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31,
+    73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100,
+    105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,
+    105,0,0,0,78,41,1,114,62,1,0,0,114,246,0,0,
+    0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,
+    114,46,1,0,0,110,5,0,0,115,2,0,0,0,0,2,
+    122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,118,
+    97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,
+    0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,0,
+    124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,1,
+    103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,38,
+    103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,111,
+    32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102,
+    111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,
+    32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,
+    110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,32,
+    32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,111,
+    110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,97,
+    100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,114,
+    116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,32,
+    32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,
+    100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,
+    32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115,
+    116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78,
+    41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,0,
+    0,41,3,114,119,0,0,0,114,139,0,0,0,114,187,0,
+    0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,
+    0,114,137,0,0,0,116,5,0,0,115,8,0,0,0,0,
+    7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,110,
+    100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99,
+    6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,
+    6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124,
+    2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124,
+    4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,41,
+    1,114,190,0,0,0,41,7,114,119,0,0,0,114,188,0,
+    0,0,114,139,0,0,0,114,44,0,0,0,90,4,115,109,
+    115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,0,
+    128,5,0,0,115,8,0,0,0,0,1,10,1,8,1,2,
+    255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,103,
+    101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,0,
+    0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,0,
+    0,115,102,1,0,0,100,1,125,3,124,1,160,0,100,2,
+    161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,2,
+    112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,0,
+    110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,0,
+    100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,7,
+    107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,0,
+    95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,4,
+    160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4,
+    125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,2,
+    124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,2,
+    125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8,
+    124,11,131,2,125,12,116,15,124,12,131,1,114,208,124,0,
+    160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5,
+    2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,3,
+    124,0,106,14,68,0,93,86,92,2,125,9,125,10,116,13,
+    124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18,
+    106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7,
+    124,9,23,0,124,6,107,6,144,1,114,54,116,15,124,12,
+    131,1,144,1,114,54,124,0,160,16,124,10,124,1,124,12,
+    100,8,124,2,161,5,2,0,1,0,83,0,113,224,124,3,
+    144,1,114,98,116,18,160,19,100,9,124,8,161,2,1,0,
+    116,18,160,20,124,1,100,8,161,2,125,13,124,8,103,1,
+    124,13,95,21,124,13,83,0,100,8,83,0,41,10,122,111,
+    84,114,121,32,116,111,32,102,105,110,100,32,97,32,115,112,
+    101,99,32,102,111,114,32,116,104,101,32,115,112,101,99,105,
+    102,105,101,100,32,109,111,100,117,108,101,46,10,10,32,32,
+    32,32,32,32,32,32,82,101,116,117,114,110,115,32,116,104,
+    101,32,109,97,116,99,104,105,110,103,32,115,112,101,99,44,
+    32,111,114,32,78,111,110,101,32,105,102,32,110,111,116,32,
+    102,111,117,110,100,46,10,32,32,32,32,32,32,32,32,70,
+    114,71,0,0,0,114,28,0,0,0,114,105,0,0,0,114,
+    209,0,0,0,122,9,116,114,121,105,110,103,32,123,125,41,
+    1,90,9,118,101,114,98,111,115,105,116,121,78,122,25,112,
+    111,115,115,105,98,108,101,32,110,97,109,101,115,112,97,99,
+    101,32,102,111,114,32,123,125,41,22,114,41,0,0,0,114,
+    49,0,0,0,114,44,0,0,0,114,2,0,0,0,114,55,
+    0,0,0,114,10,1,0,0,114,50,0,0,0,114,62,1,
+    0,0,218,11,95,102,105,108,108,95,99,97,99,104,101,114,
+    7,0,0,0,114,65,1,0,0,114,106,0,0,0,114,64,
+    1,0,0,114,38,0,0,0,114,61,1,0,0,114,54,0,
+    0,0,114,58,1,0,0,114,56,0,0,0,114,134,0,0,
+    0,114,149,0,0,0,114,183,0,0,0,114,178,0,0,0,
+    41,14,114,119,0,0,0,114,139,0,0,0,114,202,0,0,
+    0,90,12,105,115,95,110,97,109,101,115,112,97,99,101,90,
+    11,116,97,105,108,95,109,111,100,117,108,101,114,169,0,0,
+    0,90,5,99,97,99,104,101,90,12,99,97,99,104,101,95,
+    109,111,100,117,108,101,90,9,98,97,115,101,95,112,97,116,
+    104,114,17,1,0,0,114,188,0,0,0,90,13,105,110,105,
+    116,95,102,105,108,101,110,97,109,101,90,9,102,117,108,108,
+    95,112,97,116,104,114,187,0,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,6,0,0,0,114,203,0,0,0,133,5,
+    0,0,115,74,0,0,0,0,5,4,1,14,1,2,1,24,
+    1,14,1,10,1,10,1,8,1,6,2,6,1,6,1,10,
+    2,6,1,4,2,8,1,12,1,14,1,8,1,10,1,8,
+    1,26,4,8,2,14,1,16,1,16,1,14,1,10,1,10,
+    1,2,0,2,255,10,2,6,1,12,1,12,1,8,1,4,
+    1,122,20,70,105,108,101,70,105,110,100,101,114,46,102,105,
+    110,100,95,115,112,101,99,99,1,0,0,0,0,0,0,0,
+    0,0,0,0,9,0,0,0,10,0,0,0,67,0,0,0,
+    115,190,0,0,0,124,0,106,0,125,1,122,22,116,1,160,
+    2,124,1,112,22,116,1,160,3,161,0,161,1,125,2,87,
+    0,110,30,4,0,116,4,116,5,116,6,102,3,107,10,114,
+    58,1,0,1,0,1,0,103,0,125,2,89,0,110,2,88,
+    0,116,7,106,8,160,9,100,1,161,1,115,84,116,10,124,
+    2,131,1,124,0,95,11,110,74,116,10,131,0,125,3,124,
+    2,68,0,93,56,125,4,124,4,160,12,100,2,161,1,92,
+    3,125,5,125,6,125,7,124,6,114,136,100,3,160,13,124,
+    5,124,7,160,14,161,0,161,2,125,8,110,4,124,5,125,
+    8,124,3,160,15,124,8,161,1,1,0,113,94,124,3,124,
+    0,95,11,116,7,106,8,160,9,116,16,161,1,114,186,100,
+    4,100,5,132,0,124,2,68,0,131,1,124,0,95,17,100,
+    6,83,0,41,7,122,68,70,105,108,108,32,116,104,101,32,
+    99,97,99,104,101,32,111,102,32,112,111,116,101,110,116,105,
+    97,108,32,109,111,100,117,108,101,115,32,97,110,100,32,112,
+    97,99,107,97,103,101,115,32,102,111,114,32,116,104,105,115,
+    32,100,105,114,101,99,116,111,114,121,46,114,0,0,0,0,
+    114,71,0,0,0,114,61,0,0,0,99,1,0,0,0,0,
     0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,
-    0,0,0,115,22,0,0,0,104,0,124,0,93,14,125,1,
-    100,0,124,1,155,0,157,2,146,2,113,4,83,0,41,1,
-    114,74,0,0,0,114,3,0,0,0,41,2,114,32,0,0,
-    0,218,1,115,114,3,0,0,0,114,3,0,0,0,114,6,
-    0,0,0,114,68,1,0,0,51,6,0,0,115,4,0,0,
-    0,6,0,2,0,122,25,95,115,101,116,117,112,46,60,108,
-    111,99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,
-    90,7,95,116,104,114,101,97,100,90,8,95,119,101,97,107,
-    114,101,102,90,6,119,105,110,114,101,103,114,192,0,0,0,
-    114,7,0,0,0,122,4,46,112,121,119,122,6,95,100,46,
-    112,121,100,84,78,41,19,114,134,0,0,0,114,8,0,0,
-    0,114,163,0,0,0,114,31,1,0,0,114,125,0,0,0,
-    90,18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,
-    110,97,109,101,114,129,0,0,0,218,3,97,108,108,114,23,
-    0,0,0,114,118,0,0,0,114,36,0,0,0,114,13,0,
-    0,0,114,21,1,0,0,114,167,0,0,0,114,80,1,0,
-    0,114,102,0,0,0,114,186,0,0,0,114,191,0,0,0,
-    114,195,0,0,0,41,12,218,17,95,98,111,111,116,115,116,
-    114,97,112,95,109,111,100,117,108,101,90,11,115,101,108,102,
-    95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110,
-    95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109,
-    111,100,117,108,101,90,10,111,115,95,100,101,116,97,105,108,
-    115,90,10,98,117,105,108,116,105,110,95,111,115,114,31,0,
-    0,0,114,35,0,0,0,90,9,111,115,95,109,111,100,117,
-    108,101,90,13,116,104,114,101,97,100,95,109,111,100,117,108,
-    101,90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,
-    101,90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,
-    114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,
-    6,95,115,101,116,117,112,10,6,0,0,115,78,0,0,0,
-    0,8,4,1,6,1,6,3,10,1,8,1,10,1,12,2,
-    10,1,14,3,22,1,12,2,22,1,8,1,10,1,10,1,
-    6,2,2,1,10,1,10,1,14,1,12,2,8,1,12,1,
-    12,1,18,1,22,3,10,1,12,3,10,1,12,3,10,1,
-    10,1,12,3,14,1,14,1,10,1,10,1,10,1,114,87,
-    1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
-    2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,
-    0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,
-    2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,
-    1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,
-    1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,
-    104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,
-    112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,
-    78,41,10,114,87,1,0,0,114,184,0,0,0,114,8,0,
-    0,0,114,51,1,0,0,114,167,0,0,0,114,59,1,0,
-    0,114,74,1,0,0,218,9,109,101,116,97,95,112,97,116,
-    104,114,186,0,0,0,114,45,1,0,0,41,2,114,86,1,
-    0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,
-    97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114,
-    6,0,0,0,218,8,95,105,110,115,116,97,108,108,75,6,
-    0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114,
-    89,1,0,0,41,63,114,127,0,0,0,114,12,0,0,0,
-    90,37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,
-    73,86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,
-    84,69,83,95,75,69,89,114,11,0,0,0,114,13,0,0,
-    0,114,20,0,0,0,114,27,0,0,0,114,29,0,0,0,
-    114,38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,
-    53,0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,
-    0,0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,
-    95,95,99,111,100,101,95,95,114,162,0,0,0,114,18,0,
-    0,0,114,148,0,0,0,114,17,0,0,0,114,24,0,0,
-    0,114,236,0,0,0,114,92,0,0,0,114,88,0,0,0,
-    114,102,0,0,0,114,89,0,0,0,90,23,68,69,66,85,
-    71,95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,
-    88,69,83,90,27,79,80,84,73,77,73,90,69,68,95,66,
-    89,84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,
-    114,98,0,0,0,114,103,0,0,0,114,109,0,0,0,114,
-    113,0,0,0,114,115,0,0,0,114,136,0,0,0,114,143,
-    0,0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,
-    0,0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,
-    0,114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,
-    0,0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,
-    0,0,114,221,0,0,0,114,239,0,0,0,114,8,1,0,
-    0,114,14,1,0,0,114,21,1,0,0,114,15,1,0,0,
-    114,22,1,0,0,114,43,1,0,0,114,45,1,0,0,114,
-    59,1,0,0,114,79,1,0,0,114,184,0,0,0,114,87,
-    1,0,0,114,89,1,0,0,114,3,0,0,0,114,3,0,
-    0,0,114,3,0,0,0,114,6,0,0,0,218,8,60,109,
-    111,100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,
-    22,4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,
-    5,8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,
-    9,12,22,10,127,0,8,16,1,12,2,4,1,4,2,6,
-    2,6,2,8,2,18,71,8,40,8,19,8,12,8,12,8,
-    28,8,17,8,33,8,28,8,24,16,13,14,10,12,11,8,
-    14,6,3,6,1,2,255,12,68,14,64,14,29,16,127,0,
-    17,14,68,18,45,18,26,4,3,18,53,14,63,14,42,14,
-    127,0,7,14,127,0,22,12,23,8,11,8,65,
+    0,0,0,115,20,0,0,0,104,0,124,0,93,12,125,1,
+    124,1,160,0,161,0,146,2,113,4,83,0,114,3,0,0,
+    0,41,1,114,106,0,0,0,41,2,114,32,0,0,0,90,
+    2,102,110,114,3,0,0,0,114,3,0,0,0,114,6,0,
+    0,0,218,9,60,115,101,116,99,111,109,112,62,210,5,0,
+    0,115,4,0,0,0,6,0,2,0,122,41,70,105,108,101,
+    70,105,110,100,101,114,46,95,102,105,108,108,95,99,97,99,
+    104,101,46,60,108,111,99,97,108,115,62,46,60,115,101,116,
+    99,111,109,112,62,78,41,18,114,44,0,0,0,114,2,0,
+    0,0,114,7,1,0,0,114,55,0,0,0,114,3,1,0,
+    0,218,15,80,101,114,109,105,115,115,105,111,110,69,114,114,
+    111,114,218,18,78,111,116,65,68,105,114,101,99,116,111,114,
+    121,69,114,114,111,114,114,8,0,0,0,114,9,0,0,0,
+    114,10,0,0,0,114,63,1,0,0,114,64,1,0,0,114,
+    101,0,0,0,114,62,0,0,0,114,106,0,0,0,218,3,
+    97,100,100,114,11,0,0,0,114,65,1,0,0,41,9,114,
+    119,0,0,0,114,44,0,0,0,114,8,1,0,0,90,21,
+    108,111,119,101,114,95,115,117,102,102,105,120,95,99,111,110,
+    116,101,110,116,115,114,41,1,0,0,114,117,0,0,0,114,
+    29,1,0,0,114,17,1,0,0,90,8,110,101,119,95,110,
+    97,109,101,114,3,0,0,0,114,3,0,0,0,114,6,0,
+    0,0,114,67,1,0,0,181,5,0,0,115,34,0,0,0,
+    0,2,6,1,2,1,22,1,20,3,10,3,12,1,12,7,
+    6,1,8,1,16,1,4,1,18,2,4,1,12,1,6,1,
+    12,1,122,22,70,105,108,101,70,105,110,100,101,114,46,95,
+    102,105,108,108,95,99,97,99,104,101,99,1,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,7,
+    0,0,0,115,18,0,0,0,135,0,135,1,102,2,100,1,
+    100,2,132,8,125,2,124,2,83,0,41,3,97,20,1,0,
+    0,65,32,99,108,97,115,115,32,109,101,116,104,111,100,32,
+    119,104,105,99,104,32,114,101,116,117,114,110,115,32,97,32,
+    99,108,111,115,117,114,101,32,116,111,32,117,115,101,32,111,
+    110,32,115,121,115,46,112,97,116,104,95,104,111,111,107,10,
+    32,32,32,32,32,32,32,32,119,104,105,99,104,32,119,105,
+    108,108,32,114,101,116,117,114,110,32,97,110,32,105,110,115,
+    116,97,110,99,101,32,117,115,105,110,103,32,116,104,101,32,
+    115,112,101,99,105,102,105,101,100,32,108,111,97,100,101,114,
+    115,32,97,110,100,32,116,104,101,32,112,97,116,104,10,32,
+    32,32,32,32,32,32,32,99,97,108,108,101,100,32,111,110,
+    32,116,104,101,32,99,108,111,115,117,114,101,46,10,10,32,
+    32,32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,
+    116,104,32,99,97,108,108,101,100,32,111,110,32,116,104,101,
+    32,99,108,111,115,117,114,101,32,105,115,32,110,111,116,32,
+    97,32,100,105,114,101,99,116,111,114,121,44,32,73,109,112,
+    111,114,116,69,114,114,111,114,32,105,115,10,32,32,32,32,
+    32,32,32,32,114,97,105,115,101,100,46,10,10,32,32,32,
+    32,32,32,32,32,99,1,0,0,0,0,0,0,0,0,0,
+    0,0,1,0,0,0,4,0,0,0,19,0,0,0,115,34,
+    0,0,0,116,0,124,0,131,1,115,20,116,1,100,1,124,
+    0,100,2,141,2,130,1,136,0,124,0,102,1,136,1,158,
+    2,142,0,83,0,41,3,122,45,80,97,116,104,32,104,111,
+    111,107,32,102,111,114,32,105,109,112,111,114,116,108,105,98,
+    46,109,97,99,104,105,110,101,114,121,46,70,105,108,101,70,
+    105,110,100,101,114,46,122,30,111,110,108,121,32,100,105,114,
+    101,99,116,111,114,105,101,115,32,97,114,101,32,115,117,112,
+    112,111,114,116,101,100,114,48,0,0,0,41,2,114,56,0,
+    0,0,114,118,0,0,0,114,48,0,0,0,169,2,114,193,
+    0,0,0,114,66,1,0,0,114,3,0,0,0,114,6,0,
+    0,0,218,24,112,97,116,104,95,104,111,111,107,95,102,111,
+    114,95,70,105,108,101,70,105,110,100,101,114,222,5,0,0,
+    115,6,0,0,0,0,2,8,1,12,1,122,54,70,105,108,
+    101,70,105,110,100,101,114,46,112,97,116,104,95,104,111,111,
+    107,46,60,108,111,99,97,108,115,62,46,112,97,116,104,95,
+    104,111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,
+    100,101,114,114,3,0,0,0,41,3,114,193,0,0,0,114,
+    66,1,0,0,114,73,1,0,0,114,3,0,0,0,114,72,
+    1,0,0,114,6,0,0,0,218,9,112,97,116,104,95,104,
+    111,111,107,212,5,0,0,115,4,0,0,0,0,10,14,6,
+    122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,116,
+    104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,0,
+    0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,
+    12,0,0,0,100,1,160,0,124,0,106,1,161,1,83,0,
+    41,2,78,122,16,70,105,108,101,70,105,110,100,101,114,40,
+    123,33,114,125,41,41,2,114,62,0,0,0,114,44,0,0,
+    0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,
+    114,6,0,0,0,114,39,1,0,0,230,5,0,0,115,2,
+    0,0,0,0,1,122,19,70,105,108,101,70,105,110,100,101,
+    114,46,95,95,114,101,112,114,95,95,41,1,78,41,15,114,
+    125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127,
+    0,0,0,114,209,0,0,0,114,46,1,0,0,114,143,0,
+    0,0,114,206,0,0,0,114,137,0,0,0,114,58,1,0,
+    0,114,203,0,0,0,114,67,1,0,0,114,207,0,0,0,
+    114,74,1,0,0,114,39,1,0,0,114,3,0,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,59,
+    1,0,0,87,5,0,0,115,22,0,0,0,8,2,4,7,
+    8,14,8,4,4,2,8,12,8,5,10,48,8,31,2,1,
+    10,17,114,59,1,0,0,99,4,0,0,0,0,0,0,0,
+    0,0,0,0,6,0,0,0,8,0,0,0,67,0,0,0,
+    115,146,0,0,0,124,0,160,0,100,1,161,1,125,4,124,
+    0,160,0,100,2,161,1,125,5,124,4,115,66,124,5,114,
+    36,124,5,106,1,125,4,110,30,124,2,124,3,107,2,114,
+    56,116,2,124,1,124,2,131,2,125,4,110,10,116,3,124,
+    1,124,2,131,2,125,4,124,5,115,84,116,4,124,1,124,
+    2,124,4,100,3,141,3,125,5,122,36,124,5,124,0,100,
+    2,60,0,124,4,124,0,100,1,60,0,124,2,124,0,100,
+    4,60,0,124,3,124,0,100,5,60,0,87,0,110,20,4,
+    0,116,5,107,10,114,140,1,0,1,0,1,0,89,0,110,
+    2,88,0,100,0,83,0,41,6,78,218,10,95,95,108,111,
+    97,100,101,114,95,95,218,8,95,95,115,112,101,99,95,95,
+    114,60,1,0,0,90,8,95,95,102,105,108,101,95,95,90,
+    10,95,95,99,97,99,104,101,100,95,95,41,6,218,3,103,
+    101,116,114,140,0,0,0,114,15,1,0,0,114,9,1,0,
+    0,114,190,0,0,0,218,9,69,120,99,101,112,116,105,111,
+    110,41,6,90,2,110,115,114,117,0,0,0,90,8,112,97,
+    116,104,110,97,109,101,90,9,99,112,97,116,104,110,97,109,
+    101,114,140,0,0,0,114,187,0,0,0,114,3,0,0,0,
+    114,3,0,0,0,114,6,0,0,0,218,14,95,102,105,120,
+    95,117,112,95,109,111,100,117,108,101,236,5,0,0,115,34,
+    0,0,0,0,2,10,1,10,1,4,1,4,1,8,1,8,
+    1,12,2,10,1,4,1,14,1,2,1,8,1,8,1,8,
+    1,12,1,14,2,114,79,1,0,0,99,0,0,0,0,0,
+    0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,67,
+    0,0,0,115,38,0,0,0,116,0,116,1,160,2,161,0,
+    102,2,125,0,116,3,116,4,102,2,125,1,116,5,116,6,
+    102,2,125,2,124,0,124,1,124,2,103,3,83,0,41,1,
+    122,95,82,101,116,117,114,110,115,32,97,32,108,105,115,116,
+    32,111,102,32,102,105,108,101,45,98,97,115,101,100,32,109,
+    111,100,117,108,101,32,108,111,97,100,101,114,115,46,10,10,
+    32,32,32,32,69,97,99,104,32,105,116,101,109,32,105,115,
+    32,97,32,116,117,112,108,101,32,40,108,111,97,100,101,114,
+    44,32,115,117,102,102,105,120,101,115,41,46,10,32,32,32,
+    32,41,7,114,252,0,0,0,114,163,0,0,0,218,18,101,
+    120,116,101,110,115,105,111,110,95,115,117,102,102,105,120,101,
+    115,114,9,1,0,0,114,102,0,0,0,114,15,1,0,0,
+    114,89,0,0,0,41,3,90,10,101,120,116,101,110,115,105,
+    111,110,115,90,6,115,111,117,114,99,101,90,8,98,121,116,
+    101,99,111,100,101,114,3,0,0,0,114,3,0,0,0,114,
+    6,0,0,0,114,184,0,0,0,3,6,0,0,115,8,0,
+    0,0,0,5,12,1,8,1,8,1,114,184,0,0,0,99,
+    1,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,
+    9,0,0,0,67,0,0,0,115,178,1,0,0,124,0,97,
+    0,116,0,106,1,97,1,116,0,106,2,97,2,116,1,106,
+    3,116,4,25,0,125,1,100,1,68,0,93,48,125,2,124,
+    2,116,1,106,3,107,7,114,56,116,0,160,5,124,2,161,
+    1,125,3,110,10,116,1,106,3,124,2,25,0,125,3,116,
+    6,124,1,124,2,124,3,131,3,1,0,113,30,100,2,100,
+    3,103,1,102,2,100,4,100,5,100,3,103,2,102,2,102,
+    2,125,4,124,4,68,0,93,110,92,2,125,5,125,6,116,
+    7,100,6,100,7,132,0,124,6,68,0,131,1,131,1,115,
+    136,116,8,130,1,124,6,100,8,25,0,125,7,124,5,116,
+    1,106,3,107,6,114,170,116,1,106,3,124,5,25,0,125,
+    8,1,0,113,226,113,106,122,20,116,0,160,5,124,5,161,
+    1,125,8,87,0,1,0,113,226,87,0,113,106,4,0,116,
+    9,107,10,114,214,1,0,1,0,1,0,89,0,113,106,89,
+    0,113,106,88,0,113,106,116,9,100,9,131,1,130,1,116,
+    6,124,1,100,10,124,8,131,3,1,0,116,6,124,1,100,
+    11,124,7,131,3,1,0,116,6,124,1,100,12,100,13,160,
+    10,124,6,161,1,131,3,1,0,116,6,124,1,100,14,100,
+    15,100,16,132,0,124,6,68,0,131,1,131,3,1,0,116,
+    0,160,5,100,17,161,1,125,9,116,6,124,1,100,17,124,
+    9,131,3,1,0,116,0,160,5,100,18,161,1,125,10,116,
+    6,124,1,100,18,124,10,131,3,1,0,124,5,100,4,107,
+    2,144,1,114,110,116,0,160,5,100,19,161,1,125,11,116,
+    6,124,1,100,20,124,11,131,3,1,0,116,6,124,1,100,
+    21,116,11,131,0,131,3,1,0,116,12,160,13,116,2,160,
+    14,161,0,161,1,1,0,124,5,100,4,107,2,144,1,114,
+    174,116,15,160,16,100,22,161,1,1,0,100,23,116,12,107,
+    6,144,1,114,174,100,24,116,17,95,18,100,25,83,0,41,
+    26,122,205,83,101,116,117,112,32,116,104,101,32,112,97,116,
+    104,45,98,97,115,101,100,32,105,109,112,111,114,116,101,114,
+    115,32,102,111,114,32,105,109,112,111,114,116,108,105,98,32,
+    98,121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,
+    100,101,100,10,32,32,32,32,98,117,105,108,116,45,105,110,
+    32,109,111,100,117,108,101,115,32,97,110,100,32,105,110,106,
+    101,99,116,105,110,103,32,116,104,101,109,32,105,110,116,111,
+    32,116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,
+    115,112,97,99,101,46,10,10,32,32,32,32,79,116,104,101,
+    114,32,99,111,109,112,111,110,101,110,116,115,32,97,114,101,
+    32,101,120,116,114,97,99,116,101,100,32,102,114,111,109,32,
+    116,104,101,32,99,111,114,101,32,98,111,111,116,115,116,114,
+    97,112,32,109,111,100,117,108,101,46,10,10,32,32,32,32,
+    41,4,114,64,0,0,0,114,75,0,0,0,218,8,98,117,
+    105,108,116,105,110,115,114,160,0,0,0,90,5,112,111,115,
+    105,120,250,1,47,90,2,110,116,250,1,92,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,
+    0,115,0,0,0,115,26,0,0,0,124,0,93,18,125,1,
+    116,0,124,1,131,1,100,0,107,2,86,0,1,0,113,2,
+    100,1,83,0,41,2,114,39,0,0,0,78,41,1,114,22,
+    0,0,0,41,2,114,32,0,0,0,114,95,0,0,0,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,19,
+    1,0,0,39,6,0,0,115,4,0,0,0,4,0,2,0,
+    122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115,
+    62,46,60,103,101,110,101,120,112,114,62,114,73,0,0,0,
+    122,30,105,109,112,111,114,116,108,105,98,32,114,101,113,117,
+    105,114,101,115,32,112,111,115,105,120,32,111,114,32,110,116,
+    114,2,0,0,0,114,35,0,0,0,114,31,0,0,0,114,
+    40,0,0,0,114,58,0,0,0,99,1,0,0,0,0,0,
+    0,0,0,0,0,0,2,0,0,0,4,0,0,0,83,0,
+    0,0,115,22,0,0,0,104,0,124,0,93,14,125,1,100,
+    0,124,1,155,0,157,2,146,2,113,4,83,0,41,1,114,
+    74,0,0,0,114,3,0,0,0,41,2,114,32,0,0,0,
+    218,1,115,114,3,0,0,0,114,3,0,0,0,114,6,0,
+    0,0,114,68,1,0,0,55,6,0,0,115,4,0,0,0,
+    6,0,2,0,122,25,95,115,101,116,117,112,46,60,108,111,
+    99,97,108,115,62,46,60,115,101,116,99,111,109,112,62,90,
+    7,95,116,104,114,101,97,100,90,8,95,119,101,97,107,114,
+    101,102,90,6,119,105,110,114,101,103,114,192,0,0,0,114,
+    7,0,0,0,122,4,46,112,121,119,122,6,95,100,46,112,
+    121,100,84,78,41,19,114,134,0,0,0,114,8,0,0,0,
+    114,163,0,0,0,114,31,1,0,0,114,125,0,0,0,90,
+    18,95,98,117,105,108,116,105,110,95,102,114,111,109,95,110,
+    97,109,101,114,129,0,0,0,218,3,97,108,108,114,23,0,
+    0,0,114,118,0,0,0,114,36,0,0,0,114,13,0,0,
+    0,114,21,1,0,0,114,167,0,0,0,114,80,1,0,0,
+    114,102,0,0,0,114,186,0,0,0,114,191,0,0,0,114,
+    195,0,0,0,41,12,218,17,95,98,111,111,116,115,116,114,
+    97,112,95,109,111,100,117,108,101,90,11,115,101,108,102,95,
+    109,111,100,117,108,101,90,12,98,117,105,108,116,105,110,95,
+    110,97,109,101,90,14,98,117,105,108,116,105,110,95,109,111,
+    100,117,108,101,90,10,111,115,95,100,101,116,97,105,108,115,
+    90,10,98,117,105,108,116,105,110,95,111,115,114,31,0,0,
+    0,114,35,0,0,0,90,9,111,115,95,109,111,100,117,108,
+    101,90,13,116,104,114,101,97,100,95,109,111,100,117,108,101,
+    90,14,119,101,97,107,114,101,102,95,109,111,100,117,108,101,
+    90,13,119,105,110,114,101,103,95,109,111,100,117,108,101,114,
+    3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,6,
+    95,115,101,116,117,112,14,6,0,0,115,78,0,0,0,0,
+    8,4,1,6,1,6,3,10,1,8,1,10,1,12,2,10,
+    1,14,3,22,1,12,2,22,1,8,1,10,1,10,1,6,
+    2,2,1,10,1,10,1,14,1,12,2,8,1,12,1,12,
+    1,18,1,22,3,10,1,12,3,10,1,12,3,10,1,10,
+    1,12,3,14,1,14,1,10,1,10,1,10,1,114,87,1,
+    0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,
+    0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,0,
+    116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,2,
+    106,3,160,4,116,5,106,6,124,1,142,0,103,1,161,1,
+    1,0,116,2,106,7,160,8,116,9,161,1,1,0,100,1,
+    83,0,41,2,122,41,73,110,115,116,97,108,108,32,116,104,
+    101,32,112,97,116,104,45,98,97,115,101,100,32,105,109,112,
+    111,114,116,32,99,111,109,112,111,110,101,110,116,115,46,78,
+    41,10,114,87,1,0,0,114,184,0,0,0,114,8,0,0,
+    0,114,51,1,0,0,114,167,0,0,0,114,59,1,0,0,
+    114,74,1,0,0,218,9,109,101,116,97,95,112,97,116,104,
+    114,186,0,0,0,114,45,1,0,0,41,2,114,86,1,0,
+    0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,97,
+    100,101,114,115,114,3,0,0,0,114,3,0,0,0,114,6,
+    0,0,0,218,8,95,105,110,115,116,97,108,108,79,6,0,
+    0,115,8,0,0,0,0,2,8,1,6,1,20,1,114,89,
+    1,0,0,41,63,114,127,0,0,0,114,12,0,0,0,90,
+    37,95,67,65,83,69,95,73,78,83,69,78,83,73,84,73,
+    86,69,95,80,76,65,84,70,79,82,77,83,95,66,89,84,
+    69,83,95,75,69,89,114,11,0,0,0,114,13,0,0,0,
+    114,20,0,0,0,114,27,0,0,0,114,29,0,0,0,114,
+    38,0,0,0,114,47,0,0,0,114,49,0,0,0,114,53,
+    0,0,0,114,54,0,0,0,114,56,0,0,0,114,59,0,
+    0,0,114,69,0,0,0,218,4,116,121,112,101,218,8,95,
+    95,99,111,100,101,95,95,114,162,0,0,0,114,18,0,0,
+    0,114,148,0,0,0,114,17,0,0,0,114,24,0,0,0,
+    114,236,0,0,0,114,92,0,0,0,114,88,0,0,0,114,
+    102,0,0,0,114,89,0,0,0,90,23,68,69,66,85,71,
+    95,66,89,84,69,67,79,68,69,95,83,85,70,70,73,88,
+    69,83,90,27,79,80,84,73,77,73,90,69,68,95,66,89,
+    84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,114,
+    98,0,0,0,114,103,0,0,0,114,109,0,0,0,114,113,
+    0,0,0,114,115,0,0,0,114,136,0,0,0,114,143,0,
+    0,0,114,152,0,0,0,114,156,0,0,0,114,158,0,0,
+    0,114,165,0,0,0,114,170,0,0,0,114,171,0,0,0,
+    114,176,0,0,0,218,6,111,98,106,101,99,116,114,185,0,
+    0,0,114,190,0,0,0,114,191,0,0,0,114,208,0,0,
+    0,114,221,0,0,0,114,239,0,0,0,114,9,1,0,0,
+    114,15,1,0,0,114,21,1,0,0,114,252,0,0,0,114,
+    22,1,0,0,114,43,1,0,0,114,45,1,0,0,114,59,
+    1,0,0,114,79,1,0,0,114,184,0,0,0,114,87,1,
+    0,0,114,89,1,0,0,114,3,0,0,0,114,3,0,0,
+    0,114,3,0,0,0,114,6,0,0,0,218,8,60,109,111,
+    100,117,108,101,62,1,0,0,0,115,126,0,0,0,4,22,
+    4,1,4,1,2,1,2,255,4,4,8,17,8,5,8,5,
+    8,6,8,6,8,12,8,10,8,9,8,5,8,7,8,9,
+    12,22,10,127,0,8,16,1,12,2,4,1,4,2,6,2,
+    6,2,8,2,18,71,8,40,8,19,8,12,8,12,8,28,
+    8,17,8,33,8,28,8,24,16,13,14,10,12,11,8,14,
+    6,3,6,1,2,255,12,68,14,64,14,29,16,127,0,17,
+    14,72,18,45,18,26,4,3,18,53,14,63,14,42,14,127,
+    0,7,14,127,0,22,12,23,8,11,8,65,
 };
index b79689449935562e9ec17578113e1eb3da22d91e..cbb3d909a10b7b3cafff210cf6f9a7621473c3ba 100644 (file)
@@ -522,563 +522,562 @@ const unsigned char _Py_M__zipimport[] = {
     0,0,0,114,35,0,0,0,65,1,0,0,115,12,0,0,
     0,0,1,10,1,14,1,8,1,10,1,10,1,114,35,0,
     0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,26,
-    0,0,0,9,0,0,0,67,0,0,0,115,254,4,0,0,
-    122,16,116,0,160,1,124,0,100,1,161,2,125,1,87,0,
-    110,38,4,0,116,2,107,10,114,54,1,0,1,0,1,0,
-    116,3,100,2,124,0,155,2,157,2,124,0,100,3,141,2,
-    130,1,89,0,110,2,88,0,124,1,144,4,143,168,1,0,
-    122,36,124,1,160,4,116,5,11,0,100,4,161,2,1,0,
-    124,1,160,6,161,0,125,2,124,1,160,7,116,5,161,1,
-    125,3,87,0,110,38,4,0,116,2,107,10,114,138,1,0,
-    1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0,
-    100,3,141,2,130,1,89,0,110,2,88,0,116,8,124,3,
-    131,1,116,5,107,3,114,170,116,3,100,5,124,0,155,2,
-    157,2,124,0,100,3,141,2,130,1,124,3,100,0,100,6,
-    133,2,25,0,116,9,107,3,144,1,114,180,122,24,124,1,
-    160,4,100,7,100,4,161,2,1,0,124,1,160,6,161,0,
-    125,4,87,0,110,38,4,0,116,2,107,10,114,250,1,0,
-    1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0,
-    100,3,141,2,130,1,89,0,110,2,88,0,116,10,124,4,
-    116,11,24,0,116,5,24,0,100,7,131,2,125,5,122,22,
-    124,1,160,4,124,5,161,1,1,0,124,1,160,7,161,0,
-    125,6,87,0,110,40,4,0,116,2,107,10,144,1,114,76,
-    1,0,1,0,1,0,116,3,100,5,124,0,155,2,157,2,
-    124,0,100,3,141,2,130,1,89,0,110,2,88,0,124,6,
-    160,12,116,9,161,1,125,7,124,7,100,7,107,0,144,1,
-    114,116,116,3,100,8,124,0,155,2,157,2,124,0,100,3,
-    141,2,130,1,124,6,124,7,124,7,116,5,23,0,133,2,
-    25,0,125,3,116,8,124,3,131,1,116,5,107,3,144,1,
-    114,164,116,3,100,9,124,0,155,2,157,2,124,0,100,3,
-    141,2,130,1,124,4,116,8,124,6,131,1,24,0,124,7,
-    23,0,125,2,116,13,124,3,100,10,100,11,133,2,25,0,
-    131,1,125,8,116,13,124,3,100,11,100,12,133,2,25,0,
-    131,1,125,9,124,2,124,8,107,0,144,1,114,240,116,3,
-    100,13,124,0,155,2,157,2,124,0,100,3,141,2,130,1,
-    124,2,124,9,107,0,144,2,114,12,116,3,100,14,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,124,2,124,8,
-    56,0,125,2,124,2,124,9,24,0,125,10,124,10,100,7,
-    107,0,144,2,114,56,116,3,100,15,124,0,155,2,157,2,
-    124,0,100,3,141,2,130,1,105,0,125,11,100,7,125,12,
-    122,14,124,1,160,4,124,2,161,1,1,0,87,0,110,40,
-    4,0,116,2,107,10,144,2,114,118,1,0,1,0,1,0,
-    116,3,100,5,124,0,155,2,157,2,124,0,100,3,141,2,
-    130,1,89,0,110,2,88,0,124,1,160,7,100,16,161,1,
-    125,3,116,8,124,3,131,1,100,6,107,0,144,2,114,152,
-    116,14,100,17,131,1,130,1,124,3,100,0,100,6,133,2,
-    25,0,100,18,107,3,144,2,114,174,144,4,113,226,116,8,
-    124,3,131,1,100,16,107,3,144,2,114,196,116,14,100,17,
-    131,1,130,1,116,15,124,3,100,19,100,20,133,2,25,0,
-    131,1,125,13,116,15,124,3,100,20,100,10,133,2,25,0,
-    131,1,125,14,116,15,124,3,100,10,100,21,133,2,25,0,
-    131,1,125,15,116,15,124,3,100,21,100,11,133,2,25,0,
-    131,1,125,16,116,13,124,3,100,11,100,12,133,2,25,0,
-    131,1,125,17,116,13,124,3,100,12,100,22,133,2,25,0,
-    131,1,125,18,116,13,124,3,100,22,100,23,133,2,25,0,
-    131,1,125,4,116,15,124,3,100,23,100,24,133,2,25,0,
-    131,1,125,19,116,15,124,3,100,24,100,25,133,2,25,0,
-    131,1,125,20,116,15,124,3,100,25,100,26,133,2,25,0,
-    131,1,125,21,116,13,124,3,100,27,100,16,133,2,25,0,
-    131,1,125,22,124,19,124,20,23,0,124,21,23,0,125,8,
-    124,22,124,9,107,4,144,3,114,156,116,3,100,28,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,124,22,124,10,
-    55,0,125,22,122,14,124,1,160,7,124,19,161,1,125,23,
-    87,0,110,40,4,0,116,2,107,10,144,3,114,218,1,0,
-    1,0,1,0,116,3,100,5,124,0,155,2,157,2,124,0,
-    100,3,141,2,130,1,89,0,110,2,88,0,116,8,124,23,
-    131,1,124,19,107,3,144,3,114,252,116,3,100,5,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,122,50,116,8,
-    124,1,160,7,124,8,124,19,24,0,161,1,131,1,124,8,
-    124,19,24,0,107,3,144,4,114,44,116,3,100,5,124,0,
-    155,2,157,2,124,0,100,3,141,2,130,1,87,0,110,40,
-    4,0,116,2,107,10,144,4,114,86,1,0,1,0,1,0,
-    116,3,100,5,124,0,155,2,157,2,124,0,100,3,141,2,
-    130,1,89,0,110,2,88,0,124,13,100,29,64,0,144,4,
-    114,108,124,23,160,16,161,0,125,23,110,54,122,14,124,23,
-    160,16,100,30,161,1,125,23,87,0,110,38,4,0,116,17,
-    107,10,144,4,114,160,1,0,1,0,1,0,124,23,160,16,
-    100,31,161,1,160,18,116,19,161,1,125,23,89,0,110,2,
-    88,0,124,23,160,20,100,32,116,21,161,2,125,23,116,22,
-    160,23,124,0,124,23,161,2,125,24,124,24,124,14,124,18,
-    124,4,124,22,124,15,124,16,124,17,102,8,125,25,124,25,
-    124,11,124,23,60,0,124,12,100,33,55,0,125,12,144,2,
-    113,120,87,0,53,0,81,0,82,0,88,0,116,24,160,25,
-    100,34,124,12,124,0,161,3,1,0,124,11,83,0,41,35,
-    78,218,2,114,98,122,21,99,97,110,39,116,32,111,112,101,
-    110,32,90,105,112,32,102,105,108,101,58,32,114,12,0,0,
-    0,114,86,0,0,0,250,21,99,97,110,39,116,32,114,101,
-    97,100,32,90,105,112,32,102,105,108,101,58,32,233,4,0,
-    0,0,114,0,0,0,0,122,16,110,111,116,32,97,32,90,
-    105,112,32,102,105,108,101,58,32,122,18,99,111,114,114,117,
-    112,116,32,90,105,112,32,102,105,108,101,58,32,233,12,0,
-    0,0,233,16,0,0,0,233,20,0,0,0,122,28,98,97,
-    100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116,
-    111,114,121,32,115,105,122,101,58,32,122,30,98,97,100,32,
-    99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114,
-    121,32,111,102,102,115,101,116,58,32,122,38,98,97,100,32,
-    99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114,
-    121,32,115,105,122,101,32,111,114,32,111,102,102,115,101,116,
-    58,32,233,46,0,0,0,250,27,69,79,70,32,114,101,97,
-    100,32,119,104,101,114,101,32,110,111,116,32,101,120,112,101,
-    99,116,101,100,115,4,0,0,0,80,75,1,2,233,8,0,
-    0,0,233,10,0,0,0,233,14,0,0,0,233,24,0,0,
-    0,233,28,0,0,0,233,30,0,0,0,233,32,0,0,0,
-    233,34,0,0,0,233,42,0,0,0,122,25,98,97,100,32,
-    108,111,99,97,108,32,104,101,97,100,101,114,32,111,102,102,
-    115,101,116,58,32,105,0,8,0,0,218,5,97,115,99,105,
-    105,90,6,108,97,116,105,110,49,250,1,47,114,5,0,0,
-    0,122,33,122,105,112,105,109,112,111,114,116,58,32,102,111,
-    117,110,100,32,123,125,32,110,97,109,101,115,32,105,110,32,
-    123,33,114,125,41,26,218,3,95,105,111,218,4,111,112,101,
-    110,114,22,0,0,0,114,3,0,0,0,218,4,115,101,101,
-    107,218,20,69,78,68,95,67,69,78,84,82,65,76,95,68,
-    73,82,95,83,73,90,69,90,4,116,101,108,108,218,4,114,
-    101,97,100,114,51,0,0,0,218,18,83,84,82,73,78,71,
-    95,69,78,68,95,65,82,67,72,73,86,69,218,3,109,97,
-    120,218,15,77,65,88,95,67,79,77,77,69,78,84,95,76,
-    69,78,218,5,114,102,105,110,100,114,2,0,0,0,218,8,
-    69,79,70,69,114,114,111,114,114,1,0,0,0,114,62,0,
-    0,0,218,18,85,110,105,99,111,100,101,68,101,99,111,100,
-    101,69,114,114,111,114,218,9,116,114,97,110,115,108,97,116,
-    101,218,11,99,112,52,51,55,95,116,97,98,108,101,114,19,
-    0,0,0,114,20,0,0,0,114,21,0,0,0,114,30,0,
-    0,0,114,76,0,0,0,114,77,0,0,0,41,26,114,29,
-    0,0,0,218,2,102,112,90,15,104,101,97,100,101,114,95,
-    112,111,115,105,116,105,111,110,218,6,98,117,102,102,101,114,
-    218,9,102,105,108,101,95,115,105,122,101,90,17,109,97,120,
-    95,99,111,109,109,101,110,116,95,115,116,97,114,116,218,4,
-    100,97,116,97,90,3,112,111,115,218,11,104,101,97,100,101,
-    114,95,115,105,122,101,90,13,104,101,97,100,101,114,95,111,
-    102,102,115,101,116,90,10,97,114,99,95,111,102,102,115,101,
-    116,114,33,0,0,0,218,5,99,111,117,110,116,218,5,102,
-    108,97,103,115,218,8,99,111,109,112,114,101,115,115,218,4,
-    116,105,109,101,218,4,100,97,116,101,218,3,99,114,99,218,
-    9,100,97,116,97,95,115,105,122,101,218,9,110,97,109,101,
-    95,115,105,122,101,218,10,101,120,116,114,97,95,115,105,122,
-    101,90,12,99,111,109,109,101,110,116,95,115,105,122,101,218,
-    11,102,105,108,101,95,111,102,102,115,101,116,114,59,0,0,
-    0,114,13,0,0,0,218,1,116,114,9,0,0,0,114,9,
-    0,0,0,114,10,0,0,0,114,27,0,0,0,96,1,0,
-    0,115,212,0,0,0,0,1,2,1,16,1,14,1,24,2,
-    8,1,2,1,14,1,8,1,14,1,14,1,24,1,12,1,
-    18,1,18,3,2,1,12,1,12,1,14,1,10,1,2,255,
-    12,2,8,1,2,255,2,1,2,255,4,2,2,1,10,1,
-    12,1,16,1,10,1,2,255,12,2,10,1,10,1,10,1,
-    2,255,6,2,16,1,14,1,10,1,2,255,6,2,16,2,
-    16,1,16,1,10,1,18,1,10,1,18,1,8,1,8,1,
-    10,1,18,2,4,2,4,1,2,1,14,1,16,1,24,2,
-    10,1,14,1,8,2,18,1,4,1,14,1,8,1,16,1,
-    16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,
-    16,1,16,1,12,1,10,1,18,1,8,2,2,1,14,1,
-    16,1,24,1,14,1,18,4,2,1,28,1,22,1,16,1,
-    24,2,10,2,10,3,2,1,14,1,16,1,22,2,12,1,
-    12,1,20,1,8,1,22,1,14,1,114,27,0,0,0,117,
-    190,1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,
-    12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,
-    28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,
-    44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
-    60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,
-    76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,
-    92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,
-    108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,
-    124,125,126,127,195,135,195,188,195,169,195,162,195,164,195,160,
-    195,165,195,167,195,170,195,171,195,168,195,175,195,174,195,172,
-    195,132,195,133,195,137,195,166,195,134,195,180,195,182,195,178,
-    195,187,195,185,195,191,195,150,195,156,194,162,194,163,194,165,
-    226,130,167,198,146,195,161,195,173,195,179,195,186,195,177,195,
-    145,194,170,194,186,194,191,226,140,144,194,172,194,189,194,188,
-    194,161,194,171,194,187,226,150,145,226,150,146,226,150,147,226,
-    148,130,226,148,164,226,149,161,226,149,162,226,149,150,226,149,
-    149,226,149,163,226,149,145,226,149,151,226,149,157,226,149,156,
-    226,149,155,226,148,144,226,148,148,226,148,180,226,148,172,226,
-    148,156,226,148,128,226,148,188,226,149,158,226,149,159,226,149,
-    154,226,149,148,226,149,169,226,149,166,226,149,160,226,149,144,
-    226,149,172,226,149,167,226,149,168,226,149,164,226,149,165,226,
-    149,153,226,149,152,226,149,146,226,149,147,226,149,171,226,149,
-    170,226,148,152,226,148,140,226,150,136,226,150,132,226,150,140,
-    226,150,144,226,150,128,206,177,195,159,206,147,207,128,206,163,
-    207,131,194,181,207,132,206,166,206,152,206,169,206,180,226,136,
-    158,207,134,206,181,226,136,169,226,137,161,194,177,226,137,165,
-    226,137,164,226,140,160,226,140,161,195,183,226,137,136,194,176,
-    226,136,153,194,183,226,136,154,226,129,191,194,178,226,150,160,
-    194,160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,
-    0,0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,
-    116,0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,
-    100,2,131,1,130,1,100,3,97,0,122,60,122,16,100,4,
-    100,5,108,4,109,5,125,0,1,0,87,0,110,38,4,0,
-    116,6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,
-    100,1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,
-    110,2,88,0,87,0,53,0,100,6,97,0,88,0,116,1,
-    160,2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,
-    27,122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,
-    32,85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,
-    110,39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,
-    97,116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,
-    97,105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,
-    10,100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,
-    112,105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,
-    97,105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,
-    114,116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,
-    77,0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,
-    142,0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,
-    141,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,
-    0,0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,
-    114,101,115,115,95,102,117,110,99,254,1,0,0,115,24,0,
-    0,0,0,2,4,3,10,1,8,2,4,1,4,1,16,1,
-    14,1,10,1,18,2,6,2,10,1,114,145,0,0,0,99,
-    2,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,
-    9,0,0,0,67,0,0,0,115,130,1,0,0,124,1,92,
-    8,125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,
-    9,124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,
-    1,116,1,160,2,124,0,100,3,161,2,144,1,143,8,125,
-    10,122,14,124,10,160,3,124,6,161,1,1,0,87,0,110,
-    38,4,0,116,4,107,10,114,104,1,0,1,0,1,0,116,
-    0,100,4,124,0,155,2,157,2,124,0,100,5,141,2,130,
-    1,89,0,110,2,88,0,124,10,160,5,100,6,161,1,125,
-    11,116,6,124,11,131,1,100,6,107,3,114,136,116,7,100,
-    7,131,1,130,1,124,11,100,0,100,8,133,2,25,0,100,
-    9,107,3,114,170,116,0,100,10,124,0,155,2,157,2,124,
-    0,100,5,141,2,130,1,116,8,124,11,100,11,100,12,133,
-    2,25,0,131,1,125,12,116,8,124,11,100,12,100,6,133,
-    2,25,0,131,1,125,13,100,6,124,12,23,0,124,13,23,
-    0,125,14,124,6,124,14,55,0,125,6,122,14,124,10,160,
-    3,124,6,161,1,1,0,87,0,110,40,4,0,116,4,107,
-    10,144,1,114,20,1,0,1,0,1,0,116,0,100,4,124,
-    0,155,2,157,2,124,0,100,5,141,2,130,1,89,0,110,
-    2,88,0,124,10,160,5,124,4,161,1,125,15,116,6,124,
-    15,131,1,124,4,107,3,144,1,114,54,116,4,100,13,131,
-    1,130,1,87,0,53,0,81,0,82,0,88,0,124,3,100,
-    1,107,2,144,1,114,78,124,15,83,0,122,10,116,9,131,
-    0,125,16,87,0,110,30,4,0,116,10,107,10,144,1,114,
-    118,1,0,1,0,1,0,116,0,100,14,131,1,130,1,89,
-    0,110,2,88,0,124,16,124,15,100,15,131,2,83,0,41,
-    16,78,114,0,0,0,0,122,18,110,101,103,97,116,105,118,
-    101,32,100,97,116,97,32,115,105,122,101,114,92,0,0,0,
-    114,93,0,0,0,114,12,0,0,0,114,105,0,0,0,114,
-    99,0,0,0,114,94,0,0,0,115,4,0,0,0,80,75,
-    3,4,122,23,98,97,100,32,108,111,99,97,108,32,102,105,
-    108,101,32,104,101,97,100,101,114,58,32,233,26,0,0,0,
-    114,104,0,0,0,122,26,122,105,112,105,109,112,111,114,116,
-    58,32,99,97,110,39,116,32,114,101,97,100,32,100,97,116,
-    97,114,140,0,0,0,105,241,255,255,255,41,11,114,3,0,
-    0,0,114,111,0,0,0,114,112,0,0,0,114,113,0,0,
-    0,114,22,0,0,0,114,115,0,0,0,114,51,0,0,0,
-    114,120,0,0,0,114,1,0,0,0,114,145,0,0,0,114,
-    144,0,0,0,41,17,114,29,0,0,0,114,54,0,0,0,
-    90,8,100,97,116,97,112,97,116,104,114,131,0,0,0,114,
-    135,0,0,0,114,126,0,0,0,114,138,0,0,0,114,132,
-    0,0,0,114,133,0,0,0,114,134,0,0,0,114,124,0,
-    0,0,114,125,0,0,0,114,136,0,0,0,114,137,0,0,
-    0,114,128,0,0,0,90,8,114,97,119,95,100,97,116,97,
-    114,142,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
-    10,0,0,0,114,52,0,0,0,19,2,0,0,115,62,0,
-    0,0,0,1,20,1,8,1,8,2,16,2,2,1,14,1,
-    14,1,24,1,10,1,12,1,8,2,16,2,18,2,16,1,
-    16,1,12,1,8,1,2,1,14,1,16,1,24,1,10,1,
-    14,1,18,2,10,2,4,3,2,1,10,1,16,1,14,1,
-    114,52,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,16,
-    0,0,0,116,0,124,0,124,1,24,0,131,1,100,1,107,
-    1,83,0,41,2,78,114,5,0,0,0,41,1,218,3,97,
-    98,115,41,2,90,2,116,49,90,2,116,50,114,9,0,0,
-    0,114,9,0,0,0,114,10,0,0,0,218,9,95,101,113,
-    95,109,116,105,109,101,65,2,0,0,115,2,0,0,0,0,
-    2,114,148,0,0,0,99,5,0,0,0,0,0,0,0,0,
-    0,0,0,14,0,0,0,8,0,0,0,67,0,0,0,115,
-    68,1,0,0,124,3,124,2,100,1,156,2,125,5,122,18,
-    116,0,160,1,124,4,124,3,124,5,161,3,125,6,87,0,
-    110,26,4,0,116,2,107,10,114,54,1,0,1,0,1,0,
-    89,0,100,0,83,0,89,0,110,2,88,0,124,6,100,2,
-    64,0,100,3,107,3,125,7,124,7,114,190,124,6,100,4,
-    64,0,100,3,107,3,125,8,116,3,106,4,100,5,107,3,
-    114,188,124,8,115,108,116,3,106,4,100,6,107,2,114,188,
-    116,5,124,0,124,2,131,2,125,9,124,9,100,0,107,9,
-    114,188,116,3,160,6,116,0,106,7,124,9,161,2,125,10,
-    122,20,116,8,160,9,124,4,124,10,124,3,124,5,161,4,
-    1,0,87,0,110,26,4,0,116,2,107,10,114,186,1,0,
-    1,0,1,0,89,0,100,0,83,0,89,0,110,2,88,0,
-    110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12,
-    124,11,144,1,114,18,116,11,116,12,124,4,100,7,100,8,
-    133,2,25,0,131,1,124,11,131,2,114,254,116,12,124,4,
-    100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1,
-    114,18,116,13,160,14,100,10,124,3,155,2,157,2,161,1,
-    1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0,
-    133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2,
-    144,1,115,64,116,19,100,11,124,1,155,2,100,12,157,3,
-    131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0,
-    0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0,
-    0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97,
-    108,119,97,121,115,114,100,0,0,0,114,95,0,0,0,114,
-    96,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105,
-    115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111,
-    109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21,
-    32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111,
-    98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99,
-    108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0,
-    218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97,
-    115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95,
-    103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11,
-    115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65,
-    87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18,
-    95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110,
-    97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97,
-    115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105,
-    109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115,
-    111,117,114,99,101,114,148,0,0,0,114,2,0,0,0,114,
-    76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104,
-    97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10,
-    95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101,
-    69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0,
-    0,114,63,0,0,0,114,38,0,0,0,114,127,0,0,0,
-    90,11,101,120,99,95,100,101,116,97,105,108,115,114,130,0,
-    0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12,
-    99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111,
-    117,114,99,101,95,98,121,116,101,115,114,151,0,0,0,90,
-    12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115,
-    111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114,
-    9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15,
-    95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75,
-    2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5,
-    2,1,18,1,14,1,12,2,12,1,4,1,12,1,10,1,
-    2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1,
-    2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255,
-    8,2,14,1,14,3,8,255,6,3,6,3,22,1,18,255,
-    4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1,
-    114,156,0,0,0,99,1,0,0,0,0,0,0,0,0,0,
-    0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28,
-    0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124,
-    0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41,
-    4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243,
-    1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6,
-    115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0,
-    114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122,
-    101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2,
-    0,0,115,6,0,0,0,0,1,12,1,12,1,114,160,0,
-    0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
-    0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0,
-    116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1,
-    100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0,
-    84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105,
-    116,41,2,114,160,0,0,0,218,7,99,111,109,112,105,108,
-    101,41,2,114,53,0,0,0,114,159,0,0,0,114,9,0,
-    0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99,
-    111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0,
-    0,115,4,0,0,0,0,1,8,1,114,162,0,0,0,99,
-    2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
-    11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160,
-    1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63,
-    0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63,
-    0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64,
-    0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83,
-    0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5,
-    0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0,
-    0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0,
-    0,41,2,114,132,0,0,0,90,6,109,107,116,105,109,101,
-    41,2,218,1,100,114,139,0,0,0,114,9,0,0,0,114,
-    9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115,
-    101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0,
-    0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1,
-    10,1,2,0,2,0,2,249,114,170,0,0,0,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0,
-    0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100,
-    1,100,0,133,2,25,0,100,2,107,6,115,22,116,0,130,
-    1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106,
-    1,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124,
-    2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116,
-    2,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4,
-    0,116,3,116,4,116,5,102,3,107,10,114,110,1,0,1,
-    0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41,
-    7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114,
-    164,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2,
-    114,0,0,0,0,114,0,0,0,0,41,6,218,14,65,115,
-    115,101,114,116,105,111,110,69,114,114,111,114,114,28,0,0,
-    0,114,170,0,0,0,114,26,0,0,0,218,10,73,110,100,
-    101,120,69,114,114,111,114,114,155,0,0,0,41,6,114,32,
-    0,0,0,114,13,0,0,0,114,54,0,0,0,114,132,0,
-    0,0,114,133,0,0,0,90,17,117,110,99,111,109,112,114,
-    101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114,
-    9,0,0,0,114,10,0,0,0,114,152,0,0,0,152,2,
-    0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10,
-    3,8,1,8,1,8,1,16,1,20,1,114,152,0,0,0,
-    99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
-    0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1,
-    100,1,100,0,133,2,25,0,100,2,107,6,115,20,116,0,
-    130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14,
-    124,0,106,1,124,1,25,0,125,2,87,0,110,22,4,0,
-    116,2,107,10,114,68,1,0,1,0,1,0,89,0,100,0,
-    83,0,88,0,116,3,124,0,106,4,124,2,131,2,83,0,
-    100,0,83,0,41,3,78,114,14,0,0,0,114,171,0,0,
-    0,41,5,114,176,0,0,0,114,28,0,0,0,114,26,0,
-    0,0,114,52,0,0,0,114,29,0,0,0,41,3,114,32,
-    0,0,0,114,13,0,0,0,114,54,0,0,0,114,9,0,
-    0,0,114,9,0,0,0,114,10,0,0,0,114,150,0,0,
-    0,171,2,0,0,115,14,0,0,0,0,2,20,1,12,2,
-    2,1,14,1,14,1,8,2,114,150,0,0,0,99,2,0,
-    0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,
-    0,0,67,0,0,0,115,198,0,0,0,116,0,124,0,124,
-    1,131,2,125,2,116,1,68,0,93,160,92,3,125,3,125,
-    4,125,5,124,2,124,3,23,0,125,6,116,2,106,3,100,
-    1,124,0,106,4,116,5,124,6,100,2,100,3,141,5,1,
-    0,122,14,124,0,106,6,124,6,25,0,125,7,87,0,110,
-    20,4,0,116,7,107,10,114,88,1,0,1,0,1,0,89,
-    0,113,14,88,0,124,7,100,4,25,0,125,8,116,8,124,
-    0,106,4,124,7,131,2,125,9,124,4,114,132,116,9,124,
-    0,124,8,124,6,124,1,124,9,131,5,125,10,110,10,116,
-    10,124,8,124,9,131,2,125,10,124,10,100,0,107,8,114,
-    152,113,14,124,7,100,4,25,0,125,8,124,10,124,5,124,
-    8,102,3,2,0,1,0,83,0,113,14,116,11,100,5,124,
-    1,155,2,157,2,124,1,100,6,141,2,130,1,100,0,83,
-    0,41,7,78,122,13,116,114,121,105,110,103,32,123,125,123,
-    125,123,125,114,86,0,0,0,41,1,90,9,118,101,114,98,
-    111,115,105,116,121,114,0,0,0,0,114,57,0,0,0,114,
-    58,0,0,0,41,12,114,36,0,0,0,114,89,0,0,0,
-    114,76,0,0,0,114,77,0,0,0,114,29,0,0,0,114,
-    20,0,0,0,114,28,0,0,0,114,26,0,0,0,114,52,
-    0,0,0,114,156,0,0,0,114,162,0,0,0,114,3,0,
-    0,0,41,11,114,32,0,0,0,114,38,0,0,0,114,13,
-    0,0,0,114,90,0,0,0,114,91,0,0,0,114,47,0,
-    0,0,114,63,0,0,0,114,54,0,0,0,114,40,0,0,
-    0,114,127,0,0,0,114,46,0,0,0,114,9,0,0,0,
-    114,9,0,0,0,114,10,0,0,0,114,44,0,0,0,186,
-    2,0,0,115,36,0,0,0,0,1,10,1,14,1,8,1,
-    22,1,2,1,14,1,14,1,6,2,8,1,12,1,4,1,
-    18,2,10,1,8,3,2,1,8,1,16,2,114,44,0,0,
-    0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-    0,0,2,0,0,0,64,0,0,0,115,60,0,0,0,101,
-    0,90,1,100,0,90,2,100,1,90,3,100,2,90,4,100,
-    3,100,4,132,0,90,5,100,5,100,6,132,0,90,6,100,
-    7,100,8,132,0,90,7,100,9,100,10,132,0,90,8,100,
-    11,100,12,132,0,90,9,100,13,83,0,41,14,114,80,0,
-    0,0,122,165,80,114,105,118,97,116,101,32,99,108,97,115,
-    115,32,117,115,101,100,32,116,111,32,115,117,112,112,111,114,
-    116,32,90,105,112,73,109,112,111,114,116,46,103,101,116,95,
-    114,101,115,111,117,114,99,101,95,114,101,97,100,101,114,40,
-    41,46,10,10,32,32,32,32,84,104,105,115,32,99,108,97,
-    115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111,
-    32,114,101,102,101,114,101,110,99,101,32,97,108,108,32,116,
-    104,101,32,105,110,110,97,114,100,115,32,97,110,100,32,112,
-    114,105,118,97,116,101,32,112,97,114,116,115,32,111,102,10,
-    32,32,32,32,116,104,101,32,122,105,112,105,109,112,111,114,
-    116,101,114,46,10,32,32,32,32,70,99,3,0,0,0,0,
-    0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,67,
-    0,0,0,115,16,0,0,0,124,1,124,0,95,0,124,2,
-    124,0,95,1,100,0,83,0,114,88,0,0,0,41,2,114,
-    4,0,0,0,114,38,0,0,0,41,3,114,32,0,0,0,
-    114,4,0,0,0,114,38,0,0,0,114,9,0,0,0,114,
-    9,0,0,0,114,10,0,0,0,114,34,0,0,0,220,2,
-    0,0,115,4,0,0,0,0,1,6,1,122,33,95,90,105,
-    112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82,
-    101,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2,
-    0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8,
-    0,0,0,67,0,0,0,115,92,0,0,0,124,0,106,0,
-    160,1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,
-    124,1,155,0,157,3,125,3,100,3,100,4,108,2,109,3,
-    125,4,1,0,122,18,124,4,124,0,106,4,160,5,124,3,
-    161,1,131,1,87,0,83,0,4,0,116,6,107,10,114,86,
-    1,0,1,0,1,0,116,7,124,3,131,1,130,1,89,0,
-    110,2,88,0,100,0,83,0,41,5,78,114,85,0,0,0,
-    114,110,0,0,0,114,0,0,0,0,41,1,218,7,66,121,
-    116,101,115,73,79,41,8,114,38,0,0,0,114,19,0,0,
-    0,90,2,105,111,114,178,0,0,0,114,4,0,0,0,114,
-    55,0,0,0,114,22,0,0,0,218,17,70,105,108,101,78,
-    111,116,70,111,117,110,100,69,114,114,111,114,41,5,114,32,
-    0,0,0,218,8,114,101,115,111,117,114,99,101,218,16,102,
-    117,108,108,110,97,109,101,95,97,115,95,112,97,116,104,114,
-    13,0,0,0,114,178,0,0,0,114,9,0,0,0,114,9,
-    0,0,0,114,10,0,0,0,218,13,111,112,101,110,95,114,
-    101,115,111,117,114,99,101,224,2,0,0,115,14,0,0,0,
-    0,1,14,1,14,1,12,1,2,1,18,1,14,1,122,38,
-    95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,
-    99,101,82,101,97,100,101,114,46,111,112,101,110,95,114,101,
-    115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0,
-    0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,
-    8,0,0,0,116,0,130,1,100,0,83,0,114,88,0,0,
-    0,41,1,114,179,0,0,0,41,2,114,32,0,0,0,114,
-    180,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,
-    0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97,
-    116,104,233,2,0,0,115,2,0,0,0,0,4,122,38,95,
-    90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,99,
-    101,82,101,97,100,101,114,46,114,101,115,111,117,114,99,101,
-    95,112,97,116,104,99,2,0,0,0,0,0,0,0,0,0,
-    0,0,4,0,0,0,8,0,0,0,67,0,0,0,115,72,
-    0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,125,
-    2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,122,
-    16,124,0,106,2,160,3,124,3,161,1,1,0,87,0,110,
-    22,4,0,116,4,107,10,114,66,1,0,1,0,1,0,89,
-    0,100,3,83,0,88,0,100,4,83,0,41,5,78,114,85,
-    0,0,0,114,110,0,0,0,70,84,41,5,114,38,0,0,
-    0,114,19,0,0,0,114,4,0,0,0,114,55,0,0,0,
-    114,22,0,0,0,41,4,114,32,0,0,0,114,59,0,0,
-    0,114,181,0,0,0,114,13,0,0,0,114,9,0,0,0,
-    114,9,0,0,0,114,10,0,0,0,218,11,105,115,95,114,
-    101,115,111,117,114,99,101,239,2,0,0,115,14,0,0,0,
-    0,3,14,1,14,1,2,1,16,1,14,1,8,1,122,36,
-    95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114,
-    99,101,82,101,97,100,101,114,46,105,115,95,114,101,115,111,
-    117,114,99,101,99,1,0,0,0,0,0,0,0,0,0,0,
-    0,9,0,0,0,9,0,0,0,99,0,0,0,115,186,0,
-    0,0,100,1,100,2,108,0,109,1,125,1,1,0,124,1,
-    124,0,106,2,160,3,124,0,106,4,161,1,131,1,125,2,
-    124,2,160,5,124,0,106,2,106,6,161,1,125,3,124,3,
-    106,7,100,3,107,2,115,58,116,8,130,1,124,3,106,9,
-    125,4,116,10,131,0,125,5,124,0,106,2,106,11,68,0,
-    93,102,125,6,122,18,124,1,124,6,131,1,160,5,124,4,
-    161,1,125,7,87,0,110,24,4,0,116,12,107,10,114,124,
-    1,0,1,0,1,0,89,0,113,78,89,0,110,2,88,0,
-    124,7,106,9,106,7,125,8,116,13,124,8,131,1,100,1,
-    107,2,114,156,124,7,106,7,86,0,1,0,113,78,124,8,
-    124,5,107,7,114,78,124,5,160,14,124,8,161,1,1,0,
-    124,8,86,0,1,0,113,78,100,0,83,0,41,4,78,114,
-    0,0,0,0,41,1,218,4,80,97,116,104,114,60,0,0,
-    0,41,15,90,7,112,97,116,104,108,105,98,114,185,0,0,
-    0,114,4,0,0,0,114,56,0,0,0,114,38,0,0,0,
-    90,11,114,101,108,97,116,105,118,101,95,116,111,114,29,0,
-    0,0,114,59,0,0,0,114,176,0,0,0,90,6,112,97,
-    114,101,110,116,218,3,115,101,116,114,28,0,0,0,114,23,
-    0,0,0,114,51,0,0,0,218,3,97,100,100,41,9,114,
-    32,0,0,0,114,185,0,0,0,90,13,102,117,108,108,110,
-    97,109,101,95,112,97,116,104,90,13,114,101,108,97,116,105,
-    118,101,95,112,97,116,104,90,12,112,97,99,107,97,103,101,
-    95,112,97,116,104,90,12,115,117,98,100,105,114,115,95,115,
-    101,101,110,218,8,102,105,108,101,110,97,109,101,90,8,114,
-    101,108,97,116,105,118,101,90,11,112,97,114,101,110,116,95,
-    110,97,109,101,114,9,0,0,0,114,9,0,0,0,114,10,
-    0,0,0,218,8,99,111,110,116,101,110,116,115,250,2,0,
-    0,115,34,0,0,0,0,8,12,1,18,1,14,3,14,1,
-    6,1,6,1,12,1,2,1,18,1,14,1,10,5,8,1,
-    12,1,10,1,8,1,10,1,122,33,95,90,105,112,73,109,
-    112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100,
-    101,114,46,99,111,110,116,101,110,116,115,78,41,10,114,6,
-    0,0,0,114,7,0,0,0,114,8,0,0,0,114,84,0,
-    0,0,114,81,0,0,0,114,34,0,0,0,114,182,0,0,
-    0,114,183,0,0,0,114,184,0,0,0,114,189,0,0,0,
-    114,9,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
-    10,0,0,0,114,80,0,0,0,212,2,0,0,115,14,0,
-    0,0,8,1,4,5,4,2,8,4,8,9,8,6,8,11,
-    114,80,0,0,0,41,45,114,84,0,0,0,90,26,95,102,
-    114,111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,
-    101,120,116,101,114,110,97,108,114,21,0,0,0,114,1,0,
-    0,0,114,2,0,0,0,90,17,95,102,114,111,122,101,110,
-    95,105,109,112,111,114,116,108,105,98,114,76,0,0,0,114,
-    149,0,0,0,114,111,0,0,0,114,153,0,0,0,114,67,
-    0,0,0,114,132,0,0,0,90,7,95,95,97,108,108,95,
-    95,114,20,0,0,0,90,15,112,97,116,104,95,115,101,112,
-    97,114,97,116,111,114,115,114,18,0,0,0,114,75,0,0,
-    0,114,3,0,0,0,114,25,0,0,0,218,4,116,121,112,
-    101,114,70,0,0,0,114,114,0,0,0,114,116,0,0,0,
-    114,118,0,0,0,114,4,0,0,0,114,89,0,0,0,114,
-    36,0,0,0,114,37,0,0,0,114,35,0,0,0,114,27,
-    0,0,0,114,123,0,0,0,114,143,0,0,0,114,145,0,
-    0,0,114,52,0,0,0,114,148,0,0,0,114,156,0,0,
-    0,218,8,95,95,99,111,100,101,95,95,114,154,0,0,0,
-    114,160,0,0,0,114,162,0,0,0,114,170,0,0,0,114,
-    152,0,0,0,114,150,0,0,0,114,44,0,0,0,114,80,
-    0,0,0,114,9,0,0,0,114,9,0,0,0,114,9,0,
-    0,0,114,10,0,0,0,218,8,60,109,111,100,117,108,101,
-    62,1,0,0,0,115,88,0,0,0,4,16,8,1,16,1,
-    8,1,8,1,8,1,8,1,8,1,8,2,8,3,6,1,
-    14,3,16,4,4,2,8,2,4,1,4,1,4,2,14,127,
-    0,127,0,1,12,1,12,1,2,1,2,252,4,9,8,4,
-    8,9,8,31,8,126,2,254,2,29,4,5,8,21,8,46,
-    8,10,8,46,10,5,8,7,8,6,8,13,8,19,8,15,
-    8,26,
+    0,0,0,9,0,0,0,67,0,0,0,115,252,4,0,0,
+    122,14,116,0,160,1,124,0,161,1,125,1,87,0,110,38,
+    4,0,116,2,107,10,114,52,1,0,1,0,1,0,116,3,
+    100,1,124,0,155,2,157,2,124,0,100,2,141,2,130,1,
+    89,0,110,2,88,0,124,1,144,4,143,168,1,0,122,36,
+    124,1,160,4,116,5,11,0,100,3,161,2,1,0,124,1,
+    160,6,161,0,125,2,124,1,160,7,116,5,161,1,125,3,
+    87,0,110,38,4,0,116,2,107,10,114,136,1,0,1,0,
+    1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,
+    141,2,130,1,89,0,110,2,88,0,116,8,124,3,131,1,
+    116,5,107,3,114,168,116,3,100,4,124,0,155,2,157,2,
+    124,0,100,2,141,2,130,1,124,3,100,0,100,5,133,2,
+    25,0,116,9,107,3,144,1,114,178,122,24,124,1,160,4,
+    100,6,100,3,161,2,1,0,124,1,160,6,161,0,125,4,
+    87,0,110,38,4,0,116,2,107,10,114,248,1,0,1,0,
+    1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,
+    141,2,130,1,89,0,110,2,88,0,116,10,124,4,116,11,
+    24,0,116,5,24,0,100,6,131,2,125,5,122,22,124,1,
+    160,4,124,5,161,1,1,0,124,1,160,7,161,0,125,6,
+    87,0,110,40,4,0,116,2,107,10,144,1,114,74,1,0,
+    1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,0,
+    100,2,141,2,130,1,89,0,110,2,88,0,124,6,160,12,
+    116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,114,
+    116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2,
+    130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0,
+    125,3,116,8,124,3,131,1,116,5,107,3,144,1,114,162,
+    116,3,100,8,124,0,155,2,157,2,124,0,100,2,141,2,
+    130,1,124,4,116,8,124,6,131,1,24,0,124,7,23,0,
+    125,2,116,13,124,3,100,9,100,10,133,2,25,0,131,1,
+    125,8,116,13,124,3,100,10,100,11,133,2,25,0,131,1,
+    125,9,124,2,124,8,107,0,144,1,114,238,116,3,100,12,
+    124,0,155,2,157,2,124,0,100,2,141,2,130,1,124,2,
+    124,9,107,0,144,2,114,10,116,3,100,13,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,124,2,124,8,56,0,
+    125,2,124,2,124,9,24,0,125,10,124,10,100,6,107,0,
+    144,2,114,54,116,3,100,14,124,0,155,2,157,2,124,0,
+    100,2,141,2,130,1,105,0,125,11,100,6,125,12,122,14,
+    124,1,160,4,124,2,161,1,1,0,87,0,110,40,4,0,
+    116,2,107,10,144,2,114,116,1,0,1,0,1,0,116,3,
+    100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,
+    89,0,110,2,88,0,124,1,160,7,100,15,161,1,125,3,
+    116,8,124,3,131,1,100,5,107,0,144,2,114,150,116,14,
+    100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0,
+    100,17,107,3,144,2,114,172,144,4,113,224,116,8,124,3,
+    131,1,100,15,107,3,144,2,114,194,116,14,100,16,131,1,
+    130,1,116,15,124,3,100,18,100,19,133,2,25,0,131,1,
+    125,13,116,15,124,3,100,19,100,9,133,2,25,0,131,1,
+    125,14,116,15,124,3,100,9,100,20,133,2,25,0,131,1,
+    125,15,116,15,124,3,100,20,100,10,133,2,25,0,131,1,
+    125,16,116,13,124,3,100,10,100,11,133,2,25,0,131,1,
+    125,17,116,13,124,3,100,11,100,21,133,2,25,0,131,1,
+    125,18,116,13,124,3,100,21,100,22,133,2,25,0,131,1,
+    125,4,116,15,124,3,100,22,100,23,133,2,25,0,131,1,
+    125,19,116,15,124,3,100,23,100,24,133,2,25,0,131,1,
+    125,20,116,15,124,3,100,24,100,25,133,2,25,0,131,1,
+    125,21,116,13,124,3,100,26,100,15,133,2,25,0,131,1,
+    125,22,124,19,124,20,23,0,124,21,23,0,125,8,124,22,
+    124,9,107,4,144,3,114,154,116,3,100,27,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,124,22,124,10,55,0,
+    125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0,
+    110,40,4,0,116,2,107,10,144,3,114,216,1,0,1,0,
+    1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2,
+    141,2,130,1,89,0,110,2,88,0,116,8,124,23,131,1,
+    124,19,107,3,144,3,114,250,116,3,100,4,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,122,50,116,8,124,1,
+    160,7,124,8,124,19,24,0,161,1,131,1,124,8,124,19,
+    24,0,107,3,144,4,114,42,116,3,100,4,124,0,155,2,
+    157,2,124,0,100,2,141,2,130,1,87,0,110,40,4,0,
+    116,2,107,10,144,4,114,84,1,0,1,0,1,0,116,3,
+    100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1,
+    89,0,110,2,88,0,124,13,100,28,64,0,144,4,114,106,
+    124,23,160,16,161,0,125,23,110,54,122,14,124,23,160,16,
+    100,29,161,1,125,23,87,0,110,38,4,0,116,17,107,10,
+    144,4,114,158,1,0,1,0,1,0,124,23,160,16,100,30,
+    161,1,160,18,116,19,161,1,125,23,89,0,110,2,88,0,
+    124,23,160,20,100,31,116,21,161,2,125,23,116,22,160,23,
+    124,0,124,23,161,2,125,24,124,24,124,14,124,18,124,4,
+    124,22,124,15,124,16,124,17,102,8,125,25,124,25,124,11,
+    124,23,60,0,124,12,100,32,55,0,125,12,144,2,113,118,
+    87,0,53,0,81,0,82,0,88,0,116,24,160,25,100,33,
+    124,12,124,0,161,3,1,0,124,11,83,0,41,34,78,122,
+    21,99,97,110,39,116,32,111,112,101,110,32,90,105,112,32,
+    102,105,108,101,58,32,114,12,0,0,0,114,86,0,0,0,
+    250,21,99,97,110,39,116,32,114,101,97,100,32,90,105,112,
+    32,102,105,108,101,58,32,233,4,0,0,0,114,0,0,0,
+    0,122,16,110,111,116,32,97,32,90,105,112,32,102,105,108,
+    101,58,32,122,18,99,111,114,114,117,112,116,32,90,105,112,
+    32,102,105,108,101,58,32,233,12,0,0,0,233,16,0,0,
+    0,233,20,0,0,0,122,28,98,97,100,32,99,101,110,116,
+    114,97,108,32,100,105,114,101,99,116,111,114,121,32,115,105,
+    122,101,58,32,122,30,98,97,100,32,99,101,110,116,114,97,
+    108,32,100,105,114,101,99,116,111,114,121,32,111,102,102,115,
+    101,116,58,32,122,38,98,97,100,32,99,101,110,116,114,97,
+    108,32,100,105,114,101,99,116,111,114,121,32,115,105,122,101,
+    32,111,114,32,111,102,102,115,101,116,58,32,233,46,0,0,
+    0,250,27,69,79,70,32,114,101,97,100,32,119,104,101,114,
+    101,32,110,111,116,32,101,120,112,101,99,116,101,100,115,4,
+    0,0,0,80,75,1,2,233,8,0,0,0,233,10,0,0,
+    0,233,14,0,0,0,233,24,0,0,0,233,28,0,0,0,
+    233,30,0,0,0,233,32,0,0,0,233,34,0,0,0,233,
+    42,0,0,0,122,25,98,97,100,32,108,111,99,97,108,32,
+    104,101,97,100,101,114,32,111,102,102,115,101,116,58,32,105,
+    0,8,0,0,218,5,97,115,99,105,105,90,6,108,97,116,
+    105,110,49,250,1,47,114,5,0,0,0,122,33,122,105,112,
+    105,109,112,111,114,116,58,32,102,111,117,110,100,32,123,125,
+    32,110,97,109,101,115,32,105,110,32,123,33,114,125,41,26,
+    218,3,95,105,111,218,9,111,112,101,110,95,99,111,100,101,
+    114,22,0,0,0,114,3,0,0,0,218,4,115,101,101,107,
+    218,20,69,78,68,95,67,69,78,84,82,65,76,95,68,73,
+    82,95,83,73,90,69,90,4,116,101,108,108,218,4,114,101,
+    97,100,114,51,0,0,0,218,18,83,84,82,73,78,71,95,
+    69,78,68,95,65,82,67,72,73,86,69,218,3,109,97,120,
+    218,15,77,65,88,95,67,79,77,77,69,78,84,95,76,69,
+    78,218,5,114,102,105,110,100,114,2,0,0,0,218,8,69,
+    79,70,69,114,114,111,114,114,1,0,0,0,114,62,0,0,
+    0,218,18,85,110,105,99,111,100,101,68,101,99,111,100,101,
+    69,114,114,111,114,218,9,116,114,97,110,115,108,97,116,101,
+    218,11,99,112,52,51,55,95,116,97,98,108,101,114,19,0,
+    0,0,114,20,0,0,0,114,21,0,0,0,114,30,0,0,
+    0,114,76,0,0,0,114,77,0,0,0,41,26,114,29,0,
+    0,0,218,2,102,112,90,15,104,101,97,100,101,114,95,112,
+    111,115,105,116,105,111,110,218,6,98,117,102,102,101,114,218,
+    9,102,105,108,101,95,115,105,122,101,90,17,109,97,120,95,
+    99,111,109,109,101,110,116,95,115,116,97,114,116,218,4,100,
+    97,116,97,90,3,112,111,115,218,11,104,101,97,100,101,114,
+    95,115,105,122,101,90,13,104,101,97,100,101,114,95,111,102,
+    102,115,101,116,90,10,97,114,99,95,111,102,102,115,101,116,
+    114,33,0,0,0,218,5,99,111,117,110,116,218,5,102,108,
+    97,103,115,218,8,99,111,109,112,114,101,115,115,218,4,116,
+    105,109,101,218,4,100,97,116,101,218,3,99,114,99,218,9,
+    100,97,116,97,95,115,105,122,101,218,9,110,97,109,101,95,
+    115,105,122,101,218,10,101,120,116,114,97,95,115,105,122,101,
+    90,12,99,111,109,109,101,110,116,95,115,105,122,101,218,11,
+    102,105,108,101,95,111,102,102,115,101,116,114,59,0,0,0,
+    114,13,0,0,0,218,1,116,114,9,0,0,0,114,9,0,
+    0,0,114,10,0,0,0,114,27,0,0,0,96,1,0,0,
+    115,212,0,0,0,0,1,2,1,14,1,14,1,24,2,8,
+    1,2,1,14,1,8,1,14,1,14,1,24,1,12,1,18,
+    1,18,3,2,1,12,1,12,1,14,1,10,1,2,255,12,
+    2,8,1,2,255,2,1,2,255,4,2,2,1,10,1,12,
+    1,16,1,10,1,2,255,12,2,10,1,10,1,10,1,2,
+    255,6,2,16,1,14,1,10,1,2,255,6,2,16,2,16,
+    1,16,1,10,1,18,1,10,1,18,1,8,1,8,1,10,
+    1,18,2,4,2,4,1,2,1,14,1,16,1,24,2,10,
+    1,14,1,8,2,18,1,4,1,14,1,8,1,16,1,16,
+    1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,
+    1,16,1,12,1,10,1,18,1,8,2,2,1,14,1,16,
+    1,24,1,14,1,18,4,2,1,28,1,22,1,16,1,24,
+    2,10,2,10,3,2,1,14,1,16,1,22,2,12,1,12,
+    1,20,1,8,1,22,1,14,1,114,27,0,0,0,117,190,
+    1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,
+    13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,
+    29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,
+    45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+    61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,
+    77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,
+    93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,
+    109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,
+    125,126,127,195,135,195,188,195,169,195,162,195,164,195,160,195,
+    165,195,167,195,170,195,171,195,168,195,175,195,174,195,172,195,
+    132,195,133,195,137,195,166,195,134,195,180,195,182,195,178,195,
+    187,195,185,195,191,195,150,195,156,194,162,194,163,194,165,226,
+    130,167,198,146,195,161,195,173,195,179,195,186,195,177,195,145,
+    194,170,194,186,194,191,226,140,144,194,172,194,189,194,188,194,
+    161,194,171,194,187,226,150,145,226,150,146,226,150,147,226,148,
+    130,226,148,164,226,149,161,226,149,162,226,149,150,226,149,149,
+    226,149,163,226,149,145,226,149,151,226,149,157,226,149,156,226,
+    149,155,226,148,144,226,148,148,226,148,180,226,148,172,226,148,
+    156,226,148,128,226,148,188,226,149,158,226,149,159,226,149,154,
+    226,149,148,226,149,169,226,149,166,226,149,160,226,149,144,226,
+    149,172,226,149,167,226,149,168,226,149,164,226,149,165,226,149,
+    153,226,149,152,226,149,146,226,149,147,226,149,171,226,149,170,
+    226,148,152,226,148,140,226,150,136,226,150,132,226,150,140,226,
+    150,144,226,150,128,206,177,195,159,206,147,207,128,206,163,207,
+    131,194,181,207,132,206,166,206,152,206,169,206,180,226,136,158,
+    207,134,206,181,226,136,169,226,137,161,194,177,226,137,165,226,
+    137,164,226,140,160,226,140,161,195,183,226,137,136,194,176,226,
+    136,153,194,183,226,136,154,226,129,191,194,178,226,150,160,194,
+    160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+    0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,116,
+    0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,100,
+    2,131,1,130,1,100,3,97,0,122,60,122,16,100,4,100,
+    5,108,4,109,5,125,0,1,0,87,0,110,38,4,0,116,
+    6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,100,
+    1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,110,
+    2,88,0,87,0,53,0,100,6,97,0,88,0,116,1,160,
+    2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27,
+    122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32,
+    85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110,
+    39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97,
+    116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97,
+    105,108,97,98,108,101,84,114,0,0,0,0,169,1,218,10,
+    100,101,99,111,109,112,114,101,115,115,70,122,25,122,105,112,
+    105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97,
+    105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114,
+    116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,77,
+    0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,141,
+    0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,140,
+    0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,
+    0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,114,
+    101,115,115,95,102,117,110,99,254,1,0,0,115,24,0,0,
+    0,0,2,4,3,10,1,8,2,4,1,4,1,16,1,14,
+    1,10,1,18,2,6,2,10,1,114,144,0,0,0,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9,
+    0,0,0,67,0,0,0,115,128,1,0,0,124,1,92,8,
+    125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,9,
+    124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,1,
+    116,1,160,2,124,0,161,1,144,1,143,8,125,10,122,14,
+    124,10,160,3,124,6,161,1,1,0,87,0,110,38,4,0,
+    116,4,107,10,114,102,1,0,1,0,1,0,116,0,100,3,
+    124,0,155,2,157,2,124,0,100,4,141,2,130,1,89,0,
+    110,2,88,0,124,10,160,5,100,5,161,1,125,11,116,6,
+    124,11,131,1,100,5,107,3,114,134,116,7,100,6,131,1,
+    130,1,124,11,100,0,100,7,133,2,25,0,100,8,107,3,
+    114,168,116,0,100,9,124,0,155,2,157,2,124,0,100,4,
+    141,2,130,1,116,8,124,11,100,10,100,11,133,2,25,0,
+    131,1,125,12,116,8,124,11,100,11,100,5,133,2,25,0,
+    131,1,125,13,100,5,124,12,23,0,124,13,23,0,125,14,
+    124,6,124,14,55,0,125,6,122,14,124,10,160,3,124,6,
+    161,1,1,0,87,0,110,40,4,0,116,4,107,10,144,1,
+    114,18,1,0,1,0,1,0,116,0,100,3,124,0,155,2,
+    157,2,124,0,100,4,141,2,130,1,89,0,110,2,88,0,
+    124,10,160,5,124,4,161,1,125,15,116,6,124,15,131,1,
+    124,4,107,3,144,1,114,52,116,4,100,12,131,1,130,1,
+    87,0,53,0,81,0,82,0,88,0,124,3,100,1,107,2,
+    144,1,114,76,124,15,83,0,122,10,116,9,131,0,125,16,
+    87,0,110,30,4,0,116,10,107,10,144,1,114,116,1,0,
+    1,0,1,0,116,0,100,13,131,1,130,1,89,0,110,2,
+    88,0,124,16,124,15,100,14,131,2,83,0,41,15,78,114,
+    0,0,0,0,122,18,110,101,103,97,116,105,118,101,32,100,
+    97,116,97,32,115,105,122,101,114,92,0,0,0,114,12,0,
+    0,0,114,104,0,0,0,114,98,0,0,0,114,93,0,0,
+    0,115,4,0,0,0,80,75,3,4,122,23,98,97,100,32,
+    108,111,99,97,108,32,102,105,108,101,32,104,101,97,100,101,
+    114,58,32,233,26,0,0,0,114,103,0,0,0,122,26,122,
+    105,112,105,109,112,111,114,116,58,32,99,97,110,39,116,32,
+    114,101,97,100,32,100,97,116,97,114,139,0,0,0,105,241,
+    255,255,255,41,11,114,3,0,0,0,114,110,0,0,0,114,
+    111,0,0,0,114,112,0,0,0,114,22,0,0,0,114,114,
+    0,0,0,114,51,0,0,0,114,119,0,0,0,114,1,0,
+    0,0,114,144,0,0,0,114,143,0,0,0,41,17,114,29,
+    0,0,0,114,54,0,0,0,90,8,100,97,116,97,112,97,
+    116,104,114,130,0,0,0,114,134,0,0,0,114,125,0,0,
+    0,114,137,0,0,0,114,131,0,0,0,114,132,0,0,0,
+    114,133,0,0,0,114,123,0,0,0,114,124,0,0,0,114,
+    135,0,0,0,114,136,0,0,0,114,127,0,0,0,90,8,
+    114,97,119,95,100,97,116,97,114,141,0,0,0,114,9,0,
+    0,0,114,9,0,0,0,114,10,0,0,0,114,52,0,0,
+    0,19,2,0,0,115,62,0,0,0,0,1,20,1,8,1,
+    8,2,14,2,2,1,14,1,14,1,24,1,10,1,12,1,
+    8,2,16,2,18,2,16,1,16,1,12,1,8,1,2,1,
+    14,1,16,1,24,1,10,1,14,1,18,2,10,2,4,3,
+    2,1,10,1,16,1,14,1,114,52,0,0,0,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,
+    0,0,67,0,0,0,115,16,0,0,0,116,0,124,0,124,
+    1,24,0,131,1,100,1,107,1,83,0,41,2,78,114,5,
+    0,0,0,41,1,218,3,97,98,115,41,2,90,2,116,49,
+    90,2,116,50,114,9,0,0,0,114,9,0,0,0,114,10,
+    0,0,0,218,9,95,101,113,95,109,116,105,109,101,65,2,
+    0,0,115,2,0,0,0,0,2,114,147,0,0,0,99,5,
+    0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8,
+    0,0,0,67,0,0,0,115,68,1,0,0,124,3,124,2,
+    100,1,156,2,125,5,122,18,116,0,160,1,124,4,124,3,
+    124,5,161,3,125,6,87,0,110,26,4,0,116,2,107,10,
+    114,54,1,0,1,0,1,0,89,0,100,0,83,0,89,0,
+    110,2,88,0,124,6,100,2,64,0,100,3,107,3,125,7,
+    124,7,114,190,124,6,100,4,64,0,100,3,107,3,125,8,
+    116,3,106,4,100,5,107,3,114,188,124,8,115,108,116,3,
+    106,4,100,6,107,2,114,188,116,5,124,0,124,2,131,2,
+    125,9,124,9,100,0,107,9,114,188,116,3,160,6,116,0,
+    106,7,124,9,161,2,125,10,122,20,116,8,160,9,124,4,
+    124,10,124,3,124,5,161,4,1,0,87,0,110,26,4,0,
+    116,2,107,10,114,186,1,0,1,0,1,0,89,0,100,0,
+    83,0,89,0,110,2,88,0,110,84,116,10,124,0,124,2,
+    131,2,92,2,125,11,125,12,124,11,144,1,114,18,116,11,
+    116,12,124,4,100,7,100,8,133,2,25,0,131,1,124,11,
+    131,2,114,254,116,12,124,4,100,8,100,9,133,2,25,0,
+    131,1,124,12,107,3,144,1,114,18,116,13,160,14,100,10,
+    124,3,155,2,157,2,161,1,1,0,100,0,83,0,116,15,
+    160,16,124,4,100,9,100,0,133,2,25,0,161,1,125,13,
+    116,17,124,13,116,18,131,2,144,1,115,64,116,19,100,11,
+    124,1,155,2,100,12,157,3,131,1,130,1,124,13,83,0,
+    41,13,78,41,2,114,59,0,0,0,114,13,0,0,0,114,
+    5,0,0,0,114,0,0,0,0,114,86,0,0,0,90,5,
+    110,101,118,101,114,90,6,97,108,119,97,121,115,114,99,0,
+    0,0,114,94,0,0,0,114,95,0,0,0,122,22,98,121,
+    116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32,
+    102,111,114,32,122,16,99,111,109,112,105,108,101,100,32,109,
+    111,100,117,108,101,32,122,21,32,105,115,32,110,111,116,32,
+    97,32,99,111,100,101,32,111,98,106,101,99,116,41,20,114,
+    21,0,0,0,90,13,95,99,108,97,115,115,105,102,121,95,
+    112,121,99,114,75,0,0,0,218,4,95,105,109,112,90,21,
+    99,104,101,99,107,95,104,97,115,104,95,98,97,115,101,100,
+    95,112,121,99,115,218,15,95,103,101,116,95,112,121,99,95,
+    115,111,117,114,99,101,218,11,115,111,117,114,99,101,95,104,
+    97,115,104,90,17,95,82,65,87,95,77,65,71,73,67,95,
+    78,85,77,66,69,82,90,18,95,98,111,111,115,116,114,97,
+    112,95,101,120,116,101,114,110,97,108,90,18,95,118,97,108,
+    105,100,97,116,101,95,104,97,115,104,95,112,121,99,218,29,
+    95,103,101,116,95,109,116,105,109,101,95,97,110,100,95,115,
+    105,122,101,95,111,102,95,115,111,117,114,99,101,114,147,0,
+    0,0,114,2,0,0,0,114,76,0,0,0,114,77,0,0,
+    0,218,7,109,97,114,115,104,97,108,90,5,108,111,97,100,
+    115,114,15,0,0,0,218,10,95,99,111,100,101,95,116,121,
+    112,101,218,9,84,121,112,101,69,114,114,111,114,41,14,114,
+    32,0,0,0,114,53,0,0,0,114,63,0,0,0,114,38,
+    0,0,0,114,126,0,0,0,90,11,101,120,99,95,100,101,
+    116,97,105,108,115,114,129,0,0,0,90,10,104,97,115,104,
+    95,98,97,115,101,100,90,12,99,104,101,99,107,95,115,111,
+    117,114,99,101,90,12,115,111,117,114,99,101,95,98,121,116,
+    101,115,114,150,0,0,0,90,12,115,111,117,114,99,101,95,
+    109,116,105,109,101,90,11,115,111,117,114,99,101,95,115,105,
+    122,101,114,46,0,0,0,114,9,0,0,0,114,9,0,0,
+    0,114,10,0,0,0,218,15,95,117,110,109,97,114,115,104,
+    97,108,95,99,111,100,101,75,2,0,0,115,88,0,0,0,
+    0,2,2,1,2,254,6,5,2,1,18,1,14,1,12,2,
+    12,1,4,1,12,1,10,1,2,255,2,1,8,255,2,2,
+    10,1,8,1,4,1,4,1,2,254,4,5,2,1,4,1,
+    2,0,2,0,2,0,2,255,8,2,14,1,14,3,8,255,
+    6,3,6,3,22,1,18,255,4,2,4,1,8,255,4,2,
+    4,2,18,1,12,1,16,1,114,155,0,0,0,99,1,0,
+    0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,
+    0,0,67,0,0,0,115,28,0,0,0,124,0,160,0,100,
+    1,100,2,161,2,125,0,124,0,160,0,100,3,100,2,161,
+    2,125,0,124,0,83,0,41,4,78,115,2,0,0,0,13,
+    10,243,1,0,0,0,10,243,1,0,0,0,13,41,1,114,
+    19,0,0,0,41,1,218,6,115,111,117,114,99,101,114,9,
+    0,0,0,114,9,0,0,0,114,10,0,0,0,218,23,95,
+    110,111,114,109,97,108,105,122,101,95,108,105,110,101,95,101,
+    110,100,105,110,103,115,126,2,0,0,115,6,0,0,0,0,
+    1,12,1,12,1,114,159,0,0,0,99,2,0,0,0,0,
+    0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,67,
+    0,0,0,115,24,0,0,0,116,0,124,1,131,1,125,1,
+    116,1,124,1,124,0,100,1,100,2,100,3,141,4,83,0,
+    41,4,78,114,74,0,0,0,84,41,1,90,12,100,111,110,
+    116,95,105,110,104,101,114,105,116,41,2,114,159,0,0,0,
+    218,7,99,111,109,112,105,108,101,41,2,114,53,0,0,0,
+    114,158,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
+    10,0,0,0,218,15,95,99,111,109,112,105,108,101,95,115,
+    111,117,114,99,101,133,2,0,0,115,4,0,0,0,0,1,
+    8,1,114,161,0,0,0,99,2,0,0,0,0,0,0,0,
+    0,0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,
+    115,68,0,0,0,116,0,160,1,124,0,100,1,63,0,100,
+    2,23,0,124,0,100,3,63,0,100,4,64,0,124,0,100,
+    5,64,0,124,1,100,6,63,0,124,1,100,3,63,0,100,
+    7,64,0,124,1,100,5,64,0,100,8,20,0,100,9,100,
+    9,100,9,102,9,161,1,83,0,41,10,78,233,9,0,0,
+    0,105,188,7,0,0,233,5,0,0,0,233,15,0,0,0,
+    233,31,0,0,0,233,11,0,0,0,233,63,0,0,0,114,
+    86,0,0,0,114,14,0,0,0,41,2,114,131,0,0,0,
+    90,6,109,107,116,105,109,101,41,2,218,1,100,114,138,0,
+    0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,
+    0,218,14,95,112,97,114,115,101,95,100,111,115,116,105,109,
+    101,139,2,0,0,115,22,0,0,0,0,1,4,1,10,1,
+    10,1,6,1,6,1,10,1,10,1,2,0,2,0,2,249,
+    114,169,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,6,0,0,0,10,0,0,0,67,0,0,0,115,116,
+    0,0,0,122,82,124,1,100,1,100,0,133,2,25,0,100,
+    2,107,6,115,22,116,0,130,1,124,1,100,0,100,1,133,
+    2,25,0,125,1,124,0,106,1,124,1,25,0,125,2,124,
+    2,100,3,25,0,125,3,124,2,100,4,25,0,125,4,124,
+    2,100,5,25,0,125,5,116,2,124,4,124,3,131,2,124,
+    5,102,2,87,0,83,0,4,0,116,3,116,4,116,5,102,
+    3,107,10,114,110,1,0,1,0,1,0,89,0,100,6,83,
+    0,88,0,100,0,83,0,41,7,78,114,14,0,0,0,169,
+    2,218,1,99,218,1,111,114,163,0,0,0,233,6,0,0,
+    0,233,3,0,0,0,41,2,114,0,0,0,0,114,0,0,
+    0,0,41,6,218,14,65,115,115,101,114,116,105,111,110,69,
+    114,114,111,114,114,28,0,0,0,114,169,0,0,0,114,26,
+    0,0,0,218,10,73,110,100,101,120,69,114,114,111,114,114,
+    154,0,0,0,41,6,114,32,0,0,0,114,13,0,0,0,
+    114,54,0,0,0,114,131,0,0,0,114,132,0,0,0,90,
+    17,117,110,99,111,109,112,114,101,115,115,101,100,95,115,105,
+    122,101,114,9,0,0,0,114,9,0,0,0,114,10,0,0,
+    0,114,151,0,0,0,152,2,0,0,115,20,0,0,0,0,
+    1,2,2,20,1,12,1,10,3,8,1,8,1,8,1,16,
+    1,20,1,114,151,0,0,0,99,2,0,0,0,0,0,0,
+    0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,
+    0,115,86,0,0,0,124,1,100,1,100,0,133,2,25,0,
+    100,2,107,6,115,20,116,0,130,1,124,1,100,0,100,1,
+    133,2,25,0,125,1,122,14,124,0,106,1,124,1,25,0,
+    125,2,87,0,110,22,4,0,116,2,107,10,114,68,1,0,
+    1,0,1,0,89,0,100,0,83,0,88,0,116,3,124,0,
+    106,4,124,2,131,2,83,0,100,0,83,0,41,3,78,114,
+    14,0,0,0,114,170,0,0,0,41,5,114,175,0,0,0,
+    114,28,0,0,0,114,26,0,0,0,114,52,0,0,0,114,
+    29,0,0,0,41,3,114,32,0,0,0,114,13,0,0,0,
+    114,54,0,0,0,114,9,0,0,0,114,9,0,0,0,114,
+    10,0,0,0,114,149,0,0,0,171,2,0,0,115,14,0,
+    0,0,0,2,20,1,12,2,2,1,14,1,14,1,8,2,
+    114,149,0,0,0,99,2,0,0,0,0,0,0,0,0,0,
+    0,0,11,0,0,0,9,0,0,0,67,0,0,0,115,198,
+    0,0,0,116,0,124,0,124,1,131,2,125,2,116,1,68,
+    0,93,160,92,3,125,3,125,4,125,5,124,2,124,3,23,
+    0,125,6,116,2,106,3,100,1,124,0,106,4,116,5,124,
+    6,100,2,100,3,141,5,1,0,122,14,124,0,106,6,124,
+    6,25,0,125,7,87,0,110,20,4,0,116,7,107,10,114,
+    88,1,0,1,0,1,0,89,0,113,14,88,0,124,7,100,
+    4,25,0,125,8,116,8,124,0,106,4,124,7,131,2,125,
+    9,124,4,114,132,116,9,124,0,124,8,124,6,124,1,124,
+    9,131,5,125,10,110,10,116,10,124,8,124,9,131,2,125,
+    10,124,10,100,0,107,8,114,152,113,14,124,7,100,4,25,
+    0,125,8,124,10,124,5,124,8,102,3,2,0,1,0,83,
+    0,113,14,116,11,100,5,124,1,155,2,157,2,124,1,100,
+    6,141,2,130,1,100,0,83,0,41,7,78,122,13,116,114,
+    121,105,110,103,32,123,125,123,125,123,125,114,86,0,0,0,
+    41,1,90,9,118,101,114,98,111,115,105,116,121,114,0,0,
+    0,0,114,57,0,0,0,114,58,0,0,0,41,12,114,36,
+    0,0,0,114,89,0,0,0,114,76,0,0,0,114,77,0,
+    0,0,114,29,0,0,0,114,20,0,0,0,114,28,0,0,
+    0,114,26,0,0,0,114,52,0,0,0,114,155,0,0,0,
+    114,161,0,0,0,114,3,0,0,0,41,11,114,32,0,0,
+    0,114,38,0,0,0,114,13,0,0,0,114,90,0,0,0,
+    114,91,0,0,0,114,47,0,0,0,114,63,0,0,0,114,
+    54,0,0,0,114,40,0,0,0,114,126,0,0,0,114,46,
+    0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,
+    0,0,114,44,0,0,0,186,2,0,0,115,36,0,0,0,
+    0,1,10,1,14,1,8,1,22,1,2,1,14,1,14,1,
+    6,2,8,1,12,1,4,1,18,2,10,1,8,3,2,1,
+    8,1,16,2,114,44,0,0,0,99,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,
+    0,0,115,60,0,0,0,101,0,90,1,100,0,90,2,100,
+    1,90,3,100,2,90,4,100,3,100,4,132,0,90,5,100,
+    5,100,6,132,0,90,6,100,7,100,8,132,0,90,7,100,
+    9,100,10,132,0,90,8,100,11,100,12,132,0,90,9,100,
+    13,83,0,41,14,114,80,0,0,0,122,165,80,114,105,118,
+    97,116,101,32,99,108,97,115,115,32,117,115,101,100,32,116,
+    111,32,115,117,112,112,111,114,116,32,90,105,112,73,109,112,
+    111,114,116,46,103,101,116,95,114,101,115,111,117,114,99,101,
+    95,114,101,97,100,101,114,40,41,46,10,10,32,32,32,32,
+    84,104,105,115,32,99,108,97,115,115,32,105,115,32,97,108,
+    108,111,119,101,100,32,116,111,32,114,101,102,101,114,101,110,
+    99,101,32,97,108,108,32,116,104,101,32,105,110,110,97,114,
+    100,115,32,97,110,100,32,112,114,105,118,97,116,101,32,112,
+    97,114,116,115,32,111,102,10,32,32,32,32,116,104,101,32,
+    122,105,112,105,109,112,111,114,116,101,114,46,10,32,32,32,
+    32,70,99,3,0,0,0,0,0,0,0,0,0,0,0,3,
+    0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,
+    124,1,124,0,95,0,124,2,124,0,95,1,100,0,83,0,
+    114,88,0,0,0,41,2,114,4,0,0,0,114,38,0,0,
+    0,41,3,114,32,0,0,0,114,4,0,0,0,114,38,0,
+    0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,
+    0,114,34,0,0,0,220,2,0,0,115,4,0,0,0,0,
+    1,6,1,122,33,95,90,105,112,73,109,112,111,114,116,82,
+    101,115,111,117,114,99,101,82,101,97,100,101,114,46,95,95,
+    105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,0,
+    0,0,0,5,0,0,0,8,0,0,0,67,0,0,0,115,
+    92,0,0,0,124,0,106,0,160,1,100,1,100,2,161,2,
+    125,2,124,2,155,0,100,2,124,1,155,0,157,3,125,3,
+    100,3,100,4,108,2,109,3,125,4,1,0,122,18,124,4,
+    124,0,106,4,160,5,124,3,161,1,131,1,87,0,83,0,
+    4,0,116,6,107,10,114,86,1,0,1,0,1,0,116,7,
+    124,3,131,1,130,1,89,0,110,2,88,0,100,0,83,0,
+    41,5,78,114,85,0,0,0,114,109,0,0,0,114,0,0,
+    0,0,41,1,218,7,66,121,116,101,115,73,79,41,8,114,
+    38,0,0,0,114,19,0,0,0,90,2,105,111,114,177,0,
+    0,0,114,4,0,0,0,114,55,0,0,0,114,22,0,0,
+    0,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69,
+    114,114,111,114,41,5,114,32,0,0,0,218,8,114,101,115,
+    111,117,114,99,101,218,16,102,117,108,108,110,97,109,101,95,
+    97,115,95,112,97,116,104,114,13,0,0,0,114,177,0,0,
+    0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,
+    218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,224,
+    2,0,0,115,14,0,0,0,0,1,14,1,14,1,12,1,
+    2,1,18,1,14,1,122,38,95,90,105,112,73,109,112,111,
+    114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,
+    46,111,112,101,110,95,114,101,115,111,117,114,99,101,99,2,
+    0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,
+    0,0,0,67,0,0,0,115,8,0,0,0,116,0,130,1,
+    100,0,83,0,114,88,0,0,0,41,1,114,178,0,0,0,
+    41,2,114,32,0,0,0,114,179,0,0,0,114,9,0,0,
+    0,114,9,0,0,0,114,10,0,0,0,218,13,114,101,115,
+    111,117,114,99,101,95,112,97,116,104,233,2,0,0,115,2,
+    0,0,0,0,4,122,38,95,90,105,112,73,109,112,111,114,
+    116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,46,
+    114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0,
+    0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0,
+    0,0,67,0,0,0,115,72,0,0,0,124,0,106,0,160,
+    1,100,1,100,2,161,2,125,2,124,2,155,0,100,2,124,
+    1,155,0,157,3,125,3,122,16,124,0,106,2,160,3,124,
+    3,161,1,1,0,87,0,110,22,4,0,116,4,107,10,114,
+    66,1,0,1,0,1,0,89,0,100,3,83,0,88,0,100,
+    4,83,0,41,5,78,114,85,0,0,0,114,109,0,0,0,
+    70,84,41,5,114,38,0,0,0,114,19,0,0,0,114,4,
+    0,0,0,114,55,0,0,0,114,22,0,0,0,41,4,114,
+    32,0,0,0,114,59,0,0,0,114,180,0,0,0,114,13,
+    0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0,
+    0,0,218,11,105,115,95,114,101,115,111,117,114,99,101,239,
+    2,0,0,115,14,0,0,0,0,3,14,1,14,1,2,1,
+    16,1,14,1,8,1,122,36,95,90,105,112,73,109,112,111,
+    114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114,
+    46,105,115,95,114,101,115,111,117,114,99,101,99,1,0,0,
+    0,0,0,0,0,0,0,0,0,9,0,0,0,9,0,0,
+    0,99,0,0,0,115,186,0,0,0,100,1,100,2,108,0,
+    109,1,125,1,1,0,124,1,124,0,106,2,160,3,124,0,
+    106,4,161,1,131,1,125,2,124,2,160,5,124,0,106,2,
+    106,6,161,1,125,3,124,3,106,7,100,3,107,2,115,58,
+    116,8,130,1,124,3,106,9,125,4,116,10,131,0,125,5,
+    124,0,106,2,106,11,68,0,93,102,125,6,122,18,124,1,
+    124,6,131,1,160,5,124,4,161,1,125,7,87,0,110,24,
+    4,0,116,12,107,10,114,124,1,0,1,0,1,0,89,0,
+    113,78,89,0,110,2,88,0,124,7,106,9,106,7,125,8,
+    116,13,124,8,131,1,100,1,107,2,114,156,124,7,106,7,
+    86,0,1,0,113,78,124,8,124,5,107,7,114,78,124,5,
+    160,14,124,8,161,1,1,0,124,8,86,0,1,0,113,78,
+    100,0,83,0,41,4,78,114,0,0,0,0,41,1,218,4,
+    80,97,116,104,114,60,0,0,0,41,15,90,7,112,97,116,
+    104,108,105,98,114,184,0,0,0,114,4,0,0,0,114,56,
+    0,0,0,114,38,0,0,0,90,11,114,101,108,97,116,105,
+    118,101,95,116,111,114,29,0,0,0,114,59,0,0,0,114,
+    175,0,0,0,90,6,112,97,114,101,110,116,218,3,115,101,
+    116,114,28,0,0,0,114,23,0,0,0,114,51,0,0,0,
+    218,3,97,100,100,41,9,114,32,0,0,0,114,184,0,0,
+    0,90,13,102,117,108,108,110,97,109,101,95,112,97,116,104,
+    90,13,114,101,108,97,116,105,118,101,95,112,97,116,104,90,
+    12,112,97,99,107,97,103,101,95,112,97,116,104,90,12,115,
+    117,98,100,105,114,115,95,115,101,101,110,218,8,102,105,108,
+    101,110,97,109,101,90,8,114,101,108,97,116,105,118,101,90,
+    11,112,97,114,101,110,116,95,110,97,109,101,114,9,0,0,
+    0,114,9,0,0,0,114,10,0,0,0,218,8,99,111,110,
+    116,101,110,116,115,250,2,0,0,115,34,0,0,0,0,8,
+    12,1,18,1,14,3,14,1,6,1,6,1,12,1,2,1,
+    18,1,14,1,10,5,8,1,12,1,10,1,8,1,10,1,
+    122,33,95,90,105,112,73,109,112,111,114,116,82,101,115,111,
+    117,114,99,101,82,101,97,100,101,114,46,99,111,110,116,101,
+    110,116,115,78,41,10,114,6,0,0,0,114,7,0,0,0,
+    114,8,0,0,0,114,84,0,0,0,114,81,0,0,0,114,
+    34,0,0,0,114,181,0,0,0,114,182,0,0,0,114,183,
+    0,0,0,114,188,0,0,0,114,9,0,0,0,114,9,0,
+    0,0,114,9,0,0,0,114,10,0,0,0,114,80,0,0,
+    0,212,2,0,0,115,14,0,0,0,8,1,4,5,4,2,
+    8,4,8,9,8,6,8,11,114,80,0,0,0,41,45,114,
+    84,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109,
+    112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108,
+    114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90,
+    17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108,
+    105,98,114,76,0,0,0,114,148,0,0,0,114,110,0,0,
+    0,114,152,0,0,0,114,67,0,0,0,114,131,0,0,0,
+    90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15,
+    112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114,
+    18,0,0,0,114,75,0,0,0,114,3,0,0,0,114,25,
+    0,0,0,218,4,116,121,112,101,114,70,0,0,0,114,113,
+    0,0,0,114,115,0,0,0,114,117,0,0,0,114,4,0,
+    0,0,114,89,0,0,0,114,36,0,0,0,114,37,0,0,
+    0,114,35,0,0,0,114,27,0,0,0,114,122,0,0,0,
+    114,142,0,0,0,114,144,0,0,0,114,52,0,0,0,114,
+    147,0,0,0,114,155,0,0,0,218,8,95,95,99,111,100,
+    101,95,95,114,153,0,0,0,114,159,0,0,0,114,161,0,
+    0,0,114,169,0,0,0,114,151,0,0,0,114,149,0,0,
+    0,114,44,0,0,0,114,80,0,0,0,114,9,0,0,0,
+    114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,
+    8,60,109,111,100,117,108,101,62,1,0,0,0,115,88,0,
+    0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,1,
+    8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,2,
+    4,1,4,1,4,2,14,127,0,127,0,1,12,1,12,1,
+    2,1,2,252,4,9,8,4,8,9,8,31,8,126,2,254,
+    2,29,4,5,8,21,8,46,8,10,8,46,10,5,8,7,
+    8,6,8,13,8,19,8,15,8,26,
 };
index 1084def9ce03fc90bc1d9936431cb2d61a2f5077..9880c0d624d523c0ea28a9290d0f5795cf31a1de 100644 (file)
@@ -1250,6 +1250,13 @@ Py_FinalizeEx(void)
         /* nothing */;
 #endif
 
+    /* Clear all loghooks */
+    /* We want minimal exposure of this function, so define the extern
+     * here. The linker should discover the correct function without
+     * exporting a symbol. */
+    extern void _PySys_ClearAuditHooks(void);
+    _PySys_ClearAuditHooks();
+
     /* Destroy all modules */
     PyImport_Cleanup();
 
index 879a5a91f8a3b09d9fb0a34b18aad9d6f6f43944..41c66223390d054af2b5952d50916eaa19ab8b73 100644 (file)
@@ -45,8 +45,19 @@ static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstat
 static _PyInitError
 _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
 {
+    /* We preserve the hook across init, because there is
+       currently no public API to set it between runtime
+       initialization and interpreter initialization. */
+    void *open_code_hook = runtime->open_code_hook;
+    void *open_code_userdata = runtime->open_code_userdata;
+    _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
+
     memset(runtime, 0, sizeof(*runtime));
 
+    runtime->open_code_hook = open_code_hook;
+    runtime->open_code_userdata = open_code_userdata;
+    runtime->audit_hook_head = audit_hook_head;
+
     _PyGC_Initialize(&runtime->gc);
     _PyEval_Initialize(&runtime->ceval);
     _PyPreConfig_InitPythonConfig(&runtime->preconfig);
@@ -181,6 +192,10 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime)
 PyInterpreterState *
 PyInterpreterState_New(void)
 {
+    if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) {
+        return NULL;
+    }
+
     PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState));
     if (interp == NULL) {
         return NULL;
@@ -233,6 +248,8 @@ PyInterpreterState_New(void)
 
     interp->tstate_next_unique_id = 0;
 
+    interp->audit_hooks = NULL;
+
     return interp;
 }
 
@@ -240,11 +257,18 @@ PyInterpreterState_New(void)
 static void
 _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp)
 {
+    if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) {
+        PyErr_Clear();
+    }
+
     HEAD_LOCK(runtime);
     for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
         PyThreadState_Clear(p);
     }
     HEAD_UNLOCK(runtime);
+
+    Py_CLEAR(interp->audit_hooks);
+
     _PyCoreConfig_Clear(&interp->core_config);
     Py_CLEAR(interp->codec_search_path);
     Py_CLEAR(interp->codec_search_cache);
@@ -1057,6 +1081,10 @@ _PyThread_CurrentFrames(void)
     PyObject *result;
     PyInterpreterState *i;
 
+    if (PySys_Audit("sys._current_frames", NULL) < 0) {
+        return NULL;
+    }
+
     result = PyDict_New();
     if (result == NULL)
         return NULL;
index d2b27615903fee1f57850bccb27acb80a8c311ca..7219f548fd251e46a88838b9813f038aae011e81 100644 (file)
@@ -1091,6 +1091,12 @@ run_mod(mod_ty mod, PyObject *filename, PyObject *globals, PyObject *locals,
     co = PyAST_CompileObject(mod, filename, flags, -1, arena);
     if (co == NULL)
         return NULL;
+
+    if (PySys_Audit("exec", "O", co) < 0) {
+        Py_DECREF(co);
+        return NULL;
+    }
+
     v = run_eval_code_obj(co, globals, locals);
     Py_DECREF(co);
     return v;
index 1735b90b33b95583ec7b5ae1c928590fa0a4b57e..5ebeacf0b7f39936a7a6cce3c484a26425eb2ab1 100644 (file)
@@ -22,7 +22,9 @@ Data members:
 #include "pycore_pymem.h"
 #include "pycore_pathconfig.h"
 #include "pycore_pystate.h"
+#include "pycore_tupleobject.h"
 #include "pythread.h"
+#include "pydtrace.h"
 
 #include "osdefs.h"
 #include <locale.h>
@@ -111,6 +113,308 @@ PySys_SetObject(const char *name, PyObject *v)
     }
 }
 
+static int
+should_audit(void)
+{
+    PyThreadState *ts = _PyThreadState_GET();
+    if (!ts) {
+        return 0;
+    }
+    PyInterpreterState *is = ts ? ts->interp : NULL;
+    return _PyRuntime.audit_hook_head
+        || (is && is->audit_hooks)
+        || PyDTrace_AUDIT_ENABLED();
+}
+
+int
+PySys_Audit(const char *event, const char *argFormat, ...)
+{
+    PyObject *eventName = NULL;
+    PyObject *eventArgs = NULL;
+    PyObject *hooks = NULL;
+    PyObject *hook = NULL;
+    int res = -1;
+
+    /* N format is inappropriate, because you do not know
+       whether the reference is consumed by the call.
+       Assert rather than exception for perf reasons */
+    assert(!argFormat || !strchr(argFormat, 'N'));
+
+    /* Early exit when no hooks are registered */
+    if (!should_audit()) {
+        return 0;
+    }
+
+    _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
+    PyThreadState *ts = _PyThreadState_GET();
+    PyInterpreterState *is = ts ? ts->interp : NULL;
+    int dtrace = PyDTrace_AUDIT_ENABLED();
+
+    PyObject *exc_type, *exc_value, *exc_tb;
+    if (ts) {
+        PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
+    }
+
+    /* Initialize event args now */
+    if (argFormat && argFormat[0]) {
+        va_list args;
+        va_start(args, argFormat);
+        eventArgs = Py_VaBuildValue(argFormat, args);
+        if (eventArgs && !PyTuple_Check(eventArgs)) {
+            PyObject *argTuple = PyTuple_Pack(1, eventArgs);
+            Py_DECREF(eventArgs);
+            eventArgs = argTuple;
+        }
+    } else {
+        eventArgs = PyTuple_New(0);
+    }
+    if (!eventArgs) {
+        goto exit;
+    }
+
+    /* Call global hooks */
+    for (; e; e = e->next) {
+        if (e->hookCFunction(event, eventArgs, e->userData) < 0) {
+            goto exit;
+        }
+    }
+
+    /* Dtrace USDT point */
+    if (dtrace) {
+        PyDTrace_AUDIT(event, (void *)eventArgs);
+    }
+
+    /* Call interpreter hooks */
+    if (is && is->audit_hooks) {
+        eventName = PyUnicode_FromString(event);
+        if (!eventName) {
+            goto exit;
+        }
+
+        hooks = PyObject_GetIter(is->audit_hooks);
+        if (!hooks) {
+            goto exit;
+        }
+
+        /* Disallow tracing in hooks unless explicitly enabled */
+        ts->tracing++;
+        ts->use_tracing = 0;
+        while ((hook = PyIter_Next(hooks)) != NULL) {
+            PyObject *o;
+            int canTrace = -1;
+            o = PyObject_GetAttrString(hook, "__cantrace__");
+            if (o) {
+                canTrace = PyObject_IsTrue(o);
+                Py_DECREF(o);
+            } else if (PyErr_Occurred() &&
+                       PyErr_ExceptionMatches(PyExc_AttributeError)) {
+                PyErr_Clear();
+                canTrace = 0;
+            }
+            if (canTrace < 0) {
+                break;
+            }
+            if (canTrace) {
+                ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
+                ts->tracing--;
+            }
+            o = PyObject_CallFunctionObjArgs(hook, eventName,
+                                             eventArgs, NULL);
+            if (canTrace) {
+                ts->tracing++;
+                ts->use_tracing = 0;
+            }
+            if (!o) {
+                break;
+            }
+            Py_DECREF(o);
+            Py_CLEAR(hook);
+        }
+        ts->use_tracing = (ts->c_tracefunc || ts->c_profilefunc);
+        ts->tracing--;
+        if (PyErr_Occurred()) {
+            goto exit;
+        }
+    }
+
+    res = 0;
+
+exit:
+    Py_XDECREF(hook);
+    Py_XDECREF(hooks);
+    Py_XDECREF(eventName);
+    Py_XDECREF(eventArgs);
+
+    if (ts) {
+        if (!res) {
+            PyErr_Restore(exc_type, exc_value, exc_tb);
+        } else {
+            assert(PyErr_Occurred());
+            Py_XDECREF(exc_type);
+            Py_XDECREF(exc_value);
+            Py_XDECREF(exc_tb);
+        }
+    }
+
+    return res;
+}
+
+/* We expose this function primarily for our own cleanup during
+ * finalization. In general, it should not need to be called,
+ * and as such it is not defined in any header files.
+ */
+void _PySys_ClearAuditHooks(void) {
+    /* Must be finalizing to clear hooks */
+    _PyRuntimeState *runtime = &_PyRuntime;
+    PyThreadState *ts = _PyRuntimeState_GetThreadState(runtime);
+    assert(!ts || _Py_CURRENTLY_FINALIZING(runtime, ts));
+    if (!ts || !_Py_CURRENTLY_FINALIZING(runtime, ts))
+        return;
+
+    if (Py_VerboseFlag) {
+        PySys_WriteStderr("# clear sys.audit hooks\n");
+    }
+
+    /* Hooks can abort later hooks for this event, but cannot
+       abort the clear operation itself. */
+    PySys_Audit("cpython._PySys_ClearAuditHooks", NULL);
+    PyErr_Clear();
+
+    _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head, *n;
+    _PyRuntime.audit_hook_head = NULL;
+    while (e) {
+        n = e->next;
+        PyMem_RawFree(e);
+        e = n;
+    }
+}
+
+int
+PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
+{
+    /* Invoke existing audit hooks to allow them an opportunity to abort. */
+    /* Cannot invoke hooks until we are initialized */
+    if (Py_IsInitialized()) {
+        if (PySys_Audit("sys.addaudithook", NULL) < 0) {
+            if (PyErr_ExceptionMatches(PyExc_Exception)) {
+                /* We do not report errors derived from Exception */
+                PyErr_Clear();
+                return 0;
+            }
+            return -1;
+        }
+    }
+
+    _Py_AuditHookEntry *e = _PyRuntime.audit_hook_head;
+    if (!e) {
+        e = (_Py_AuditHookEntry*)PyMem_RawMalloc(sizeof(_Py_AuditHookEntry));
+        _PyRuntime.audit_hook_head = e;
+    } else {
+        while (e->next)
+            e = e->next;
+        e = e->next = (_Py_AuditHookEntry*)PyMem_RawMalloc(
+            sizeof(_Py_AuditHookEntry));
+    }
+
+    if (!e) {
+        if (Py_IsInitialized())
+            PyErr_NoMemory();
+        return -1;
+    }
+
+    e->next = NULL;
+    e->hookCFunction = (Py_AuditHookFunction)hook;
+    e->userData = userData;
+
+    return 0;
+}
+
+/*[clinic input]
+sys.addaudithook
+
+    hook: object
+
+Adds a new audit hook callback.
+[clinic start generated code]*/
+
+static PyObject *
+sys_addaudithook_impl(PyObject *module, PyObject *hook)
+/*[clinic end generated code: output=4f9c17aaeb02f44e input=0f3e191217a45e34]*/
+{
+    /* Invoke existing audit hooks to allow them an opportunity to abort. */
+    if (PySys_Audit("sys.addaudithook", NULL) < 0) {
+        if (PyErr_ExceptionMatches(PyExc_Exception)) {
+            /* We do not report errors derived from Exception */
+            PyErr_Clear();
+            Py_RETURN_NONE;
+        }
+        return NULL;
+    }
+
+    PyInterpreterState *is = _PyInterpreterState_Get();
+
+    if (is->audit_hooks == NULL) {
+        is->audit_hooks = PyList_New(0);
+        if (is->audit_hooks == NULL) {
+            return NULL;
+        }
+    }
+
+    if (PyList_Append(is->audit_hooks, hook) < 0) {
+        return NULL;
+    }
+
+    Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(audit_doc,
+"audit(event, *args)\n\
+\n\
+Passes the event to any audit hooks that are attached.");
+
+static PyObject *
+sys_audit(PyObject *self, PyObject *const *args, Py_ssize_t argc)
+{
+    if (argc == 0) {
+        PyErr_SetString(PyExc_TypeError, "audit() missing 1 required positional argument: 'event'");
+        return NULL;
+    }
+
+    if (!should_audit()) {
+        Py_RETURN_NONE;
+    }
+
+    PyObject *auditEvent = args[0];
+    if (!auditEvent) {
+        PyErr_SetString(PyExc_TypeError, "expected str for argument 'event'");
+        return NULL;
+    }
+    if (!PyUnicode_Check(auditEvent)) {
+        PyErr_Format(PyExc_TypeError, "expected str for argument 'event', not %.200s",
+            Py_TYPE(auditEvent)->tp_name);
+        return NULL;
+    }
+    const char *event = PyUnicode_AsUTF8(auditEvent);
+    if (!event) {
+        return NULL;
+    }
+
+    PyObject *auditArgs = _PyTuple_FromArray(args + 1, argc - 1);
+    if (!auditArgs) {
+        return NULL;
+    }
+
+    int res = PySys_Audit(event, "O", auditArgs);
+    Py_DECREF(auditArgs);
+
+    if (res < 0) {
+        return NULL;
+    }
+
+    Py_RETURN_NONE;
+}
+
+
 static PyObject *
 sys_breakpointhook(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
 {
@@ -1469,6 +1773,10 @@ sys__getframe_impl(PyObject *module, int depth)
 {
     PyFrameObject *f = _PyThreadState_GET()->frame;
 
+    if (PySys_Audit("sys._getframe", "O", f) < 0) {
+        return NULL;
+    }
+
     while (depth > 0 && f != NULL) {
         f = f->f_back;
         --depth;
@@ -1642,8 +1950,11 @@ sys_getandroidapilevel_impl(PyObject *module)
 #endif   /* ANDROID_API_LEVEL */
 
 
+
 static PyMethodDef sys_methods[] = {
     /* Might as well keep this in alphabetic order */
+    SYS_ADDAUDITHOOK_METHODDEF
+    {"audit",           (PyCFunction)(void(*)(void))sys_audit, METH_FASTCALL, audit_doc },
     {"breakpointhook",  (PyCFunction)(void(*)(void))sys_breakpointhook,
      METH_FASTCALL | METH_KEYWORDS, breakpointhook_doc},
     SYS_CALLSTATS_METHODDEF