From b82e17e626f7b1cd98aada0b1ebb65cb9f8fb184 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 23 May 2019 08:45:22 -0700 Subject: bpo-36842: Implement PEP 578 (GH-12613) Adds sys.audit, sys.addaudithook, io.open_code, and associated C APIs. --- Doc/c-api/code.rst | 1 + Doc/c-api/file.rst | 26 + Doc/c-api/sys.rst | 50 + Doc/howto/instrumentation.rst | 9 + Doc/library/array.rst | 1 + Doc/library/ctypes.rst | 17 + Doc/library/functions.rst | 31 + Doc/library/io.rst | 21 + Doc/library/mmap.rst | 2 + Doc/library/os.rst | 12 +- Doc/library/pickle.rst | 1 + Doc/library/socket.rst | 28 + Doc/library/sys.rst | 63 + Doc/library/urllib.request.rst | 7 + Doc/tools/extensions/pyspecific.py | 40 + Include/cpython/fileobject.h | 32 + Include/cpython/sysmodule.h | 21 + Include/fileobject.h | 25 +- Include/internal/pycore_pystate.h | 16 + Include/pydtrace.d | 1 + Include/pydtrace.h | 2 + Include/sysmodule.h | 8 +- Lib/_pyio.py | 23 + Lib/importlib/_bootstrap_external.py | 8 +- Lib/io.py | 6 +- Lib/pickle.py | 1 + Lib/test/libregrtest/setup.py | 6 + Lib/test/test_audit.py | 260 +++ Lib/test/test_embed.py | 11 + Lib/test/test_fileio.py | 23 + Lib/test/test_io.py | 2 +- Lib/urllib/request.py | 1 + Lib/zipimport.py | 4 +- Makefile.pre.in | 2 + .../2019-05-07-16-50-12.bpo-36842.NYww_N.rst | 1 + Modules/_ctypes/_ctypes.c | 16 + Modules/_ctypes/callproc.c | 7 + Modules/_io/_iomodule.c | 20 + Modules/_io/clinic/_iomodule.c.h | 44 +- Modules/_io/fileio.c | 4 + Modules/_pickle.c | 5 + Modules/_winapi.c | 47 +- Modules/arraymodule.c | 5 + Modules/mmapmodule.c | 10 + Modules/posixmodule.c | 22 + Modules/socketmodule.c | 80 + Objects/codeobject.c | 6 + Objects/descrobject.c | 8 + Objects/fileobject.c | 70 +- Objects/funcobject.c | 40 + Objects/object.c | 8 + Objects/typeobject.c | 11 + PCbuild/pythoncore.vcxproj | 2 + PCbuild/pythoncore.vcxproj.filters | 6 + Parser/asdl_c.py | 4 + Parser/parsetok.c | 9 + Programs/_testembed.c | 161 ++ Python/Python-ast.c | 4 + Python/bltinmodule.c | 30 +- Python/ceval.c | 23 + Python/clinic/sysmodule.c.h | 34 +- Python/fileutils.c | 18 + Python/import.c | 11 + Python/importdl.c | 5 + Python/importlib_external.h | 2438 ++++++++++---------- Python/importlib_zipimport.h | 1117 +++++---- Python/pylifecycle.c | 7 + Python/pystate.c | 28 + Python/pythonrun.c | 6 + Python/sysmodule.c | 311 +++ 70 files changed, 3564 insertions(+), 1815 deletions(-) create mode 100644 Include/cpython/fileobject.h create mode 100644 Include/cpython/sysmodule.h create mode 100644 Lib/test/test_audit.py create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-05-07-16-50-12.bpo-36842.NYww_N.rst diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index 27d3f76..fd3f691 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 defc859..543dc60 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 04e169a..2091da6 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 50cde35..909deb5 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 4ac7bb5..1f95dd6 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 1c60b4b..97172c5 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 ` ``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 ` ``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 1a9a8b5..7170a78 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 ` ``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 ` ``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 ` ``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 ` ``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 0f12516..2fb27c3 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 ` ``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 0f895d7..a82caf8 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 0bbfce9..6df2b49 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 `. (See also +These functions create new :term:`file objects `. (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 ` 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 `. + .. 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 27721e6..f4c41ac 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 379633a..e23a4f5 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -526,6 +526,8 @@ The following functions all create :ref:`socket objects `. The newly created socket is :ref:`non-inheritable `. + .. 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 3b754bd..0294f74 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 14fa27b..1895ae7 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 ` + ``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 e097c13..f79b250 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -151,6 +151,45 @@ class Availability(Directive): return [pnode] +# Support for documenting audit event + +class AuditEvent(Directive): + + has_content = True + required_arguments = 1 + optional_arguments = 1 + final_argument_whitespace = True + + _label = [ + "Raises an :ref:`auditing event ` {name} with no arguments.", + "Raises an :ref:`auditing event ` {name} with argument {args}.", + "Raises an :ref:`auditing event ` {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 0000000..57eac13 --- /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 0000000..72d8ffe --- /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 89e8dd6..456887e 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 1561328..ef1d8a0 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 a6a5e7e..5e6a626 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 7a04278..75f8e7f 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 c5547ff..670e5d2 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 be5e426..5baca4d 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 f8ff5f4..7da0cd0 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -963,8 +963,12 @@ class FileLoader: def get_data(self, path): """Return the data from path as raw bytes.""" - with _io.FileIO(path, 'r') as file: - return file.read() + if isinstance(self, (SourceLoader, ExtensionFileLoader)): + with _io.open_code(str(path)) as file: + return file.read() + else: + with _io.FileIO(path, 'r') as file: + return file.read() # ResourceReader ABC API. diff --git a/Lib/io.py b/Lib/io.py index 968ee50..fbce6ef 100644 --- a/Lib/io.py +++ b/Lib/io.py @@ -41,8 +41,8 @@ __author__ = ("Guido van Rossum , " "Amaury Forgeot d'Arc , " "Benjamin Peterson ") -__all__ = ["BlockingIOError", "open", "IOBase", "RawIOBase", "FileIO", - "BytesIO", "StringIO", "BufferedIOBase", +__all__ = ["BlockingIOError", "open", "open_code", "IOBase", "RawIOBase", + "FileIO", "BytesIO", "StringIO", "BufferedIOBase", "BufferedReader", "BufferedWriter", "BufferedRWPair", "BufferedRandom", "TextIOBase", "TextIOWrapper", "UnsupportedOperation", "SEEK_SET", "SEEK_CUR", "SEEK_END"] @@ -52,7 +52,7 @@ import _io import abc from _io import (DEFAULT_BUFFER_SIZE, BlockingIOError, UnsupportedOperation, - open, FileIO, BytesIO, StringIO, BufferedReader, + open, open_code, FileIO, BytesIO, StringIO, BufferedReader, BufferedWriter, BufferedRWPair, BufferedRandom, IncrementalNewlineDecoder, TextIOWrapper) diff --git a/Lib/pickle.py b/Lib/pickle.py index 595beda..be8e381 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1436,6 +1436,7 @@ class _Unpickler: def find_class(self, module, name): # Subclasses may override this. + sys.audit('pickle.find_class', module, name) if self.proto < 3 and self.fix_imports: if (module, name) in _compat_pickle.NAME_MAPPING: module, name = _compat_pickle.NAME_MAPPING[(module, name)] diff --git a/Lib/test/libregrtest/setup.py b/Lib/test/libregrtest/setup.py index 9a6585a..8493114 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 0000000..5b33d97 --- /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 32aabe3..87e90f7 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -927,5 +927,16 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): api=API_PYTHON) +class AuditingTests(EmbeddingTestsMixin, unittest.TestCase): + def test_open_code_hook(self): + self.run_embedded_interpreter("test_open_code_hook") + + def test_audit(self): + self.run_embedded_interpreter("test_audit") + + def test_audit_subinterpreter(self): + self.run_embedded_interpreter("test_audit_subinterpreter") + + if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py index 57a0265..26e4500 100644 --- a/Lib/test/test_fileio.py +++ b/Lib/test/test_fileio.py @@ -565,6 +565,7 @@ class OtherFileTests: self.assertRaises(MyException, MyFileIO, fd) os.close(fd) # should not raise OSError(EBADF) + class COtherFileTests(OtherFileTests, unittest.TestCase): FileIO = _io.FileIO modulename = '_io' @@ -576,10 +577,32 @@ class COtherFileTests(OtherFileTests, unittest.TestCase): self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MAX + 1) self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MIN - 1) + def test_open_code(self): + # Check that the default behaviour of open_code matches + # open("rb") + with self.FileIO(__file__, "rb") as f: + expected = f.read() + with _io.open_code(__file__) as f: + actual = f.read() + self.assertEqual(expected, actual) + + class PyOtherFileTests(OtherFileTests, unittest.TestCase): FileIO = _pyio.FileIO modulename = '_pyio' + def test_open_code(self): + # Check that the default behaviour of open_code matches + # open("rb") + with self.FileIO(__file__, "rb") as f: + expected = f.read() + with check_warnings(quiet=True) as w: + # Always test _open_code_with_warning + with _pyio._open_code_with_warning(__file__) as f: + actual = f.read() + self.assertEqual(expected, actual) + self.assertNotEqual(w.warnings, []) + def test_main(): # Historically, these tests have been sloppy about removing TESTFN. diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 2c3bf89..6f22b35 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -3861,7 +3861,7 @@ class MiscIOTest(unittest.TestCase): for name in self.io.__all__: obj = getattr(self.io, name, None) self.assertIsNotNone(obj, name) - if name == "open": + if name in ("open", "open_code"): continue elif "error" in name.lower() or name == "UnsupportedOperation": self.assertTrue(issubclass(obj, Exception), name) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index 9b21afb..afce8eb 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -521,6 +521,7 @@ class OpenerDirector: meth = getattr(processor, meth_name) req = meth(req) + sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method()) response = self._open(req, data) # post-process response diff --git a/Lib/zipimport.py b/Lib/zipimport.py index f430abd..fd917c1 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 d006a73..12891e9 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 0000000..5e23d31 --- /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 7b51153..f4eb536 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 a8ba84b..8682d54 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 590d6ce..ba8f001 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 990c81c..00ad616 100644 --- a/Modules/_io/clinic/_iomodule.c.h +++ b/Modules/_io/clinic/_iomodule.c.h @@ -281,4 +281,46 @@ skip_optional_pos: exit: return return_value; } -/*[clinic end generated code: output=19fc9b69a5166f63 input=a9049054013a1b77]*/ + +PyDoc_STRVAR(_io_open_code__doc__, +"open_code($module, /, path)\n" +"--\n" +"\n" +"Opens the provided file with the intent to import the contents.\n" +"\n" +"This may perform extra validation beyond open(), but is otherwise interchangeable\n" +"with calling open(path, \'rb\')."); + +#define _IO_OPEN_CODE_METHODDEF \ + {"open_code", (PyCFunction)(void(*)(void))_io_open_code, METH_FASTCALL|METH_KEYWORDS, _io_open_code__doc__}, + +static PyObject * +_io_open_code_impl(PyObject *module, PyObject *path); + +static PyObject * +_io_open_code(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +{ + PyObject *return_value = NULL; + static const char * const _keywords[] = {"path", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "open_code", 0}; + PyObject *argsbuf[1]; + PyObject *path; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); + if (!args) { + goto exit; + } + if (!PyUnicode_Check(args[0])) { + _PyArg_BadArgument("open_code", 1, "str", args[0]); + goto exit; + } + if (PyUnicode_READY(args[0]) == -1) { + goto exit; + } + path = args[0]; + return_value = _io_open_code_impl(module, path); + +exit: + return return_value; +} +/*[clinic end generated code: output=d479285078750d68 input=a9049054013a1b77]*/ diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c index c502c43..52a6f49 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 87f3cf7..24a5d22 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 8873519..1317fc9 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 523afb9..423cac9 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 917c636..fdd60bb 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 9f15866..8ebe3a0 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 c024542..74cdc0f 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 62d7c5d..f4e48a9 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 8f1a823..0db8057 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 39c7c10..3b02633 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 e8e2d2e..09b94c2 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 604f5e0..f842ab3 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 c086f18..49b45b8 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 df57adc..681c4db 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -129,12 +129,14 @@ + + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 5515d9b..32964c0 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -90,6 +90,9 @@ Include + + Include + Include @@ -108,6 +111,9 @@ Include + + Include + Include diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index cb0e6d7..d84c1b1 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1201,6 +1201,10 @@ mod_ty PyAST_obj2mod_ex(PyObject* ast, PyArena* arena, int mode, int feature_ver char *req_name[] = {"Module", "Expression", "Interactive"}; int isinstance; + if (PySys_Audit("compile", "OO", ast, Py_None) < 0) { + return NULL; + } + req_type[0] = (PyObject*)Module_type; req_type[1] = (PyObject*)Expression_type; req_type[2] = (PyObject*)Interactive_type; diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 55fd7f7..a5d7897 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 6bd55de..21d3b44 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 e84a758..39a40ee 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 047cca0..ff5a512 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 1bb4704..781b10d 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 aede60a..2a4ec72 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 dfad48e..178e2f1 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 c634edb..ec172b2 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 50231ff..1d0d32a 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 b5b4df2..36b95d9 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 b796894..cbb3d90 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 1084def..9880c0d 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 879a5a9..41c6622 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 d2b2761..7219f54 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 1735b90..5ebeacf 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 @@ -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 -- cgit v0.12