[Python-checkins] bpo-36842: Implement PEP 578 (GH-12613)

Steve Dower webhook-mailer at python.org
Thu May 23 11:45:46 EDT 2019


https://github.com/python/cpython/commit/b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184
commit: b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184
branch: master
author: Steve Dower <steve.dower at microsoft.com>
committer: GitHub <noreply at github.com>
date: 2019-05-23T08:45:22-07:00
summary:

bpo-36842: Implement PEP 578 (GH-12613)

Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs.

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

diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst
index 27d3f76d7a3d..fd3f6919d6d7 100644
--- a/Doc/c-api/code.rst
+++ b/Doc/c-api/code.rst
@@ -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)
 
diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst
index defc859dd5c4..543dc60b9f55 100644
--- a/Doc/c-api/file.rst
+++ b/Doc/c-api/file.rst
@@ -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
diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst
index 04e169a00dc6..2091da6af0be 100644
--- a/Doc/c-api/sys.rst
+++ b/Doc/c-api/sys.rst
@@ -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
diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst
index 50cde3595034..909deb5fed33 100644
--- a/Doc/howto/instrumentation.rst
+++ b/Doc/howto/instrumentation.rst
@@ -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
 -----------------
 
diff --git a/Doc/library/array.rst b/Doc/library/array.rst
index 4ac7bb5391a7..1f95dd61b9fc 100644
--- a/Doc/library/array.rst
+++ b/Doc/library/array.rst
@@ -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
 
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index 1c60b4bbda13..97172c588ae9 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -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
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index 1a9a8b5beeee..7170a7817205 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -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
 
diff --git a/Doc/library/io.rst b/Doc/library/io.rst
index 0f1251687aeb..2fb27c3aad78 100644
--- a/Doc/library/io.rst
+++ b/Doc/library/io.rst
@@ -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
 
diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst
index 0f895d76b83f..a82caf86e801 100644
--- a/Doc/library/mmap.rst
+++ b/Doc/library/mmap.rst
@@ -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:
 
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 0bbfce97c54b..6df2b49c5325 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -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.
 
 
diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst
index 27721e698826..f4c41ac68d2f 100644
--- a/Doc/library/pickle.rst
+++ b/Doc/library/pickle.rst
@@ -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:
 
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
index 379633a3b605..e23a4f5380bd 100644
--- a/Doc/library/socket.rst
+++ b/Doc/library/socket.rst
@@ -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
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 3b754bd4e276..0294f74368c0 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -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
diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
index 14fa27bb08af..1895ae74b4f5 100644
--- a/Doc/library/urllib.request.rst
+++ b/Doc/library/urllib.request.rst
@@ -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.
diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py
index e097c13eab5f..f79b25048a5a 100644
--- a/Doc/tools/extensions/pyspecific.py
+++ b/Doc/tools/extensions/pyspecific.py
@@ -151,6 +151,45 @@ def run(self):
         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
index 000000000000..57eac13c064c
--- /dev/null
+++ b/Include/cpython/fileobject.h
@@ -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
index 000000000000..72d8ffed29fd
--- /dev/null
+++ b/Include/cpython/sysmodule.h
@@ -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
diff --git a/Include/fileobject.h b/Include/fileobject.h
index 89e8dd6a2850..456887ef9d04 100644
--- a/Include/fileobject.h
+++ b/Include/fileobject.h
@@ -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
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index 1561328e6079..ef1d8a061f17 100644
--- a/Include/internal/pycore_pystate.h
+++ b/Include/internal/pycore_pystate.h
@@ -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;
 
diff --git a/Include/pydtrace.d b/Include/pydtrace.d
index a6a5e7ec224f..5e6a626b01b8 100644
--- a/Include/pydtrace.d
+++ b/Include/pydtrace.d
@@ -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
diff --git a/Include/pydtrace.h b/Include/pydtrace.h
index 7a04278166b0..75f8e7f70979 100644
--- a/Include/pydtrace.h
+++ b/Include/pydtrace.h
@@ -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 */
 
diff --git a/Include/sysmodule.h b/Include/sysmodule.h
index c5547ff6742e..670e5d283f77 100644
--- a/Include/sysmodule.h
+++ b/Include/sysmodule.h
@@ -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
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index be5e4266daff..5baca4df82ff 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -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__
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index f8ff5f4f2c5c..7da0cd0f1965 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -963,8 +963,12 @@ def get_filename(self, fullname):
 
     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.
 
diff --git a/Lib/io.py b/Lib/io.py
index 968ee5073df1..fbce6efc010c 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -41,8 +41,8 @@
               "Amaury Forgeot d'Arc <amauryfa at gmail.com>, "
               "Benjamin Peterson <benjamin at 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 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)
 
diff --git a/Lib/pickle.py b/Lib/pickle.py
index 595beda4765a..be8e3811947b 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -1436,6 +1436,7 @@ def get_extension(self, code):
 
     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)]
diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py
index 9a6585af9d0d..84931140b102 100644
--- a/Lib/test/libregrtest/setup.py
+++ b/Lib/test/libregrtest/setup.py
@@ -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
index 000000000000..5b33d978f99d
--- /dev/null
+++ b/Lib/test/test_audit.py
@@ -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()
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index 32aabe30a5c8..87e90f74bb13 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -927,5 +927,16 @@ def test_init_dont_parse_argv(self):
                           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()
diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py
index 57a02656206f..26e4500ae8cf 100644
--- a/Lib/test/test_fileio.py
+++ b/Lib/test/test_fileio.py
@@ -565,6 +565,7 @@ def __setattr__(self, name, value):
         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 @@ def testInvalidFd_overflow(self):
         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.
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 2c3bf8906679..6f22b35a9ab9 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -3861,7 +3861,7 @@ def test___all__(self):
         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)
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 9b21afb74e6e..afce8eb1a1b1 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -521,6 +521,7 @@ def open(self, fullurl, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
             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
diff --git a/Lib/zipimport.py b/Lib/zipimport.py
index f430abd6a77c..fd917c16b015 100644
--- a/Lib/zipimport.py
+++ b/Lib/zipimport.py
@@ -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)
diff --git a/Makefile.pre.in b/Makefile.pre.in
index d006a73c38be..12891e938236 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -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
index 000000000000..5e23d31a2485
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst	
@@ -0,0 +1 @@
+Implement PEP 578, adding sys.audit, io.open_code and related APIs.
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 7b5115359ed7..f4eb53657dd4 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -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);
diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
index a8ba84be4a76..8682d5487220 100644
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -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) {
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index 590d6ce9f1e5..ba8f0018043f 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -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);
+}
 

 /*
  * 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}
 };
 
diff --git a/Modules/_io/clinic/_iomodule.c.h b/Modules/_io/clinic/_iomodule.c.h
index 990c81c35574..00ad616b41fe 100644
--- a/Modules/_io/clinic/_iomodule.c.h
+++ b/Modules/_io/clinic/_iomodule.c.h
@@ -281,4 +281,46 @@ _io_open(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw
 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]*/
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index c502c430134e..52a6f49e1d32 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -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;
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 87f3cf7b614a..24a5d2277012 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -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. */
diff --git a/Modules/_winapi.c b/Modules/_winapi.c
index 8873519e6ce5..1317fc9a172c 100644
--- a/Modules/_winapi.c
+++ b/Modules/_winapi.c
@@ -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)
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 523afb99e8ae..423cac9910a2 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -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 "
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 917c6362c11d..fdd60bbb6eef 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -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;
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 9f15866d9d3d..8ebe3a0be053 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -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
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index c024542fe709..74cdc0f2f6ca 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -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;
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
index 62d7c5d329f0..f4e48a9757e5 100644
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -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,
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index 8f1a823768f3..0db8057334fd 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -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);
 }
 
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 39c7c109979a..3b026335d3f8 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -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
diff --git a/Objects/funcobject.c b/Objects/funcobject.c
index e8e2d2e15cca..09b94c264236 100644
--- a/Objects/funcobject.c
+++ b/Objects/funcobject.c
@@ -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);
diff --git a/Objects/object.c b/Objects/object.c
index 604f5e0d4882..f842ab388967 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -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) {
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index c086f182aa95..49b45b8518cc 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -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
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
index df57adcfd605..681c4db65df0 100644
--- a/PCbuild/pythoncore.vcxproj
+++ b/PCbuild/pythoncore.vcxproj
@@ -129,12 +129,14 @@
     <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" />
diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
index 5515d9bedeb1..32964c008aa2 100644
--- a/PCbuild/pythoncore.vcxproj.filters
+++ b/PCbuild/pythoncore.vcxproj.filters
@@ -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>
@@ -108,6 +111,9 @@
     <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>
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index cb0e6d7f9df2..d84c1b13cf10 100644
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -1201,6 +1201,10 @@ class PartingShots(StaticVisitor):
     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;
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 55fd7f7db3da..a5d78974b871 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -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;
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index 6bd55deab401..21d3b445d775 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -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}
 };
 
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index e84a7586a707..39a40eedca32 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -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;
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 047cca057b41..ff5a51216939 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -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:
diff --git a/Python/ceval.c b/Python/ceval.c
index 1bb4704572b4..781b10dfac9a 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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);
 }
diff --git a/Python/clinic/sysmodule.c.h b/Python/clinic/sysmodule.c.h
index aede60ac85b5..2a4ec72b0dc3 100644
--- a/Python/clinic/sysmodule.c.h
+++ b/Python/clinic/sysmodule.c.h
@@ -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]*/
diff --git a/Python/fileutils.c b/Python/fileutils.c
index dfad48edb81a..178e2f1268f8 100644
--- a/Python/fileutils.c
+++ b/Python/fileutils.c
@@ -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);
diff --git a/Python/import.c b/Python/import.c
index c634edb4c7fc..ec172b29f739 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -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
diff --git a/Python/importdl.c b/Python/importdl.c
index 50231ff28848..1d0d32a2371f 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -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);
diff --git a/Python/importlib_external.h b/Python/importlib_external.h
index b5b4df228057..36b95d99b237 100644
--- a/Python/importlib_external.h
+++ b/Python/importlib_external.h
@@ -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,
 };
diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h
index b79689449935..cbb3d909a10b 100644
--- a/Python/importlib_zipimport.h
+++ b/Python/importlib_zipimport.h
@@ -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,
 };
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 1084def9ce03..9880c0d624d5 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -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();
 
diff --git a/Python/pystate.c b/Python/pystate.c
index 879a5a91f8a3..41c66223390d 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -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;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index d2b27615903f..7219f548fd25 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -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;
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 1735b90b33b9..5ebeacf0b7f3 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -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



More information about the Python-checkins mailing list